From f8212fdb31dc300521870fbe29b987b4314dd0a4 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 6 Dec 2021 13:11:51 -0700 Subject: [PATCH 001/364] add randomization and debug prints --- src/MC/fix_bond_swap.cpp | 71 +++++++++++++++++++++++++++++++++++++--- src/MC/fix_bond_swap.h | 5 +++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 5f7ffcbbe5..8332180dc0 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -49,6 +49,8 @@ static const char cite_fix_bond_swap[] = " pages = {12718--12728}\n" "}\n\n"; +#define DELTA_PERMUTE 100 + /* ---------------------------------------------------------------------- */ FixBondSwap::FixBondSwap(LAMMPS *lmp, int narg, char **arg) : @@ -91,11 +93,14 @@ FixBondSwap::FixBondSwap(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} all temp",id_temp)); tflag = 1; - // initialize atom list + // initialize two permutation lists nmax = 0; alist = nullptr; + maxpermute = 0; + permute = nullptr; + naccept = foursome = 0; } @@ -111,6 +116,7 @@ FixBondSwap::~FixBondSwap() delete [] id_temp; memory->destroy(alist); + delete [] permute; } /* ---------------------------------------------------------------------- */ @@ -248,8 +254,8 @@ void FixBondSwap::post_integrate() } int tmp; - for (i = 0; i < neligible; i++) { - j = static_cast (random->uniform() * neligible); + for (i = 0; i < neligible-1; i++) { + j = i + static_cast (random->uniform() * (neligible-i)); tmp = alist[i]; alist[i] = alist[j]; alist[j] = tmp; @@ -277,8 +283,35 @@ void FixBondSwap::post_integrate() jlist = firstneigh[i]; jnum = numneigh[i]; + neighbor_permutation(jnum); + + // DEBUG + + int picked[4]; + int count = 0; + printf("BSWAP CANDIDATES nstep %ld itag %d jnum %d jtags", + update->ntimestep,atom->tag[i],jnum); for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; + j = jlist[permute[jj]]; + j &= NEIGHMASK; + printf(" %d",atom->tag[j]); + if (j >= nlocal) continue; + if ((mask[j] & groupbit) == 0) continue; + if (molecule[i] != molecule[j]) continue; + picked[count++] = atom->tag[j]; + } + if (count) { + printf(" picked %d",count); + for (jj = 0; jj < count; jj++) { + printf(" %d",picked[jj]); + } + } + printf("\n"); + + // END DEBUG + + for (jj = 0; jj < jnum; jj++) { + j = jlist[permute[jj]]; j &= NEIGHMASK; if (j >= nlocal) continue; if ((mask[j] & groupbit) == 0) continue; @@ -297,6 +330,8 @@ void FixBondSwap::post_integrate() // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff + printf("SWAP candidate jtag\n",atom->tag[j]); + for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); if (inext >= nlocal || inext < 0) continue; @@ -715,6 +750,34 @@ double FixBondSwap::angle_eng(int atype, int i, int j, int k) return force->angle->single(atype,i,j,k); } +/* ---------------------------------------------------------------------- + create a random permutation of one atom's N neighbor list atoms + uses one-pass Fisher-Yates shuffle on an initial identity permutation + output: randomized permute[] vector, used to index neighbors +------------------------------------------------------------------------- */ + +void FixBondSwap::neighbor_permutation(int n) +{ + int i,j,tmp; + + if (n > maxpermute) { + delete [] permute; + maxpermute = n + DELTA_PERMUTE; + permute = new int[maxpermute]; + } + + // Fisher-Yates shuffle + + for (i = 0; i < n; i++) permute[i] = i; + + for (i = 0; i < n-1; i++) { + j = i + static_cast (random->uniform() * (n-i)); + tmp = permute[i]; + permute[i] = permute[j]; + permute[j] = tmp; + } +} + /* ---------------------------------------------------------------------- return bond swapping stats n = 1 is # of swaps diff --git a/src/MC/fix_bond_swap.h b/src/MC/fix_bond_swap.h index e0691233f5..e927616246 100644 --- a/src/MC/fix_bond_swap.h +++ b/src/MC/fix_bond_swap.h @@ -46,6 +46,9 @@ class FixBondSwap : public Fix { int *type; double **x; + int maxpermute; + int *permute; + class NeighList *list; class Compute *temperature; class RanMars *random; @@ -54,6 +57,8 @@ class FixBondSwap : public Fix { double pair_eng(int, int); double bond_eng(int, int, int); double angle_eng(int, int, int, int); + + void neighbor_permutation(int); }; } // namespace LAMMPS_NS From 66c686f73307a34a40d7fd931393df0ff4595afd Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 30 Mar 2022 11:56:07 -0600 Subject: [PATCH 002/364] debug info --- src/MC/fix_bond_swap.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 8332180dc0..556c99d93a 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -330,7 +330,7 @@ void FixBondSwap::post_integrate() // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff - printf("SWAP candidate jtag\n",atom->tag[j]); + printf(" SWAP candidate jtag %d\n",atom->tag[j]); for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); @@ -351,6 +351,9 @@ void FixBondSwap::post_integrate() if (dist_rsq(i,jnext) >= cutsq) continue; if (dist_rsq(j,inext) >= cutsq) continue; + printf(" BOND jtag %d ibondtag %d jbondtag %d\n", + atom->tag[j],atom->tag[inext],atom->tag[jnext]); + // if angles are enabled: // find other atoms i,inext,j,jnext are in angles with // and angletypes: i/j angletype, i/j nextangletype @@ -468,6 +471,10 @@ void FixBondSwap::post_integrate() factor = exp(-delta/force->boltz/t_current); if (random->uniform() < factor) accept = 1; } + + printf(" MC result jtag %d delta %g accept %d\n", + atom->tag[j],delta,accept); + goto done; } } From 852c5f13fff70da0edf04dac16680173bdf7451b Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 30 Mar 2022 15:35:57 -0600 Subject: [PATCH 003/364] more debugging --- src/MC/fix_bond_swap.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 556c99d93a..55f7a112d0 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -330,7 +330,7 @@ void FixBondSwap::post_integrate() // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff - printf(" SWAP candidate jtag %d\n",atom->tag[j]); + printf(" SWAP candidate ijtag %d %d\n",atom->tag[i],atom->tag[j]); for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); @@ -351,8 +351,9 @@ void FixBondSwap::post_integrate() if (dist_rsq(i,jnext) >= cutsq) continue; if (dist_rsq(j,inext) >= cutsq) continue; - printf(" BOND jtag %d ibondtag %d jbondtag %d\n", - atom->tag[j],atom->tag[inext],atom->tag[jnext]); + printf(" BOND nstep %ld ijtag %d %d ibondtag %d jbondtag %d\n", + update->ntimestep, + atom->tag[i],atom->tag[j],atom->tag[inext],atom->tag[jnext]); // if angles are enabled: // find other atoms i,inext,j,jnext are in angles with @@ -472,7 +473,7 @@ void FixBondSwap::post_integrate() if (random->uniform() < factor) accept = 1; } - printf(" MC result jtag %d delta %g accept %d\n", + printf(" MC result jtag %d delta %g accept %d\n", atom->tag[j],delta,accept); goto done; From ebbace403a4f74eebe1dae017045cb2cb801569c Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 15 Apr 2022 14:22:46 -0600 Subject: [PATCH 004/364] Initial commit of mliap unified work --- cmake/Modules/Packages/ML-IAP.cmake | 20 +- examples/mliap/InP.hippynn.mliap.unified | 5 + examples/mliap/in.mliap.unified.hippynn.Al | 56 +++ examples/mliap/in.mliap.unified.hippynn.InP | 52 +++ examples/mliap/in.mliap.unified.lj.Ar | 35 ++ examples/mliap/pickle_mliap_unified_lj_Al.py | 21 ++ examples/mliap/pickle_mliap_unified_lj_Ar.py | 21 ++ python/lammps/mliap/loader.py | 64 +++- python/lammps/mliap/mliap_unified_abc.py | 23 ++ python/lammps/mliap/mliap_unified_lj.py | 35 ++ src/ML-IAP/mliap_data.cpp | 34 +- src/ML-IAP/mliap_data.h | 5 + src/ML-IAP/mliap_unified.cpp | 234 ++++++++++++ src/ML-IAP/mliap_unified.h | 69 ++++ src/ML-IAP/mliap_unifiedpy.pyx | 375 +++++++++++++++++++ src/ML-IAP/pair_mliap.cpp | 15 +- src/PYTHON/python_impl.cpp | 5 + src/library.cpp | 7 + src/library.h | 4 + 19 files changed, 1046 insertions(+), 34 deletions(-) create mode 100644 examples/mliap/InP.hippynn.mliap.unified create mode 100644 examples/mliap/in.mliap.unified.hippynn.Al create mode 100644 examples/mliap/in.mliap.unified.hippynn.InP create mode 100644 examples/mliap/in.mliap.unified.lj.Ar create mode 100644 examples/mliap/pickle_mliap_unified_lj_Al.py create mode 100644 examples/mliap/pickle_mliap_unified_lj_Ar.py create mode 100644 python/lammps/mliap/mliap_unified_abc.py create mode 100644 python/lammps/mliap/mliap_unified_lj.py create mode 100644 src/ML-IAP/mliap_unified.cpp create mode 100644 src/ML-IAP/mliap_unified.h create mode 100644 src/ML-IAP/mliap_unifiedpy.pyx diff --git a/cmake/Modules/Packages/ML-IAP.cmake b/cmake/Modules/Packages/ML-IAP.cmake index 63f91ba8d3..0e711cde8f 100644 --- a/cmake/Modules/Packages/ML-IAP.cmake +++ b/cmake/Modules/Packages/ML-IAP.cmake @@ -25,16 +25,18 @@ if(MLIAP_ENABLE_PYTHON) endif() set(MLIAP_BINARY_DIR ${CMAKE_BINARY_DIR}/cython) - set(MLIAP_CYTHON_SRC ${LAMMPS_SOURCE_DIR}/ML-IAP/mliap_model_python_couple.pyx) - get_filename_component(MLIAP_CYTHON_BASE ${MLIAP_CYTHON_SRC} NAME_WE) + file(GLOB MLIAP_CYTHON_SRC ${LAMMPS_SOURCE_DIR}/ML-IAP/*.pyx) file(MAKE_DIRECTORY ${MLIAP_BINARY_DIR}) - add_custom_command(OUTPUT ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.h - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MLIAP_CYTHON_SRC} ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx - COMMAND ${Cythonize_EXECUTABLE} -3 ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx - WORKING_DIRECTORY ${MLIAP_BINARY_DIR} - MAIN_DEPENDENCY ${MLIAP_CYTHON_SRC} - COMMENT "Generating C++ sources with cythonize...") + foreach(MLIAP_CYTHON_FILE ${MLIAP_CYTHON_SRC}) + get_filename_component(MLIAP_CYTHON_BASE ${MLIAP_CYTHON_FILE} NAME_WE) + add_custom_command(OUTPUT ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.h + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MLIAP_CYTHON_FILE} ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx + COMMAND ${Cythonize_EXECUTABLE} -3 ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.pyx + WORKING_DIRECTORY ${MLIAP_BINARY_DIR} + MAIN_DEPENDENCY ${MLIAP_CYTHON_FILE} + COMMENT "Generating C++ sources with cythonize...") + target_sources(lammps PRIVATE ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp) + endforeach() target_compile_definitions(lammps PRIVATE -DMLIAP_PYTHON) - target_sources(lammps PRIVATE ${MLIAP_BINARY_DIR}/${MLIAP_CYTHON_BASE}.cpp) target_include_directories(lammps PRIVATE ${MLIAP_BINARY_DIR}) endif() diff --git a/examples/mliap/InP.hippynn.mliap.unified b/examples/mliap/InP.hippynn.mliap.unified new file mode 100644 index 0000000000..cdd47d2ef7 --- /dev/null +++ b/examples/mliap/InP.hippynn.mliap.unified @@ -0,0 +1,5 @@ +# Definition of HIPNN potential + +# Specify MLIAP Unified pair style +pair_style mliap unified mliap_unified_hippynn_InP.pkl +pair_coeff * * In P diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al new file mode 100644 index 0000000000..e5c9496360 --- /dev/null +++ b/examples/mliap/in.mliap.unified.hippynn.Al @@ -0,0 +1,56 @@ +# Demonstrate MLIAP interface to HIPNN Al potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 4.05 +units metal + +# generate the box and atom positions using a FCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice fcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 26.981 + +# choose potential + +pair_style mliap unified mliap_unified_hippynn_Al.pkl +pair_coeff * * Al + +# Setup output + +compute eatom all pe/atom +compute energy all reduce sum c_eatom + +compute satom all stress/atom NULL +compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] +variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) + +thermo_style custom step temp epair c_energy etotal press v_press +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes + +#dump 4 all custom 1 forces.xyz fx fy fz + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} + diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP new file mode 100644 index 0000000000..ca1ebef23d --- /dev/null +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -0,0 +1,52 @@ +# Demonstrate MLIAP interface to HIPNN InP potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 5.83 +units metal + +# generate the box and atom positions using a FCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice diamond $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 2 box +create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 + +mass 1 114.76 +mass 2 30.98 + +# choose potential + +include InP.hippynn.mliap.unified + +#dump 4 all custom 1 forces.xyz fx fy fz + +#dump 3 all movie 1 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + + +# Setup output + +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar new file mode 100644 index 0000000000..a651623794 --- /dev/null +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -0,0 +1,35 @@ +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl +pair_coeff * * Ar 2.5 + +neighbor 0.3 bin +neigh_modify every 1 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 100 +run 25000 diff --git a/examples/mliap/pickle_mliap_unified_lj_Al.py b/examples/mliap/pickle_mliap_unified_lj_Al.py new file mode 100644 index 0000000000..8e07607bdc --- /dev/null +++ b/examples/mliap/pickle_mliap_unified_lj_Al.py @@ -0,0 +1,21 @@ +import pickle +import lammps +import lammps.mliap + +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ + + +if __name__ == '__main__': + unified = MLIAPUnifiedLJ() + unified.element_types = ["Al"] + unified.ndescriptors = 1 + unified.nparams = 3 + # Mimicking the LJ pair-style: + # pair_style lj/cut 2.5 + # pair_coeff * * 1 1 + unified.epsilon = 1.0 + unified.sigma = 2.5 + unified.rcutfac = 5.0 + + with open('mliap_unified_lj_Al.pkl', 'wb') as fp: + pickle.dump(unified, fp) diff --git a/examples/mliap/pickle_mliap_unified_lj_Ar.py b/examples/mliap/pickle_mliap_unified_lj_Ar.py new file mode 100644 index 0000000000..b210cc478f --- /dev/null +++ b/examples/mliap/pickle_mliap_unified_lj_Ar.py @@ -0,0 +1,21 @@ +import pickle +import lammps +import lammps.mliap + +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ + + +if __name__ == '__main__': + unified = MLIAPUnifiedLJ() + unified.element_types = ["Ar"] + unified.ndescriptors = 1 + unified.nparams = 3 + # Mimicking the LJ pair-style: + # pair_style lj/cut 2.5 + # pair_coeff * * 1 1 + unified.epsilon = 1.0 + unified.sigma = 1.0 + unified.rcutfac = 1.25 + + with open('mliap_unified_lj_Ar.pkl', 'wb') as fp: + pickle.dump(unified, fp) diff --git a/python/lammps/mliap/loader.py b/python/lammps/mliap/loader.py index dff791bfc1..e50ba8cb93 100644 --- a/python/lammps/mliap/loader.py +++ b/python/lammps/mliap/loader.py @@ -17,27 +17,58 @@ import sys +import importlib import importlib.util import importlib.machinery +import importlib.abc + +from ctypes import pythonapi, c_int, c_void_p, py_object + +# This dynamic loader imports a python module embedded in a shared library. +# The default value of api_version is 1013 because it has been stable since 2006. +class DynamicLoader(importlib.abc.Loader): + def __init__(self,module_name,library,api_version=1013): + self.api_version = api_version + + attr = "PyInit_"+module_name + initfunc = getattr(library,attr) + # c_void_p is standin for PyModuleDef * + initfunc.restype = c_void_p + initfunc.argtypes = () + self.module_def = initfunc() + + def create_module(self, spec): + createfunc = pythonapi.PyModule_FromDefAndSpec2 + # c_void_p is standin for PyModuleDef * + createfunc.argtypes = c_void_p, py_object, c_int + createfunc.restype = py_object + module = createfunc(self.module_def, spec, self.api_version) + return module + + def exec_module(self, module): + execfunc = pythonapi.PyModule_ExecDef + # c_void_p is standin for PyModuleDef * + execfunc.argtypes = py_object, c_void_p + execfunc.restype = c_int + result = execfunc(module, self.module_def) + if result<0: + raise ImportError() def activate_mliappy(lmp): try: - # Begin Importlib magic to find the embedded python module - # This is needed because the filename for liblammps does not - # match the spec for normal python modules, wherein - # file names match with PyInit function names. - # Also, python normally doesn't look for extensions besides '.so' - # We fix both of these problems by providing an explict - # path to the extension module 'mliap_model_python_couple' in - - path = lmp.lib._name - loader = importlib.machinery.ExtensionFileLoader('mliap_model_python_couple', path) - spec = importlib.util.spec_from_loader('mliap_model_python_couple', loader) - module = importlib.util.module_from_spec(spec) - sys.modules['mliap_model_python_couple'] = module - spec.loader.exec_module(module) - # End Importlib magic to find the embedded python module - + library = lmp.lib + module_names = ["mliap_model_python_couple", "mliap_unifiedpy"] + api_version = library.lammps_PYTHON_API_VERSION() + + for module_name in module_names: + # Make Machinery + loader = DynamicLoader(module_name,library,api_version) + spec = importlib.util.spec_from_loader(module_name,loader) + + # Do the import + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) except Exception as ee: raise ImportError("Could not load ML-IAP python coupling module.") from ee @@ -49,4 +80,3 @@ def load_model(model): "the pair style. Call lammps.mliap.activate_mliappy(lmp)." ) from ie mliap_model_python_couple.load_from_python(model) - diff --git a/python/lammps/mliap/mliap_unified_abc.py b/python/lammps/mliap/mliap_unified_abc.py new file mode 100644 index 0000000000..f5751b14f2 --- /dev/null +++ b/python/lammps/mliap/mliap_unified_abc.py @@ -0,0 +1,23 @@ +from abc import ABC, abstractmethod + +class MLIAPUnified(ABC): + """Abstract base class for MLIAPUnified.""" + + def __init__(self): + self.interface = None + self.element_types = None + self.ndescriptors = None + self.nparams = None + self.rcutfac = None + + @abstractmethod + def compute_gradients(self, data): + """Compute gradients.""" + + @abstractmethod + def compute_descriptors(self, data): + """Compute descriptors.""" + + @abstractmethod + def compute_forces(self, data): + """Compute forces.""" diff --git a/python/lammps/mliap/mliap_unified_lj.py b/python/lammps/mliap/mliap_unified_lj.py new file mode 100644 index 0000000000..62892c93bf --- /dev/null +++ b/python/lammps/mliap/mliap_unified_lj.py @@ -0,0 +1,35 @@ +from .mliap_unified_abc import MLIAPUnified +import numpy as np + + +class MLIAPUnifiedLJ(MLIAPUnified): + """Test implementation for MLIAPUnified.""" + + def __init__(self): + super().__init__() + + def compute_gradients(self, data): + """Test compute_gradients.""" + + def compute_descriptors(self, data): + """Test compute_descriptors.""" + + def compute_forces(self, data): + """Test compute_forces.""" + eij, fij = self.compute_pair_ef(data) + data.update_pair_energy(eij) + data.update_pair_forces(fij) + + def compute_pair_ef(self, data): + rij = data.rij + + r2inv = 1.0 / np.sum(rij ** 2, axis=1) + r6inv = r2inv * r2inv * r2inv + + lj1 = 4.0 * self.epsilon * self.sigma**12 + lj2 = 4.0 * self.epsilon * self.sigma**6 + + eij = r6inv * (lj1 * r6inv - lj2) + fij = r6inv * (3.0 * lj2 - 6.0 * lj2 * r6inv) * r2inv + fij = fij[:, np.newaxis] * rij + return eij, fij diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index e96e87ba11..7b17f62c6f 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -31,12 +31,14 @@ MLIAPData::MLIAPData(LAMMPS *lmp, int gradgradflag_in, int *map_in, class MLIAPModel* model_in, class MLIAPDescriptor* descriptor_in, class PairMLIAP* pairmliap_in) : - Pointers(lmp), gradforce(nullptr), betas(nullptr), + Pointers(lmp), f(nullptr), gradforce(nullptr), betas(nullptr), descriptors(nullptr), eatoms(nullptr), gamma(nullptr), gamma_row_index(nullptr), gamma_col_index(nullptr), egradient(nullptr), - numneighs(nullptr), iatoms(nullptr), ielems(nullptr), jatoms(nullptr), jelems(nullptr), - rij(nullptr), graddesc(nullptr), model(nullptr), descriptor(nullptr), list(nullptr) + numneighs(nullptr), iatoms(nullptr), pair_i(nullptr), ielems(nullptr), + jatoms(nullptr), jelems(nullptr), elems(nullptr), rij(nullptr), + graddesc(nullptr), model(nullptr), descriptor(nullptr), list(nullptr) { + f = atom->f; gradgradflag = gradgradflag_in; map = map_in; model = model_in; @@ -85,10 +87,12 @@ MLIAPData::~MLIAPData() memory->destroy(gradforce); memory->destroy(iatoms); + memory->destroy(pair_i); memory->destroy(ielems); memory->destroy(numneighs); memory->destroy(jatoms); memory->destroy(jelems); + memory->destroy(elems); memory->destroy(rij); memory->destroy(graddesc); } @@ -110,25 +114,32 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i double **x = atom->x; int *type = atom->type; + nlocal = atom->nlocal; + nghost = atom->nghost; + ntotal = nlocal + nghost; + int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - // grow nmax gradforce array if necessary + // grow nmax gradforce, elems arrays if necessary if (atom->nmax > nmax) { nmax = atom->nmax; memory->grow(gradforce,nmax,size_gradforce, "MLIAPData:gradforce"); + memory->grow(elems,nmax,"MLIAPData:elems"); } - // clear gradforce array + // clear gradforce, elems arrays int nall = atom->nlocal + atom->nghost; - for (int i = 0; i < nall; i++) + for (int i = 0; i < nall; i++) { for (int j = 0; j < size_gradforce; j++) { gradforce[i][j] = 0.0; } + elems[i] = 0; + } // grow arrays if necessary @@ -153,6 +164,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i grow_neigharrays(); + npairs = 0; int ij = 0; for (int ii = 0; ii < nlistatoms; ii++) { const int i = ilist[ii]; @@ -178,6 +190,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i const int jelem = map[jtype]; if (rsq < descriptor->cutsq[ielem][jelem]) { + pair_i[ij] = i; jatoms[ij] = j; jelems[ij] = jelem; rij[ij][0] = delx; @@ -190,6 +203,12 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i iatoms[ii] = i; ielems[ii] = ielem; numneighs[ii] = ninside; + npairs += ninside; + } + + for (int i = 0; i < nall; i++) { + const int itype = type[i]; + elems[i] = map[itype]; } eflag = eflag_in; @@ -249,6 +268,7 @@ void MLIAPData::grow_neigharrays() } if (nneigh_max < nneigh) { + memory->grow(pair_i,nneigh,"MLIAPData:pair_i"); memory->grow(jatoms,nneigh,"MLIAPData:jatoms"); memory->grow(jelems,nneigh,"MLIAPData:jelems"); memory->grow(rij,nneigh,3,"MLIAPData:rij"); @@ -264,6 +284,7 @@ double MLIAPData::memory_usage() bytes += (double)nelements*nparams*sizeof(double); // egradient bytes += (double)nmax*size_gradforce*sizeof(double); // gradforce + bytes += (double)nmax*sizeof(int); // elems if (gradgradflag == 1) { bytes += (double)natomgamma_max* @@ -282,6 +303,7 @@ double MLIAPData::memory_usage() bytes += (double)natomneigh_max*sizeof(int); // ielems bytes += (double)natomneigh_max*sizeof(int); // numneighs + bytes += (double)nneigh_max*sizeof(int); // pair_i bytes += (double)nneigh_max*sizeof(int); // jatoms bytes += (double)nneigh_max*sizeof(int); // jelems bytes += (double)nneigh_max*3*sizeof(double); // rij" diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index 258261fa1a..88bf4e4797 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -35,6 +35,7 @@ class MLIAPData : protected Pointers { int size_gradforce; int yoffset, zoffset; int ndims_force, ndims_virial; + double **f; double **gradforce; double **betas; // betas for all atoms in list double **descriptors; // descriptors for all atoms in list @@ -56,15 +57,19 @@ class MLIAPData : protected Pointers { // data structures for mliap neighbor list // only neighbors strictly inside descriptor cutoff + int nlocal, nghost, ntotal; // # of owned and ghost atoms on this proc, and sum of both int nlistatoms; // current number of atoms in neighborlist int nlistatoms_max; // allocated size of descriptor array int natomneigh_max; // allocated size of atom neighbor arrays int *numneighs; // neighbors count for each atom int *iatoms; // index of each atom + int *pair_i; // index of each i atom for each ij pair int *ielems; // element of each atom int nneigh_max; // number of ij neighbors allocated + int npairs; // number of ij neighbor pairs int *jatoms; // index of each neighbor int *jelems; // element of each neighbor + int *elems; // element of each atom in or not in the neighborlist double **rij; // distance vector of each neighbor double ***graddesc; // descriptor gradient w.r.t. each neighbor int eflag; // indicates if energy is needed diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp new file mode 100644 index 0000000000..e424739145 --- /dev/null +++ b/src/ML-IAP/mliap_unified.cpp @@ -0,0 +1,234 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Steven Ray Anaya (LANL) +------------------------------------------------------------------------- */ +#ifdef MLIAP_PYTHON + +#include +#include "mliap_unified.h" + +#include "error.h" +#include "memory.h" +#include "lmppython.h" +#include "mliap_data.h" +#include "mliap_unifiedpy.h" +#include "pair_mliap.h" +#include "python_compat.h" +#include "utils.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *lmp) : + MLIAPDescriptor(lmp) {} + +MLIAPDummyDescriptor::~MLIAPDummyDescriptor() { + memory->destroy(radelem); + memory->destroy(cutsq); + Py_DECREF(unified_interface); +} + +void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) { + PyGILState_STATE gstate = PyGILState_Ensure(); + compute_descriptors_python(unified_interface, data); + if (PyErr_Occurred()) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Running mliappy unified compute_descriptors failure."); + } + PyGILState_Release(gstate); +} + +void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) { + PyGILState_STATE gstate = PyGILState_Ensure(); + compute_forces_python(unified_interface, data); + if (PyErr_Occurred()) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Running mliappy unified compute_forces failure."); + } + PyGILState_Release(gstate); +} + +void MLIAPDummyDescriptor::compute_force_gradients(class MLIAPData *) { + error->all(FLERR, "compute_force_gradients not implemented"); +} + +void MLIAPDummyDescriptor::compute_descriptor_gradients(class MLIAPData *) { + error->all(FLERR, "compute_descriptor_gradients not implemented"); +} + +void MLIAPDummyDescriptor::init() { + memory->create(radelem, nelements, "mliap_dummy_descriptor:radelem"); + for (int ielem = 0; ielem < nelements; ielem++) { + radelem[ielem] = 1; + } + + double cut; + cutmax = 0.0; + memory->create(cutsq, nelements, nelements, "mliap/descriptor/dummy:cutsq"); + for (int ielem = 0; ielem < nelements; ielem++) { + // rcutfac set from python, is global cutoff for all elements + cut = 2.0*radelem[ielem]*rcutfac; + if (cut > cutmax) cutmax = cut; + cutsq[ielem][ielem] = cut*cut; + for (int jelem = ielem+1; jelem < nelements; jelem++) { + cut = (radelem[ielem]+radelem[jelem])*rcutfac; + cutsq[ielem][jelem] = cutsq[jelem][ielem] = cut*cut; + } + } +} + +void MLIAPDummyDescriptor::set_elements(char **elems, int nelems) { + nelements = nelems; + elements = new char*[nelems]; + for (int i = 0; i < nelems; i++) { + elements[i] = utils::strdup(elems[i]); + } +} + +/* ---------------------------------------------------------------------- */ + +MLIAPDummyModel::MLIAPDummyModel(LAMMPS *lmp, char *coefffilename) : + MLIAPModel(lmp, coefffilename) { + nonlinearflag = 1; +} + +MLIAPDummyModel::~MLIAPDummyModel() { + // MLIAPPY_unload_model(this); + Py_DECREF(unified_interface); +} + +int MLIAPDummyModel::get_nparams() { + return nparams; +} + +int MLIAPDummyModel::get_gamma_nnz(class MLIAPData *) { + // TODO: get_gamma_nnz + return 0; +} + +void MLIAPDummyModel::compute_gradients(class MLIAPData *data) { + PyGILState_STATE gstate = PyGILState_Ensure(); + compute_gradients_python(unified_interface, data); + if (PyErr_Occurred()) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Running mliappy unified compute_gradients failure."); + } + PyGILState_Release(gstate); +} + +void MLIAPDummyModel::compute_gradgrads(class MLIAPData *) { + error->all(FLERR, "compute_gradgrads not implemented"); +} + +void MLIAPDummyModel::compute_force_gradients(class MLIAPData *) { + error->all(FLERR, "compute_force_gradients not implemented"); +} + +double MLIAPDummyModel::memory_usage() { + // TODO: implement memory usage in Cython(?) + return 0; +} + +void MLIAPDummyModel::read_coeffs(char *) { + error->all(FLERR, "read_coeffs not implemented"); +} + +/* ---------------------------------------------------------------------- */ + +MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *data, LAMMPS *lmp, + char *coefffilename) { + lmp->python->init(); + PyGILState_STATE gstate = PyGILState_Ensure(); + + PyObject *pyMain = PyImport_AddModule("__main__"); + + if (!pyMain) { + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Could not initialize embedded Python"); + } + + PyObject *unified_module = PyImport_ImportModule("mliap_unifiedpy"); + + if (!unified_module) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Loading mliappy unified module failure."); + } + + // Connect dummy model, dummy descriptor, data to Python unified + MLIAPDummyModel *model = new MLIAPDummyModel(lmp, coefffilename); + MLIAPDummyDescriptor *descriptor = new MLIAPDummyDescriptor(lmp); + + PyObject *unified_interface = mliap_unified_connect(unified_fname, model, descriptor); + if (PyErr_Occurred()) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + lmp->error->all(FLERR, "Running mliappy unified module failure."); + } + + model->unified_interface = unified_interface; + Py_INCREF(unified_interface); + descriptor->unified_interface = unified_interface; + Py_INCREF(unified_interface); + + PyGILState_Release(gstate); + + MLIAPBuildUnified_t build = {data, descriptor, model}; + return build; +} + +/* ---------------------------------------------------------------------- */ + +void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { + double e_total = 0; + for (int ii = 0; ii < data->nlistatoms; ii++) + data->eatoms[ii] = 0; + + for (int ii = 0; ii < data->npairs; ii++) { + int i = data->pair_i[ii]; + double e = 0.5 * eij[ii]; + + data->eatoms[i] += e; + e_total += e; + } + data->energy = e_total; +} + +void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { + double **f = data->f; + for (int ii = 0; ii < data->npairs; ii++) { + int ii3 = ii * 3; + int i = data->pair_i[ii]; + int j = data->jatoms[ii]; + + f[i][0] += fij[ii3]; + f[i][1] += fij[ii3 + 1]; + f[i][2] += fij[ii3 + 2]; + f[j][0] -= fij[ii3]; + f[j][1] -= fij[ii3 + 1]; + f[j][2] -= fij[ii3 + 2]; + } +} + +#endif diff --git a/src/ML-IAP/mliap_unified.h b/src/ML-IAP/mliap_unified.h new file mode 100644 index 0000000000..cf39165353 --- /dev/null +++ b/src/ML-IAP/mliap_unified.h @@ -0,0 +1,69 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef LMP_MLIAP_UNIFIED_H +#define LMP_MLIAP_UNIFIED_H + +#include "mliap_data.h" +#include "mliap_descriptor.h" +#include "mliap_model.h" + +#include + +namespace LAMMPS_NS { + +class MLIAPDummyDescriptor : public MLIAPDescriptor { + public: + MLIAPDummyDescriptor(LAMMPS *); + ~MLIAPDummyDescriptor(); + virtual void compute_descriptors(class MLIAPData *); + virtual void compute_forces(class MLIAPData *); + virtual void compute_force_gradients(class MLIAPData *); + virtual void compute_descriptor_gradients(class MLIAPData *); + virtual void init(); + void set_elements(char **, int); + + PyObject *unified_interface; + double rcutfac; +}; + +class MLIAPDummyModel : public MLIAPModel { + public: + MLIAPDummyModel(LAMMPS *, char * = NULL); + ~MLIAPDummyModel(); + virtual int get_nparams(); + virtual int get_gamma_nnz(class MLIAPData *); + virtual void compute_gradients(class MLIAPData *); + virtual void compute_gradgrads(class MLIAPData *); + virtual void compute_force_gradients(class MLIAPData *); + virtual double memory_usage(); + + PyObject *unified_interface; + + protected: + virtual void read_coeffs(char *); +}; + +struct MLIAPBuildUnified_t { + MLIAPData *data; + MLIAPDummyDescriptor *descriptor; + MLIAPDummyModel *model; +}; + +MLIAPBuildUnified_t build_unified(char *, MLIAPData *, LAMMPS *, char * = NULL); +void update_pair_energy(MLIAPData *, double *); +void update_pair_forces(MLIAPData *, double *); + +} // namespace LAMMPS_NS + +#endif diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unifiedpy.pyx new file mode 100644 index 0000000000..459052abf7 --- /dev/null +++ b/src/ML-IAP/mliap_unifiedpy.pyx @@ -0,0 +1,375 @@ +# cython: language_level=3 +# distutils: language = c++ + +import pickle +import numpy as np +import lammps.mliap + +cimport cython +from cpython.ref cimport PyObject +from libc.stdlib cimport malloc, free + + +cdef extern from "../lammps.h" namespace "LAMMPS_NS": + cdef cppclass LAMMPS: + pass + + +cdef extern from "mliap_data.h" namespace "LAMMPS_NS": + cdef cppclass MLIAPData: + # ----- may not need ----- + int size_array_rows + int size_array_cols + int natoms + int yoffset + int zoffset + int ndims_force + int ndims_virial + # -END- may not need -END- + int size_gradforce + # ----- write only ----- + double ** f + double ** gradforce + double ** betas # betas for all atoms in list + double ** descriptors # descriptors for all atoms in list + double * eatoms # energies for all atoms in list + double energy + # -END- write only -END- + int ndescriptors # number of descriptors + int nparams # number of model parameters per element + int nelements # number of elements + + # data structures for grad-grad list (gamma) + + # ----- ignore for now ----- + int gamma_nnz # number of non-zero entries in gamma + double ** gamma # gamma element + int ** gamma_row_index # row (parameter) index + int ** gamma_col_index # column (descriptor) index + double * egradient # energy gradient w.r.t. parameters + # -END- ignore for now -END- + + # data structures for mliap neighbor list + # only neighbors strictly inside descriptor cutoff + + int nlocal + int nghost + int ntotal + int * elems + int nlistatoms # current number of atoms in neighborlist + int * numneighs # neighbors count for each atom + int * iatoms # index of each atom + int * pair_i # index of each i atom for each ij pair + int * ielems # element of each atom + int nneigh_max # number of ij neighbors allocated + int npairs # number of ij neighbor pairs + int * jatoms # index of each neighbor + int * jelems # element of each neighbor + double ** rij # distance vector of each neighbor + # ----- write only ----- + double *** graddesc # descriptor gradient w.r.t. each neighbor + # -END- write only -END- + int eflag # indicates if energy is needed + int vflag # indicates if virial is needed + + +cdef extern from "mliap_unified.h" namespace "LAMMPS_NS": + cdef cppclass MLIAPDummyDescriptor: + MLIAPDummyDescriptor(PyObject *, LAMMPS *) + int ndescriptors # number of descriptors + int nelements # # of unique elements + char **elements # names of unique elements + double cutmax # maximum cutoff needed + double rcutfac + double *radelem # element radii + + void compute_descriptors(MLIAPData *) + void compute_forces(MLIAPData *) + void set_elements(char **, int) + + cdef cppclass MLIAPDummyModel: + MLIAPDummyModel(PyObject *, LAMMPS *, char * = NULL) + int ndescriptors # number of descriptors + int nparams # number of parameters per element + int nelements; # # of unique elements + + void compute_gradients(MLIAPData *) + + cdef void update_pair_energy(MLIAPData *, double *) + cdef void update_pair_forces(MLIAPData *, double *) + + +# @property sans getter +def write_only_property(fset): + return property(fget=None, fset=fset) + + +cdef class MLIAPDataPy: + cdef MLIAPData * data + + def __cinit__(self): + self.data = NULL + + def update_pair_energy(self, eij): + cdef double[:] eij_arr = eij + update_pair_energy(self.data, &eij_arr[0]) + + def update_pair_forces(self, fij): + cdef double[:, ::1] fij_arr = fij + update_pair_forces(self.data, &fij_arr[0][0]) + + @property + def f(self): + if self.data.f is NULL: + return None + return np.asarray( &self.data.f[0][0]) + + @property + def size_gradforce(self): + return self.data.size_gradforce + + @write_only_property + def gradforce(self, value): + if self.data.gradforce is NULL: + raise ValueError("attempt to set NULL gradforce") + cdef double[:, :] gradforce_view = &self.data.gradforce[0][0] + cdef double[:, :] value_view = value + gradforce_view[:] = value_view + + @write_only_property + def betas(self, value): + if self.data.betas is NULL: + raise ValueError("attempt to set NULL betas") + cdef double[:, :] betas_view = &self.data.betas[0][0] + cdef double[:, :] value_view = value + betas_view[:] = value_view + + @write_only_property + def descriptors(self, value): + if self.data.descriptors is NULL: + raise ValueError("attempt to set NULL descriptors") + cdef double[:, :] descriptors_view = &self.data.descriptors[0][0] + cdef double[:, :] value_view = value + descriptors_view[:] = value_view + + @write_only_property + def eatoms(self, value): + if self.data.eatoms is NULL: + raise ValueError("attempt to set NULL eatoms") + cdef double[:] eatoms_view = &self.data.eatoms[0] + cdef double[:] value_view = value + eatoms_view[:] = value_view + + @write_only_property + def energy(self, value): + self.data.energy = value + + @property + def ndescriptors(self): + return self.data.ndescriptors + + @property + def nparams(self): + return self.data.nparams + + @property + def nelements(self): + return self.data.nelements + + # data structures for grad-grad list (gamma) + + @property + def gamma_nnz(self): + return self.data.gamma_nnz + + @property + def gamma(self): + if self.data.gamma is NULL: + return None + return np.asarray( &self.data.gamma[0][0]) + + @property + def gamma_row_index(self): + if self.data.gamma_row_index is NULL: + return None + return np.asarray( &self.data.gamma_row_index[0][0]) + + @property + def gamma_col_index(self): + if self.data.gamma_col_index is NULL: + return None + return np.asarray( &self.data.gamma_col_index[0][0]) + + @property + def egradient(self): + if self.data.egradient is NULL: + return None + return np.asarray( &self.data.egradient[0]) + + # data structures for mliap neighbor list + # only neighbors strictly inside descriptor cutoff + + @property + def nlocal(self): + return self.data.nlocal + + @property + def nghost(self): + return self.data.nghost + + @property + def ntotal(self): + return self.data.ntotal + + @property + def elems(self): + if self.data.elems is NULL: + return None + return np.asarray( &self.data.elems[0]) + + @property + def nlistatoms(self): + return self.data.nlistatoms + + @property + def numneighs(self): + if self.data.numneighs is NULL: + return None + return np.asarray( &self.data.numneighs[0]) + + @property + def iatoms(self): + if self.data.iatoms is NULL: + return None + return np.asarray( &self.data.iatoms[0]) + + @property + def pair_i(self): + if self.data.pair_i is NULL: + return None + return np.asarray( &self.data.pair_i[0]) + + @property + def ielems(self): + if self.data.ielems is NULL: + return None + return np.asarray( &self.data.ielems[0]) + + @property + def npairs(self): + return self.data.npairs + + @property + def jatoms(self): + if self.data.jatoms is NULL: + return None + return np.asarray( &self.data.jatoms[0]) + + @property + def pair_j(self): + return self.jatoms + + @property + def jelems(self): + if self.data.jelems is NULL: + return None + return np.asarray( &self.data.jelems[0]) + + @property + def rij(self): + if self.data.rij is NULL: + return None + return np.asarray( &self.data.rij[0][0]) + + @write_only_property + def graddesc(self, value): + if self.data.graddesc is NULL: + raise ValueError("attempt to set NULL graddesc") + cdef double[:, :, :] graddesc_view = &self.data.graddesc[0][0][0] + cdef double[:, :, :] value_view = value + graddesc_view[:] = value_view + + @property + def eflag(self): + return self.data.eflag + + @property + def vflag(self): + return self.data.vflag + + +cdef class MLIAPUnifiedInterface: + cdef MLIAPDummyModel * model + cdef MLIAPDummyDescriptor * descriptor + cdef unified_impl + + def __init__(self, unified_impl): + self.model = NULL + self.descriptor = NULL + self.unified_impl = unified_impl + + def compute_gradients(self, data): + self.unified_impl.compute_gradients(data) + + def compute_descriptors(self, data): + self.unified_impl.compute_descriptors(data) + + def compute_forces(self, data): + self.unified_impl.compute_forces(data) + + +cdef public void compute_gradients_python(unified_int, MLIAPData *data) with gil: + pydata = MLIAPDataPy() + pydata.data = data + unified_int.compute_gradients(pydata) + + +cdef public void compute_descriptors_python(unified_int, MLIAPData *data) with gil: + pydata = MLIAPDataPy() + pydata.data = data + unified_int.compute_descriptors(pydata) + + +cdef public void compute_forces_python(unified_int, MLIAPData *data) with gil: + pydata = MLIAPDataPy() + pydata.data = data + unified_int.compute_forces(pydata) + + +cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, + MLIAPDummyDescriptor * descriptor) with gil: + str_fname = fname.decode('utf-8') + with open(str_fname, 'rb') as pfile: + unified = pickle.load(pfile) + + unified_int = MLIAPUnifiedInterface(unified) + unified_int.model = model + unified_int.descriptor = descriptor + + unified.interface = unified_int + + if unified.ndescriptors is None: + raise ValueError("no descriptors set") + + unified_int.descriptor.ndescriptors = unified.ndescriptors + unified_int.descriptor.rcutfac = unified.rcutfac + unified_int.model.ndescriptors = unified.ndescriptors + unified_int.model.nparams = unified.nparams + + if unified.element_types is None: + raise ValueError("no element type set") + + cdef int nelements = len(unified.element_types) + cdef char **elements = malloc(nelements * sizeof(char*)) + if not elements: + raise MemoryError("failed to allocate memory for element names") + cdef char *elem_name + for i, elem in enumerate(unified.element_types): + elem_name_bytes = elem.encode('UTF-8') + elem_name = elem_name_bytes + elements[i] = &elem_name[0] + unified_int.descriptor.set_elements(elements, nelements) + unified_int.model.nelements = nelements + + free(elements) + return unified_int diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 179649caff..ba1f147c13 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -25,6 +25,7 @@ #include "mliap_model_nn.h" #include "mliap_model_quadratic.h" #ifdef MLIAP_PYTHON +#include "mliap_unified.h" #include "mliap_model_python.h" #endif @@ -93,11 +94,11 @@ void PairMLIAP::compute(int eflag, int vflag) // compute E_i and beta_i = dE_i/dB_i for all i in list model->compute_gradients(data); - e_tally(data); // calculate force contributions beta_i*dB_i/dR_j descriptor->compute_forces(data); + e_tally(data); // calculate stress @@ -124,7 +125,7 @@ void PairMLIAP::allocate() void PairMLIAP::settings(int narg, char ** arg) { - if (narg < 4) + if (narg < 2) error->all(FLERR,"Illegal pair_style command"); // set flags for required keywords @@ -174,6 +175,16 @@ void PairMLIAP::settings(int narg, char ** arg) } else error->all(FLERR,"Illegal pair_style mliap command"); descriptorflag = 1; +#ifdef MLIAP_PYTHON + } else if (strcmp(arg[iarg], "unified") == 0) { + if (iarg+1 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + MLIAPBuildUnified_t build = build_unified(arg[iarg+1], data, lmp); + model = build.model; + descriptor = build.descriptor; + modelflag = 1; + descriptorflag = 1; + iarg += 2; +#endif } else error->all(FLERR,"Illegal pair_style mliap command"); } diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index bc593d5b8a..f15bb833ce 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -29,10 +29,12 @@ #ifdef MLIAP_PYTHON #include "mliap_model_python.h" +#include "mliap_unified.h" // The above should somehow really be included in the next file. // We could get around this with cython --capi-reexport-cincludes // However, that exposes -too many- headers. #include "mliap_model_python_couple.h" +#include "mliap_unifiedpy.h" #endif using namespace LAMMPS_NS; @@ -66,6 +68,9 @@ PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) // This -must- happen before python is initialized. int err = PyImport_AppendInittab("mliap_model_python_couple", PyInit_mliap_model_python_couple); if (err) error->all(FLERR, "Could not register MLIAPPY embedded python module."); + + err = PyImport_AppendInittab("mliap_unifiedpy", PyInit_mliap_unifiedpy); + if (err) error->all(FLERR, "Could not register MLIAPPY unified embedded python module."); #endif Py_Initialize(); diff --git a/src/library.cpp b/src/library.cpp index c2ae52a809..01af4897af 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -5576,6 +5576,13 @@ int lammps_get_last_error_message(void *handle, char *buffer, int buf_size) { return 0; } +#ifdef LMP_PYTHON +#include +int lammps_PYTHON_API_VERSION(){ + return PYTHON_API_VERSION; +} +#endif + // Local Variables: // fill-column: 72 // End: diff --git a/src/library.h b/src/library.h index 94fd7f7380..d62323a15c 100644 --- a/src/library.h +++ b/src/library.h @@ -256,6 +256,10 @@ void lammps_force_timeout(void *handle); int lammps_has_error(void *handle); int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +#ifdef LMP_PYTHON +int lammps_PYTHON_API_VERSION(); +#endif + #ifdef __cplusplus } #endif From f909d7760da0d2c1dfac1653d6b1f9217d7c4bad Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 15 Apr 2022 14:29:58 -0600 Subject: [PATCH 005/364] Remove deprecated LJ Aluminum example --- examples/mliap/pickle_mliap_unified_lj_Al.py | 21 -------------------- 1 file changed, 21 deletions(-) delete mode 100644 examples/mliap/pickle_mliap_unified_lj_Al.py diff --git a/examples/mliap/pickle_mliap_unified_lj_Al.py b/examples/mliap/pickle_mliap_unified_lj_Al.py deleted file mode 100644 index 8e07607bdc..0000000000 --- a/examples/mliap/pickle_mliap_unified_lj_Al.py +++ /dev/null @@ -1,21 +0,0 @@ -import pickle -import lammps -import lammps.mliap - -from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ - - -if __name__ == '__main__': - unified = MLIAPUnifiedLJ() - unified.element_types = ["Al"] - unified.ndescriptors = 1 - unified.nparams = 3 - # Mimicking the LJ pair-style: - # pair_style lj/cut 2.5 - # pair_coeff * * 1 1 - unified.epsilon = 1.0 - unified.sigma = 2.5 - unified.rcutfac = 5.0 - - with open('mliap_unified_lj_Al.pkl', 'wb') as fp: - pickle.dump(unified, fp) From 3045f1d3cbf5fad3fa44c32b3f890d33c9a783cb Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 13 May 2022 14:45:44 -0600 Subject: [PATCH 006/364] Add pickle method to base class --- python/lammps/mliap/mliap_unified_abc.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/lammps/mliap/mliap_unified_abc.py b/python/lammps/mliap/mliap_unified_abc.py index f5751b14f2..3243df85c4 100644 --- a/python/lammps/mliap/mliap_unified_abc.py +++ b/python/lammps/mliap/mliap_unified_abc.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +import pickle class MLIAPUnified(ABC): """Abstract base class for MLIAPUnified.""" @@ -21,3 +22,7 @@ class MLIAPUnified(ABC): @abstractmethod def compute_forces(self, data): """Compute forces.""" + + def pickle(self, fname): + with open(fname, 'wb') as fp: + pickle.dump(self, fp) From 99cd9d026b3fa312f31cdbbe74849177178b0a84 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 13 May 2022 14:49:30 -0600 Subject: [PATCH 007/364] Fix thermo, run of unified LJ script --- examples/mliap/in.mliap.unified.lj.Ar | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index a651623794..35808ba8b9 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -31,5 +31,5 @@ fix 1 all nve #dump 4 all custom 1 forces.xyz fx fy fz -thermo 100 -run 25000 +thermo 50 +run 250 From 0382fc00c85a60d7c9404c974686a1ce5220bc9b Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 13 May 2022 14:49:56 -0600 Subject: [PATCH 008/364] Update unified LJ pickle script --- examples/mliap/in.mliap.unified.lj.Ar | 2 +- examples/mliap/pickle_mliap_unified_lj_Ar.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 35808ba8b9..72fe2f8523 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -12,7 +12,7 @@ mass 1 1.0 velocity all create 3.0 87287 loop geom pair_style mliap unified mliap_unified_lj_Ar.pkl -pair_coeff * * Ar 2.5 +pair_coeff * * Ar neighbor 0.3 bin neigh_modify every 1 delay 0 check no diff --git a/examples/mliap/pickle_mliap_unified_lj_Ar.py b/examples/mliap/pickle_mliap_unified_lj_Ar.py index b210cc478f..c7a16b44a7 100644 --- a/examples/mliap/pickle_mliap_unified_lj_Ar.py +++ b/examples/mliap/pickle_mliap_unified_lj_Ar.py @@ -1,4 +1,3 @@ -import pickle import lammps import lammps.mliap @@ -17,5 +16,4 @@ if __name__ == '__main__': unified.sigma = 1.0 unified.rcutfac = 1.25 - with open('mliap_unified_lj_Ar.pkl', 'wb') as fp: - pickle.dump(unified, fp) + unified.pickle('mliap_unified_lj_Ar.pkl') From 0b3c7514fabb648f96e8a5a238bbc9d93e6f4784 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 20 May 2022 11:07:06 -0600 Subject: [PATCH 009/364] Implement second interaction layer (ghost neighs) --- src/ML-IAP/mliap_descriptor.h | 1 + src/ML-IAP/mliap_unified.cpp | 3 +++ src/ML-IAP/pair_mliap.cpp | 22 +++++++++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/ML-IAP/mliap_descriptor.h b/src/ML-IAP/mliap_descriptor.h index 156f8d1e92..dd5e4e06a3 100644 --- a/src/ML-IAP/mliap_descriptor.h +++ b/src/ML-IAP/mliap_descriptor.h @@ -33,6 +33,7 @@ class MLIAPDescriptor : protected Pointers { int nelements; // # of unique elements char **elements; // names of unique elements double **cutsq; // nelem x nelem rcutsq values + double **cutghost; // cutoff for each ghost pair double cutmax; // maximum cutoff needed double *radelem; // element radii double *wjelem; // elements weights diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index e424739145..64758c7cb1 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -82,14 +82,17 @@ void MLIAPDummyDescriptor::init() { double cut; cutmax = 0.0; memory->create(cutsq, nelements, nelements, "mliap/descriptor/dummy:cutsq"); + memory->create(cutghost, nelements, nelements, "mliap/descriptor/dummy:cutghost"); for (int ielem = 0; ielem < nelements; ielem++) { // rcutfac set from python, is global cutoff for all elements cut = 2.0*radelem[ielem]*rcutfac; if (cut > cutmax) cutmax = cut; cutsq[ielem][ielem] = cut*cut; + cutghost[ielem][ielem] = cut*cut; for (int jelem = ielem+1; jelem < nelements; jelem++) { cut = (radelem[ielem]+radelem[jelem])*rcutfac; cutsq[ielem][jelem] = cutsq[jelem][ielem] = cut*cut; + cutghost[ielem][jelem] = cutghost[jelem][ielem] = cut*cut; } } } diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index ba1f147c13..0b8880aded 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -34,6 +34,7 @@ #include "force.h" #include "memory.h" #include "neighbor.h" +#include "neigh_request.h" #include #include @@ -65,6 +66,7 @@ PairMLIAP::~PairMLIAP() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); + memory->destroy(cutghost); memory->destroy(map); } } @@ -116,6 +118,7 @@ void PairMLIAP::allocate() memory->create(setflag,n+1,n+1,"pair:setflag"); memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutghost,n+1,n+1,"pair:cutghost"); memory->create(map,n+1,"pair:map"); } @@ -177,13 +180,22 @@ void PairMLIAP::settings(int narg, char ** arg) descriptorflag = 1; #ifdef MLIAP_PYTHON } else if (strcmp(arg[iarg], "unified") == 0) { + MLIAPBuildUnified_t build; if (iarg+1 > narg) error->all(FLERR,"Illegal pair_style mliap command"); - MLIAPBuildUnified_t build = build_unified(arg[iarg+1], data, lmp); + if (strcmp(arg[iarg+1],"ghostneigh") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + build = build_unified(arg[iarg+2], data, lmp); + ghostneigh = 1; + iarg += 3; + } else { + if (iarg+1 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + build = build_unified(arg[iarg+1], data, lmp); + iarg += 2; + } model = build.model; descriptor = build.descriptor; modelflag = 1; descriptorflag = 1; - iarg += 2; #endif } else error->all(FLERR,"Illegal pair_style mliap command"); @@ -324,7 +336,10 @@ void PairMLIAP::init_style() // need a full neighbor list - neighbor->add_request(this, NeighConst::REQ_FULL); + if (ghostneigh) + neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); + else + neighbor->add_request(this, NeighConst::REQ_FULL); } @@ -349,6 +364,7 @@ double PairMLIAP::memory_usage() int n = atom->ntypes+1; bytes += (double)n*n*sizeof(int); // setflag bytes += (double)n*n*sizeof(int); // cutsq + bytes += (double)n*n*sizeof(int); // cutghost bytes += (double)n*sizeof(int); // map bytes += descriptor->memory_usage(); // Descriptor object bytes += model->memory_usage(); // Model object From ac3fc3548268651eee5cc3a92860be52b919fb0d Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 20 May 2022 11:08:32 -0600 Subject: [PATCH 010/364] Update InP example scripts --- examples/mliap/InP.hippynn.mliap.unified | 5 -- examples/mliap/in.mliap.unified.hippynn.InP | 4 +- .../in.mliap.unified.hippynn.InP.ghostneigh | 60 +++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) delete mode 100644 examples/mliap/InP.hippynn.mliap.unified create mode 100644 examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh diff --git a/examples/mliap/InP.hippynn.mliap.unified b/examples/mliap/InP.hippynn.mliap.unified deleted file mode 100644 index cdd47d2ef7..0000000000 --- a/examples/mliap/InP.hippynn.mliap.unified +++ /dev/null @@ -1,5 +0,0 @@ -# Definition of HIPNN potential - -# Specify MLIAP Unified pair style -pair_style mliap unified mliap_unified_hippynn_InP.pkl -pair_coeff * * In P diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP index ca1ebef23d..26fce32e19 100644 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -25,7 +25,9 @@ mass 2 30.98 # choose potential -include InP.hippynn.mliap.unified +# Specify MLIAP Unified pair style +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pkl +pair_coeff * * In P #dump 4 all custom 1 forces.xyz fx fy fz diff --git a/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh new file mode 100644 index 0000000000..33ae030211 --- /dev/null +++ b/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh @@ -0,0 +1,60 @@ +# Demonstrate MLIAP interface to HIPNN InP potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 5.83 +units metal + +# generate the box and atom positions using a FCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice diamond $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 2 box +create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 + +mass 1 114.76 +mass 2 30.98 + +# choose potential + +# Specify MLIAP Unified pair style +pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_InP.pkl +pair_coeff * * In P + +#dump 4 all custom 1 forces.xyz fx fy fz + +#dump 3 all movie 1 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + + +# Setup output + +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +variable ninteractions equal 2 +variable cutdist equal 7.5 +variable skin equal 1.0 +variable commcut equal (${ninteractions}*${cutdist})+${skin} + +timestep 0.5e-3 +neighbor ${skin} bin +neigh_modify once no every 1 delay 0 check yes +comm_modify cutoff ${commcut} + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} From 2044a9ef970bcec579643037766a67900ac5d633 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 20 May 2022 11:09:01 -0600 Subject: [PATCH 011/364] Change neigh_modify every to 20 --- examples/mliap/in.mliap.unified.lj.Ar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 72fe2f8523..9ec447a812 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -15,7 +15,7 @@ pair_style mliap unified mliap_unified_lj_Ar.pkl pair_coeff * * Ar neighbor 0.3 bin -neigh_modify every 1 delay 0 check no +neigh_modify every 20 delay 0 check no fix 1 all nve From 9a322b5a2a45fd94dd165d8575a2ecdfeafee2c2 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 20 May 2022 11:09:59 -0600 Subject: [PATCH 012/364] Update Al example script, add ghostneigh example --- examples/mliap/in.mliap.unified.hippynn.Al | 2 +- .../in.mliap.unified.hippynn.Al.ghostneigh | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al index e5c9496360..02af7ababa 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al +++ b/examples/mliap/in.mliap.unified.hippynn.Al @@ -24,7 +24,7 @@ mass 1 26.981 # choose potential -pair_style mliap unified mliap_unified_hippynn_Al.pkl +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pkl pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh new file mode 100644 index 0000000000..dcaa4d2155 --- /dev/null +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -0,0 +1,62 @@ +# Demonstrate MLIAP interface to HIPNN Al potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 4.05 +units metal + +# generate the box and atom positions using a FCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice fcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 26.981 + +# choose potential + +pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al.pkl +pair_coeff * * Al + +# Setup output + +compute eatom all pe/atom +compute energy all reduce sum c_eatom + +compute satom all stress/atom NULL +compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] +variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) + +thermo_style custom step temp epair c_energy etotal press v_press +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +variable ninteractions equal 2 +variable cutdist equal 7.5 +variable skin equal 1.0 +variable commcut equal (${ninteractions}*${cutdist})+${skin} + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes +comm_modify cutoff ${commcut} + +#dump 4 all custom 1 forces.xyz fx fy fz + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} + From b05d96078ab660c65cb2d5f4458d0cc6968d5ca7 Mon Sep 17 00:00:00 2001 From: Joel Thomas Clemmer <=> Date: Mon, 6 Jun 2022 10:10:43 -0600 Subject: [PATCH 013/364] Adding extra property vector to bonds --- doc/src/bond_bpm_rotational.rst | 14 ++++++++ doc/src/bond_bpm_spring.rst | 7 ++++ doc/src/compute_bond_local.rst | 18 ++++++++-- src/BPM/bond_bpm_rotational.cpp | 31 ++++++++++++++-- src/BPM/bond_bpm_spring.cpp | 9 +++++ src/bond.cpp | 3 ++ src/bond.h | 3 ++ src/bond_hybrid.cpp | 63 +++++++++++++++++++++++++++++++++ src/bond_hybrid.h | 4 +++ src/compute_bond_local.cpp | 18 ++++++++-- src/compute_bond_local.h | 2 +- 11 files changed, 165 insertions(+), 7 deletions(-) diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index b13d27dfbe..7211781a4a 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -201,6 +201,20 @@ output options. The vector or array will be floating point values that correspond to the specified attribute. +The single() function of this bond style returns 0.0 for the energy +of a bonded interaction, since energy is not conserved in these +dissipative potentials. It also returns only the normal component of +the bonded interaction force. However, the single() function also +calculates 7 extra bond quantities. The first 4 are data from the +reference state of the bond including the magnitude :math:`r_0` +followed by the :math:`x`, :math:`y`, and :math:`z` components of the +initial unit vector pointing to particle I from particle J. The next 3 +(5-7) are the components of the total force, including normal and +tangential contributions, acting on particle I. + +These extra quantities can be accessed by the :doc:`compute bond/local ` +command, as *b1*, *b2*, ..., *b7*\ . + Restrictions """""""""""" diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 1d2f12701d..619f6c0e8c 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -163,6 +163,13 @@ output options. The vector or array will be floating point values that correspond to the specified attribute. +The single() function of this bond style returns 0.0 for the energy +of a bonded interaction, since energy is not conserved in these +dissipative potentials. The single() function also calculates an +extra bond quantity, the initial distance :math:`r_0`. This +extra quantity can be accessed by the +:doc:`compute bond/local ` command as *b1*\ . + Restrictions """""""""""" diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 24b0943484..138d2d1b2a 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * bond/local = style name of this compute command * one or more values may be appended -* value = *dist* or *dx* or *dy* or *dz* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* +* value = *dist* or *dx* or *dy* or *dz* or *engpot* or *force* or *fx* or *fy* or *fz* or *engvib* or *engrot* or *engtrans* or *omega* or *velvib* or *v_name* or *bN* .. parsed-literal:: @@ -29,6 +29,7 @@ Syntax *omega* = magnitude of bond angular velocity *velvib* = vibrational velocity along the bond length *v_name* = equal-style variable with name (see below) + *bN* = bond style specific quantities for allowed N values * zero or more keyword/args pairs may be appended * keyword = *set* @@ -47,7 +48,7 @@ Examples compute 1 all bond/local engpot compute 1 all bond/local dist engpot force - compute 1 all bond/local dist fx fy fz + compute 1 all bond/local dist fx fy fz b1 b2 compute 1 all angle/local dist v_distsq set dist d @@ -145,6 +146,19 @@ those quantities via the :doc:`compute reduce ` command with thermo output. And the :doc:`fix ave/histo ` command will histogram the distance\^2 values and write them to a file. +A bond style may define additional bond quantities which can be +accessed as *b1* to *bN*, where N is defined by the bond style. Most +bond styles do not define any additional quantities, so N = 0. An +example of ones that do are the :doc:`BPM bond styles ` +which store the reference state between two particles. See +individual bond styles for details. + +When using *bN* with bond style *hybrid*, the output will be the Nth +quantity from the sub-style that computes the bonded interaction +(based on bond type). If that sub-style does not define a *bN*, +the output will be 0.0. The maximum allowed N is the maximum number +of quantities provided by any sub-style. + ---------- The local data stored by this command is generated by looping over all diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index a43b4c7500..f885dead28 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -49,12 +49,17 @@ BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) : BondBPM(_lmp) gtwist = nullptr; partial_flag = 1; smooth_flag = 1; + + single_extra = 7; + svector = new double[7]; } /* ---------------------------------------------------------------------- */ BondBPMRotational::~BondBPMRotational() { + delete[] svector; + if (allocated) { memory->destroy(setflag); memory->destroy(Kr); @@ -753,11 +758,12 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo // Not yet enabled if (type <= 0) return 0.0; - int itmp; + int flipped = 0; if (atom->tag[j] < atom->tag[i]) { - itmp = i; + int itmp = i; i = j; j = itmp; + flipped = 1; } double r0_mag, r_mag, r_mag_inv; @@ -792,5 +798,26 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo smooth = 1.0 - smooth * smooth; fforce *= smooth; } + + // set single_extra quantities + + svector[0] = r0_mag; + if (flipped) { + svector[1] = -r0[0]; + svector[2] = -r0[1]; + svector[3] = -r0[2]; + svector[4] = force1on2[0]; + svector[5] = force1on2[1]; + svector[6] = force1on2[2]; + } else { + svector[1] = r0[0]; + svector[2] = r0[1]; + svector[3] = r0[2]; + svector[4] = -force1on2[0]; + svector[5] = -force1on2[1]; + svector[6] = -force1on2[2]; + } + + return 0.0; } diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index d5935f612c..855080d28e 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -34,12 +34,17 @@ BondBPMSpring::BondBPMSpring(LAMMPS *_lmp) : { partial_flag = 1; smooth_flag = 1; + + single_extra = 1; + svector = new double[1]; } /* ---------------------------------------------------------------------- */ BondBPMSpring::~BondBPMSpring() { + delete[] svector; + if (allocated) { memory->destroy(setflag); memory->destroy(k); @@ -377,5 +382,9 @@ double BondBPMSpring::single(int type, double rsq, int i, int j, double &fforce) fforce *= smooth; } + // set single_extra quantities + + svector[0] = r0; + return 0.0; } diff --git a/src/bond.cpp b/src/bond.cpp index 280f383da0..363385ff48 100644 --- a/src/bond.cpp +++ b/src/bond.cpp @@ -52,6 +52,9 @@ Bond::Bond(LAMMPS *_lmp) : Pointers(_lmp) born_matrix_enable = 0; partial_flag = 0; + single_extra = 0; + svector = nullptr; + maxeatom = maxvatom = 0; eatom = nullptr; vatom = nullptr; diff --git a/src/bond.h b/src/bond.h index f0207f1113..dc64e40ae8 100644 --- a/src/bond.h +++ b/src/bond.h @@ -42,6 +42,9 @@ class Bond : protected Pointers { int reinitflag; // 0 if not compatible with fix adapt // extract() method may still need to be added + int single_extra; // number of extra single values calculated + double *svector; // vector of extra single quantities + // KOKKOS host/device flag and data masks ExecutionSpace execution_space; diff --git a/src/bond_hybrid.cpp b/src/bond_hybrid.cpp index 5410e9a98b..ec49871506 100644 --- a/src/bond_hybrid.cpp +++ b/src/bond_hybrid.cpp @@ -50,6 +50,8 @@ BondHybrid::~BondHybrid() delete[] keywords; } + delete[] svector; + if (allocated) { memory->destroy(setflag); memory->destroy(map); @@ -238,6 +240,49 @@ void BondHybrid::settings(int narg, char **arg) i = jarg; nstyles++; } + + // set bond flags from sub-style flags + + flags(); +} + +/* ---------------------------------------------------------------------- + set top-level bond flags from sub-style flags +------------------------------------------------------------------------- */ + +void BondHybrid::flags() +{ + int m; + + // set comm_forward, comm_reverse, comm_reverse_off to max of any sub-style + + for (m = 0; m < nstyles; m++) { + if (styles[m]) comm_forward = MAX(comm_forward,styles[m]->comm_forward); + if (styles[m]) comm_reverse = MAX(comm_reverse,styles[m]->comm_reverse); + if (styles[m]) comm_reverse_off = MAX(comm_reverse_off, + styles[m]->comm_reverse_off); + } + + init_svector(); +} + +/* ---------------------------------------------------------------------- + initialize Bond::svector array +------------------------------------------------------------------------- */ + +void BondHybrid::init_svector() +{ + // single_extra = list all sub-style single_extra + // allocate svector + + single_extra = 0; + for (int m = 0; m < nstyles; m++) + single_extra = MAX(single_extra,styles[m]->single_extra); + + if (single_extra) { + delete[] svector; + svector = new double[single_extra]; + } } /* ---------------------------------------------------------------------- @@ -359,9 +404,27 @@ double BondHybrid::single(int type, double rsq, int i, int j, double &fforce) { if (map[type] < 0) error->one(FLERR, "Invoked bond single on bond style none"); + + if (single_extra) copy_svector(type); return styles[map[type]]->single(type, rsq, i, j, fforce); } +/* ---------------------------------------------------------------------- + copy Bond::svector data +------------------------------------------------------------------------- */ + +void BondHybrid::copy_svector(int type) +{ + memset(svector,0,single_extra*sizeof(double)); + + // there is only one style in bond style hybrid for a bond type + Bond *this_style = styles[map[type]]; + + for (int l = 0; this_style->single_extra; ++l) { + svector[l] = this_style->svector[l]; + } +} + /* ---------------------------------------------------------------------- memory usage ------------------------------------------------------------------------- */ diff --git a/src/bond_hybrid.h b/src/bond_hybrid.h index 6288772836..ce689488b0 100644 --- a/src/bond_hybrid.h +++ b/src/bond_hybrid.h @@ -52,6 +52,10 @@ class BondHybrid : public Bond { int ***bondlist; // bondlist for each sub-style void allocate(); + void flags(); + + virtual void init_svector(); + virtual void copy_svector(int); }; } // namespace LAMMPS_NS diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index 11a8ed7148..3eceb9af91 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -34,7 +34,7 @@ using namespace LAMMPS_NS; #define DELTA 10000 #define EPSILON 1.0e-12 -enum{DIST,DX,DY,DZ,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE,FX,FY,FZ,VARIABLE}; +enum{DIST,DX,DY,DZ,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE,FX,FY,FZ,VARIABLE,BN}; /* ---------------------------------------------------------------------- */ @@ -54,6 +54,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : nvalues = narg - 3; bstyle = new int[nvalues]; + bindex = new int[nvalues]; vstr = new char*[nvalues]; vvar = new int[nvalues]; @@ -80,6 +81,11 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : bstyle[nvalues++] = VARIABLE; vstr[nvar] = utils::strdup(&arg[iarg][2]); nvar++; + } else if (arg[iarg][0] == 'b') { + int n = atoi(&arg[iarg][1]); + if (n <= 0) error->all(FLERR, "Invalid keyword in compute bond/local command"); + bstyle[nvalues] = BN; + bindex[nvalues++] = n - 1; } else break; } @@ -131,7 +137,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : velflag = 0; for (int i = 0; i < nvalues; i++) { if (bstyle[i] == ENGPOT || bstyle[i] == FORCE || bstyle[i] == FX || - bstyle[i] == FY || bstyle[i] == FZ) singleflag = 1; + bstyle[i] == FY || bstyle[i] == FZ || bstyle[i] == BN) singleflag = 1; if (bstyle[i] == VELVIB || bstyle[i] == OMEGA || bstyle[i] == ENGTRANS || bstyle[i] == ENGVIB || bstyle[i] == ENGROT) velflag = 1; } @@ -151,6 +157,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : ComputeBondLocal::~ComputeBondLocal() { delete [] bstyle; + delete [] bindex; for (int i = 0; i < nvar; i++) delete [] vstr[i]; delete [] vstr; delete [] vvar; @@ -168,6 +175,10 @@ void ComputeBondLocal::init() if (force->bond == nullptr) error->all(FLERR,"No bond style is defined for compute bond/local"); + for (int i = 0; i < nvalues; i++) + if (bstyle[i] == BN && bindex[i] >= force->bond->single_extra) + error->all(FLERR, "Bond style does not have extra field requested by compute bond/local"); + if (nvar) { for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); @@ -438,6 +449,9 @@ int ComputeBondLocal::compute_bonds(int flag) ptr[n] = input->variable->compute_equal(vvar[ivar]); ivar++; break; + case BN: + ptr[n] = bond->svector[bindex[n]]; + break; } } } diff --git a/src/compute_bond_local.h b/src/compute_bond_local.h index 0e52ba50ab..078c957dcd 100644 --- a/src/compute_bond_local.h +++ b/src/compute_bond_local.h @@ -39,7 +39,7 @@ class ComputeBondLocal : public Compute { int singleflag, velflag, ghostvelflag, initflag; int dvar; - int *bstyle, *vvar; + int *bstyle, *bindex, *vvar; char *dstr; char **vstr; From 49e04d56430d2d695e0fd78a13d40800ca8ba5ce Mon Sep 17 00:00:00 2001 From: Joel Thomas Clemmer <=> Date: Mon, 6 Jun 2022 10:33:22 -0600 Subject: [PATCH 014/364] Removing unnecessary variables in compute nbond --- src/BPM/compute_nbond_atom.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/BPM/compute_nbond_atom.cpp b/src/BPM/compute_nbond_atom.cpp index 38fad5ec96..b0fbacf038 100644 --- a/src/BPM/compute_nbond_atom.cpp +++ b/src/BPM/compute_nbond_atom.cpp @@ -33,8 +33,6 @@ ComputeNBondAtom::ComputeNBondAtom(LAMMPS *_lmp, int narg, char **arg) : peratom_flag = 1; size_peratom_cols = 0; - peatomflag = 1; - timeflag = 1; comm_reverse = 1; nmax = 0; @@ -51,11 +49,6 @@ ComputeNBondAtom::~ComputeNBondAtom() void ComputeNBondAtom::compute_peratom() { - - invoked_peratom = update->ntimestep; - if (update->eflag_atom != invoked_peratom) - error->all(FLERR, "Per-atom nbond was not tallied on needed timestep"); - // grow local nbond array if necessary // needs to be atom->nmax in length From 43a01b4fe41e0b4cd38e93320007a2371d0b83e1 Mon Sep 17 00:00:00 2001 From: Joel Thomas Clemmer <=> Date: Mon, 6 Jun 2022 11:18:11 -0600 Subject: [PATCH 015/364] Adding option to forward nbond, useful for fixes that need bondcounts --- src/BPM/compute_nbond_atom.cpp | 36 +++++++++++++++++++++++++++++++++- src/BPM/compute_nbond_atom.h | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/BPM/compute_nbond_atom.cpp b/src/BPM/compute_nbond_atom.cpp index b0fbacf038..9947c9b09e 100644 --- a/src/BPM/compute_nbond_atom.cpp +++ b/src/BPM/compute_nbond_atom.cpp @@ -29,11 +29,17 @@ using namespace LAMMPS_NS; ComputeNBondAtom::ComputeNBondAtom(LAMMPS *_lmp, int narg, char **arg) : Compute(_lmp, narg, arg), nbond(nullptr) { - if (narg < 3) error->all(FLERR, "Illegal compute nbond/atom command"); + if ((narg < 3) || (narg > 4)) error->all(FLERR, "Illegal compute nbond/atom command"); peratom_flag = 1; size_peratom_cols = 0; comm_reverse = 1; + comm_forward = 0; + + if (narg == 4) { + if (utils::strmatch(arg[3], "forward")) comm_forward = 1; + else error->all(FLERR, "Illegal compute nbond/atom command"); + } nmax = 0; } @@ -100,6 +106,9 @@ void ComputeNBondAtom::compute_peratom() for (i = 0; i < nlocal; i++) if (!(mask[i] & groupbit)) nbond[i] = 0.0; + + // forward to ghosts if requested + if (comm_forward != 0) comm->forward_comm(this); } /* ---------------------------------------------------------------------- */ @@ -126,6 +135,31 @@ void ComputeNBondAtom::unpack_reverse_comm(int n, int *list, double *buf) nbond[j] += buf[m++]; } } +/* ---------------------------------------------------------------------- */ + +int ComputeNBondAtom::pack_forward_comm(int n, int *list, double *buf, + int /*pbc_flag*/, int * /*pbc*/) +{ + int i,j,m; + + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = nbond[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeNBondAtom::unpack_forward_comm(int n, int first, double *buf) +{ + int i,m,last; + + m = 0; + last = first + n; + for (i = first; i < last; i++) nbond[i] = buf[m++]; +} /* ---------------------------------------------------------------------- memory usage of local atom-based array diff --git a/src/BPM/compute_nbond_atom.h b/src/BPM/compute_nbond_atom.h index 32d4ca2462..fe793cc05f 100644 --- a/src/BPM/compute_nbond_atom.h +++ b/src/BPM/compute_nbond_atom.h @@ -32,6 +32,8 @@ class ComputeNBondAtom : public Compute { void compute_peratom() override; int pack_reverse_comm(int, int, double *) override; void unpack_reverse_comm(int, int *, double *) override; + int pack_forward_comm(int, int *, double *, int, int *) override; + void unpack_forward_comm(int, int, double *) override; double memory_usage() override; private: From c07d61d3920486c5b3759401e584d27c2575fae1 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Tue, 7 Jun 2022 02:16:06 -0600 Subject: [PATCH 016/364] Progress towards supporting ghosts in neighbor list --- .../in.mliap.unified.hippynn.Al.ghostneigh | 2 +- examples/mliap/mliap_unified_lj_Ar.pkl | Bin 0 -> 192 bytes src/ML-IAP/mliap_data.cpp | 12 +++--- src/ML-IAP/mliap_data.h | 3 +- src/ML-IAP/mliap_unified.cpp | 2 +- src/ML-IAP/mliap_unifiedpy.pyx | 35 ++++++++---------- src/ML-IAP/pair_mliap.cpp | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 examples/mliap/mliap_unified_lj_Ar.pkl diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index dcaa4d2155..1c46b7df75 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -24,7 +24,7 @@ mass 1 26.981 # choose potential -pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al.pkl +pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multiple_layers.pkl pair_coeff * * Al # Setup output diff --git a/examples/mliap/mliap_unified_lj_Ar.pkl b/examples/mliap/mliap_unified_lj_Ar.pkl new file mode 100644 index 0000000000000000000000000000000000000000..9558d4204fcf8f4783d5e147e396347c40b3b334 GIT binary patch literal 192 zcmZo*nYxt$0(xX~5_5A4iuH1HG7}3RWPE8}W?E)yN_6_+*ObXq zG#jVXPSNP$%*-oEElNvFPMzY{!<(9unwy$e5?@kTkXk$?c1jPEW6_kv9-h3E)Z*l# z%z~2qqT(suj6Ljm1&Kw8xj;5^4|`E^X$jDPDem@Ppsrz0Ehx^+$f; gradgradflag = gradgradflag_in; map = map_in; model = model_in; @@ -111,13 +110,10 @@ void MLIAPData::init() void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_in) { list = list_in; + f = atom->f; double **x = atom->x; int *type = atom->type; - nlocal = atom->nlocal; - nghost = atom->nghost; - ntotal = nlocal + nghost; - int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; @@ -134,6 +130,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i // clear gradforce, elems arrays int nall = atom->nlocal + atom->nghost; + ntotal = nall; for (int i = 0; i < nall; i++) { for (int j = 0; j < size_gradforce; j++) { gradforce[i][j] = 0.0; @@ -150,6 +147,11 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i memory->grow(eatoms,nlistatoms,"MLIAPData:eatoms"); nlistatoms_max = nlistatoms; } + + if (list->ghost == 1) + nlistghosts = list->gnum; + else + nlistghosts = 0; // grow gamma arrays if necessary diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index 88bf4e4797..b59440d0e2 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -57,9 +57,10 @@ class MLIAPData : protected Pointers { // data structures for mliap neighbor list // only neighbors strictly inside descriptor cutoff - int nlocal, nghost, ntotal; // # of owned and ghost atoms on this proc, and sum of both + int ntotal; // total # of owned and ghost atoms on this proc int nlistatoms; // current number of atoms in neighborlist int nlistatoms_max; // allocated size of descriptor array + int nlistghosts; // current number of ghost atoms in neighborlist int natomneigh_max; // allocated size of atom neighbor arrays int *numneighs; // neighbors count for each atom int *iatoms; // index of each atom diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 64758c7cb1..e28093dc62 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -171,7 +171,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat PyObject *unified_module = PyImport_ImportModule("mliap_unifiedpy"); - if (!unified_module) { + if (PyErr_Occurred()) { PyErr_Print(); PyErr_Clear(); PyGILState_Release(gstate); diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unifiedpy.pyx index 459052abf7..b7378f2abd 100644 --- a/src/ML-IAP/mliap_unifiedpy.pyx +++ b/src/ML-IAP/mliap_unifiedpy.pyx @@ -52,11 +52,9 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": # data structures for mliap neighbor list # only neighbors strictly inside descriptor cutoff - int nlocal - int nghost - int ntotal - int * elems + int ntotal # total # of owned and ghost atoms on this proc int nlistatoms # current number of atoms in neighborlist + int nlistghosts # current number of ghost atoms in neighborlist int * numneighs # neighbors count for each atom int * iatoms # index of each atom int * pair_i # index of each i atom for each ij pair @@ -65,6 +63,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": int npairs # number of ij neighbor pairs int * jatoms # index of each neighbor int * jelems # element of each neighbor + int * elems # element of each atom in or not in the neighborlist double ** rij # distance vector of each neighbor # ----- write only ----- double *** graddesc # descriptor gradient w.r.t. each neighbor @@ -75,7 +74,7 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": cdef extern from "mliap_unified.h" namespace "LAMMPS_NS": cdef cppclass MLIAPDummyDescriptor: - MLIAPDummyDescriptor(PyObject *, LAMMPS *) + MLIAPDummyDescriptor(PyObject *, LAMMPS *) except + int ndescriptors # number of descriptors int nelements # # of unique elements char **elements # names of unique elements @@ -88,15 +87,15 @@ cdef extern from "mliap_unified.h" namespace "LAMMPS_NS": void set_elements(char **, int) cdef cppclass MLIAPDummyModel: - MLIAPDummyModel(PyObject *, LAMMPS *, char * = NULL) + MLIAPDummyModel(PyObject *, LAMMPS *, char * = NULL) except + int ndescriptors # number of descriptors int nparams # number of parameters per element int nelements; # # of unique elements void compute_gradients(MLIAPData *) - cdef void update_pair_energy(MLIAPData *, double *) - cdef void update_pair_forces(MLIAPData *, double *) + cdef void update_pair_energy(MLIAPData *, double *) except + + cdef void update_pair_forces(MLIAPData *, double *) except + # @property sans getter @@ -209,14 +208,6 @@ cdef class MLIAPDataPy: # data structures for mliap neighbor list # only neighbors strictly inside descriptor cutoff - @property - def nlocal(self): - return self.data.nlocal - - @property - def nghost(self): - return self.data.nghost - @property def ntotal(self): return self.data.ntotal @@ -230,6 +221,10 @@ cdef class MLIAPDataPy: @property def nlistatoms(self): return self.data.nlistatoms + + @property + def nlistghosts(self): + return self.data.nlistghosts @property def numneighs(self): @@ -318,19 +313,19 @@ cdef class MLIAPUnifiedInterface: self.unified_impl.compute_forces(data) -cdef public void compute_gradients_python(unified_int, MLIAPData *data) with gil: +cdef public void compute_gradients_python(unified_int, MLIAPData *data) except * with gil: pydata = MLIAPDataPy() pydata.data = data unified_int.compute_gradients(pydata) -cdef public void compute_descriptors_python(unified_int, MLIAPData *data) with gil: +cdef public void compute_descriptors_python(unified_int, MLIAPData *data) except * with gil: pydata = MLIAPDataPy() pydata.data = data unified_int.compute_descriptors(pydata) -cdef public void compute_forces_python(unified_int, MLIAPData *data) with gil: +cdef public void compute_forces_python(unified_int, MLIAPData *data) except * with gil: pydata = MLIAPDataPy() pydata.data = data unified_int.compute_forces(pydata) @@ -361,8 +356,10 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, cdef int nelements = len(unified.element_types) cdef char **elements = malloc(nelements * sizeof(char*)) + if not elements: raise MemoryError("failed to allocate memory for element names") + cdef char *elem_name for i, elem in enumerate(unified.element_types): elem_name_bytes = elem.encode('UTF-8') diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 0b8880aded..b076c95296 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -336,7 +336,7 @@ void PairMLIAP::init_style() // need a full neighbor list - if (ghostneigh) + if (ghostneigh == 1) neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); else neighbor->add_request(this, NeighConst::REQ_FULL); From 7aec2e10bfba98bfd3f5898e901e7c522cbbb703 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Tue, 7 Jun 2022 16:18:27 -0600 Subject: [PATCH 017/364] Remove nlistghosts, store inum+gnum in natomneigh --- src/ML-IAP/mliap_data.cpp | 23 ++++++++++------------- src/ML-IAP/mliap_data.h | 6 +++--- src/ML-IAP/mliap_unifiedpy.pyx | 16 ++++++++-------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index e90db8e886..c433a9fde5 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -148,11 +148,6 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i nlistatoms_max = nlistatoms; } - if (list->ghost == 1) - nlistghosts = list->gnum; - else - nlistghosts = 0; - // grow gamma arrays if necessary if (gradgradflag == 1) { @@ -168,7 +163,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i npairs = 0; int ij = 0; - for (int ii = 0; ii < nlistatoms; ii++) { + for (int ii = 0; ii < natomneigh; ii++) { const int i = ilist[ii]; const double xtmp = x[i][0]; @@ -225,12 +220,14 @@ void MLIAPData::grow_neigharrays() { // grow neighbor atom arrays if necessary - - if (natomneigh_max < nlistatoms) { - memory->grow(iatoms,nlistatoms,"MLIAPData:iatoms"); - memory->grow(ielems,nlistatoms,"MLIAPData:ielems"); - memory->grow(numneighs,nlistatoms,"MLIAPData:numneighs"); - natomneigh_max = nlistatoms; + natomneigh = list->inum; + if (list->ghost == 1) + natomneigh += list->gnum; + if (natomneigh_max < natomneigh) { + memory->grow(iatoms,natomneigh,"MLIAPData:iatoms"); + memory->grow(ielems,natomneigh,"MLIAPData:ielems"); + memory->grow(numneighs,natomneigh,"MLIAPData:numneighs"); + natomneigh_max = natomneigh; } // grow neighbor arrays if necessary @@ -242,7 +239,7 @@ void MLIAPData::grow_neigharrays() int *type = atom->type; int nneigh = 0; - for (int ii = 0; ii < nlistatoms; ii++) { + for (int ii = 0; ii < natomneigh; ii++) { const int i = ilist[ii]; const double xtmp = x[i][0]; diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index b59440d0e2..a281a846f1 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -57,10 +57,10 @@ class MLIAPData : protected Pointers { // data structures for mliap neighbor list // only neighbors strictly inside descriptor cutoff - int ntotal; // total # of owned and ghost atoms on this proc - int nlistatoms; // current number of atoms in neighborlist + int ntotal; // total number of owned and ghost atoms on this proc + int nlistatoms; // current number of atoms in local atom lists int nlistatoms_max; // allocated size of descriptor array - int nlistghosts; // current number of ghost atoms in neighborlist + int natomneigh; // current number of atoms and ghosts in atom neighbor arrays int natomneigh_max; // allocated size of atom neighbor arrays int *numneighs; // neighbors count for each atom int *iatoms; // index of each atom diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unifiedpy.pyx index b7378f2abd..94ae5ff493 100644 --- a/src/ML-IAP/mliap_unifiedpy.pyx +++ b/src/ML-IAP/mliap_unifiedpy.pyx @@ -52,9 +52,9 @@ cdef extern from "mliap_data.h" namespace "LAMMPS_NS": # data structures for mliap neighbor list # only neighbors strictly inside descriptor cutoff - int ntotal # total # of owned and ghost atoms on this proc - int nlistatoms # current number of atoms in neighborlist - int nlistghosts # current number of ghost atoms in neighborlist + int ntotal # total number of owned and ghost atoms on this proc + int nlistatoms # current number of atoms in local atom lists + int natomneigh # current number of atoms and ghosts in atom neighbor arrays int * numneighs # neighbors count for each atom int * iatoms # index of each atom int * pair_i # index of each i atom for each ij pair @@ -223,20 +223,20 @@ cdef class MLIAPDataPy: return self.data.nlistatoms @property - def nlistghosts(self): - return self.data.nlistghosts + def natomneigh(self): + return self.data.natomneigh @property def numneighs(self): if self.data.numneighs is NULL: return None - return np.asarray( &self.data.numneighs[0]) + return np.asarray( &self.data.numneighs[0]) @property def iatoms(self): if self.data.iatoms is NULL: return None - return np.asarray( &self.data.iatoms[0]) + return np.asarray( &self.data.iatoms[0]) @property def pair_i(self): @@ -248,7 +248,7 @@ cdef class MLIAPDataPy: def ielems(self): if self.data.ielems is NULL: return None - return np.asarray( &self.data.ielems[0]) + return np.asarray( &self.data.ielems[0]) @property def npairs(self): From 081aa2629fa19c8b06de63754a8ae912c731f666 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 9 Jun 2022 00:50:03 -0600 Subject: [PATCH 018/364] Minor changes --- examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh | 2 +- src/ML-IAP/mliap_data.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index 1c46b7df75..dd92242655 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -24,7 +24,7 @@ mass 1 26.981 # choose potential -pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multiple_layers.pkl +pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pkl pair_coeff * * Al # Setup output diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index c433a9fde5..faf2220a77 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -163,7 +163,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i npairs = 0; int ij = 0; - for (int ii = 0; ii < natomneigh; ii++) { + for (int ii = 0; ii < nlistatoms; ii++) { const int i = ilist[ii]; const double xtmp = x[i][0]; From 2638213a5cf166283fe052e909aae348aaf2b8e8 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 13 Jun 2022 11:04:28 -0600 Subject: [PATCH 019/364] Fixing documentation and adding colname to local --- doc/src/Howto_bpm.rst | 110 ++++++++++++++++++++-------------- doc/src/dump_modify.rst | 10 ++-- examples/bpm/pour/in.bpm.pour | 5 ++ src/dump.cpp | 2 +- src/dump_local.cpp | 21 ++++++- src/dump_local.h | 1 + 6 files changed, 95 insertions(+), 54 deletions(-) diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 2f015162e0..7147401182 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -33,46 +33,6 @@ reference state of a bond. Bonds that are created midway into a run, such as those created by pouring grains using :doc:`fix pour `, are initialized on that timestep. -As bonds can be broken between neighbor list builds, the -:doc:`special_bonds ` command works differently for BPM -bond styles. There are two possible settings which determine how pair -interactions work between bonded particles. First, one can turn off -all pair interactions between bonded particles. Unlike :doc:`bond -quartic `, this is not done by subtracting pair forces -during the bond computation but rather by dynamically updating the -special bond list. This is the default behavior of BPM bond styles and -is done by updating the 1-2 special bond list as bonds break. To do -this, LAMMPS requires :doc:`newton ` bond off such that all -processors containing an atom know when a bond breaks. Additionally, -one must do either (A) or (B). - -A) Use the following special bond settings - - .. code-block:: LAMMPS - - special_bonds lj 0 1 1 coul 1 1 1 - - These settings accomplish two goals. First, they turn off 1-3 and 1-4 - special bond lists, which are not currently supported for BPMs. As - BPMs often have dense bond networks, generating 1-3 and 1-4 special - bond lists is expensive. By setting the lj weight for 1-2 bonds to - zero, this turns off pairwise interactions. Even though there are no - charges in BPM models, setting a nonzero coul weight for 1-2 bonds - ensures all bonded neighbors are still included in the neighbor list - in case bonds break between neighbor list builds. - -B) Alternatively, one can simply overlay pair interactions such that all - bonded particles also feel pair interactions. This can be - accomplished by using the *overlay/pair* keyword present in all bpm - bond styles and by using the following special bond settings - - .. code-block:: LAMMPS - - special_bonds lj/coul 1 1 1 - -See the :doc:`Howto ` page on broken bonds for -more information. - ---------- Currently there are two types of bonds included in the BPM @@ -91,12 +51,6 @@ This also requires a unique integrator :doc:`fix nve/bpm/sphere ` which numerically integrates orientation similar to :doc:`fix nve/asphere `. -To monitor the fracture of bonds in the system, all BPM bond styles -have the ability to record instances of bond breakage to output using -the :doc:`dump local ` command. Additionally, one can use -:doc:`compute nbond/atom ` to tally the current -number of bonds per atom. - In addition to bond styles, a new pair style :doc:`pair bpm/spring ` was added to accompany the bpm/spring bond style. This pair style is simply a hookean repulsion with similar @@ -104,6 +58,70 @@ velocity damping as its sister bond style. ---------- +Bond data can be output using a combination of standard LAMMPS comamnds. +A list of IDs for bonded atoms can be generated using the +:doc:`compute property/local ` command. +Various properties of bonds can be computed using the +:doc:`compute property/bond ` command. This +command allows one to access data saved to the bond's history +such as the reference length of the bond. More information on +historical data can be found on the documentation pages for the specific +BPM bond styles. Finally, this data can be output using `dump local `. +As one may output many columns from the same compute, the +:doc:`dump modify ` *colname* option may be used to provide +more helpful column names. An example of this procedure is found in +/examples/bpm/pour/. External software, such as OVITO, can read these dump +files to render bond data. + +---------- + +As bonds can be broken between neighbor list builds, the +:doc:`special_bonds ` command works differently for BPM +bond styles. There are two possible settings which determine how pair +interactions work between bonded particles. First, one can overlay +pair forces with bond forces such that all bonded particles also +feel pair interactions. This can be accomplished by using the *overlay/pair* keyword present in all bpm bond styles and by using the following special bond settings + + .. code-block:: LAMMPS + + special_bonds lj/coul 1 1 1 + +Alternatively, one can turn off all pair interactions between bonded particles. Unlike :doc:`bond quartic `, this is not done +by subtracting pair forces during the bond computation but rather by +dynamically updating the special bond list. This is the default behavior +of BPM bond styles and is done by updating the 1-2 special bond list as +bonds break. To do this, LAMMPS requires :doc:`newton ` bond off +such that all processors containing an atom know when a bond breaks. +Additionally, one must use the following special bond settings + + .. code-block:: LAMMPS + + special_bonds lj 0 1 1 coul 1 1 1 + +These settings accomplish two goals. First, they turn off 1-3 and 1-4 +special bond lists, which are not currently supported for BPMs. As +BPMs often have dense bond networks, generating 1-3 and 1-4 special +bond lists is expensive. By setting the lj weight for 1-2 bonds to +zero, this turns off pairwise interactions. Even though there are no +charges in BPM models, setting a nonzero coul weight for 1-2 bonds +ensures all bonded neighbors are still included in the neighbor list +in case bonds break between neighbor list builds. + +To monitor the fracture of bonds in the system, all BPM bond styles +have the ability to record instances of bond breakage to output using +the :doc:`dump local ` command. Since one may frequently output +a list of broken bonds and the time they broke, the +:doc:`dump modify ` option *header no* may be useful to +avoid repeatedly printing the header of the dump file. An example of +this procedure is found in /examples/bpm/impact/. Additionally, +one can use :doc:`compute nbond/atom ` to tally the +current number of bonds per atom. + +See the :doc:`Howto ` page on broken bonds for +more information. + +---------- + While LAMMPS has many utilities to create and delete bonds, *only* the following are currently compatible with BPM bond styles: diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index fd916beb4e..75c8d3f4c7 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -17,7 +17,7 @@ Syntax * one or more keyword/value pairs may be appended * these keywords apply to various dump styles -* keyword = *append* or *at* or *balance* or *buffer* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* +* keyword = *append* or *at* or *balance* or *buffer* or *colname* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* .. parsed-literal:: @@ -381,10 +381,10 @@ performed with dump style *xtc*\ . ---------- The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, -and MPIIO variants. The setting for *ID string* replaces the default -text with the provided string. *ID* can be a positive integer when it -represents the column number counting from the left, a negative integer +for dump styles: *atom*, *custom*, *cfg*, and *local* and their compressed, +ADIOS, and MPIIO variants. The setting for *ID string* replaces the +default text with the provided string. *ID* can be a positive integer when +it represents the column number counting from the left, a negative integer when it represents the column number from the right (i.e. -1 is the last column/keyword), or a custom dump keyword (or compute, fix, property, or variable reference) and then it replaces the string for that specific diff --git a/examples/bpm/pour/in.bpm.pour b/examples/bpm/pour/in.bpm.pour index e4cc8557a3..d9bb60674a 100644 --- a/examples/bpm/pour/in.bpm.pour +++ b/examples/bpm/pour/in.bpm.pour @@ -19,6 +19,9 @@ bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 compute nbond all nbond/atom compute tbond all reduce sum c_nbond +compute bond_ids all property/local batom1 batom2 +compute bond_properties all bond/local dist b1 + compute_modify thermo_temp dynamic/dof yes fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL @@ -31,5 +34,7 @@ timestep 0.05 thermo_style custom step ke pe pxx pyy pzz c_tbond thermo 100 #dump 1 all custom 500 atomDump id radius x y z c_nbond mol +#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] +#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" run 100000 diff --git a/src/dump.cpp b/src/dump.cpp index 3569d32165..602a0fcc2d 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -1146,7 +1146,7 @@ void Dump::modify_params(int narg, char **arg) } } if ((icol < 0) || (icol >= (int)keyword_user.size())) - error->all(FLERR, "Illegal thermo_modify command"); + error->all(FLERR, "Illegal dump_modify command"); keyword_user[icol] = arg[iarg+2]; iarg += 3; } diff --git a/src/dump_local.cpp b/src/dump_local.cpp index 012e8b95dd..5c4ffb1344 100644 --- a/src/dump_local.cpp +++ b/src/dump_local.cpp @@ -101,11 +101,15 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) : // setup column string std::string cols; + cols.clear(); + keyword_user.resize(nfield); for (int iarg = 0; iarg < nfield; iarg++) { + key2col[earg[iarg]] = iarg; + keyword_user[iarg].clear(); + if (cols.size()) cols += " "; cols += earg[iarg]; - cols += " "; } - columns = utils::strdup(cols); + columns_default = utils::strdup(cols); // setup default label string @@ -153,6 +157,19 @@ void DumpLocal::init_style() if (sort_flag && sortcol == 0) error->all(FLERR,"Dump local cannot sort by atom ID"); + // assemble ITEMS: column string from defaults and user values + + delete[] columns; + std::string combined; + int icol = 0; + for (auto item : utils::split_words(columns_default)) { + if (combined.size()) combined += " "; + if (keyword_user[icol].size()) combined += keyword_user[icol]; + else combined += item; + ++icol; + } + columns = utils::strdup(combined); + // format = copy of default or user-specified line format delete[] format; diff --git a/src/dump_local.h b/src/dump_local.h index 160ff87f0a..da06092522 100644 --- a/src/dump_local.h +++ b/src/dump_local.h @@ -38,6 +38,7 @@ class DumpLocal : public Dump { char **vformat; // format string for each vector element char *columns; // column labels + char *columns_default; int nfield; // # of keywords listed by user From 2084e18ad214dfcc55f4e7652892034559271ae6 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Mon, 13 Jun 2022 12:46:29 -0600 Subject: [PATCH 020/364] Removing junk copied during write_data --- doc/src/bond_bpm_rotational.rst | 4 +++- doc/src/bond_bpm_spring.rst | 4 +++- src/fix_bond_history.cpp | 4 +++- src/fix_property_atom.cpp | 6 +++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index 7211781a4a..cd9d6438be 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -178,7 +178,9 @@ Restart and other info This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart file will -properly resume bonds. +properly resume bonds. However, the reference state is NOT +written to data files. Therefore reading a data file will not +restore bonds which will recalculate their reference state. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 619f6c0e8c..8297e5b147 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -141,7 +141,9 @@ Restart and other info This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart -file will properly resume bonds. +file will properly restore bonds. However, the reference state is NOT +written to data files. Therefore reading a data file will not +restore bonds which will recalculate their reference state. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these diff --git a/src/fix_bond_history.cpp b/src/fix_bond_history.cpp index a0af563b3b..b5b51a963c 100644 --- a/src/fix_bond_history.cpp +++ b/src/fix_bond_history.cpp @@ -82,10 +82,12 @@ int FixBondHistory::setmask() void FixBondHistory::post_constructor() { // Store saved bond quantities for each atom using fix property atom + // Don't copy history to data files because this fix is typically + // not yet instantiated - history is only preserved across restarts id_fix = utils::strdup(id + std::string("_FIX_PROP_ATOM")); id_array = utils::strdup(std::string("d2_") + id); - modify->add_fix(fmt::format("{} {} property/atom {} {}", id_fix, group->names[igroup], id_array, + modify->add_fix(fmt::format("{} {} property/atom {} {} writedata no", id_fix, group->names[igroup], id_array, nbond * ndata)); int tmp1, tmp2; index = atom->find_custom(&id_array[3], tmp1, tmp2); diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index a6a1b997e3..38dd00c364 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -35,7 +35,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (narg < 4) error->all(FLERR, "Illegal fix property/atom command"); restart_peratom = 1; - wd_section = 1; + wd_section = 1; // can be overwitten using optional arguments int iarg = 3; nvalue = narg - iarg; @@ -153,6 +153,10 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (iarg + 2 > narg) error->all(FLERR, "Illegal fix property/atom command"); border = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; + } else if (strcmp(arg[iarg], "writedata") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix property/atom command"); + wd_section = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; } else error->all(FLERR, "Illegal fix property/atom command"); } From d6c1517f0ee1da9387df52b854fb546f478c98f9 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Mon, 20 Jun 2022 10:05:12 -0600 Subject: [PATCH 021/364] Implement cutghost for ghostneighs --- .../in.mliap.unified.hippynn.InP.ghostneigh | 60 ------------------- src/ML-IAP/mliap_data.cpp | 2 +- src/ML-IAP/mliap_data.h | 2 +- src/ML-IAP/mliap_unifiedpy.pyx | 18 +++--- src/ML-IAP/pair_mliap.cpp | 12 ++-- 5 files changed, 19 insertions(+), 75 deletions(-) delete mode 100644 examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh diff --git a/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh deleted file mode 100644 index 33ae030211..0000000000 --- a/examples/mliap/in.mliap.unified.hippynn.InP.ghostneigh +++ /dev/null @@ -1,60 +0,0 @@ -# Demonstrate MLIAP interface to HIPNN InP potential - -# Initialize simulation - -variable nsteps index 100 -variable nrep equal 4 -variable a equal 5.83 -units metal - -# generate the box and atom positions using a FCC lattice - -variable nx equal ${nrep} -variable ny equal ${nrep} -variable nz equal ${nrep} - -boundary p p p - -lattice diamond $a -region box block 0 ${nx} 0 ${ny} 0 ${nz} -create_box 2 box -create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 - -mass 1 114.76 -mass 2 30.98 - -# choose potential - -# Specify MLIAP Unified pair style -pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_InP.pkl -pair_coeff * * In P - -#dump 4 all custom 1 forces.xyz fx fy fz - -#dump 3 all movie 1 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - - -# Setup output - -thermo 10 -thermo_modify norm yes - -# Set up NVE run - -variable ninteractions equal 2 -variable cutdist equal 7.5 -variable skin equal 1.0 -variable commcut equal (${ninteractions}*${cutdist})+${skin} - -timestep 0.5e-3 -neighbor ${skin} bin -neigh_modify once no every 1 delay 0 check yes -comm_modify cutoff ${commcut} - -# Run MD - -velocity all create 300.0 4928459 loop geom -fix 1 all nve -run ${nsteps} diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index faf2220a77..c433a9fde5 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -163,7 +163,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i npairs = 0; int ij = 0; - for (int ii = 0; ii < nlistatoms; ii++) { + for (int ii = 0; ii < natomneigh; ii++) { const int i = ilist[ii]; const double xtmp = x[i][0]; diff --git a/src/ML-IAP/mliap_data.h b/src/ML-IAP/mliap_data.h index a281a846f1..562dcd63cb 100644 --- a/src/ML-IAP/mliap_data.h +++ b/src/ML-IAP/mliap_data.h @@ -64,10 +64,10 @@ class MLIAPData : protected Pointers { int natomneigh_max; // allocated size of atom neighbor arrays int *numneighs; // neighbors count for each atom int *iatoms; // index of each atom - int *pair_i; // index of each i atom for each ij pair int *ielems; // element of each atom int nneigh_max; // number of ij neighbors allocated int npairs; // number of ij neighbor pairs + int *pair_i; // index of each i atom for each ij pair int *jatoms; // index of each neighbor int *jelems; // element of each neighbor int *elems; // element of each atom in or not in the neighborlist diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unifiedpy.pyx index 94ae5ff493..d34137e3f6 100644 --- a/src/ML-IAP/mliap_unifiedpy.pyx +++ b/src/ML-IAP/mliap_unifiedpy.pyx @@ -238,12 +238,6 @@ cdef class MLIAPDataPy: return None return np.asarray( &self.data.iatoms[0]) - @property - def pair_i(self): - if self.data.pair_i is NULL: - return None - return np.asarray( &self.data.pair_i[0]) - @property def ielems(self): if self.data.ielems is NULL: @@ -255,15 +249,21 @@ cdef class MLIAPDataPy: return self.data.npairs @property - def jatoms(self): - if self.data.jatoms is NULL: + def pair_i(self): + if self.data.pair_i is NULL: return None - return np.asarray( &self.data.jatoms[0]) + return np.asarray( &self.data.pair_i[0]) @property def pair_j(self): return self.jatoms + @property + def jatoms(self): + if self.data.jatoms is NULL: + return None + return np.asarray( &self.data.jatoms[0]) + @property def jelems(self): if self.data.jelems is NULL: diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index b076c95296..56c6e505b0 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -30,6 +30,7 @@ #endif #include "atom.h" +#include "comm.h" #include "error.h" #include "force.h" #include "memory.h" @@ -336,10 +337,11 @@ void PairMLIAP::init_style() // need a full neighbor list - if (ghostneigh == 1) - neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); - else + if (ghostneigh == 1) { + neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST | NeighConst::REQ_NEWTON_OFF); + } else { neighbor->add_request(this, NeighConst::REQ_FULL); + } } @@ -350,7 +352,9 @@ void PairMLIAP::init_style() double PairMLIAP::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - return sqrt(descriptor->cutsq[map[i]][map[j]]); + double cutmax = sqrt(descriptor->cutsq[map[i]][map[j]]); + cutghost[i][j] = cutghost[j][i] = 2.0 * cutmax + neighbor->skin; + return cutmax; } /* ---------------------------------------------------------------------- From f33a4087c59993992ab9621b6caccd6301a91a21 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Mon, 20 Jun 2022 10:05:35 -0600 Subject: [PATCH 022/364] Add v_tally to force calculation --- src/ML-IAP/mliap_unified.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index e28093dc62..f4f1501675 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -231,6 +231,8 @@ void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { f[j][0] -= fij[ii3]; f[j][1] -= fij[ii3 + 1]; f[j][2] -= fij[ii3 + 2]; + + if (data->vflag) data->pairmliap->v_tally(i, j, &fij[ii3], data->rij[ii]); } } From b97140a7f0bc16407e312e09560147b30f1ec695 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Mon, 20 Jun 2022 10:26:42 -0600 Subject: [PATCH 023/364] Use skin variable in neighbor command --- examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index dd92242655..583f7c645e 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -48,7 +48,7 @@ variable skin equal 1.0 variable commcut equal (${ninteractions}*${cutdist})+${skin} timestep 0.5e-3 -neighbor 1.0 bin +neighbor ${skin} bin neigh_modify once no every 1 delay 0 check yes comm_modify cutoff ${commcut} From 474e6a03d04d2264a0b044537b83aa4cb039774a Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 23 Jun 2022 10:43:08 +0200 Subject: [PATCH 024/364] WIP: configuring ML-PACE.cmake to work with pace/al --- cmake/Modules/Packages/ML-PACE.cmake | 61 ++- src/ML-PACE/pair_pace_al.cpp | 593 +++++++++++++++++++++++++++ src/ML-PACE/pair_pace_al.h | 99 +++++ 3 files changed, 736 insertions(+), 17 deletions(-) create mode 100644 src/ML-PACE/pair_pace_al.cpp create mode 100644 src/ML-PACE/pair_pace_al.h diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index c553809ff1..493caa5357 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,20 +1,34 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.fix2.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +if(NOT DEFINED LOCAL_ML-PACE) + # standard user scenario: get latest ML-PACE from github + set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.fix2.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "32394d799bc282bb57696c78c456e64f" CACHE STRING "MD5 checksum of PACE evaluator library tarball") -mark_as_advanced(PACELIB_URL) -mark_as_advanced(PACELIB_MD5) + set(PACELIB_MD5 "32394d799bc282bb57696c78c456e64f" 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 EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS + message("ML-PACE: Downloading from ${PACELIB_URL}") + # download library sources to build folder + file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS -# 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} -) -get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) + # 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} + ) + get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) +else() + # developer scenario: use local ML-PACE + if(EXISTS ${LOCAL_ML-PACE}) + set(lib-pace ${LOCAL_ML-PACE}) + message("ML-PACE: Using local folder ${lib-pace}") + else() + message(FATAL_ERROR "ML-PACE: ERROR! Folder ${LOCAL_ML-PACE} does not exist") + endif() +endif() + +##yaml # enforce building libyaml-cpp as static library and turn off optional features set(YAML_BUILD_SHARED_LIBS OFF) set(YAML_CPP_BUILD_CONTRIB OFF) @@ -22,16 +36,29 @@ set(YAML_CPP_BUILD_TOOLS OFF) add_subdirectory(${lib-pace}/yaml-cpp build-yaml-cpp) set(YAML_CPP_INCLUDE_DIR ${lib-pace}/yaml-cpp/include) +## cnpy +set(CNPY_PATH ${lib-pace}/cnpy) +set(CNPY_INCLUDE_PATH ${CNPY_PATH}) +set(CNPY_SRC ${CNPY_PATH}/cnpy.cpp) +add_library(cnpy-static STATIC ${CNPY_SRC}) +set_target_properties(cnpy-static PROPERTIES LINKER_LANGUAGE CXX) + + +## winger-cpp +# this is header-only library +set(WIGNER_PATH ${lib-pace}/wigner-cpp) +set(WIGNER_INCLUDE_PATH ${WIGNER_PATH}/include/wigner) + +# ML-PACE sources file(GLOB PACE_EVALUATOR_INCLUDE_DIR ${lib-pace}/ML-PACE) file(GLOB PACE_EVALUATOR_SOURCES ${lib-pace}/ML-PACE/*.cpp) -list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace.cpp) +list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace*.cpp) add_library(pace STATIC ${PACE_EVALUATOR_SOURCES}) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) -target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR}) +target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR} ${CNPY_INCLUDE_PATH} ${WIGNER_INCLUDE_PATH}) - -target_link_libraries(pace PRIVATE yaml-cpp-pace) +target_link_libraries(pace PRIVATE yaml-cpp-pace cnpy-static) if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) endif() diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp new file mode 100644 index 0000000000..aeffe7cbf2 --- /dev/null +++ b/src/ML-PACE/pair_pace_al.cpp @@ -0,0 +1,593 @@ +/* +Copyright 2021 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 + + + This FILENAME is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + + +// +// Created by Lysogorskiy Yury on 2.01.22. +// + +#include +#include +#include +#include +#include +#include "pair_pace_al.h" +#include "atom.h" +#include "dump_custom.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "update.h" + + +#include "math_const.h" + +#include "ace_version.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define MAXLINE 1024 +#define DELTA 4 +#define PACE_AL_EXTRAPOLATION_GRADE_FNAME "grade.dat" +//added YL + + + +int elements_num_pace_al = 104; +char const *const elements_pace_al[104] = {"X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", + "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", + "Mn", + "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", + "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", + "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", + "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", + "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", + "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr" +}; + +int AtomicNumberByName_pace_al(char *elname) { + for (int i = 1; i < elements_num_pace_al; i++) + if (strcmp(elname, elements_pace_al[i]) == 0) + return i; + return -1; +} + +/* ---------------------------------------------------------------------- + * Append extrapolation grade to file + ---------------------------------------------------------------------- */ +void dump_extrapolation_grade_header() { + FILE *gamma_file = fopen(PACE_AL_EXTRAPOLATION_GRADE_FNAME, "w"); + fprintf(gamma_file, "Step\tgamma\n"); + fclose(gamma_file); +} + +/* ---------------------------------------------------------------------- + * Append extrapolation grade to file + ---------------------------------------------------------------------- */ +void dump_extrapolation_grade(int timestep, double gamma) { + FILE *gamma_file = fopen(PACE_AL_EXTRAPOLATION_GRADE_FNAME, "a"); + fprintf(gamma_file, "%d\t%f\n", timestep, gamma); + fclose(gamma_file); +} + + +/* ---------------------------------------------------------------------- */ +PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { + //single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + + nelements = 0; + ace = NULL; + potential_file_name = NULL; + elements = NULL; + map = NULL; +} + +/* ---------------------------------------------------------------------- + check if allocated, since class can be destructed when incomplete +------------------------------------------------------------------------- */ + +PairPACEActiveLearning::~PairPACEActiveLearning() { + if (copymode) return; + + if (elements) + for (int i = 0; i < nelements; i++) delete[] elements[i]; + delete[] elements; + + + delete[] potential_file_name; + + delete basis_set; + delete ace; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(map); + memory->destroy(scale); + } + + if (dump) + delete dump; +} + +/* ---------------------------------------------------------------------- */ + +void PairPACEActiveLearning::compute(int eflag, int vflag) { + int i, j, ii, jj, inum, jnum; + double delx, dely, delz, evdwl; + double fij[3]; + int *ilist, *jlist, *numneigh, **firstneigh; + double gamma_grade = 0; + double global_gamma_grade = 0; + ev_init(eflag, vflag); + + // downwards modified by YL + + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + // number of atoms in cell + int nlocal = atom->nlocal; + + int newton_pair = force->newton_pair; + + // number of atoms including ghost atoms + int nall = nlocal + atom->nghost; + + // inum: length of the neighborlists list + inum = list->inum; + + // ilist: list of "i" atoms for which neighbor lists exist + ilist = list->ilist; + + //numneigh: the length of each these neigbor list + numneigh = list->numneigh; + + // the pointer to the list of neighbors of "i" + firstneigh = list->firstneigh; + + if (inum != nlocal) { + char str[128]; + snprintf(str, 128, "inum: %d nlocal: %d are different", inum, nlocal); + error->all(FLERR, str); + } + + + // Aidan Thompson told RD (26 July 2019) that practically always holds: + // inum = nlocal + // i = ilist(ii) < inum + // j = jlist(jj) < nall + // neighborlist contains neighbor atoms plus skin atoms, + // skin atoms can be removed by setting skin to zero but here + // they are disregarded anyway + + + //determine the maximum number of neighbours + int max_jnum = 0; + int nei = 0; + for (ii = 0; ii < list->inum; ii++) { + i = ilist[ii]; + jnum = numneigh[i]; + nei = nei + jnum; + if (jnum > max_jnum) + max_jnum = jnum; + } + + int current_timestep = update->ntimestep; + bool is_bevaluator = current_timestep % gamma_grade_eval_freq == 0; + + if (is_bevaluator) + ace->resize_neighbours_cache(max_jnum); + else + rec_ace->resize_neighbours_cache(max_jnum); + + //loop over atoms + for (ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // checking if neighbours are actually within cutoff range is done inside compute_atom + // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom + // by using 'ace->element_type_mapping' array + // x: [r0 ,r1, r2, ..., r100] + // i = 0 ,1 + // jnum(0) = 50 + // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] + try { + if (is_bevaluator) + ace->compute_atom(i, x, type, jnum, jlist); + else + rec_ace->compute_atom(i, x, type, jnum, jlist); + } catch (exception &e) { + error->all(FLERR, e.what()); + exit(EXIT_FAILURE); + } + // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade + + if (is_bevaluator) { + if (gamma_grade < ace->max_gamma_grade) + gamma_grade = ace->max_gamma_grade; + } + + Array2D &neighbours_forces = (is_bevaluator ? ace->neighbours_forces : rec_ace->neighbours_forces); + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + const int jtype = type[j]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + + fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); + fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); + fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); + + + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + if (vflag) + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, + fij[0], fij[1], fij[2], + -delx, -dely, -delz); + } + + // tally energy contribution + if (eflag) { + // evdwl = energy of atom I + DOUBLE_TYPE e_atom; + if (is_bevaluator) + e_atom= ace->e_atom; + else + e_atom= rec_ace->e_atom; + evdwl = scale[1][1] * e_atom; + ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); + } + } + + + if (vflag_fdotr) virial_fdotr_compute(); + + + if (is_bevaluator) { + //gather together global_gamma_grade + MPI_Allreduce(&gamma_grade, &global_gamma_grade, 1, MPI_DOUBLE, MPI_MAX, world); + int mpi_rank; + MPI_Comm_rank(world, &mpi_rank); + + if (global_gamma_grade > gamma_upper_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, global_gamma_grade); + dump->write(); + MPI_Barrier(world); + + if (mpi_rank == 0) { + error->all(FLERR, "Extrapolation grade is too large, stopping...\n"); + } + + MPI_Abort(world, 1); //abort properly with error code '1' if not using 4 processes + exit(EXIT_FAILURE); + } else if (global_gamma_grade > gamma_lower_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, global_gamma_grade); + dump->write(); + } + } + +// end modifications YL +} + +/* ---------------------------------------------------------------------- */ + +void PairPACEActiveLearning::allocate() { + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag, n + 1, n + 1, "pair:setflag"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(map, n + 1, "pair:map"); + memory->create(scale, n + 1, n + 1, "pair:scale"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairPACEActiveLearning::settings(int narg, char **arg) { + if (narg > 3) { + error->all(FLERR, + "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound]"); + } + + if (narg > 0) { + double glb = atof(arg[0]); // gamma lower bound + if (glb < 1.0) + error->all(FLERR, + "Illegal gamma_lower_bound value: it should be real number >= 1.0"); + else + gamma_lower_bound = glb; + } + + if (narg > 1) { + double gub = atof(arg[1]); // gamma upper bound + if (gub < gamma_lower_bound) + error->all(FLERR, + "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); + else + gamma_upper_bound = gub; + } + + if (narg > 2) { + gamma_grade_eval_freq = atoi(arg[2]); + if (gamma_grade_eval_freq < 1) + error->all(FLERR, + "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); + } + + if (comm->me == 0) { + if (screen) { + fprintf(screen, "ACE/AL version: %d.%d.%d\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + fprintf(screen, "Extrapolation grade thresholds (lower/upper): %f/%f\n", gamma_lower_bound, + gamma_upper_bound); + fprintf(screen, "Extrapolation grade evaluation frequency: %d\n", gamma_grade_eval_freq); + } + if (logfile) { + fprintf(logfile, "ACE/AL version: %d.%d.%d\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + fprintf(logfile, "Extrapolation grade thresholds (lower/upper): %f/%f\n", gamma_lower_bound, + gamma_upper_bound); + fprintf(logfile, "Extrapolation grade evaluation frequency: %d\n", gamma_grade_eval_freq); + } + + + } + + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairPACEActiveLearning::coeff(int narg, char **arg) { + + if (narg < 5) + error->all(FLERR, + "Incorrect args for pair coefficients. Correct form:\npair_coeff * * elem1 elem2 ..."); + + if (!allocated) allocate(); + + //number of provided elements in pair_coeff line + int ntypes_coeff = narg - 4; + + if (ntypes_coeff != atom->ntypes) { + char error_message[1024]; + snprintf(error_message, 1024, + "Incorrect args for pair coefficients. You provided %d elements in pair_coeff, but structure has %d atom types", + ntypes_coeff, atom->ntypes); + error->all(FLERR, error_message); + } + + char *type1 = arg[0]; + char *type2 = arg[1]; + char *potential_file_name = arg[2]; + active_set_inv_filename = arg[3]; + char **elemtypes = &arg[4]; + + // insure that I,J are identical + if (strcmp(type1, type2) != 0) + error->all(FLERR, "Incorrect args for PACE/AL:pair_coeff coefficients"); + int ilo, ihi, jlo, jhi; + force->bounds(FLERR, type1, atom->ntypes, ilo, ihi); + force->bounds(FLERR, type2, atom->ntypes, jlo, jhi); + + + //load potential file + basis_set = new ACEBBasisSet(); + if (comm->me == 0) { + if (screen) fprintf(screen, "Loading %s\n", potential_file_name); + if (logfile) fprintf(logfile, "Loading %s\n", potential_file_name); + } + basis_set->load(potential_file_name); + + // convert the basis set to CTilde format + ctilde_basis_set = new ACECTildeBasisSet(); + *ctilde_basis_set = basis_set->to_ACECTildeBasisSet(); + + if (comm->me == 0) { + if (screen) fprintf(screen, "Total number of basis functions\n"); + if (logfile) fprintf(logfile, "Total number of basis functions\n"); + + for (SPECIES_TYPE mu = 0; mu < basis_set->nelements; mu++) { + int n_r1 = basis_set->total_basis_size_rank1[mu]; + int n = basis_set->total_basis_size[mu]; + if (screen) fprintf(screen, "\t%s: %d (r=1) %d (r>1)\n", basis_set->elements_name[mu].c_str(), n_r1, n); + if (logfile) fprintf(logfile, "\t%s: %d (r=1) %d (r>1)\n", basis_set->elements_name[mu].c_str(), n_r1, n); + } + } + + + // read args that map atom types to pACE elements + // map[i] = which element the Ith atom type is, -1 if not mapped + // map[0] is not used + + ace = new ACEBEvaluator(); + ace->element_type_mapping.init(atom->ntypes + 1); + + rec_ace = new ACERecursiveEvaluator(); + rec_ace->set_recursive(true); + rec_ace->element_type_mapping.init(atom->ntypes + 1); + rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential + + FILE *species_type_file = fopen("species_types.dat", "w"); + for (int i = 1; i <= atom->ntypes; i++) { + char *elemname = elemtypes[i - 1]; + // dump species types for reconstruction of atomic configurations + fprintf(species_type_file, "%s ", elemname); + int atomic_number = AtomicNumberByName_pace_al(elemname); + if (atomic_number == -1) { + char error_msg[1024]; + snprintf(error_msg, 1024, "String '%s' is not a valid element\n", elemname); + fclose(species_type_file); + error->all(FLERR, error_msg); + } + SPECIES_TYPE mu = basis_set->get_species_index_by_name(elemname); + if (mu != -1) { + if (comm->me == 0) { + if (screen) + fprintf(screen, "Mapping LAMMPS atom type #%d(%s) -> ACE species type #%d\n", i, elemname, mu); + if (logfile) + fprintf(logfile, "Mapping LAMMPS atom type #%d(%s) -> ACE species type #%d\n", i, elemname, mu); + } + map[i] = mu; + ace->element_type_mapping(i) = mu; // set up LAMMPS atom type to ACE species mapping for ace evaluator + rec_ace->element_type_mapping(i) = mu; + } else { + char error_msg[1024]; + snprintf(error_msg, 1024, "Element %s is not supported by ACE-potential from file %s", elemname, + potential_file_name); + fclose(species_type_file); + error->all(FLERR, error_msg); + } + } + fclose(species_type_file); + ace->set_basis(*basis_set); + rec_ace->set_basis(*ctilde_basis_set); + + if (comm->me == 0) { + if (screen) fprintf(screen, "Loading ASI %s\n", active_set_inv_filename); + if (logfile) fprintf(logfile, "Loading ASI %s\n", active_set_inv_filename); + } + ace->load_active_set(active_set_inv_filename); + + // clear setflag since coeff() called once with I,J = * * + int n = atom->ntypes; + for (int i = 1; i <= n; i++) { + for (int j = i; j <= n; j++) { + setflag[i][j] = 1; + scale[i][j] = 1.0; + } + } + + // set setflag i,j for type pairs where both are mapped to elements + + int count = 1; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); + + + // prepare dump class + + if (!dump) { + // dump WRITE_DUMP all cfg 10 dump.snap.*.cfg mass type xs ys zs + // dump WRITE_DUMP all custom freq extrapolation.dat id type mass x y z + char **dumpargs = new char *[11]; + dumpargs[0] = (char *) "WRITE_DUMP"; // dump id + dumpargs[1] = (char *) "all"; // group + dumpargs[2] = (char *) "custom"; // dump style + dumpargs[3] = (char *) "1"; // dump frequency + dumpargs[4] = (char *) "extrapolative_structures.dat"; // fname + dumpargs[5] = (char *) "id"; + dumpargs[6] = (char *) "type"; + dumpargs[7] = (char *) "mass"; + dumpargs[8] = (char *) "x"; + dumpargs[9] = (char *) "y"; + dumpargs[10] = (char *) "z"; + dump = new DumpCustom(lmp, 11, dumpargs); + dump->init(); + + // dump_modify WRITE_DUMP element X Y Z + char **dumpargs3 = new char *[atom->ntypes + 1]; + dumpargs3[0] = (char *) "element"; + for (int k = 0; k < atom->ntypes; k++) + dumpargs3[k + 1] = elemtypes[k]; + dump->modify_params(atom->ntypes + 1, dumpargs3); + } + + // write extrapolation_grade.dat file header + if (comm->me == 0) + dump_extrapolation_grade_header(); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairPACEActiveLearning::init_style() { + if (atom->tag_enable == 0) + error->all(FLERR, "Pair style pACE requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR, "Pair style pACE requires newton pair on"); + + // request a full neighbor list + int irequest = neighbor->request(this, instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairPACEActiveLearning::init_one(int i, int j) { + if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + //cutoff from the basis set's radial functions settings + scale[j][i] = scale[i][j]; + return basis_set->radial_functions->cut(map[i], map[j]); +} + +/* ---------------------------------------------------------------------- + extract method for extracting value of scale variable + ---------------------------------------------------------------------- */ +void *PairPACEActiveLearning::extract(const char *str, int &dim) { + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return NULL; +} + diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h new file mode 100644 index 0000000000..329922d142 --- /dev/null +++ b/src/ML-PACE/pair_pace_al.h @@ -0,0 +1,99 @@ +/* +Copyright 2021 Yury Lysogorskiy^1, Ralf Drautz^1 + +^1: Ruhr-University Bochum, Bochum, Germany + This FILENAME is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + + +// +// Created by Lysogorskiy Yury on 1.01.22. +// + + +#ifdef PAIR_CLASS + +PairStyle(pace/al,PairPACEActiveLearning) + +#else + +#ifndef LMP_PAIR_PACE_AL_H +#define LMP_PAIR_PACE_AL_H + +#include "pair.h" +#include "dump_custom.h" +#include "ace_b_evaluator.h" +#include "ace_b_basis.h" +#include "ace_recursive.h" + +namespace LAMMPS_NS { + + class PairPACEActiveLearning : public Pair { + public: + PairPACEActiveLearning(class LAMMPS *); + + virtual ~PairPACEActiveLearning(); + + virtual void compute(int, int); + + void settings(int, char **); + + void coeff(int, char **); + + virtual void init_style(); + + double init_one(int, int); + + void *extract(const char *, int &); + + // virtual double memory_usage(); + + protected: + ACEBBasisSet *basis_set = nullptr; + + ACECTildeBasisSet *ctilde_basis_set = nullptr; + + ACEBEvaluator* ace = nullptr; + + ACERecursiveEvaluator* rec_ace = nullptr; + + char *potential_file_name; + int gamma_grade_eval_freq = 1; + + DumpCustom *dump = nullptr; + + char *active_set_inv_filename; + double gamma_lower_bound = 1.5; + double gamma_upper_bound = 10; + virtual void allocate(); + + void read_files(char *, char *); + + inline int equal(double *x, double *y); + + + double rcutmax; // max cutoff for all elements + int nelements; // # of unique elements + char **elements; // names of unique elements + + int *map; // mapping from atom types to elements + int *jlist_local; + int *type_local; + double **scale; + }; + +} + +#endif +#endif \ No newline at end of file From ab1913f2409917df4ed37cc2624e7d83c468c61f Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 23 Jun 2022 15:12:30 +0200 Subject: [PATCH 025/364] - add pair_pace_al.cpp/h - upgrade ML-PACE.cmake: reuse local PACE codebase or download and unarchive (default behaviour) - pair_pace.cpp: remove unused variable, change pACE->PACE --- cmake/Modules/Packages/ML-PACE.cmake | 9 +- src/ML-PACE/pair_pace.cpp | 7 +- src/ML-PACE/pair_pace_al.cpp | 282 +++++++++++---------------- src/ML-PACE/pair_pace_al.h | 73 +++---- 4 files changed, 149 insertions(+), 222 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 493caa5357..34ba9eec1d 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -6,7 +6,7 @@ if(NOT DEFINED LOCAL_ML-PACE) mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) - message("ML-PACE: Downloading from ${PACELIB_URL}") +# message("-- [ML-PACE]: Downloading from ${PACELIB_URL}") # download library sources to build folder file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS @@ -22,9 +22,9 @@ else() if(EXISTS ${LOCAL_ML-PACE}) set(lib-pace ${LOCAL_ML-PACE}) - message("ML-PACE: Using local folder ${lib-pace}") + message("-- [ML-PACE]: Using local folder ${lib-pace}") else() - message(FATAL_ERROR "ML-PACE: ERROR! Folder ${LOCAL_ML-PACE} does not exist") + message(FATAL_ERROR "-- [ML-PACE]: ERROR! Folder ${LOCAL_ML-PACE} does not exist") endif() endif() @@ -43,7 +43,6 @@ set(CNPY_SRC ${CNPY_PATH}/cnpy.cpp) add_library(cnpy-static STATIC ${CNPY_SRC}) set_target_properties(cnpy-static PROPERTIES LINKER_LANGUAGE CXX) - ## winger-cpp # this is header-only library set(WIGNER_PATH ${lib-pace}/wigner-cpp) @@ -57,7 +56,7 @@ list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace*.cpp) add_library(pace STATIC ${PACE_EVALUATOR_SOURCES}) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR} ${CNPY_INCLUDE_PATH} ${WIGNER_INCLUDE_PATH}) - +target_compile_definitions(pace PUBLIC EXTRA_C_PROJECTIONS) target_link_libraries(pace PRIVATE yaml-cpp-pace cnpy-static) if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 87e580b8d3..0033a72823 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -286,7 +286,6 @@ void PairPACE::coeff(int narg, char **arg) map_element2type(narg - 3, arg + 3); auto potential_file_name = utils::get_potential_file_path(arg[2]); - char **elemtypes = &arg[3]; //load potential file delete aceimpl->basis_set; @@ -304,7 +303,7 @@ void PairPACE::coeff(int narg, char **arg) } } - // read args that map atom types to pACE elements + // read args that map atom types to PACE elements // map[i] = which element the Ith atom type is, -1 if not mapped // map[0] is not used @@ -354,8 +353,8 @@ void PairPACE::coeff(int narg, char **arg) void PairPACE::init_style() { - if (atom->tag_enable == 0) error->all(FLERR, "Pair style pACE requires atom IDs"); - if (force->newton_pair == 0) error->all(FLERR, "Pair style pACE requires newton pair on"); + if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); // request a full neighbor list neighbor->add_request(this, NeighConst::REQ_FULL); diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index aeffe7cbf2..5a25ceca6f 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -1,26 +1,20 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + /* -Copyright 2021 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 +Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, 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 - - - This FILENAME is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ @@ -48,8 +42,26 @@ Copyright 2021 Yury Lysogorskiy^1, Cas van der Oord^2, Anton Bochkarev^1, #include "math_const.h" +#include "ace_b_evaluator.h" +#include "ace_b_basis.h" +#include "ace_recursive.h" #include "ace_version.h" +namespace LAMMPS_NS { + struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} + ~ACEALImpl() + { + delete basis_set; + delete ace; + } + ACEBBasisSet *basis_set; + ACEBEvaluator* ace; + ACECTildeBasisSet *ctilde_basis_set; + ACERecursiveEvaluator* rec_ace; + }; +} // namespace LAMMPS_NS + using namespace LAMMPS_NS; using namespace MathConst; @@ -100,16 +112,14 @@ void dump_extrapolation_grade(int timestep, double gamma) { /* ---------------------------------------------------------------------- */ PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { - //single_enable = 0; + single_enable = 0; restartinfo = 0; one_coeff = 1; manybody_flag = 1; - nelements = 0; - ace = NULL; - potential_file_name = NULL; - elements = NULL; - map = NULL; + + aceimpl = new ACEALImpl; + scale= nullptr; } /* ---------------------------------------------------------------------- @@ -119,20 +129,11 @@ PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { PairPACEActiveLearning::~PairPACEActiveLearning() { if (copymode) return; - if (elements) - for (int i = 0; i < nelements; i++) delete[] elements[i]; - delete[] elements; - - - delete[] potential_file_name; - - delete basis_set; - delete ace; + delete aceimpl; if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(map); memory->destroy(scale); } @@ -208,9 +209,9 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { bool is_bevaluator = current_timestep % gamma_grade_eval_freq == 0; if (is_bevaluator) - ace->resize_neighbours_cache(max_jnum); + aceimpl->ace->resize_neighbours_cache(max_jnum); else - rec_ace->resize_neighbours_cache(max_jnum); + aceimpl->rec_ace->resize_neighbours_cache(max_jnum); //loop over atoms for (ii = 0; ii < list->inum; ii++) { @@ -233,21 +234,21 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] try { if (is_bevaluator) - ace->compute_atom(i, x, type, jnum, jlist); + aceimpl->ace->compute_atom(i, x, type, jnum, jlist); else - rec_ace->compute_atom(i, x, type, jnum, jlist); - } catch (exception &e) { + aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); + } catch (std::exception &e) { error->all(FLERR, e.what()); exit(EXIT_FAILURE); } // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade if (is_bevaluator) { - if (gamma_grade < ace->max_gamma_grade) - gamma_grade = ace->max_gamma_grade; + if (gamma_grade < aceimpl->ace->max_gamma_grade) + gamma_grade = aceimpl->ace->max_gamma_grade; } - Array2D &neighbours_forces = (is_bevaluator ? ace->neighbours_forces : rec_ace->neighbours_forces); + Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; const int jtype = type[j]; @@ -280,10 +281,10 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { // evdwl = energy of atom I DOUBLE_TYPE e_atom; if (is_bevaluator) - e_atom= ace->e_atom; + e_atom= aceimpl->ace->e_atom; else - e_atom= rec_ace->e_atom; - evdwl = scale[1][1] * e_atom; + e_atom= aceimpl->rec_ace->e_atom; + evdwl = scale[itype][itype] * e_atom; ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); } } @@ -291,7 +292,7 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { if (vflag_fdotr) virial_fdotr_compute(); - + //TODO: check correctness of MPI usage, maybe use comm->me==0 instead ? if (is_bevaluator) { //gather together global_gamma_grade MPI_Allreduce(&gamma_grade, &global_gamma_grade, 1, MPI_DOUBLE, MPI_MAX, world); @@ -326,6 +327,7 @@ void PairPACEActiveLearning::allocate() { memory->create(setflag, n + 1, n + 1, "pair:setflag"); memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + //TODO: remove ? memory->create(map, n + 1, "pair:map"); memory->create(scale, n + 1, n + 1, "pair:scale"); } @@ -367,22 +369,12 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { if (comm->me == 0) { if (screen) { - fprintf(screen, "ACE/AL version: %d.%d.%d\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - fprintf(screen, "Extrapolation grade thresholds (lower/upper): %f/%f\n", gamma_lower_bound, + utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, gamma_upper_bound); - fprintf(screen, "Extrapolation grade evaluation frequency: %d\n", gamma_grade_eval_freq); + utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); } - if (logfile) { - fprintf(logfile, "ACE/AL version: %d.%d.%d\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - fprintf(logfile, "Extrapolation grade thresholds (lower/upper): %f/%f\n", gamma_lower_bound, - gamma_upper_bound); - fprintf(logfile, "Extrapolation grade evaluation frequency: %d\n", gamma_grade_eval_freq); - } - - } - - } /* ---------------------------------------------------------------------- @@ -397,133 +389,95 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { if (!allocated) allocate(); - //number of provided elements in pair_coeff line - int ntypes_coeff = narg - 4; + map_element2type(narg - 4, arg + 4); - if (ntypes_coeff != atom->ntypes) { - char error_message[1024]; - snprintf(error_message, 1024, - "Incorrect args for pair coefficients. You provided %d elements in pair_coeff, but structure has %d atom types", - ntypes_coeff, atom->ntypes); - error->all(FLERR, error_message); - } - - char *type1 = arg[0]; - char *type2 = arg[1]; - char *potential_file_name = arg[2]; - active_set_inv_filename = arg[3]; + auto potential_file_name = utils::get_potential_file_path(arg[2]); + auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); char **elemtypes = &arg[4]; - // insure that I,J are identical - if (strcmp(type1, type2) != 0) - error->all(FLERR, "Incorrect args for PACE/AL:pair_coeff coefficients"); - int ilo, ihi, jlo, jhi; - force->bounds(FLERR, type1, atom->ntypes, ilo, ihi); - force->bounds(FLERR, type2, atom->ntypes, jlo, jhi); + delete aceimpl->basis_set; + delete aceimpl->ctilde_basis_set; //load potential file - basis_set = new ACEBBasisSet(); - if (comm->me == 0) { - if (screen) fprintf(screen, "Loading %s\n", potential_file_name); - if (logfile) fprintf(logfile, "Loading %s\n", potential_file_name); - } - basis_set->load(potential_file_name); + aceimpl->basis_set = new ACEBBasisSet(); + if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); + aceimpl->basis_set->load(potential_file_name); - // convert the basis set to CTilde format - ctilde_basis_set = new ACECTildeBasisSet(); - *ctilde_basis_set = basis_set->to_ACECTildeBasisSet(); + //convert the basis set to CTilde format + aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); + *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); if (comm->me == 0) { - if (screen) fprintf(screen, "Total number of basis functions\n"); - if (logfile) fprintf(logfile, "Total number of basis functions\n"); + utils::logmesg(lmp, "Total number of basis functions\n"); - for (SPECIES_TYPE mu = 0; mu < basis_set->nelements; mu++) { - int n_r1 = basis_set->total_basis_size_rank1[mu]; - int n = basis_set->total_basis_size[mu]; - if (screen) fprintf(screen, "\t%s: %d (r=1) %d (r>1)\n", basis_set->elements_name[mu].c_str(), n_r1, n); - if (logfile) fprintf(logfile, "\t%s: %d (r=1) %d (r>1)\n", basis_set->elements_name[mu].c_str(), n_r1, n); + for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { + int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; + int n = aceimpl->basis_set->total_basis_size[mu]; + utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, + n); } } - // read args that map atom types to pACE elements + // read args that map atom types to PACE elements // map[i] = which element the Ith atom type is, -1 if not mapped // map[0] is not used + delete aceimpl->ace; + delete aceimpl->rec_ace; - ace = new ACEBEvaluator(); - ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->ace = new ACEBEvaluator(); + aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); - rec_ace = new ACERecursiveEvaluator(); - rec_ace->set_recursive(true); - rec_ace->element_type_mapping.init(atom->ntypes + 1); - rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential + aceimpl->rec_ace = new ACERecursiveEvaluator(); + aceimpl->rec_ace->set_recursive(true); + aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential FILE *species_type_file = fopen("species_types.dat", "w"); - for (int i = 1; i <= atom->ntypes; i++) { + const int n = atom->ntypes; + for (int i = 1; i <= n; i++) { char *elemname = elemtypes[i - 1]; - // dump species types for reconstruction of atomic configurations - fprintf(species_type_file, "%s ", elemname); - int atomic_number = AtomicNumberByName_pace_al(elemname); - if (atomic_number == -1) { - char error_msg[1024]; - snprintf(error_msg, 1024, "String '%s' is not a valid element\n", elemname); - fclose(species_type_file); - error->all(FLERR, error_msg); - } - SPECIES_TYPE mu = basis_set->get_species_index_by_name(elemname); - if (mu != -1) { - if (comm->me == 0) { - if (screen) - fprintf(screen, "Mapping LAMMPS atom type #%d(%s) -> ACE species type #%d\n", i, elemname, mu); - if (logfile) - fprintf(logfile, "Mapping LAMMPS atom type #%d(%s) -> ACE species type #%d\n", i, elemname, mu); - } - map[i] = mu; - ace->element_type_mapping(i) = mu; // set up LAMMPS atom type to ACE species mapping for ace evaluator - rec_ace->element_type_mapping(i) = mu; + if (strcmp(elemname, "NULL") == 0) { + // species_type=-1 value will not reach ACE Evaluator::compute_atom, + // but if it will ,then error will be thrown there + aceimpl->ace->element_type_mapping(i) = -1; + map[i] = -1; + if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); } else { - char error_msg[1024]; - snprintf(error_msg, 1024, "Element %s is not supported by ACE-potential from file %s", elemname, - potential_file_name); - fclose(species_type_file); - error->all(FLERR, error_msg); + + // dump species types for reconstruction of atomic configurations + fprintf(species_type_file, "%s ", elemname); + int atomic_number = AtomicNumberByName_pace_al(elemname); + if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); + SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); + if (mu != -1) { + if (comm->me == 0) + utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, + elemname, mu); + map[i] = mu; + // set up LAMMPS atom type to ACE species mapping for ace evaluators + aceimpl->ace->element_type_mapping(i) = mu; + aceimpl->rec_ace->element_type_mapping(i) = mu; + } else { + error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, + potential_file_name); + } } } fclose(species_type_file); - ace->set_basis(*basis_set); - rec_ace->set_basis(*ctilde_basis_set); + aceimpl->ace->set_basis(*aceimpl->basis_set); + aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); - if (comm->me == 0) { - if (screen) fprintf(screen, "Loading ASI %s\n", active_set_inv_filename); - if (logfile) fprintf(logfile, "Loading ASI %s\n", active_set_inv_filename); - } - ace->load_active_set(active_set_inv_filename); + if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); + aceimpl->ace->load_active_set(active_set_inv_filename); // clear setflag since coeff() called once with I,J = * * - int n = atom->ntypes; - for (int i = 1; i <= n; i++) { - for (int j = i; j <= n; j++) { - setflag[i][j] = 1; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) scale[i][j] = 1.0; - } - } - - // set setflag i,j for type pairs where both are mapped to elements - - int count = 1; - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - if (map[i] >= 0 && map[j] >= 0) { - setflag[i][j] = 1; - count++; - } - - if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); - - + // prepare dump class - if (!dump) { // dump WRITE_DUMP all cfg 10 dump.snap.*.cfg mass type xs ys zs // dump WRITE_DUMP all custom freq extrapolation.dat id type mass x y z @@ -561,14 +515,12 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { void PairPACEActiveLearning::init_style() { if (atom->tag_enable == 0) - error->all(FLERR, "Pair style pACE requires atom IDs"); + error->all(FLERR, "Pair style PACE requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR, "Pair style pACE requires newton pair on"); + error->all(FLERR, "Pair style PACE requires newton pair on"); // request a full neighbor list - int irequest = neighbor->request(this, instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; + neighbor->add_request(this, NeighConst::REQ_FULL); } /* ---------------------------------------------------------------------- @@ -579,7 +531,7 @@ double PairPACEActiveLearning::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); //cutoff from the basis set's radial functions settings scale[j][i] = scale[i][j]; - return basis_set->radial_functions->cut(map[i], map[j]); + return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); } /* ---------------------------------------------------------------------- @@ -588,6 +540,6 @@ double PairPACEActiveLearning::init_one(int i, int j) { void *PairPACEActiveLearning::extract(const char *str, int &dim) { dim = 2; if (strcmp(str, "scale") == 0) return (void *) scale; - return NULL; + return nullptr; } diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 329922d142..64b790bc96 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -1,31 +1,29 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + This software is distributed under the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + /* -Copyright 2021 Yury Lysogorskiy^1, Ralf Drautz^1 +Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, + Matous Mrovec^1, Ralf Drautz^1 ^1: Ruhr-University Bochum, Bochum, Germany - This FILENAME is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - // // Created by Lysogorskiy Yury on 1.01.22. // #ifdef PAIR_CLASS - +// clang-format off PairStyle(pace/al,PairPACEActiveLearning) - +// clang-format on #else #ifndef LMP_PAIR_PACE_AL_H @@ -33,9 +31,7 @@ PairStyle(pace/al,PairPACEActiveLearning) #include "pair.h" #include "dump_custom.h" -#include "ace_b_evaluator.h" -#include "ace_b_basis.h" -#include "ace_recursive.h" + namespace LAMMPS_NS { @@ -43,53 +39,34 @@ namespace LAMMPS_NS { public: PairPACEActiveLearning(class LAMMPS *); - virtual ~PairPACEActiveLearning(); + ~PairPACEActiveLearning() override; - virtual void compute(int, int); - - void settings(int, char **); - - void coeff(int, char **); - - virtual void init_style(); - - double init_one(int, int); - - void *extract(const char *, int &); - - // virtual double memory_usage(); + void compute(int, int) override; + void settings(int, char **) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + void *extract(const char *, int &) override; protected: - ACEBBasisSet *basis_set = nullptr; + struct ACEALImpl *aceimpl; - ACECTildeBasisSet *ctilde_basis_set = nullptr; - ACEBEvaluator* ace = nullptr; - ACERecursiveEvaluator* rec_ace = nullptr; - - char *potential_file_name; int gamma_grade_eval_freq = 1; - DumpCustom *dump = nullptr; - char *active_set_inv_filename; + double gamma_lower_bound = 1.5; double gamma_upper_bound = 10; + virtual void allocate(); - void read_files(char *, char *); - inline int equal(double *x, double *y); - double rcutmax; // max cutoff for all elements int nelements; // # of unique elements - char **elements; // names of unique elements - int *map; // mapping from atom types to elements - int *jlist_local; - int *type_local; double **scale; }; From 6d6346feef3a945108768c1868a6d8b784f97129 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 23 Jun 2022 15:19:02 +0200 Subject: [PATCH 026/364] pair_pace_al.cpp: remove memory create pair:map --- src/ML-PACE/pair_pace_al.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index 5a25ceca6f..9e57834abb 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -327,8 +327,6 @@ void PairPACEActiveLearning::allocate() { memory->create(setflag, n + 1, n + 1, "pair:setflag"); memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - //TODO: remove ? - memory->create(map, n + 1, "pair:map"); memory->create(scale, n + 1, n + 1, "pair:scale"); } From bd10d17be91f6f42d4d2968157e5719f948d5c3d Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 23 Jun 2022 16:55:56 +0200 Subject: [PATCH 027/364] (WIP) lib/pace/Install.py: add --local flag to be able to use local PACE codebase lib/pace/Makefile and Makefile.lammps: update, include wigner-cpp and cnpy --- lib/pace/Install.py | 94 +++++++++++++++++++++++----------------- lib/pace/Makefile | 10 ++++- lib/pace/Makefile.lammps | 4 +- 3 files changed, 64 insertions(+), 44 deletions(-) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 790acd4cf4..bf4723a090 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -1,4 +1,4 @@ -# TODO#!/usr/bin/env python +#!/usr/bin/env python """ Install.py tool to download, compile, and setup the pace library @@ -6,7 +6,10 @@ used to automate the steps described in the README file in this dir """ from __future__ import print_function -import sys, subprocess + +import shutil +import subprocess +import sys from argparse import ArgumentParser sys.path.append('..') @@ -19,19 +22,17 @@ version = 'v.2021.10.25.fix2' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2021.2.3.upd2' : '8fd1162724d349b930e474927197f20d', - 'v.2021.4.9' : '4db54962fbd6adcf8c18d46e1798ceb5', - 'v.2021.9.28' : 'f98363bb98adc7295ea63974738c2a1b', - 'v.2021.10.25' : 'a2ac3315c41a1a4a5c912bcb1bc9c5cc', - 'v.2021.10.25.fix': 'e0572de57039d4afedefb25707b6ceae', - 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f' - } - + 'v.2021.2.3.upd2': '8fd1162724d349b930e474927197f20d', + 'v.2021.4.9': '4db54962fbd6adcf8c18d46e1798ceb5', + 'v.2021.9.28': 'f98363bb98adc7295ea63974738c2a1b', + 'v.2021.10.25': 'a2ac3315c41a1a4a5c912bcb1bc9c5cc', + 'v.2021.10.25.fix': 'e0572de57039d4afedefb25707b6ceae', + 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f' +} parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") - # help message HELP = """ @@ -55,55 +56,68 @@ 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") +parser.add_argument("-l", "--local", default=None, + help="use local version of PACE library build") 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) + parser.print_help() + sys.exit(HELP) buildflag = args.build verboseflag = args.verbose version = args.version - +local = args.local 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) +unarchived_folder_name = "lammps-user-pace-%s" % (version) # download PACE tarball, unpack, build PACE if buildflag: + if not local: + # 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") - # download entire tarball + # 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("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") + 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) + else: + # copy from local version of library PACE + print("Copy pace from ", local) + src_folder = thisdir + "/src" + shutil.copytree(local, src_folder, + # ignore=lambda (s1,s2): ('.git' in s1 or '.git' in s2), + dirs_exist_ok=True) - # 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")) - # 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 -# remove source files + print("Removing pace build files and archive ...") + cmd = 'make clean-build' + if not local: + cmd = ('rm %s;' % (download_filename))+cmd + subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) - print("Removing pace build files and archive ...") - cmd = 'rm %s; make clean-build' % (download_filename) - subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) diff --git a/lib/pace/Makefile b/lib/pace/Makefile index 81f7c9db95..e6d7bff2b9 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -5,8 +5,14 @@ SHELL = /bin/sh YAML_CPP_PATH = src/yaml-cpp YAML_CPP_INC = $(YAML_CPP_PATH)/include +WIGNER_CPP_INC = src/wigner-cpp/include/wigner + +CNPY_CPP_PATH = src/cnpy +CNPY_CPP_INC = $(CNPY_CPP_PATH) +CNPY_SRC_FILES = $(CNPY_CPP_PATH)/cnpy.cpp + SRC_FILES = $(wildcard src/ML-PACE/*.cpp) -SRC = $(filter-out src/ML-PACE/pair_pace.cpp, $(SRC_FILES)) +SRC = $(filter-out src/ML-PACE/pair_pace.cpp, $(SRC_FILES)) $(CNPY_SRC_FILES) # ------ DEFINITIONS ------ @@ -15,7 +21,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) +CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) -I$(WIGNER_CPP_INC) -I$(CNPY_CPP_INC) -DEXTRA_C_PROJECTIONS ARCHIVE = ar ARCHFLAG = -rc diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index f4cbeb8ffd..7e4513e36d 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ -pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include +pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include/wigner -DEXTRA_C_PROJECTIONS pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp -pace_SYSPATH = +pace_SYSPATH = \ No newline at end of file From 3e4c6580ec59054163675e7d110aaadc06b50c28 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 23 Jun 2022 18:47:16 +0200 Subject: [PATCH 028/364] (WIP) add compute_pace.cpp/h pair_pace_al.cpp: allocate map --- src/ML-PACE/compute_pace.cpp | 64 ++++++++++++++++++++++++++++++++++++ src/ML-PACE/compute_pace.h | 46 ++++++++++++++++++++++++++ src/ML-PACE/pair_pace_al.cpp | 44 ++++++++++++++++--------- src/ML-PACE/pair_pace_al.h | 18 +++++++--- 4 files changed, 153 insertions(+), 19 deletions(-) create mode 100644 src/ML-PACE/compute_pace.cpp create mode 100644 src/ML-PACE/compute_pace.h diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp new file mode 100644 index 0000000000..4a3061cef5 --- /dev/null +++ b/src/ML-PACE/compute_pace.cpp @@ -0,0 +1,64 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +// +// Created by Yury Lysogorskiy on 23.06.22. +// + +#include "compute_pace.h" +#include "pair_pace_al.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "math_extra.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "pair.h" +#include "update.h" + +using namespace LAMMPS_NS; + +ComputePaceAtom::ComputePaceAtom(class LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg) { + if (narg < 3) error->all(FLERR, "Illegal compute pace/atom command"); + peratom_flag = 1; +} + +ComputePaceAtom::~ComputePaceAtom() { +} + +void ComputePaceAtom::init() { + if (force->pair == nullptr) + error->all(FLERR, "Compute pace/atom requires a pair style be defined"); + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style, "pace/atom") == 0) count++; + if (count > 1 && comm->me == 0) error->warning(FLERR, "More than one compute pace/atom"); + + pair_pace_al = force->pair_match("pace/al", 1); + if (!pair_pace_al) + error->all(FLERR, "Compute pace/atom requires a `pace/al` pair style"); + +} + +void ComputePaceAtom::compute_peratom() { + invoked_peratom = update->ntimestep; + + vector_atom = ((PairPACEActiveLearning *) pair_pace_al)->extrapolation_grade_gamma; + +} \ No newline at end of file diff --git a/src/ML-PACE/compute_pace.h b/src/ML-PACE/compute_pace.h new file mode 100644 index 0000000000..1d2f130470 --- /dev/null +++ b/src/ML-PACE/compute_pace.h @@ -0,0 +1,46 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +// +// Created by Yury Lysogorskiy on 23.06.22. +// + +#ifdef COMPUTE_CLASS +// clang-format off +ComputeStyle(pace/atom,ComputePaceAtom); +// clang-format on +#else + +#ifndef COMPUTE_PACE_H +#define COMPUTE_PACE_H + + +#include "compute.h" +#include "pair_pace_al.h" + +namespace LAMMPS_NS { + + class ComputePaceAtom : public Compute { + public: + ComputePaceAtom(class LAMMPS *, int, char **); + ~ComputePaceAtom() override; + void init() override; + void compute_peratom() override; + private: + int nmax; + Pair *pair_pace_al; + }; + +} // namespace LAMMPS_NS +#endif //COMPUTE_PACE_H +#endif \ No newline at end of file diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index 9e57834abb..062ef8d7fe 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -117,9 +117,11 @@ PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { one_coeff = 1; manybody_flag = 1; + natoms = 0; aceimpl = new ACEALImpl; - scale= nullptr; + scale = nullptr; + extrapolation_grade_gamma = nullptr; } /* ---------------------------------------------------------------------- @@ -135,6 +137,8 @@ PairPACEActiveLearning::~PairPACEActiveLearning() { memory->destroy(setflag); memory->destroy(cutsq); memory->destroy(scale); + memory->destroy(map); + memory->destroy(extrapolation_grade_gamma); } if (dump) @@ -149,7 +153,7 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { double fij[3]; int *ilist, *jlist, *numneigh, **firstneigh; double gamma_grade = 0; - double global_gamma_grade = 0; + per_structure_gamma_grade = 0; ev_init(eflag, vflag); // downwards modified by YL @@ -185,6 +189,12 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { } + if (atom->natoms > natoms) { + memory->destroy(extrapolation_grade_gamma); + natoms = atom->natoms; + memory->create(extrapolation_grade_gamma, natoms, "pace/atom:gamma"); + } + // Aidan Thompson told RD (26 July 2019) that practically always holds: // inum = nlocal // i = ilist(ii) < inum @@ -246,9 +256,12 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { if (is_bevaluator) { if (gamma_grade < aceimpl->ace->max_gamma_grade) gamma_grade = aceimpl->ace->max_gamma_grade; + + extrapolation_grade_gamma[i] = gamma_grade; } - Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); + Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces + : aceimpl->rec_ace->neighbours_forces); for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; const int jtype = type[j]; @@ -281,9 +294,9 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { // evdwl = energy of atom I DOUBLE_TYPE e_atom; if (is_bevaluator) - e_atom= aceimpl->ace->e_atom; + e_atom = aceimpl->ace->e_atom; else - e_atom= aceimpl->rec_ace->e_atom; + e_atom = aceimpl->rec_ace->e_atom; evdwl = scale[itype][itype] * e_atom; ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); } @@ -294,13 +307,13 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { //TODO: check correctness of MPI usage, maybe use comm->me==0 instead ? if (is_bevaluator) { - //gather together global_gamma_grade - MPI_Allreduce(&gamma_grade, &global_gamma_grade, 1, MPI_DOUBLE, MPI_MAX, world); + //gather together per_structure_gamma_grade + MPI_Allreduce(&gamma_grade, &per_structure_gamma_grade, 1, MPI_DOUBLE, MPI_MAX, world); int mpi_rank; MPI_Comm_rank(world, &mpi_rank); - if (global_gamma_grade > gamma_upper_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, global_gamma_grade); + if (per_structure_gamma_grade > gamma_upper_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, per_structure_gamma_grade); dump->write(); MPI_Barrier(world); @@ -310,8 +323,8 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { MPI_Abort(world, 1); //abort properly with error code '1' if not using 4 processes exit(EXIT_FAILURE); - } else if (global_gamma_grade > gamma_lower_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, global_gamma_grade); + } else if (per_structure_gamma_grade > gamma_lower_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, per_structure_gamma_grade); dump->write(); } } @@ -327,6 +340,7 @@ void PairPACEActiveLearning::allocate() { memory->create(setflag, n + 1, n + 1, "pair:setflag"); memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(map, n + 1, "pair:map"); memory->create(scale, n + 1, n + 1, "pair:scale"); } @@ -369,7 +383,7 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { if (screen) { utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, - gamma_upper_bound); + gamma_upper_bound); utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); } } @@ -471,10 +485,10 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { aceimpl->ace->load_active_set(active_set_inv_filename); // clear setflag since coeff() called once with I,J = * * - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) scale[i][j] = 1.0; - + // prepare dump class if (!dump) { // dump WRITE_DUMP all cfg 10 dump.snap.*.cfg mass type xs ys zs diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 64b790bc96..5151e9572b 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -31,42 +31,52 @@ PairStyle(pace/al,PairPACEActiveLearning) #include "pair.h" #include "dump_custom.h" - +#include "compute_pace.h" namespace LAMMPS_NS { class PairPACEActiveLearning : public Pair { + friend class ComputePaceAtom; + public: PairPACEActiveLearning(class LAMMPS *); ~PairPACEActiveLearning() override; void compute(int, int) override; + void settings(int, char **) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + void *extract(const char *, int &) override; protected: struct ACEALImpl *aceimpl; - - int gamma_grade_eval_freq = 1; DumpCustom *dump = nullptr; - + int natoms; //total number of atoms double gamma_lower_bound = 1.5; double gamma_upper_bound = 10; + double per_structure_gamma_grade = 0; virtual void allocate(); + void read_files(char *, char *); + inline int equal(double *x, double *y); double rcutmax; // max cutoff for all elements int nelements; // # of unique elements + double *extrapolation_grade_gamma; //per-atom gamma value + double **scale; }; From edf40edfd9bb4177ceff899705bd9b5a20f002f4 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 24 Jun 2022 12:51:51 +0200 Subject: [PATCH 029/364] compute_pace.cpp: add scalar max gamma per structure (extracted from MPI-managed pair pace) pair_pace_al.h/cpp: - add Compute *computePaceAtom -add max_gamma_grade_per_structure - use nlocal for size of per-atom extrapolation_grade_gamma[] - bugfix with using current_atom_gamma_grade --- src/ML-PACE/compute_pace.cpp | 8 +++-- src/ML-PACE/pair_pace_al.cpp | 68 +++++++++++++++++++++++------------- src/ML-PACE/pair_pace_al.h | 5 +-- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp index 4a3061cef5..070be9ad50 100644 --- a/src/ML-PACE/compute_pace.cpp +++ b/src/ML-PACE/compute_pace.cpp @@ -58,7 +58,9 @@ void ComputePaceAtom::init() { void ComputePaceAtom::compute_peratom() { invoked_peratom = update->ntimestep; - - vector_atom = ((PairPACEActiveLearning *) pair_pace_al)->extrapolation_grade_gamma; - + auto pair = (PairPACEActiveLearning *) pair_pace_al; + if (invoked_peratom != pair->bevaluator_timestep) + error->all(FLERR, "PACE/gamma was not computed on needed timestep"); + vector_atom = pair->extrapolation_grade_gamma; + scalar = pair->max_gamma_grade_per_structure; } \ No newline at end of file diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index 062ef8d7fe..3718586648 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -38,6 +38,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "memory.h" #include "error.h" #include "update.h" +#include "modify.h" #include "math_const.h" @@ -46,19 +47,21 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "ace_b_basis.h" #include "ace_recursive.h" #include "ace_version.h" +#include "compute_pace.h" namespace LAMMPS_NS { struct ACEALImpl { ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} - ~ACEALImpl() - { + + ~ACEALImpl() { delete basis_set; delete ace; } + ACEBBasisSet *basis_set; - ACEBEvaluator* ace; + ACEBEvaluator *ace; ACECTildeBasisSet *ctilde_basis_set; - ACERecursiveEvaluator* rec_ace; + ACERecursiveEvaluator *rec_ace; }; } // namespace LAMMPS_NS @@ -152,8 +155,8 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { double delx, dely, delz, evdwl; double fij[3]; int *ilist, *jlist, *numneigh, **firstneigh; - double gamma_grade = 0; - per_structure_gamma_grade = 0; + double max_gamma_grade = 0; + max_gamma_grade_per_structure = 0; ev_init(eflag, vflag); // downwards modified by YL @@ -188,13 +191,12 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { error->all(FLERR, str); } - - if (atom->natoms > natoms) { + //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades + if (atom->nlocal > natoms) { memory->destroy(extrapolation_grade_gamma); - natoms = atom->natoms; + natoms = atom->nlocal; memory->create(extrapolation_grade_gamma, natoms, "pace/atom:gamma"); } - // Aidan Thompson told RD (26 July 2019) that practically always holds: // inum = nlocal // i = ilist(ii) < inum @@ -254,10 +256,10 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade if (is_bevaluator) { - if (gamma_grade < aceimpl->ace->max_gamma_grade) - gamma_grade = aceimpl->ace->max_gamma_grade; - - extrapolation_grade_gamma[i] = gamma_grade; + double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; + if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; + bevaluator_timestep = current_timestep; + extrapolation_grade_gamma[i] = current_atom_gamma_grade; } Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces @@ -307,13 +309,13 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { //TODO: check correctness of MPI usage, maybe use comm->me==0 instead ? if (is_bevaluator) { - //gather together per_structure_gamma_grade - MPI_Allreduce(&gamma_grade, &per_structure_gamma_grade, 1, MPI_DOUBLE, MPI_MAX, world); + //gather together max_gamma_grade_per_structure + MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); int mpi_rank; MPI_Comm_rank(world, &mpi_rank); - if (per_structure_gamma_grade > gamma_upper_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, per_structure_gamma_grade); + if (max_gamma_grade_per_structure > gamma_upper_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); dump->write(); MPI_Barrier(world); @@ -323,8 +325,8 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { MPI_Abort(world, 1); //abort properly with error code '1' if not using 4 processes exit(EXIT_FAILURE); - } else if (per_structure_gamma_grade > gamma_lower_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, per_structure_gamma_grade); + } else if (max_gamma_grade_per_structure > gamma_lower_bound) { + if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); dump->write(); } } @@ -489,12 +491,27 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { for (int j = i; j <= n; j++) scale[i][j] = 1.0; + // prepare compute gamma + if (!computePaceAtom) { + // compute pace all pace/atom + char **computeargs = new char *[3]; + computeargs[0] = (char *) "pace_gamma"; //name + computeargs[1] = (char *) "all"; // atoms group + computeargs[2] = (char *) "pace/atom"; //compute style + computePaceAtom = new ComputePaceAtom(lmp, 3, computeargs); + computePaceAtom->init(); + // mimic behaviour from Modify::add_compute + modify->compute[modify->ncompute] = computePaceAtom; + //TODO: modify->compute_list is protected!!! +// modify->compute_list = std::vector(modify->compute, modify->compute + modify->ncompute + 1); + modify->ncompute++; + } + // prepare dump class if (!dump) { - // dump WRITE_DUMP all cfg 10 dump.snap.*.cfg mass type xs ys zs - // dump WRITE_DUMP all custom freq extrapolation.dat id type mass x y z - char **dumpargs = new char *[11]; - dumpargs[0] = (char *) "WRITE_DUMP"; // dump id + // dump pace all custom freq extrapolation.dat id type mass x y z + char **dumpargs = new char *[12]; + dumpargs[0] = (char *) "pace"; // dump id dumpargs[1] = (char *) "all"; // group dumpargs[2] = (char *) "custom"; // dump style dumpargs[3] = (char *) "1"; // dump frequency @@ -505,7 +522,8 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { dumpargs[8] = (char *) "x"; dumpargs[9] = (char *) "y"; dumpargs[10] = (char *) "z"; - dump = new DumpCustom(lmp, 11, dumpargs); + dumpargs[11] = (char *) "c_pace_gamma"; + dump = new DumpCustom(lmp, 12, dumpargs); dump->init(); // dump_modify WRITE_DUMP element X Y Z diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 5151e9572b..47616cd0b1 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -60,11 +60,12 @@ namespace LAMMPS_NS { int gamma_grade_eval_freq = 1; DumpCustom *dump = nullptr; + Compute *computePaceAtom = nullptr; int natoms; //total number of atoms double gamma_lower_bound = 1.5; double gamma_upper_bound = 10; - double per_structure_gamma_grade = 0; + double max_gamma_grade_per_structure = 0; virtual void allocate(); @@ -74,7 +75,7 @@ namespace LAMMPS_NS { double rcutmax; // max cutoff for all elements int nelements; // # of unique elements - + int bevaluator_timestep; // timestep, on which gamma grade were computed double *extrapolation_grade_gamma; //per-atom gamma value double **scale; From 79c7a50ffcff150f6b4199f6da9a153778dd99a0 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 24 Jun 2022 14:53:38 +0200 Subject: [PATCH 030/364] PairPACEActiveLearning: add flag is_dump_extrapolative_structures compute_pace: add compute_scalar --- src/ML-PACE/compute_pace.cpp | 17 ++++++++++--- src/ML-PACE/compute_pace.h | 1 + src/ML-PACE/pair_pace_al.cpp | 49 ++++++++++++++++++++++++++---------- src/ML-PACE/pair_pace_al.h | 1 + 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp index 070be9ad50..4689106452 100644 --- a/src/ML-PACE/compute_pace.cpp +++ b/src/ML-PACE/compute_pace.cpp @@ -36,6 +36,8 @@ ComputePaceAtom::ComputePaceAtom(class LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { if (narg < 3) error->all(FLERR, "Illegal compute pace/atom command"); peratom_flag = 1; + size_peratom_cols = 0; + scalar_flag = 1; // compute max of gamma } ComputePaceAtom::~ComputePaceAtom() { @@ -43,7 +45,7 @@ ComputePaceAtom::~ComputePaceAtom() { void ComputePaceAtom::init() { if (force->pair == nullptr) - error->all(FLERR, "Compute pace/atom requires a pair style be defined"); + error->all(FLERR, "Compute pace/atom requires a pair style pace/al be defined"); int count = 0; for (int i = 0; i < modify->ncompute; i++) @@ -53,14 +55,23 @@ void ComputePaceAtom::init() { pair_pace_al = force->pair_match("pace/al", 1); if (!pair_pace_al) error->all(FLERR, "Compute pace/atom requires a `pace/al` pair style"); +} +double ComputePaceAtom::compute_scalar() { + invoked_peratom = update->ntimestep; + auto pair = (PairPACEActiveLearning *) pair_pace_al; + if (invoked_peratom != pair->bevaluator_timestep) + error->all(FLERR, "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); + + scalar = pair->max_gamma_grade_per_structure; + return scalar; } void ComputePaceAtom::compute_peratom() { invoked_peratom = update->ntimestep; auto pair = (PairPACEActiveLearning *) pair_pace_al; if (invoked_peratom != pair->bevaluator_timestep) - error->all(FLERR, "PACE/gamma was not computed on needed timestep"); + error->all(FLERR, "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); vector_atom = pair->extrapolation_grade_gamma; - scalar = pair->max_gamma_grade_per_structure; + } \ No newline at end of file diff --git a/src/ML-PACE/compute_pace.h b/src/ML-PACE/compute_pace.h index 1d2f130470..0830ffadcd 100644 --- a/src/ML-PACE/compute_pace.h +++ b/src/ML-PACE/compute_pace.h @@ -35,6 +35,7 @@ namespace LAMMPS_NS { ComputePaceAtom(class LAMMPS *, int, char **); ~ComputePaceAtom() override; void init() override; + double compute_scalar() override; void compute_peratom() override; private: int nmax; diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index 3718586648..baa14c8c08 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -71,6 +71,8 @@ using namespace MathConst; #define MAXLINE 1024 #define DELTA 4 #define PACE_AL_EXTRAPOLATION_GRADE_FNAME "grade.dat" +#define EXTRAPOLATIVE_STRUCTURES_FNAME "extrapolative_structures.dat" +#define SPECIES_TYPE_FNAME "species_types.dat" //added YL @@ -144,8 +146,12 @@ PairPACEActiveLearning::~PairPACEActiveLearning() { memory->destroy(extrapolation_grade_gamma); } - if (dump) + if (dump) { delete dump; + dump = nullptr; + } + + //computePaceAtom will be deleted by lmp->modify, as it was registered there } /* ---------------------------------------------------------------------- */ @@ -315,8 +321,9 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { MPI_Comm_rank(world, &mpi_rank); if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); - dump->write(); + if (mpi_rank == 0) + dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); + if (is_dump_extrapolative_structures) dump->write(); MPI_Barrier(world); if (mpi_rank == 0) { @@ -326,8 +333,10 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { MPI_Abort(world, 1); //abort properly with error code '1' if not using 4 processes exit(EXIT_FAILURE); } else if (max_gamma_grade_per_structure > gamma_lower_bound) { - if (mpi_rank == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); - dump->write(); + if (mpi_rank == 0) + dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); + if (is_dump_extrapolative_structures) + dump->write(); } } @@ -351,9 +360,10 @@ void PairPACEActiveLearning::allocate() { ------------------------------------------------------------------------- */ void PairPACEActiveLearning::settings(int narg, char **arg) { - if (narg > 3) { + //TODO: make keyword base interface: pair_style pace/al freq 100 gamma_lo 1.5 gamma_hi 10 dump yes + if (narg > 4) { error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound]"); + "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] [nodump]"); } if (narg > 0) { @@ -381,12 +391,23 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); } + if (narg > 3) { + if (strcmp(arg[3], "nodump") == 0) is_dump_extrapolative_structures = false; + if (strcmp(arg[3], "dump") == 0) is_dump_extrapolative_structures = true; + } + if (comm->me == 0) { if (screen) { utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, gamma_upper_bound); utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); + if (is_dump_extrapolative_structures) + utils::logmesg(lmp, "Extrapolative structures will be dumped into {}\n", + EXTRAPOLATIVE_STRUCTURES_FNAME); + else + utils::logmesg(lmp, "No extrapolative structures will be dumped\n"); + } } } @@ -448,7 +469,10 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential - FILE *species_type_file = fopen("species_types.dat", "w"); + FILE *species_type_file = nullptr; + if (is_dump_extrapolative_structures) + species_type_file = fopen(SPECIES_TYPE_FNAME, "w"); + const int n = atom->ntypes; for (int i = 1; i <= n; i++) { char *elemname = elemtypes[i - 1]; @@ -459,9 +483,8 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { map[i] = -1; if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); } else { - // dump species types for reconstruction of atomic configurations - fprintf(species_type_file, "%s ", elemname); + if (is_dump_extrapolative_structures) fprintf(species_type_file, "%s ", elemname); int atomic_number = AtomicNumberByName_pace_al(elemname); if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); @@ -479,7 +502,7 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { } } } - fclose(species_type_file); + if (is_dump_extrapolative_structures) fclose(species_type_file); aceimpl->ace->set_basis(*aceimpl->basis_set); aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); @@ -508,14 +531,14 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { } // prepare dump class - if (!dump) { + if (is_dump_extrapolative_structures && !dump) { // dump pace all custom freq extrapolation.dat id type mass x y z char **dumpargs = new char *[12]; dumpargs[0] = (char *) "pace"; // dump id dumpargs[1] = (char *) "all"; // group dumpargs[2] = (char *) "custom"; // dump style dumpargs[3] = (char *) "1"; // dump frequency - dumpargs[4] = (char *) "extrapolative_structures.dat"; // fname + dumpargs[4] = (char *) EXTRAPOLATIVE_STRUCTURES_FNAME; // fname dumpargs[5] = (char *) "id"; dumpargs[6] = (char *) "type"; dumpargs[7] = (char *) "mass"; diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 47616cd0b1..7e66603092 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -59,6 +59,7 @@ namespace LAMMPS_NS { struct ACEALImpl *aceimpl; int gamma_grade_eval_freq = 1; + bool is_dump_extrapolative_structures = true; DumpCustom *dump = nullptr; Compute *computePaceAtom = nullptr; int natoms; //total number of atoms From c6e12dc6d3a4813d0441f804ce3e5610dd8469bd Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 24 Jun 2022 15:04:19 +0200 Subject: [PATCH 031/364] WIP: bevaluator_timestep_shift --- src/ML-PACE/compute_pace.cpp | 21 ++++++++++++++++----- src/ML-PACE/pair_pace_al.cpp | 2 +- src/ML-PACE/pair_pace_al.h | 1 + 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp index 4689106452..235f555bfa 100644 --- a/src/ML-PACE/compute_pace.cpp +++ b/src/ML-PACE/compute_pace.cpp @@ -58,10 +58,16 @@ void ComputePaceAtom::init() { } double ComputePaceAtom::compute_scalar() { - invoked_peratom = update->ntimestep; + invoked_scalar = update->ntimestep; auto pair = (PairPACEActiveLearning *) pair_pace_al; - if (invoked_peratom != pair->bevaluator_timestep) - error->all(FLERR, "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); + + if (invoked_scalar != pair->bevaluator_timestep) { +// error->all(FLERR, +// "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); + utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} and recomputing\n",invoked_scalar); + pair->bevaluator_timestep_shift = invoked_scalar; + pair->compute(1, 1); + } scalar = pair->max_gamma_grade_per_structure; return scalar; @@ -70,8 +76,13 @@ double ComputePaceAtom::compute_scalar() { void ComputePaceAtom::compute_peratom() { invoked_peratom = update->ntimestep; auto pair = (PairPACEActiveLearning *) pair_pace_al; - if (invoked_peratom != pair->bevaluator_timestep) - error->all(FLERR, "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); + if (invoked_peratom != pair->bevaluator_timestep) { +// error->all(FLERR, +// "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); + utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} and recomputing\n",invoked_scalar); + pair->bevaluator_timestep_shift = invoked_peratom; + pair->compute(1, 1); + } vector_atom = pair->extrapolation_grade_gamma; } \ No newline at end of file diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index baa14c8c08..ce8a75a6e5 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -224,7 +224,7 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { } int current_timestep = update->ntimestep; - bool is_bevaluator = current_timestep % gamma_grade_eval_freq == 0; + bool is_bevaluator = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; if (is_bevaluator) aceimpl->ace->resize_neighbours_cache(max_jnum); diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 7e66603092..29a76e1f3c 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -77,6 +77,7 @@ namespace LAMMPS_NS { double rcutmax; // max cutoff for all elements int nelements; // # of unique elements int bevaluator_timestep; // timestep, on which gamma grade were computed + int bevaluator_timestep_shift = 0; // double *extrapolation_grade_gamma; //per-atom gamma value double **scale; From afd8e1d06016d84e4d73ab083d1c60410ad36f8c Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 27 Jun 2022 12:37:33 +0200 Subject: [PATCH 032/364] ML-PACE.cmake: move library pace build configuration (CMakeLists.txt) to lammps-user-pace repo compute_pace.cpp: comment out logmessage --- cmake/Modules/Packages/ML-PACE.cmake | 31 ++-------------------------- src/ML-PACE/compute_pace.cpp | 10 ++++----- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 34ba9eec1d..dd3bc83b7a 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -28,36 +28,9 @@ else() endif() endif() -##yaml -# enforce building libyaml-cpp as static library and turn off optional features -set(YAML_BUILD_SHARED_LIBS OFF) -set(YAML_CPP_BUILD_CONTRIB OFF) -set(YAML_CPP_BUILD_TOOLS OFF) -add_subdirectory(${lib-pace}/yaml-cpp build-yaml-cpp) -set(YAML_CPP_INCLUDE_DIR ${lib-pace}/yaml-cpp/include) - -## cnpy -set(CNPY_PATH ${lib-pace}/cnpy) -set(CNPY_INCLUDE_PATH ${CNPY_PATH}) -set(CNPY_SRC ${CNPY_PATH}/cnpy.cpp) -add_library(cnpy-static STATIC ${CNPY_SRC}) -set_target_properties(cnpy-static PROPERTIES LINKER_LANGUAGE CXX) - -## winger-cpp -# this is header-only library -set(WIGNER_PATH ${lib-pace}/wigner-cpp) -set(WIGNER_INCLUDE_PATH ${WIGNER_PATH}/include/wigner) - -# ML-PACE sources -file(GLOB PACE_EVALUATOR_INCLUDE_DIR ${lib-pace}/ML-PACE) -file(GLOB PACE_EVALUATOR_SOURCES ${lib-pace}/ML-PACE/*.cpp) -list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace*.cpp) - -add_library(pace STATIC ${PACE_EVALUATOR_SOURCES}) +add_subdirectory(${lib-pace} build-pace) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) -target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR} ${YAML_CPP_INCLUDE_DIR} ${CNPY_INCLUDE_PATH} ${WIGNER_INCLUDE_PATH}) -target_compile_definitions(pace PUBLIC EXTRA_C_PROJECTIONS) -target_link_libraries(pace PRIVATE yaml-cpp-pace cnpy-static) + if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) endif() diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp index 235f555bfa..d99676491d 100644 --- a/src/ML-PACE/compute_pace.cpp +++ b/src/ML-PACE/compute_pace.cpp @@ -62,10 +62,9 @@ double ComputePaceAtom::compute_scalar() { auto pair = (PairPACEActiveLearning *) pair_pace_al; if (invoked_scalar != pair->bevaluator_timestep) { -// error->all(FLERR, -// "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); - utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} and recomputing\n",invoked_scalar); +// utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_scalar,pair->bevaluator_timestep); pair->bevaluator_timestep_shift = invoked_scalar; + //TODO: is that right calling of pair pace compute? pair->compute(1, 1); } @@ -77,10 +76,9 @@ void ComputePaceAtom::compute_peratom() { invoked_peratom = update->ntimestep; auto pair = (PairPACEActiveLearning *) pair_pace_al; if (invoked_peratom != pair->bevaluator_timestep) { -// error->all(FLERR, -// "PACE/gamma was not computed on needed timestep.\nIncrease `freq` in pair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] or reset timestep to 0"); - utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} and recomputing\n",invoked_scalar); +// utils::logmesg(lmp,"[ComputePaceAtom::compute_peratom] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_peratom,pair->bevaluator_timestep); pair->bevaluator_timestep_shift = invoked_peratom; + //TODO: is that right calling of pair pace compute? pair->compute(1, 1); } vector_atom = pair->extrapolation_grade_gamma; From 23959d4330730438e64a8da4be29108511d25529 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 27 Jun 2022 13:03:59 +0200 Subject: [PATCH 033/364] pair_pace_al.cpp: use comm->me, throw more detailed error when extrapolate compute_pace.cpp: comment out logmessage --- src/ML-PACE/compute_pace.cpp | 2 ++ src/ML-PACE/pair_pace_al.cpp | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp index d99676491d..d66952d1f9 100644 --- a/src/ML-PACE/compute_pace.cpp +++ b/src/ML-PACE/compute_pace.cpp @@ -62,6 +62,7 @@ double ComputePaceAtom::compute_scalar() { auto pair = (PairPACEActiveLearning *) pair_pace_al; if (invoked_scalar != pair->bevaluator_timestep) { + //TODO: somehow control the frequency of extra computation and warn user about adjusting gamma_freq? // utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_scalar,pair->bevaluator_timestep); pair->bevaluator_timestep_shift = invoked_scalar; //TODO: is that right calling of pair pace compute? @@ -76,6 +77,7 @@ void ComputePaceAtom::compute_peratom() { invoked_peratom = update->ntimestep; auto pair = (PairPACEActiveLearning *) pair_pace_al; if (invoked_peratom != pair->bevaluator_timestep) { + //TODO: somehow control the frequency of extra computation and warn user about adjusting gamma_freq? // utils::logmesg(lmp,"[ComputePaceAtom::compute_peratom] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_peratom,pair->bevaluator_timestep); pair->bevaluator_timestep_shift = invoked_peratom; //TODO: is that right calling of pair pace compute? diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index ce8a75a6e5..b20798f3a7 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -313,27 +313,27 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { if (vflag_fdotr) virial_fdotr_compute(); - //TODO: check correctness of MPI usage, maybe use comm->me==0 instead ? + //TODO: check correctness of MPI usage if (is_bevaluator) { //gather together max_gamma_grade_per_structure MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); - int mpi_rank; - MPI_Comm_rank(world, &mpi_rank); if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (mpi_rank == 0) + if (comm->me == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); if (is_dump_extrapolative_structures) dump->write(); MPI_Barrier(world); - if (mpi_rank == 0) { - error->all(FLERR, "Extrapolation grade is too large, stopping...\n"); - } + if (comm->me == 0) + error->all(FLERR, + "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, timestep={}), stopping...\n", + max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); - MPI_Abort(world, 1); //abort properly with error code '1' if not using 4 processes + MPI_Barrier(world); + MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes exit(EXIT_FAILURE); } else if (max_gamma_grade_per_structure > gamma_lower_bound) { - if (mpi_rank == 0) + if (comm->me == 0) dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); if (is_dump_extrapolative_structures) dump->write(); From 80e10206486a705a58cdd9346ded95b9c719e98e Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 27 Jun 2022 18:47:09 +0200 Subject: [PATCH 034/364] update ML-PACE.cmake and lib/pace for v.2022.06.27 --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- lib/pace/Install.py | 5 +++-- lib/pace/Makefile | 4 ++-- lib/pace/Makefile.lammps | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index dd3bc83b7a..98a9496154 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,8 +1,8 @@ if(NOT DEFINED LOCAL_ML-PACE) # standard user scenario: get latest ML-PACE from github - set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.10.25.fix2.tar.gz" CACHE STRING "URL for PACE evaluator library sources") + set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.06.27.tar.gz" CACHE STRING "URL for PACE evaluator library sources") - set(PACELIB_MD5 "32394d799bc282bb57696c78c456e64f" CACHE STRING "MD5 checksum of PACE evaluator library tarball") + set(PACELIB_MD5 "400f0a4b44c1ce64ae47796e6de4bba8" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index bf4723a090..e7bcacefb7 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,7 +18,7 @@ from install_helpers import fullpath, geturl, checkmd5sum # settings thisdir = fullpath('.') -version = 'v.2021.10.25.fix2' +version ='v.2022.06.27' # known checksums for different PACE versions. used to validate the download. checksums = { \ @@ -27,7 +27,8 @@ checksums = { \ 'v.2021.9.28': 'f98363bb98adc7295ea63974738c2a1b', 'v.2021.10.25': 'a2ac3315c41a1a4a5c912bcb1bc9c5cc', 'v.2021.10.25.fix': 'e0572de57039d4afedefb25707b6ceae', - 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f' + 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f', + 'v.2022.06.27': '400f0a4b44c1ce64ae47796e6de4bba8' } parser = ArgumentParser(prog='Install.py', diff --git a/lib/pace/Makefile b/lib/pace/Makefile index e6d7bff2b9..43e5287ecc 100644 --- a/lib/pace/Makefile +++ b/lib/pace/Makefile @@ -11,7 +11,7 @@ CNPY_CPP_PATH = src/cnpy CNPY_CPP_INC = $(CNPY_CPP_PATH) CNPY_SRC_FILES = $(CNPY_CPP_PATH)/cnpy.cpp -SRC_FILES = $(wildcard src/ML-PACE/*.cpp) +SRC_FILES = $(wildcard src/ML-PACE/ace/*.cpp) $(wildcard src/ML-PACE/ace-evaluator/*.cpp) SRC = $(filter-out src/ML-PACE/pair_pace.cpp, $(SRC_FILES)) $(CNPY_SRC_FILES) # ------ DEFINITIONS ------ @@ -21,7 +21,7 @@ OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE -I$(YAML_CPP_INC) -I$(WIGNER_CPP_INC) -I$(CNPY_CPP_INC) -DEXTRA_C_PROJECTIONS +CXXFLAGS = -O3 -fPIC -Isrc/ML-PACE/ace -Isrc/ML-PACE/ace-evaluator -I$(YAML_CPP_INC) -I$(WIGNER_CPP_INC) -I$(CNPY_CPP_INC) -DEXTRA_C_PROJECTIONS ARCHIVE = ar ARCHFLAG = -rc diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index 7e4513e36d..cda4e81662 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ -pace_SYSINC =-I../../lib/pace/src/ML-PACE -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include/wigner -DEXTRA_C_PROJECTIONS +pace_SYSINC =-I../../lib/pace/src/ML-PACE/ace -I../../lib/pace/src/ML-PACE/ace-evaluator -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include/wigner -DEXTRA_C_PROJECTIONS pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp pace_SYSPATH = \ No newline at end of file From f8ddeb033cb42b8c551fe4cac805f17cd05dbd2c Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 29 Jun 2022 14:38:37 +0200 Subject: [PATCH 035/364] change default is_dump_extrapolative_structures=false add pair_pace.rst --- doc/src/pair_pace.rst | 68 ++++++++++++++++++++++++++++++++++-- src/ML-PACE/pair_pace_al.cpp | 1 + src/ML-PACE/pair_pace_al.h | 2 +- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index c9857c5caa..d50bd7e097 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -1,11 +1,15 @@ .. index:: pair_style pace .. index:: pair_style pace/kk +.. index:: pair_style pace/al pair_style pace command ======================= Accelerator Variants: *pace/kk* +pair_style pace/al command +========================= + Syntax """""" @@ -22,6 +26,18 @@ Syntax *recursive* = use recursive algorithm for basis functions *chunksize* value = number of atoms in each pass +.. code-block:: LAMMPS + + pair_style pace/al gamma_lower_bound gamma_upper_bound gamma_freq dump + +* one or more arguments may be appended + + .. parsed-literal:: + *gamma_lower_bound* = minimal value of extrapolation grade considered as moderate extrapolation + *gamma_upper_bound* = maximal value of extrapolation grade considered as moderate extrapolation + *gamma_freq* value = frequency of computing extrapolation grade (in steps) + dump = *dump* or *nodump* = dump structures with gamma > *gamma_lower_bound* to `extrapolative_structures.dat` file + Examples """""""" @@ -31,6 +47,9 @@ Examples pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu + pair_style pace/al 1.5 10 20 nodump + pair_coeff * * Cu.yaml Cu.asi Cu + Description """"""""""" @@ -76,6 +95,43 @@ avoid running out of memory. For example if there are 8192 atoms in the simulation and the *chunksize* is set to 4096, the ACE calculation will be broken up into two passes (running on a single GPU). +Extrapolation grade and active learning +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Calculation of extrapolation grade in PACE is implemented in `pair_style pace/al`. +It is based on the MaxVol algorithm similar to Moment Tensor Potential (MTP) by Shapeev et al. +and described in :ref:`(Lysogorskiy2) `. +In order to compute extrapolation grade one needs to provide: + +#. ACE potential in B-basis form (`.yaml` format) and +#. Active Set Inverted (ASI) file for corresponding potential (`.asi` format) + +Calculation of extrapolation grades requires matrix-vector multiplication for each atom +and can be slower than the usual `pair_style pace recursive`, +therefore it make sense not to do it on every step. +Extrapolation grade calculation frequency is controlled by *gamma_freq* parameter. +On all other steps `pair_style pace recursive` is used. + +The maximal value of *gamma* for all atoms in a structure determines the extrapolation grade for structure. +If per-structure extrapolation grade exceeds *gamma_lower_bound* but less than *gamma_upper_bound*, +the structure is considered as extrapolative and will be stored into +`extrapolative_structures.dat` if *dump* keyword is provided. +If extrapolation grade exceeds *gamma_upper_bound*, simulation is aborted. + +Both per-atom and per-structure extrapolation grades are accessible via `compute pace/atom` +that is **always** instantiated for `pair_style pace/al` by name `c_pace_gamma`: + +.. code-block:: LAMMPS + + # per-structure extrapolation grade + thermo_style custom step etotal temp press c_pace_gamma + + # per-atom extrapolation grade + dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma + + +---------- + See the :doc:`pair_coeff ` page for alternate ways to specify the path for the ACE coefficient file. @@ -119,7 +175,11 @@ Related commands Default """"""" -recursive, chunksize = 4096 +recursive, chunksize = 4096, +gamma_lower_bound = 1.5, +gamma_upper_bound = 10, +gamma_freq = 1, +nodump .. _Drautz20191: @@ -127,4 +187,8 @@ recursive, chunksize = 4096 .. _Lysogorskiy20211: -**(Lysogorskiy)** Lysogorskiy, van der Oord, Bochkarev, Menon, Rinaldi, Hammerschmidt, Mrovec, Thompson, Csanyi, Ortner, Drautz, TBD (2021). +**(Lysogorskiy)** Lysogorskiy, van der Oord, Bochkarev, Menon, Rinaldi, Hammerschmidt, Mrovec, Thompson, Csanyi, Ortner, Drautz, npj Comp Mat, 7, 97 (2021). + +.. _Lysogorskiy2022: + +**(Lysogorskiy2022)** Lysogorskiy, Bochkarev, Mrovec, Drautz, TBS (2022). diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_al.cpp index b20798f3a7..4c678d5060 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_al.cpp @@ -392,6 +392,7 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { } if (narg > 3) { + //default value is_dump_extrapolative_structures = false if (strcmp(arg[3], "nodump") == 0) is_dump_extrapolative_structures = false; if (strcmp(arg[3], "dump") == 0) is_dump_extrapolative_structures = true; } diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_al.h index 29a76e1f3c..219958a6ab 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_al.h @@ -59,7 +59,7 @@ namespace LAMMPS_NS { struct ACEALImpl *aceimpl; int gamma_grade_eval_freq = 1; - bool is_dump_extrapolative_structures = true; + bool is_dump_extrapolative_structures = false; DumpCustom *dump = nullptr; Compute *computePaceAtom = nullptr; int natoms; //total number of atoms From 6a37a75bcf9fda778f4bb9a4cfe3828a2876c95b Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 29 Jun 2022 15:18:39 +0200 Subject: [PATCH 036/364] add compute_pace_atom.rst --- doc/src/compute_pace_atom.rst | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 doc/src/compute_pace_atom.rst diff --git a/doc/src/compute_pace_atom.rst b/doc/src/compute_pace_atom.rst new file mode 100644 index 0000000000..ae1ac0b228 --- /dev/null +++ b/doc/src/compute_pace_atom.rst @@ -0,0 +1,73 @@ +.. index:: compute pace/atom + +compute pace/atom command +======================= + +Syntax +"""""" + +.. parsed-literal:: + + compute ID all pace/atom + +* ID is documented in :doc:`compute ` command +* pace/atom = style name of this compute command + +Examples +"""""""" + +.. code-block:: LAMMPS + + compute my_gamma all pace/atom + +Description +""""""""""" + +Define a computation that calculates both per-atom and per-structure extrapolation grades for PACE interatomic potential. +Pair style :doc:`pair_style pace/al ` must be instantiated before. +Extrapolation grades are computed by `pair_style pace/al` every *gamma_freq* steps (see :doc:`pair_style pace/al `), +but `compute pace/atom` will invoke extra calculations with this pair style if necessary. +For better performance, it is recommended to use the same values of *gamma_freq* and +the frequency of compute style callers, i.e. `dump` or `thermo`. + + +Default compute style with ID="pace_gamma" is always created by `pair_style pace/al` and corresponding +per-structure and per-atom extrapolation grades could be used as: + +.. code-block:: + + # per-structure extrapolation grade c_pace_gamma + thermo_style custom step etotal temp press c_pace_gamma + + # per-atom extrapolation grade c_pace_gamma + dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma + + +Output info +""""""""""" + +This compute calculates both per-atom vector and per-structure scalar, +which can be accessed by any command that uses per-atom and/or per-structure values from a compute as input. +See the :doc:`Howto output ` page for an overview of +LAMMPS output options. + +All values are unitless. + +Restrictions +"""""""""""" + + Pair style :doc:`pair_style pace/al ` must be instantiated before. + + group-ID always corresponds to the group atoms used by `pair_style pace/al` and by default is `all`. + +Related commands +"""""""""""""""" + +:doc:`pair_style pace/al ` +:doc:`dump custom ` +:doc:`thermo custom ` + +Default +""""""" + +`compute pace_gamma all pace/atom` From 530e5d5c14dbd1c6cff87d799331c5c437f3666e Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 30 Jun 2022 12:56:08 -0600 Subject: [PATCH 037/364] Remove NEWTON_OFF --- src/ML-IAP/pair_mliap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 56c6e505b0..af161a63d8 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -338,7 +338,7 @@ void PairMLIAP::init_style() // need a full neighbor list if (ghostneigh == 1) { - neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST | NeighConst::REQ_NEWTON_OFF); + neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); } else { neighbor->add_request(this, NeighConst::REQ_FULL); } From 3b41ec7d9bd1cefa8886b13561409e2f9eb228d8 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 7 Jul 2022 23:28:12 +0200 Subject: [PATCH 038/364] uniformly rename pair_style, compute and dump to pace/extrapolation add doc --- doc/src/Commands_compute.rst | 1 + doc/src/Commands_pair.rst | 1 + doc/src/compute.rst | 1 + ...tom.rst => compute_pace_extrapolation.rst} | 34 +++++------- doc/src/dump_pace_extrapolation.rst | 45 +++++++++++++++ doc/src/pair_pace.rst | 55 +++++++++++-------- doc/src/pair_style.rst | 1 + 7 files changed, 96 insertions(+), 42 deletions(-) rename doc/src/{compute_pace_atom.rst => compute_pace_extrapolation.rst} (54%) create mode 100644 doc/src/dump_pace_extrapolation.rst diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 61c5e83eda..97e188469b 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -95,6 +95,7 @@ KOKKOS, o = OPENMP, t = OPT. * :doc:`nbond/atom ` * :doc:`omega/chunk ` * :doc:`orientorder/atom (k) ` + * :doc:`pace/extrapolation ` * :doc:`pair ` * :doc:`pair/local ` * :doc:`pe ` diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index f902b40b29..ae232bf6e9 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -232,6 +232,7 @@ OPT. * :doc:`oxrna2/xstk ` * :doc:`oxrna2/coaxstk ` * :doc:`pace (k) ` + * :doc:`pace/extrapolation ` * :doc:`peri/eps ` * :doc:`peri/lps (o) ` * :doc:`peri/pmb (o) ` diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 6fdedbbb95..12576ced7d 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -240,6 +240,7 @@ The individual style names on the :doc:`Commands compute ` pag * :doc:`nbond/atom ` - calculates number of bonds per atom * :doc:`omega/chunk ` - angular velocity for each chunk * :doc:`orientorder/atom ` - Steinhardt bond orientational order parameters Ql +* :doc:`pace/extrapolation ` - calculate extrapolation grade for pair style pace/extrapolation * :doc:`pair ` - values computed by a pair style * :doc:`pair/local ` - distance/energy/force of each pairwise interaction * :doc:`pe ` - potential energy diff --git a/doc/src/compute_pace_atom.rst b/doc/src/compute_pace_extrapolation.rst similarity index 54% rename from doc/src/compute_pace_atom.rst rename to doc/src/compute_pace_extrapolation.rst index ae1ac0b228..b983f983e9 100644 --- a/doc/src/compute_pace_atom.rst +++ b/doc/src/compute_pace_extrapolation.rst @@ -1,40 +1,38 @@ -.. index:: compute pace/atom +.. index:: compute pace/extrapolation -compute pace/atom command -======================= +compute pace/extrapolation command +================================== Syntax """""" .. parsed-literal:: - compute ID all pace/atom + compute ID all pace/extrapolation * ID is documented in :doc:`compute ` command -* pace/atom = style name of this compute command +* pace/extrapolation = style name of this compute command Examples """""""" .. code-block:: LAMMPS - compute my_gamma all pace/atom + compute pace_gamma all pace/extrapolation Description """"""""""" Define a computation that calculates both per-atom and per-structure extrapolation grades for PACE interatomic potential. -Pair style :doc:`pair_style pace/al ` must be instantiated before. -Extrapolation grades are computed by `pair_style pace/al` every *gamma_freq* steps (see :doc:`pair_style pace/al `), -but `compute pace/atom` will invoke extra calculations with this pair style if necessary. +Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. +Extrapolation grades are computed by `pair_style pace/extrapolation` every *gamma_freq* steps (see :doc:`pair_style pace/extrapolation `), +but `compute pace/extrapolation` will invoke extra calculations with this pair style if necessary. For better performance, it is recommended to use the same values of *gamma_freq* and the frequency of compute style callers, i.e. `dump` or `thermo`. +.. code-block:: LAMMPS -Default compute style with ID="pace_gamma" is always created by `pair_style pace/al` and corresponding -per-structure and per-atom extrapolation grades could be used as: - -.. code-block:: + compute pace_gamma all pace/extrapolation # per-structure extrapolation grade c_pace_gamma thermo_style custom step etotal temp press c_pace_gamma @@ -56,18 +54,16 @@ All values are unitless. Restrictions """""""""""" - Pair style :doc:`pair_style pace/al ` must be instantiated before. + Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. - group-ID always corresponds to the group atoms used by `pair_style pace/al` and by default is `all`. + group-ID always corresponds to the group atoms used by `pair_style pace/extrapolation` and by default is `all`. Related commands """""""""""""""" -:doc:`pair_style pace/al ` -:doc:`dump custom ` -:doc:`thermo custom ` +:doc:`pair_style pace/extrapolation `, :doc:`dump custom `, :doc:`thermo custom ` Default """"""" -`compute pace_gamma all pace/atom` +`compute pace_gamma all pace/extrapolation` diff --git a/doc/src/dump_pace_extrapolation.rst b/doc/src/dump_pace_extrapolation.rst new file mode 100644 index 0000000000..0b14222c42 --- /dev/null +++ b/doc/src/dump_pace_extrapolation.rst @@ -0,0 +1,45 @@ +.. index:: dump pace/extrapolation + +dump pace/extrapolation command +================================ + +Syntax +"""""" + +.. parsed-literal:: + + dump ID group-ID pace/extrapolation N file args + + +* ID = user-assigned name for the dump +* group-ID = ID of the group of atoms to be dumped +* N = dump every this many timesteps (use 1 to potentially dump on every step, see below) +* file = name of file to write dump info to +* args = list of arguments (see :doc:`dump custom `) + +Examples +"""""""" + +.. code-block:: LAMMPS + + dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma + dump pace all pace/extrapolation 1 extrapolation.lammpsbin id type mass x y z c_pace_gamma + +Description +""""""""""" + +Dump a snapshot of atom coordinates if extrapolation grade, computed by +:doc:`compute pace/extrapolation `, exceeds *gamma_lower_bound* threshold, +provided in :doc:`pair_style pace/extrapolation `. + +.. note:: + + To be able to use this dump, you need to setup :doc:`pair_style pace/extrapolation ` + and :doc:`compute pace/extrapolation ` beforehand + +---------- + +Related commands +"""""""""""""""" + +:doc:`pair_style pace/extrapolation `, :doc:`compute pace/extrapolation ` diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index d50bd7e097..c2d33240db 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -1,14 +1,14 @@ .. index:: pair_style pace .. index:: pair_style pace/kk -.. index:: pair_style pace/al +.. index:: pair_style pace/extrapolation pair_style pace command ======================= Accelerator Variants: *pace/kk* -pair_style pace/al command -========================= +pair_style pace/extrapolation command +===================================== Syntax """""" @@ -28,7 +28,7 @@ Syntax .. code-block:: LAMMPS - pair_style pace/al gamma_lower_bound gamma_upper_bound gamma_freq dump + pair_style pace/extrapolation gamma_lower_bound gamma_upper_bound gamma_freq * one or more arguments may be appended @@ -36,7 +36,6 @@ Syntax *gamma_lower_bound* = minimal value of extrapolation grade considered as moderate extrapolation *gamma_upper_bound* = maximal value of extrapolation grade considered as moderate extrapolation *gamma_freq* value = frequency of computing extrapolation grade (in steps) - dump = *dump* or *nodump* = dump structures with gamma > *gamma_lower_bound* to `extrapolative_structures.dat` file Examples """""""" @@ -47,7 +46,7 @@ Examples pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu - pair_style pace/al 1.5 10 20 nodump + pair_style pace/extrapolation 1.5 10 20 pair_coeff * * Cu.yaml Cu.asi Cu Description @@ -95,12 +94,12 @@ avoid running out of memory. For example if there are 8192 atoms in the simulation and the *chunksize* is set to 4096, the ACE calculation will be broken up into two passes (running on a single GPU). -Extrapolation grade and active learning -""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +Extrapolation grade +""""""""""""""""""" -Calculation of extrapolation grade in PACE is implemented in `pair_style pace/al`. +Calculation of extrapolation grade in PACE is implemented in `pair_style pace/extrapolation`. It is based on the MaxVol algorithm similar to Moment Tensor Potential (MTP) by Shapeev et al. -and described in :ref:`(Lysogorskiy2) `. +and is described in :ref:`(Lysogorskiy2) `. In order to compute extrapolation grade one needs to provide: #. ACE potential in B-basis form (`.yaml` format) and @@ -108,27 +107,36 @@ In order to compute extrapolation grade one needs to provide: Calculation of extrapolation grades requires matrix-vector multiplication for each atom and can be slower than the usual `pair_style pace recursive`, -therefore it make sense not to do it on every step. +therefore it make sense *not* to do it on every step. Extrapolation grade calculation frequency is controlled by *gamma_freq* parameter. On all other steps `pair_style pace recursive` is used. The maximal value of *gamma* for all atoms in a structure determines the extrapolation grade for structure. -If per-structure extrapolation grade exceeds *gamma_lower_bound* but less than *gamma_upper_bound*, -the structure is considered as extrapolative and will be stored into -`extrapolative_structures.dat` if *dump* keyword is provided. -If extrapolation grade exceeds *gamma_upper_bound*, simulation is aborted. - -Both per-atom and per-structure extrapolation grades are accessible via `compute pace/atom` -that is **always** instantiated for `pair_style pace/al` by name `c_pace_gamma`: +Both per-atom and per-structure extrapolation grades are accessible via `compute pace/extrapolation`: .. code-block:: LAMMPS - # per-structure extrapolation grade + compute pace_gamma all pace/extrapolation + + # show maximal extrapolation grade per-structure thermo_style custom step etotal temp press c_pace_gamma - # per-atom extrapolation grade + # dump structure with per-atom extrapolation grades dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma +If maximal extrapolation grade per-structure exceeds *gamma_lower_bound* but less than *gamma_upper_bound*, +the structure is considered as extrapolative and can be stored with `dump pace/extrapolation`: + +.. code-block:: LAMMPS + + compute pace_gamma all pace/extrapolation + dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma + +Please note, that even if you provide dump frequency equal to one, dump will write structure +only if extrapolation grades are computed on current timestep *and* maximal extrapolation grade exceeds *gamma_lower_bound*. +If extrapolation grade exceeds *gamma_upper_bound*, simulation will be aborted. + + ---------- @@ -170,7 +178,9 @@ See the :doc:`Build package ` page for more info. Related commands """""""""""""""" -:doc:`pair_style snap ` +:doc:`pair_style snap `, +:doc:`compute pace/extrapolation `, +:doc:`dump pace/extrapolation `, Default """"""" @@ -178,8 +188,7 @@ Default recursive, chunksize = 4096, gamma_lower_bound = 1.5, gamma_upper_bound = 10, -gamma_freq = 1, -nodump +gamma_freq = 1 .. _Drautz20191: diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index 7e9414cee9..17614d3055 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -310,6 +310,7 @@ accelerated styles exist. * :doc:`oxrna2/stk ` - * :doc:`oxrna2/xstk ` - * :doc:`pace ` - Atomic Cluster Expansion (ACE) machine-learning potential +* :doc:`pace/extrapolation ` - Atomic Cluster Expansion (ACE) machine-learning potential with extrapolation grades * :doc:`peri/eps ` - peridynamic EPS potential * :doc:`peri/lps ` - peridynamic LPS potential * :doc:`peri/pmb ` - peridynamic PMB potential From d21c933ae0fb7127d9e26685086d1d2bad988b11 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 7 Jul 2022 23:35:27 +0200 Subject: [PATCH 039/364] - rename pair_style pace/al to pace/extrapolation - PairPACEExtrapolation do not instantiate special compute and dump pace/extrapolation classes. This is user responsibility now. - add is_set_energies_forces option to control updating Pair::evdwl and Pair::f - add dump_pace_extrapolation.h/cpp - DumpPACEExtrapolation::write() dump only if 1) extrapolation grades were computed on current timestep AND 2) max extrapolation grade > gamma_lower_bound - ComputePACEExtrapolation::invoke_compute_extrapolation_grades: does not update energies/forces/stresses, called when compute and pair_style pace/extrapolation not syncronize --- src/ML-PACE/compute_pace.cpp | 88 -------- src/ML-PACE/compute_pace_extrapolation.cpp | 93 +++++++++ ...te_pace.h => compute_pace_extrapolation.h} | 15 +- src/ML-PACE/dump_pace_extrapolation.cpp | 56 +++++ src/ML-PACE/dump_pace_extrapolation.h | 43 ++++ ...ace_al.cpp => pair_pace_extrapolation.cpp} | 194 +++++------------- ...ir_pace_al.h => pair_pace_extrapolation.h} | 34 ++- 7 files changed, 263 insertions(+), 260 deletions(-) delete mode 100644 src/ML-PACE/compute_pace.cpp create mode 100644 src/ML-PACE/compute_pace_extrapolation.cpp rename src/ML-PACE/{compute_pace.h => compute_pace_extrapolation.h} (72%) create mode 100644 src/ML-PACE/dump_pace_extrapolation.cpp create mode 100644 src/ML-PACE/dump_pace_extrapolation.h rename src/ML-PACE/{pair_pace_al.cpp => pair_pace_extrapolation.cpp} (70%) rename src/ML-PACE/{pair_pace_al.h => pair_pace_extrapolation.h} (70%) diff --git a/src/ML-PACE/compute_pace.cpp b/src/ML-PACE/compute_pace.cpp deleted file mode 100644 index d66952d1f9..0000000000 --- a/src/ML-PACE/compute_pace.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -// -// Created by Yury Lysogorskiy on 23.06.22. -// - -#include "compute_pace.h" -#include "pair_pace_al.h" - -#include "atom.h" -#include "comm.h" -#include "error.h" -#include "force.h" -#include "math_extra.h" -#include "memory.h" -#include "modify.h" -#include "neigh_list.h" -#include "neighbor.h" -#include "pair.h" -#include "update.h" - -using namespace LAMMPS_NS; - -ComputePaceAtom::ComputePaceAtom(class LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) { - if (narg < 3) error->all(FLERR, "Illegal compute pace/atom command"); - peratom_flag = 1; - size_peratom_cols = 0; - scalar_flag = 1; // compute max of gamma -} - -ComputePaceAtom::~ComputePaceAtom() { -} - -void ComputePaceAtom::init() { - if (force->pair == nullptr) - error->all(FLERR, "Compute pace/atom requires a pair style pace/al be defined"); - - int count = 0; - for (int i = 0; i < modify->ncompute; i++) - if (strcmp(modify->compute[i]->style, "pace/atom") == 0) count++; - if (count > 1 && comm->me == 0) error->warning(FLERR, "More than one compute pace/atom"); - - pair_pace_al = force->pair_match("pace/al", 1); - if (!pair_pace_al) - error->all(FLERR, "Compute pace/atom requires a `pace/al` pair style"); -} - -double ComputePaceAtom::compute_scalar() { - invoked_scalar = update->ntimestep; - auto pair = (PairPACEActiveLearning *) pair_pace_al; - - if (invoked_scalar != pair->bevaluator_timestep) { - //TODO: somehow control the frequency of extra computation and warn user about adjusting gamma_freq? -// utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_scalar,pair->bevaluator_timestep); - pair->bevaluator_timestep_shift = invoked_scalar; - //TODO: is that right calling of pair pace compute? - pair->compute(1, 1); - } - - scalar = pair->max_gamma_grade_per_structure; - return scalar; -} - -void ComputePaceAtom::compute_peratom() { - invoked_peratom = update->ntimestep; - auto pair = (PairPACEActiveLearning *) pair_pace_al; - if (invoked_peratom != pair->bevaluator_timestep) { - //TODO: somehow control the frequency of extra computation and warn user about adjusting gamma_freq? -// utils::logmesg(lmp,"[ComputePaceAtom::compute_peratom] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_peratom,pair->bevaluator_timestep); - pair->bevaluator_timestep_shift = invoked_peratom; - //TODO: is that right calling of pair pace compute? - pair->compute(1, 1); - } - vector_atom = pair->extrapolation_grade_gamma; - -} \ No newline at end of file diff --git a/src/ML-PACE/compute_pace_extrapolation.cpp b/src/ML-PACE/compute_pace_extrapolation.cpp new file mode 100644 index 0000000000..07f128f89b --- /dev/null +++ b/src/ML-PACE/compute_pace_extrapolation.cpp @@ -0,0 +1,93 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +// +// Created by Yury Lysogorskiy on 23.06.22. +// + +#include "compute_pace_extrapolation.h" +#include "pair_pace_extrapolation.h" + + +#include "comm.h" +#include "error.h" +#include "force.h" +#include "modify.h" +#include "update.h" + +using namespace LAMMPS_NS; + +ComputePACEExtrapolation::ComputePACEExtrapolation(class LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg) { + if (narg < 3) error->all(FLERR, "Illegal compute pace/extrapolation command"); + peratom_flag = 1; + size_peratom_cols = 0; + scalar_flag = 1; // compute max of gamma +} + +ComputePACEExtrapolation::~ComputePACEExtrapolation() { +} + +void ComputePACEExtrapolation::init() { + if (force->pair == nullptr) + error->all(FLERR, "Compute pace/extrapolation requires a pair style pace/extrapolation be defined"); + + if ((modify->get_compute_by_style("pace/extrapolation").size() > 1) && (comm->me == 0)) + error->warning(FLERR, "More than one instance of compute pace/atom"); + + pair_pace_extrapolation = (PairPACEExtrapolation *) force->pair_match("pace/extrapolation", 1); + if (!pair_pace_extrapolation) + error->all(FLERR, "Compute pace/extrapolation requires a `pace/extrapolation` pair style"); +} + +void ComputePACEExtrapolation::invoke_compute_extrapolation_grades() { + bigint current_timestep = update->ntimestep; + pair_pace_extrapolation->bevaluator_timestep_shift = current_timestep; + int old_vflag_fdotr = pair_pace_extrapolation->vflag_fdotr; + pair_pace_extrapolation->vflag_fdotr = 0; + pair_pace_extrapolation->is_set_energies_forces = false; + + pair_pace_extrapolation->compute(0, 0); + + pair_pace_extrapolation->is_set_energies_forces = true; + pair_pace_extrapolation->vflag_fdotr = old_vflag_fdotr; +} + +double ComputePACEExtrapolation::compute_scalar() { + invoked_scalar = update->ntimestep; + + // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep + // if not coherent, change pair->bevaluator_timestep_shift to current timestep + // and call invoke_compute_extrapolation_grades without updating energies and forces + if (invoked_scalar != pair_pace_extrapolation->bevaluator_timestep) { + //utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_scalar,pair->bevaluator_timestep); + invoke_compute_extrapolation_grades(); + } + + scalar = pair_pace_extrapolation->max_gamma_grade_per_structure; + return scalar; +} + +void ComputePACEExtrapolation::compute_peratom() { + invoked_peratom = update->ntimestep; + + // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep + // if not coherent, change pair->bevaluator_timestep_shift to current timestep + // and call invoke_compute_extrapolation_grades without updating energies and forces + if (invoked_peratom != pair_pace_extrapolation->bevaluator_timestep) { + //utils::logmesg(lmp,"[ComputePaceAtom::compute_peratom] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_peratom,pair->bevaluator_timestep); + invoke_compute_extrapolation_grades(); + } + + vector_atom = pair_pace_extrapolation->extrapolation_grade_gamma; +} \ No newline at end of file diff --git a/src/ML-PACE/compute_pace.h b/src/ML-PACE/compute_pace_extrapolation.h similarity index 72% rename from src/ML-PACE/compute_pace.h rename to src/ML-PACE/compute_pace_extrapolation.h index 0830ffadcd..1bc7d04189 100644 --- a/src/ML-PACE/compute_pace.h +++ b/src/ML-PACE/compute_pace_extrapolation.h @@ -17,7 +17,7 @@ #ifdef COMPUTE_CLASS // clang-format off -ComputeStyle(pace/atom,ComputePaceAtom); +ComputeStyle(pace/extrapolation,ComputePACEExtrapolation); // clang-format on #else @@ -26,20 +26,21 @@ ComputeStyle(pace/atom,ComputePaceAtom); #include "compute.h" -#include "pair_pace_al.h" +#include "pair_pace_extrapolation.h" namespace LAMMPS_NS { + class PairPACEExtrapolation; - class ComputePaceAtom : public Compute { + class ComputePACEExtrapolation : public Compute { public: - ComputePaceAtom(class LAMMPS *, int, char **); - ~ComputePaceAtom() override; + ComputePACEExtrapolation(class LAMMPS *, int, char **); + ~ComputePACEExtrapolation() override; void init() override; double compute_scalar() override; void compute_peratom() override; private: - int nmax; - Pair *pair_pace_al; + PairPACEExtrapolation *pair_pace_extrapolation; + void invoke_compute_extrapolation_grades(); }; } // namespace LAMMPS_NS diff --git a/src/ML-PACE/dump_pace_extrapolation.cpp b/src/ML-PACE/dump_pace_extrapolation.cpp new file mode 100644 index 0000000000..f2cda0b85b --- /dev/null +++ b/src/ML-PACE/dump_pace_extrapolation.cpp @@ -0,0 +1,56 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "dump_pace_extrapolation.h" +#include "atom.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" +#include "update.h" +#include "modify.h" + + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +DumpPACEExtrapolation::DumpPACEExtrapolation(struct LAMMPS *lmp, int nargs, char **argv) : DumpCustom(lmp, nargs, + argv) { + pairPaceExtrapolation = (PairPACEExtrapolation *) force->pair_match("pace/extrapolation", 1); + if (!pairPaceExtrapolation) + error->all(FLERR, "Dump pace/extrapolation requires a `pace/extrapolation` pair style"); + + // Save atomtypes to elements mapping into SPECIES_TYPE_FNAME to be used later in Python for loading extrapolative structures + FILE *species_type_file = fopen(SPECIES_TYPE_FNAME.c_str(), "w"); + const int n = atom->ntypes; + for (int i = 0; i < n; i++) { + auto elemname = pairPaceExtrapolation->element_names[i].c_str(); + fprintf(species_type_file, "%s ", elemname); + } + fclose(species_type_file); +} + +void DumpPACEExtrapolation::write() { + int current_time_step = update->ntimestep; + // dump only if + // 1) extrapolation grades were computed on current timestep AND + // 2) max extrapolation grade > gamma_lower_bound + if (current_time_step == pairPaceExtrapolation->bevaluator_timestep) { + if (pairPaceExtrapolation->max_gamma_grade_per_structure > pairPaceExtrapolation->gamma_lower_bound) { + DumpCustom::write(); + MPI_Barrier(world); + } + } +} diff --git a/src/ML-PACE/dump_pace_extrapolation.h b/src/ML-PACE/dump_pace_extrapolation.h new file mode 100644 index 0000000000..6ba48d784d --- /dev/null +++ b/src/ML-PACE/dump_pace_extrapolation.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef DUMP_CLASS +// clang-format off +DumpStyle(pace/extrapolation,DumpPACEExtrapolation); +// clang-format on +#else + +#ifndef LMP_DUMP_PACE_AL_H +#define LMP_DUMP_PACE_AL_H + +#include "pair.h" +#include "dump_custom.h" +#include "pair_pace_extrapolation.h" + +namespace LAMMPS_NS { + // forward declaration + class PairPACEExtrapolation; + + class DumpPACEExtrapolation : public DumpCustom { + const std::string SPECIES_TYPE_FNAME = "species_types.dat"; + PairPACEExtrapolation *pairPaceExtrapolation; + public: + DumpPACEExtrapolation(class LAMMPS *lmp, int nargs, char **argv); + + void write() override; + }; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/ML-PACE/pair_pace_al.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp similarity index 70% rename from src/ML-PACE/pair_pace_al.cpp rename to src/ML-PACE/pair_pace_extrapolation.cpp index 4c678d5060..3cfc182372 100644 --- a/src/ML-PACE/pair_pace_al.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -27,7 +27,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include #include #include -#include "pair_pace_al.h" +#include "pair_pace_extrapolation.h" #include "atom.h" #include "dump_custom.h" #include "neighbor.h" @@ -47,7 +47,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "ace_b_basis.h" #include "ace_recursive.h" #include "ace_version.h" -#include "compute_pace.h" +#include "compute_pace_extrapolation.h" namespace LAMMPS_NS { struct ACEALImpl { @@ -70,9 +70,7 @@ using namespace MathConst; #define MAXLINE 1024 #define DELTA 4 -#define PACE_AL_EXTRAPOLATION_GRADE_FNAME "grade.dat" -#define EXTRAPOLATIVE_STRUCTURES_FNAME "extrapolative_structures.dat" -#define SPECIES_TYPE_FNAME "species_types.dat" + //added YL @@ -96,27 +94,9 @@ int AtomicNumberByName_pace_al(char *elname) { return -1; } -/* ---------------------------------------------------------------------- - * Append extrapolation grade to file - ---------------------------------------------------------------------- */ -void dump_extrapolation_grade_header() { - FILE *gamma_file = fopen(PACE_AL_EXTRAPOLATION_GRADE_FNAME, "w"); - fprintf(gamma_file, "Step\tgamma\n"); - fclose(gamma_file); -} - -/* ---------------------------------------------------------------------- - * Append extrapolation grade to file - ---------------------------------------------------------------------- */ -void dump_extrapolation_grade(int timestep, double gamma) { - FILE *gamma_file = fopen(PACE_AL_EXTRAPOLATION_GRADE_FNAME, "a"); - fprintf(gamma_file, "%d\t%f\n", timestep, gamma); - fclose(gamma_file); -} - /* ---------------------------------------------------------------------- */ -PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { +PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; restartinfo = 0; one_coeff = 1; @@ -133,7 +113,7 @@ PairPACEActiveLearning::PairPACEActiveLearning(LAMMPS *lmp) : Pair(lmp) { check if allocated, since class can be destructed when incomplete ------------------------------------------------------------------------- */ -PairPACEActiveLearning::~PairPACEActiveLearning() { +PairPACEExtrapolation::~PairPACEExtrapolation() { if (copymode) return; delete aceimpl; @@ -145,18 +125,11 @@ PairPACEActiveLearning::~PairPACEActiveLearning() { memory->destroy(map); memory->destroy(extrapolation_grade_gamma); } - - if (dump) { - delete dump; - dump = nullptr; - } - - //computePaceAtom will be deleted by lmp->modify, as it was registered there } /* ---------------------------------------------------------------------- */ -void PairPACEActiveLearning::compute(int eflag, int vflag) { +void PairPACEExtrapolation::compute(int eflag, int vflag) { int i, j, ii, jj, inum, jnum; double delx, dely, delz, evdwl; double fij[3]; @@ -192,9 +165,7 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { firstneigh = list->firstneigh; if (inum != nlocal) { - char str[128]; - snprintf(str, 128, "inum: %d nlocal: %d are different", inum, nlocal); - error->all(FLERR, str); + error->all(FLERR, "inum: %d nlocal: %d are different", inum, nlocal); } //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades @@ -270,35 +241,38 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - const int jtype = type[j]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; + //optionally assign global forces arrays + if (is_set_energies_forces) { + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + const int jtype = type[j]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; - fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); - fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); - fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); + fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); + fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); + fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; - // tally per-atom virial contribution - if (vflag) - ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, - fij[0], fij[1], fij[2], - -delx, -dely, -delz); + // tally per-atom virial contribution + if (vflag) + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, + fij[0], fij[1], fij[2], + -delx, -dely, -delz); + } } // tally energy contribution - if (eflag) { + if (eflag && is_set_energies_forces) { // evdwl = energy of atom I DOUBLE_TYPE e_atom; if (is_bevaluator) @@ -313,17 +287,12 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { if (vflag_fdotr) virial_fdotr_compute(); - //TODO: check correctness of MPI usage if (is_bevaluator) { //gather together max_gamma_grade_per_structure MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); + // check if gamma_upper_bound is exceeded if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (comm->me == 0) - dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); - if (is_dump_extrapolative_structures) dump->write(); - MPI_Barrier(world); - if (comm->me == 0) error->all(FLERR, "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, timestep={}), stopping...\n", @@ -332,11 +301,6 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { MPI_Barrier(world); MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes exit(EXIT_FAILURE); - } else if (max_gamma_grade_per_structure > gamma_lower_bound) { - if (comm->me == 0) - dump_extrapolation_grade(update->ntimestep, max_gamma_grade_per_structure); - if (is_dump_extrapolative_structures) - dump->write(); } } @@ -345,7 +309,7 @@ void PairPACEActiveLearning::compute(int eflag, int vflag) { /* ---------------------------------------------------------------------- */ -void PairPACEActiveLearning::allocate() { +void PairPACEExtrapolation::allocate() { allocated = 1; int n = atom->ntypes; @@ -359,11 +323,10 @@ void PairPACEActiveLearning::allocate() { global settings ------------------------------------------------------------------------- */ -void PairPACEActiveLearning::settings(int narg, char **arg) { - //TODO: make keyword base interface: pair_style pace/al freq 100 gamma_lo 1.5 gamma_hi 10 dump yes - if (narg > 4) { +void PairPACEExtrapolation::settings(int narg, char **arg) { + if (narg > 3) { error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq] [nodump]"); + "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq]"); } if (narg > 0) { @@ -391,25 +354,11 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); } - if (narg > 3) { - //default value is_dump_extrapolative_structures = false - if (strcmp(arg[3], "nodump") == 0) is_dump_extrapolative_structures = false; - if (strcmp(arg[3], "dump") == 0) is_dump_extrapolative_structures = true; - } - if (comm->me == 0) { - if (screen) { - utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, - gamma_upper_bound); - utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); - if (is_dump_extrapolative_structures) - utils::logmesg(lmp, "Extrapolative structures will be dumped into {}\n", - EXTRAPOLATIVE_STRUCTURES_FNAME); - else - utils::logmesg(lmp, "No extrapolative structures will be dumped\n"); - - } + utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, + gamma_upper_bound); + utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); } } @@ -417,7 +366,7 @@ void PairPACEActiveLearning::settings(int narg, char **arg) { set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairPACEActiveLearning::coeff(int narg, char **arg) { +void PairPACEExtrapolation::coeff(int narg, char **arg) { if (narg < 5) error->all(FLERR, @@ -471,12 +420,12 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential FILE *species_type_file = nullptr; - if (is_dump_extrapolative_structures) - species_type_file = fopen(SPECIES_TYPE_FNAME, "w"); const int n = atom->ntypes; + element_names.resize(n); for (int i = 1; i <= n; i++) { char *elemname = elemtypes[i - 1]; + element_names[i - 1] = elemname; if (strcmp(elemname, "NULL") == 0) { // species_type=-1 value will not reach ACE Evaluator::compute_atom, // but if it will ,then error will be thrown there @@ -485,7 +434,6 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); } else { // dump species types for reconstruction of atomic configurations - if (is_dump_extrapolative_structures) fprintf(species_type_file, "%s ", elemname); int atomic_number = AtomicNumberByName_pace_al(elemname); if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); @@ -503,7 +451,7 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { } } } - if (is_dump_extrapolative_structures) fclose(species_type_file); + aceimpl->ace->set_basis(*aceimpl->basis_set); aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); @@ -515,59 +463,13 @@ void PairPACEActiveLearning::coeff(int narg, char **arg) { for (int j = i; j <= n; j++) scale[i][j] = 1.0; - // prepare compute gamma - if (!computePaceAtom) { - // compute pace all pace/atom - char **computeargs = new char *[3]; - computeargs[0] = (char *) "pace_gamma"; //name - computeargs[1] = (char *) "all"; // atoms group - computeargs[2] = (char *) "pace/atom"; //compute style - computePaceAtom = new ComputePaceAtom(lmp, 3, computeargs); - computePaceAtom->init(); - // mimic behaviour from Modify::add_compute - modify->compute[modify->ncompute] = computePaceAtom; - //TODO: modify->compute_list is protected!!! -// modify->compute_list = std::vector(modify->compute, modify->compute + modify->ncompute + 1); - modify->ncompute++; - } - - // prepare dump class - if (is_dump_extrapolative_structures && !dump) { - // dump pace all custom freq extrapolation.dat id type mass x y z - char **dumpargs = new char *[12]; - dumpargs[0] = (char *) "pace"; // dump id - dumpargs[1] = (char *) "all"; // group - dumpargs[2] = (char *) "custom"; // dump style - dumpargs[3] = (char *) "1"; // dump frequency - dumpargs[4] = (char *) EXTRAPOLATIVE_STRUCTURES_FNAME; // fname - dumpargs[5] = (char *) "id"; - dumpargs[6] = (char *) "type"; - dumpargs[7] = (char *) "mass"; - dumpargs[8] = (char *) "x"; - dumpargs[9] = (char *) "y"; - dumpargs[10] = (char *) "z"; - dumpargs[11] = (char *) "c_pace_gamma"; - dump = new DumpCustom(lmp, 12, dumpargs); - dump->init(); - - // dump_modify WRITE_DUMP element X Y Z - char **dumpargs3 = new char *[atom->ntypes + 1]; - dumpargs3[0] = (char *) "element"; - for (int k = 0; k < atom->ntypes; k++) - dumpargs3[k + 1] = elemtypes[k]; - dump->modify_params(atom->ntypes + 1, dumpargs3); - } - - // write extrapolation_grade.dat file header - if (comm->me == 0) - dump_extrapolation_grade_header(); } /* ---------------------------------------------------------------------- init specific to this pair style ------------------------------------------------------------------------- */ -void PairPACEActiveLearning::init_style() { +void PairPACEExtrapolation::init_style() { if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); if (force->newton_pair == 0) @@ -581,7 +483,7 @@ void PairPACEActiveLearning::init_style() { init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairPACEActiveLearning::init_one(int i, int j) { +double PairPACEExtrapolation::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); //cutoff from the basis set's radial functions settings scale[j][i] = scale[i][j]; @@ -591,7 +493,7 @@ double PairPACEActiveLearning::init_one(int i, int j) { /* ---------------------------------------------------------------------- extract method for extracting value of scale variable ---------------------------------------------------------------------- */ -void *PairPACEActiveLearning::extract(const char *str, int &dim) { +void *PairPACEExtrapolation::extract(const char *str, int &dim) { dim = 2; if (strcmp(str, "scale") == 0) return (void *) scale; return nullptr; diff --git a/src/ML-PACE/pair_pace_al.h b/src/ML-PACE/pair_pace_extrapolation.h similarity index 70% rename from src/ML-PACE/pair_pace_al.h rename to src/ML-PACE/pair_pace_extrapolation.h index 219958a6ab..568b4ce9b1 100644 --- a/src/ML-PACE/pair_pace_al.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -9,8 +9,7 @@ ------------------------------------------------------------------------- */ /* -Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, - Matous Mrovec^1, Ralf Drautz^1 +Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drautz^1 ^1: Ruhr-University Bochum, Bochum, Germany */ @@ -22,7 +21,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, #ifdef PAIR_CLASS // clang-format off -PairStyle(pace/al,PairPACEActiveLearning) +PairStyle(pace/extrapolation,PairPACEExtrapolation) // clang-format on #else @@ -30,18 +29,22 @@ PairStyle(pace/al,PairPACEActiveLearning) #define LMP_PAIR_PACE_AL_H #include "pair.h" -#include "dump_custom.h" -#include "compute_pace.h" +#include namespace LAMMPS_NS { - class PairPACEActiveLearning : public Pair { - friend class ComputePaceAtom; + //forward declaration + class ComputePACEExtrapolation; + class DumpPACEExtrapolation; + + class PairPACEExtrapolation : public Pair { + friend class ComputePACEExtrapolation; + friend class DumpPACEExtrapolation; public: - PairPACEActiveLearning(class LAMMPS *); + PairPACEExtrapolation(class LAMMPS *); - ~PairPACEActiveLearning() override; + ~PairPACEExtrapolation() override; void compute(int, int) override; @@ -57,23 +60,16 @@ namespace LAMMPS_NS { protected: struct ACEALImpl *aceimpl; - int gamma_grade_eval_freq = 1; - bool is_dump_extrapolative_structures = false; - DumpCustom *dump = nullptr; - Compute *computePaceAtom = nullptr; + bool is_set_energies_forces = true; // if set, then update forces and energies int natoms; //total number of atoms double gamma_lower_bound = 1.5; double gamma_upper_bound = 10; double max_gamma_grade_per_structure = 0; - virtual void allocate(); - - void read_files(char *, char *); - - inline int equal(double *x, double *y); - + void allocate(); + std::vector element_names; // list of elements (used by dump pace/extrapolation) double rcutmax; // max cutoff for all elements int nelements; // # of unique elements int bevaluator_timestep; // timestep, on which gamma grade were computed From dcf9082591823945ed15f1dbbd976035fd1cc7a9 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 7 Jul 2022 23:35:58 +0200 Subject: [PATCH 040/364] Makefile.lammps: add empty line Install.py: remove older versions --- lib/pace/Install.py | 5 ----- lib/pace/Makefile.lammps | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index e7bcacefb7..7e0f14d47c 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -22,11 +22,6 @@ version ='v.2022.06.27' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2021.2.3.upd2': '8fd1162724d349b930e474927197f20d', - 'v.2021.4.9': '4db54962fbd6adcf8c18d46e1798ceb5', - 'v.2021.9.28': 'f98363bb98adc7295ea63974738c2a1b', - 'v.2021.10.25': 'a2ac3315c41a1a4a5c912bcb1bc9c5cc', - 'v.2021.10.25.fix': 'e0572de57039d4afedefb25707b6ceae', 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f', 'v.2022.06.27': '400f0a4b44c1ce64ae47796e6de4bba8' } diff --git a/lib/pace/Makefile.lammps b/lib/pace/Makefile.lammps index cda4e81662..e925f86089 100644 --- a/lib/pace/Makefile.lammps +++ b/lib/pace/Makefile.lammps @@ -1,3 +1,3 @@ pace_SYSINC =-I../../lib/pace/src/ML-PACE/ace -I../../lib/pace/src/ML-PACE/ace-evaluator -I../../lib/pace/src/yaml-cpp/include -I../../lib/pace/src/wigner-cpp/include/wigner -DEXTRA_C_PROJECTIONS pace_SYSLIB = -L../../lib/pace/ -lpace -L../../lib/pace/src/yaml-cpp/ -lyaml-cpp -pace_SYSPATH = \ No newline at end of file +pace_SYSPATH = From a5a2b4023ead6c4f9b87dc75897171116a775fe7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 8 Jul 2022 22:17:19 -0400 Subject: [PATCH 041/364] simplify and apply clang-format --- src/ML-PACE/compute_pace_extrapolation.cpp | 95 ++- src/ML-PACE/compute_pace_extrapolation.h | 29 +- src/ML-PACE/pair_pace_extrapolation.cpp | 704 ++++++++++----------- src/ML-PACE/pair_pace_extrapolation.h | 77 +-- 4 files changed, 439 insertions(+), 466 deletions(-) diff --git a/src/ML-PACE/compute_pace_extrapolation.cpp b/src/ML-PACE/compute_pace_extrapolation.cpp index 07f128f89b..ebbb7ccd19 100644 --- a/src/ML-PACE/compute_pace_extrapolation.cpp +++ b/src/ML-PACE/compute_pace_extrapolation.cpp @@ -16,8 +16,8 @@ // #include "compute_pace_extrapolation.h" -#include "pair_pace_extrapolation.h" +#include "pair_pace_extrapolation.h" #include "comm.h" #include "error.h" @@ -28,66 +28,63 @@ using namespace LAMMPS_NS; ComputePACEExtrapolation::ComputePACEExtrapolation(class LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) { - if (narg < 3) error->all(FLERR, "Illegal compute pace/extrapolation command"); - peratom_flag = 1; - size_peratom_cols = 0; - scalar_flag = 1; // compute max of gamma + Compute(lmp, narg, arg), pair_pace_extrapolation(nullptr) +{ + peratom_flag = 1; + size_peratom_cols = 0; + scalar_flag = 1; // get next timestep where gamma is available } -ComputePACEExtrapolation::~ComputePACEExtrapolation() { -} - -void ComputePACEExtrapolation::init() { - if (force->pair == nullptr) - error->all(FLERR, "Compute pace/extrapolation requires a pair style pace/extrapolation be defined"); - - if ((modify->get_compute_by_style("pace/extrapolation").size() > 1) && (comm->me == 0)) - error->warning(FLERR, "More than one instance of compute pace/atom"); - +void ComputePACEExtrapolation::init() +{ + if (force->pair) pair_pace_extrapolation = (PairPACEExtrapolation *) force->pair_match("pace/extrapolation", 1); - if (!pair_pace_extrapolation) - error->all(FLERR, "Compute pace/extrapolation requires a `pace/extrapolation` pair style"); + if (!pair_pace_extrapolation) + error->all(FLERR, "Compute pace/extrapolation requires a `pace/extrapolation` pair style"); + + if ((modify->get_compute_by_style("pace/extrapolation").size() > 1) && (comm->me == 0)) + error->warning(FLERR, "More than one instance of compute pace/atom"); } -void ComputePACEExtrapolation::invoke_compute_extrapolation_grades() { - bigint current_timestep = update->ntimestep; - pair_pace_extrapolation->bevaluator_timestep_shift = current_timestep; - int old_vflag_fdotr = pair_pace_extrapolation->vflag_fdotr; - pair_pace_extrapolation->vflag_fdotr = 0; - pair_pace_extrapolation->is_set_energies_forces = false; +void ComputePACEExtrapolation::invoke_compute_extrapolation_grades() +{ + bigint current_timestep = update->ntimestep; + pair_pace_extrapolation->bevaluator_timestep_shift = current_timestep; + int old_vflag_fdotr = pair_pace_extrapolation->vflag_fdotr; + pair_pace_extrapolation->vflag_fdotr = 0; + pair_pace_extrapolation->is_set_energies_forces = false; - pair_pace_extrapolation->compute(0, 0); + pair_pace_extrapolation->compute(0, 0); - pair_pace_extrapolation->is_set_energies_forces = true; - pair_pace_extrapolation->vflag_fdotr = old_vflag_fdotr; + pair_pace_extrapolation->is_set_energies_forces = true; + pair_pace_extrapolation->vflag_fdotr = old_vflag_fdotr; } -double ComputePACEExtrapolation::compute_scalar() { - invoked_scalar = update->ntimestep; +double ComputePACEExtrapolation::compute_scalar() +{ + invoked_scalar = update->ntimestep; - // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep - // if not coherent, change pair->bevaluator_timestep_shift to current timestep - // and call invoke_compute_extrapolation_grades without updating energies and forces - if (invoked_scalar != pair_pace_extrapolation->bevaluator_timestep) { - //utils::logmesg(lmp,"[ComputePaceAtom::compute_scalar] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_scalar,pair->bevaluator_timestep); - invoke_compute_extrapolation_grades(); - } + // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep + // if not coherent, change pair->bevaluator_timestep_shift to current timestep + // and call invoke_compute_extrapolation_grades without updating energies and forces + if (invoked_scalar != pair_pace_extrapolation->bevaluator_timestep) { + invoke_compute_extrapolation_grades(); + } - scalar = pair_pace_extrapolation->max_gamma_grade_per_structure; - return scalar; + scalar = pair_pace_extrapolation->max_gamma_grade_per_structure; + return scalar; } -void ComputePACEExtrapolation::compute_peratom() { - invoked_peratom = update->ntimestep; +void ComputePACEExtrapolation::compute_peratom() +{ + invoked_peratom = update->ntimestep; - // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep - // if not coherent, change pair->bevaluator_timestep_shift to current timestep - // and call invoke_compute_extrapolation_grades without updating energies and forces - if (invoked_peratom != pair_pace_extrapolation->bevaluator_timestep) { - //utils::logmesg(lmp,"[ComputePaceAtom::compute_peratom] Reseting timestep shift to {} (pace timestep={}) and recomputing\n",invoked_peratom,pair->bevaluator_timestep); - invoke_compute_extrapolation_grades(); - } + // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep + // if not coherent, change pair->bevaluator_timestep_shift to current timestep + // and call invoke_compute_extrapolation_grades without updating energies and forces + if (invoked_peratom != pair_pace_extrapolation->bevaluator_timestep) { + invoke_compute_extrapolation_grades(); + } - vector_atom = pair_pace_extrapolation->extrapolation_grade_gamma; -} \ No newline at end of file + vector_atom = pair_pace_extrapolation->extrapolation_grade_gamma; +} diff --git a/src/ML-PACE/compute_pace_extrapolation.h b/src/ML-PACE/compute_pace_extrapolation.h index 1bc7d04189..0329379c45 100644 --- a/src/ML-PACE/compute_pace_extrapolation.h +++ b/src/ML-PACE/compute_pace_extrapolation.h @@ -24,25 +24,24 @@ ComputeStyle(pace/extrapolation,ComputePACEExtrapolation); #ifndef COMPUTE_PACE_H #define COMPUTE_PACE_H - #include "compute.h" #include "pair_pace_extrapolation.h" namespace LAMMPS_NS { - class PairPACEExtrapolation; +class PairPACEExtrapolation; - class ComputePACEExtrapolation : public Compute { - public: - ComputePACEExtrapolation(class LAMMPS *, int, char **); - ~ComputePACEExtrapolation() override; - void init() override; - double compute_scalar() override; - void compute_peratom() override; - private: - PairPACEExtrapolation *pair_pace_extrapolation; - void invoke_compute_extrapolation_grades(); - }; +class ComputePACEExtrapolation : public Compute { + public: + ComputePACEExtrapolation(class LAMMPS *, int, char **); + void init() override; + double compute_scalar() override; + void compute_peratom() override; + + private: + PairPACEExtrapolation *pair_pace_extrapolation; + void invoke_compute_extrapolation_grades(); +}; } // namespace LAMMPS_NS -#endif //COMPUTE_PACE_H -#endif \ No newline at end of file +#endif //COMPUTE_PACE_H +#endif diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 3cfc182372..624cb69ff5 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -17,52 +17,49 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau ^1: Ruhr-University Bochum, Bochum, Germany */ - // // Created by Lysogorskiy Yury on 2.01.22. // -#include -#include -#include -#include -#include #include "pair_pace_extrapolation.h" #include "atom.h" +#include "comm.h" #include "dump_custom.h" -#include "neighbor.h" +#include "error.h" +#include "force.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" #include "neigh_list.h" #include "neigh_request.h" -#include "force.h" -#include "comm.h" -#include "memory.h" -#include "error.h" +#include "neighbor.h" #include "update.h" -#include "modify.h" +#include +#include +#include -#include "math_const.h" - -#include "ace_b_evaluator.h" #include "ace_b_basis.h" +#include "ace_b_evaluator.h" #include "ace_recursive.h" #include "ace_version.h" #include "compute_pace_extrapolation.h" namespace LAMMPS_NS { - struct ACEALImpl { - ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} +struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} - ~ACEALImpl() { - delete basis_set; - delete ace; - } + ~ACEALImpl() + { + delete basis_set; + delete ace; + } - ACEBBasisSet *basis_set; - ACEBEvaluator *ace; - ACECTildeBasisSet *ctilde_basis_set; - ACERecursiveEvaluator *rec_ace; - }; + ACEBBasisSet *basis_set; + ACEBEvaluator *ace; + ACECTildeBasisSet *ctilde_basis_set; + ACERecursiveEvaluator *rec_ace; +}; } // namespace LAMMPS_NS using namespace LAMMPS_NS; @@ -73,429 +70,416 @@ using namespace MathConst; //added YL - - int elements_num_pace_al = 104; -char const *const elements_pace_al[104] = {"X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", - "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", - "Mn", - "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", - "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", - "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", - "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", - "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", - "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr" -}; +char const *const elements_pace_al[104] = { + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", + "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", + "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", + "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", + "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", + "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", + "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; -int AtomicNumberByName_pace_al(char *elname) { - for (int i = 1; i < elements_num_pace_al; i++) - if (strcmp(elname, elements_pace_al[i]) == 0) - return i; - return -1; +int AtomicNumberByName_pace_al(char *elname) +{ + for (int i = 1; i < elements_num_pace_al; i++) + if (strcmp(elname, elements_pace_al[i]) == 0) return i; + return -1; } - /* ---------------------------------------------------------------------- */ -PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) { - single_enable = 0; - restartinfo = 0; - one_coeff = 1; - manybody_flag = 1; +PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; - natoms = 0; + natoms = 0; - aceimpl = new ACEALImpl; - scale = nullptr; - extrapolation_grade_gamma = nullptr; + aceimpl = new ACEALImpl; + scale = nullptr; + extrapolation_grade_gamma = nullptr; } /* ---------------------------------------------------------------------- check if allocated, since class can be destructed when incomplete ------------------------------------------------------------------------- */ -PairPACEExtrapolation::~PairPACEExtrapolation() { - if (copymode) return; +PairPACEExtrapolation::~PairPACEExtrapolation() +{ + if (copymode) return; - delete aceimpl; + delete aceimpl; - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(scale); - memory->destroy(map); - memory->destroy(extrapolation_grade_gamma); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(scale); + memory->destroy(map); + memory->destroy(extrapolation_grade_gamma); + } } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::compute(int eflag, int vflag) { - int i, j, ii, jj, inum, jnum; - double delx, dely, delz, evdwl; - double fij[3]; - int *ilist, *jlist, *numneigh, **firstneigh; - double max_gamma_grade = 0; - max_gamma_grade_per_structure = 0; - ev_init(eflag, vflag); +void PairPACEExtrapolation::compute(int eflag, int vflag) +{ + int i, j, ii, jj, inum, jnum; + double delx, dely, delz, evdwl; + double fij[3]; + int *ilist, *jlist, *numneigh, **firstneigh; + double max_gamma_grade = 0; + max_gamma_grade_per_structure = 0; + ev_init(eflag, vflag); - // downwards modified by YL + // downwards modified by YL - double **x = atom->x; - double **f = atom->f; - tagint *tag = atom->tag; - int *type = atom->type; - // number of atoms in cell - int nlocal = atom->nlocal; + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + // number of atoms in cell + int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; + int newton_pair = force->newton_pair; - // number of atoms including ghost atoms - int nall = nlocal + atom->nghost; + // number of atoms including ghost atoms + int nall = nlocal + atom->nghost; - // inum: length of the neighborlists list - inum = list->inum; + // inum: length of the neighborlists list + inum = list->inum; - // ilist: list of "i" atoms for which neighbor lists exist - ilist = list->ilist; + // ilist: list of "i" atoms for which neighbor lists exist + ilist = list->ilist; - //numneigh: the length of each these neigbor list - numneigh = list->numneigh; + //numneigh: the length of each these neigbor list + numneigh = list->numneigh; - // the pointer to the list of neighbors of "i" - firstneigh = list->firstneigh; + // the pointer to the list of neighbors of "i" + firstneigh = list->firstneigh; - if (inum != nlocal) { - error->all(FLERR, "inum: %d nlocal: %d are different", inum, nlocal); + // this happens when used as substyle in pair style hybrid. + // So this check and error effectively disallows use with pair style hybrid. + if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } + + //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades + if (atom->nlocal > natoms) { + memory->destroy(extrapolation_grade_gamma); + natoms = atom->nlocal; + memory->create(extrapolation_grade_gamma, natoms, "pace/atom:gamma"); + } + + //determine the maximum number of neighbours + int max_jnum = 0; + int nei = 0; + for (ii = 0; ii < list->inum; ii++) { + i = ilist[ii]; + jnum = numneigh[i]; + nei = nei + jnum; + if (jnum > max_jnum) max_jnum = jnum; + } + + bigint current_timestep = update->ntimestep; + bool is_bevaluator = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; + + if (is_bevaluator) + aceimpl->ace->resize_neighbours_cache(max_jnum); + else + aceimpl->rec_ace->resize_neighbours_cache(max_jnum); + + //loop over atoms + for (ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // checking if neighbours are actually within cutoff range is done inside compute_atom + // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom + // by using 'ace->element_type_mapping' array + // x: [r0 ,r1, r2, ..., r100] + // i = 0 ,1 + // jnum(0) = 50 + // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] + try { + if (is_bevaluator) + aceimpl->ace->compute_atom(i, x, type, jnum, jlist); + else + aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); + } catch (std::exception &e) { + error->all(FLERR, e.what()); + exit(EXIT_FAILURE); } - - //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades - if (atom->nlocal > natoms) { - memory->destroy(extrapolation_grade_gamma); - natoms = atom->nlocal; - memory->create(extrapolation_grade_gamma, natoms, "pace/atom:gamma"); - } - // Aidan Thompson told RD (26 July 2019) that practically always holds: - // inum = nlocal - // i = ilist(ii) < inum - // j = jlist(jj) < nall - // neighborlist contains neighbor atoms plus skin atoms, - // skin atoms can be removed by setting skin to zero but here - // they are disregarded anyway - - - //determine the maximum number of neighbours - int max_jnum = 0; - int nei = 0; - for (ii = 0; ii < list->inum; ii++) { - i = ilist[ii]; - jnum = numneigh[i]; - nei = nei + jnum; - if (jnum > max_jnum) - max_jnum = jnum; - } - - int current_timestep = update->ntimestep; - bool is_bevaluator = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; - - if (is_bevaluator) - aceimpl->ace->resize_neighbours_cache(max_jnum); - else - aceimpl->rec_ace->resize_neighbours_cache(max_jnum); - - //loop over atoms - for (ii = 0; ii < list->inum; ii++) { - i = list->ilist[ii]; - const int itype = type[i]; - - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // checking if neighbours are actually within cutoff range is done inside compute_atom - // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom - // by using 'ace->element_type_mapping' array - // x: [r0 ,r1, r2, ..., r100] - // i = 0 ,1 - // jnum(0) = 50 - // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] - try { - if (is_bevaluator) - aceimpl->ace->compute_atom(i, x, type, jnum, jlist); - else - aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); - } catch (std::exception &e) { - error->all(FLERR, e.what()); - exit(EXIT_FAILURE); - } - // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade - - if (is_bevaluator) { - double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; - if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; - bevaluator_timestep = current_timestep; - extrapolation_grade_gamma[i] = current_atom_gamma_grade; - } - - Array2D &neighbours_forces = (is_bevaluator ? aceimpl->ace->neighbours_forces - : aceimpl->rec_ace->neighbours_forces); - //optionally assign global forces arrays - if (is_set_energies_forces) { - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - const int jtype = type[j]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - - fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); - fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); - fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); - - - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - if (vflag) - ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, - fij[0], fij[1], fij[2], - -delx, -dely, -delz); - } - } - - // tally energy contribution - if (eflag && is_set_energies_forces) { - // evdwl = energy of atom I - DOUBLE_TYPE e_atom; - if (is_bevaluator) - e_atom = aceimpl->ace->e_atom; - else - e_atom = aceimpl->rec_ace->e_atom; - evdwl = scale[itype][itype] * e_atom; - ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); - } - } - - - if (vflag_fdotr) virial_fdotr_compute(); + // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade if (is_bevaluator) { - //gather together max_gamma_grade_per_structure - MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); - - // check if gamma_upper_bound is exceeded - if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (comm->me == 0) - error->all(FLERR, - "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, timestep={}), stopping...\n", - max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); - - MPI_Barrier(world); - MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes - exit(EXIT_FAILURE); - } + double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; + if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; + bevaluator_timestep = current_timestep; + extrapolation_grade_gamma[i] = current_atom_gamma_grade; } -// end modifications YL + Array2D &neighbours_forces = + (is_bevaluator ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); + //optionally assign global forces arrays + if (is_set_energies_forces) { + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + const int jtype = type[j]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + + fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); + fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); + fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); + + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + if (vflag) + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, + -delz); + } + } + + // tally energy contribution + if (eflag && is_set_energies_forces) { + // evdwl = energy of atom I + DOUBLE_TYPE e_atom; + if (is_bevaluator) + e_atom = aceimpl->ace->e_atom; + else + e_atom = aceimpl->rec_ace->e_atom; + evdwl = scale[itype][itype] * e_atom; + ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); + } + } + + if (vflag_fdotr) virial_fdotr_compute(); + + if (is_bevaluator) { + //gather together max_gamma_grade_per_structure + MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); + + // check if gamma_upper_bound is exceeded + if (max_gamma_grade_per_structure > gamma_upper_bound) { + if (comm->me == 0) + error->all(FLERR, + "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " + "timestep={}), stopping...\n", + max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); + + MPI_Barrier(world); + MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes + exit(EXIT_FAILURE); + } + } + + // end modifications YL } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::allocate() { - allocated = 1; - int n = atom->ntypes; +void PairPACEExtrapolation::allocate() +{ + allocated = 1; + int n = atom->ntypes; - memory->create(setflag, n + 1, n + 1, "pair:setflag"); - memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(map, n + 1, "pair:map"); - memory->create(scale, n + 1, n + 1, "pair:scale"); + memory->create(setflag, n + 1, n + 1, "pair:setflag"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(map, n + 1, "pair:map"); + memory->create(scale, n + 1, n + 1, "pair:scale"); } /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::settings(int narg, char **arg) { - if (narg > 3) { - error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/al [gamma_lower_bound] [gamma_upper_bound] [freq]"); - } +void PairPACEExtrapolation::settings(int narg, char **arg) +{ + if (narg > 3) { + error->all(FLERR, + "Illegal pair_style command. Correct form:\n\tpair_style pace/al " + "[gamma_lower_bound] [gamma_upper_bound] [freq]"); + } - if (narg > 0) { - double glb = atof(arg[0]); // gamma lower bound - if (glb < 1.0) - error->all(FLERR, - "Illegal gamma_lower_bound value: it should be real number >= 1.0"); - else - gamma_lower_bound = glb; - } + if (narg > 0) { + double glb = atof(arg[0]); // gamma lower bound + if (glb < 1.0) + error->all(FLERR, "Illegal gamma_lower_bound value: it should be real number >= 1.0"); + else + gamma_lower_bound = glb; + } - if (narg > 1) { - double gub = atof(arg[1]); // gamma upper bound - if (gub < gamma_lower_bound) - error->all(FLERR, - "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); - else - gamma_upper_bound = gub; - } + if (narg > 1) { + double gub = atof(arg[1]); // gamma upper bound + if (gub < gamma_lower_bound) + error->all( + FLERR, + "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); + else + gamma_upper_bound = gub; + } - if (narg > 2) { - gamma_grade_eval_freq = atoi(arg[2]); - if (gamma_grade_eval_freq < 1) - error->all(FLERR, - "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); - } + if (narg > 2) { + gamma_grade_eval_freq = atoi(arg[2]); + if (gamma_grade_eval_freq < 1) + error->all(FLERR, "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); + } - if (comm->me == 0) { - utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, - gamma_upper_bound); - utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); - } + if (comm->me == 0) { + utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, + gamma_upper_bound); + utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); + } } /* ---------------------------------------------------------------------- set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::coeff(int narg, char **arg) { +void PairPACEExtrapolation::coeff(int narg, char **arg) +{ - if (narg < 5) - error->all(FLERR, - "Incorrect args for pair coefficients. Correct form:\npair_coeff * * elem1 elem2 ..."); + if (narg < 5) + error->all(FLERR, + "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " + " elem1 elem2 ..."); - if (!allocated) allocate(); + if (!allocated) allocate(); - map_element2type(narg - 4, arg + 4); + map_element2type(narg - 4, arg + 4); - auto potential_file_name = utils::get_potential_file_path(arg[2]); - auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); - char **elemtypes = &arg[4]; + auto potential_file_name = utils::get_potential_file_path(arg[2]); + auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); + char **elemtypes = &arg[4]; + delete aceimpl->basis_set; + delete aceimpl->ctilde_basis_set; - delete aceimpl->basis_set; - delete aceimpl->ctilde_basis_set; + //load potential file + aceimpl->basis_set = new ACEBBasisSet(); + if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); + aceimpl->basis_set->load(potential_file_name); - //load potential file - aceimpl->basis_set = new ACEBBasisSet(); - if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); - aceimpl->basis_set->load(potential_file_name); + //convert the basis set to CTilde format + aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); + *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); - //convert the basis set to CTilde format - aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); - *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); + if (comm->me == 0) { + utils::logmesg(lmp, "Total number of basis functions\n"); - if (comm->me == 0) { - utils::logmesg(lmp, "Total number of basis functions\n"); - - for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { - int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; - int n = aceimpl->basis_set->total_basis_size[mu]; - utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, - n); - } + for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { + int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; + int n = aceimpl->basis_set->total_basis_size[mu]; + utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, + n); } + } + // read args that map atom types to PACE elements + // map[i] = which element the Ith atom type is, -1 if not mapped + // map[0] is not used + delete aceimpl->ace; + delete aceimpl->rec_ace; - // read args that map atom types to PACE elements - // map[i] = which element the Ith atom type is, -1 if not mapped - // map[0] is not used - delete aceimpl->ace; - delete aceimpl->rec_ace; + aceimpl->ace = new ACEBEvaluator(); + aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->ace = new ACEBEvaluator(); - aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->rec_ace = new ACERecursiveEvaluator(); + aceimpl->rec_ace->set_recursive(true); + aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential - aceimpl->rec_ace = new ACERecursiveEvaluator(); - aceimpl->rec_ace->set_recursive(true); - aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential + FILE *species_type_file = nullptr; - FILE *species_type_file = nullptr; - - const int n = atom->ntypes; - element_names.resize(n); - for (int i = 1; i <= n; i++) { - char *elemname = elemtypes[i - 1]; - element_names[i - 1] = elemname; - if (strcmp(elemname, "NULL") == 0) { - // species_type=-1 value will not reach ACE Evaluator::compute_atom, - // but if it will ,then error will be thrown there - aceimpl->ace->element_type_mapping(i) = -1; - map[i] = -1; - if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); - } else { - // dump species types for reconstruction of atomic configurations - int atomic_number = AtomicNumberByName_pace_al(elemname); - if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); - SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); - if (mu != -1) { - if (comm->me == 0) - utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, - elemname, mu); - map[i] = mu; - // set up LAMMPS atom type to ACE species mapping for ace evaluators - aceimpl->ace->element_type_mapping(i) = mu; - aceimpl->rec_ace->element_type_mapping(i) = mu; - } else { - error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, - potential_file_name); - } - } + const int n = atom->ntypes; + element_names.resize(n); + for (int i = 1; i <= n; i++) { + char *elemname = elemtypes[i - 1]; + element_names[i - 1] = elemname; + if (strcmp(elemname, "NULL") == 0) { + // species_type=-1 value will not reach ACE Evaluator::compute_atom, + // but if it will ,then error will be thrown there + aceimpl->ace->element_type_mapping(i) = -1; + map[i] = -1; + if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); + } else { + // dump species types for reconstruction of atomic configurations + int atomic_number = AtomicNumberByName_pace_al(elemname); + if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); + SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); + if (mu != -1) { + if (comm->me == 0) + utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, + elemname, mu); + map[i] = mu; + // set up LAMMPS atom type to ACE species mapping for ace evaluators + aceimpl->ace->element_type_mapping(i) = mu; + aceimpl->rec_ace->element_type_mapping(i) = mu; + } else { + error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, + potential_file_name); + } } + } - aceimpl->ace->set_basis(*aceimpl->basis_set); - aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); + aceimpl->ace->set_basis(*aceimpl->basis_set); + aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); - if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); - aceimpl->ace->load_active_set(active_set_inv_filename); - - // clear setflag since coeff() called once with I,J = * * - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - scale[i][j] = 1.0; + if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); + aceimpl->ace->load_active_set(active_set_inv_filename); + // clear setflag since coeff() called once with I,J = * * + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) scale[i][j] = 1.0; } /* ---------------------------------------------------------------------- init specific to this pair style ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::init_style() { - if (atom->tag_enable == 0) - error->all(FLERR, "Pair style PACE requires atom IDs"); - if (force->newton_pair == 0) - error->all(FLERR, "Pair style PACE requires newton pair on"); +void PairPACEExtrapolation::init_style() +{ + if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); - // request a full neighbor list - neighbor->add_request(this, NeighConst::REQ_FULL); + // request a full neighbor list + neighbor->add_request(this, NeighConst::REQ_FULL); } /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairPACEExtrapolation::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - //cutoff from the basis set's radial functions settings - scale[j][i] = scale[i][j]; - return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); +double PairPACEExtrapolation::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + //cutoff from the basis set's radial functions settings + scale[j][i] = scale[i][j]; + return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); } /* ---------------------------------------------------------------------- extract method for extracting value of scale variable ---------------------------------------------------------------------- */ -void *PairPACEExtrapolation::extract(const char *str, int &dim) { - dim = 2; - if (strcmp(str, "scale") == 0) return (void *) scale; - return nullptr; +void *PairPACEExtrapolation::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return nullptr; } - diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index 568b4ce9b1..2ce0966c96 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -18,10 +18,9 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau // Created by Lysogorskiy Yury on 1.01.22. // - #ifdef PAIR_CLASS // clang-format off -PairStyle(pace/extrapolation,PairPACEExtrapolation) +PairStyle(pace/extrapolation,PairPACEExtrapolation); // clang-format on #else @@ -33,53 +32,47 @@ PairStyle(pace/extrapolation,PairPACEExtrapolation) namespace LAMMPS_NS { - //forward declaration - class ComputePACEExtrapolation; - class DumpPACEExtrapolation; +//forward declaration +class ComputePACEExtrapolation; +class DumpPACEExtrapolation; - class PairPACEExtrapolation : public Pair { - friend class ComputePACEExtrapolation; - friend class DumpPACEExtrapolation; +class PairPACEExtrapolation : public Pair { + friend class ComputePACEExtrapolation; + friend class DumpPACEExtrapolation; - public: - PairPACEExtrapolation(class LAMMPS *); + public: + PairPACEExtrapolation(class LAMMPS *); + ~PairPACEExtrapolation() override; - ~PairPACEExtrapolation() override; + void compute(int, int) override; + void settings(int, char **) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + void *extract(const char *, int &) override; - void compute(int, int) override; + protected: + struct ACEALImpl *aceimpl; + bigint gamma_grade_eval_freq = 1; + bool is_set_energies_forces = true; // if set, then update forces and energies + int natoms; //total number of atoms - void settings(int, char **) override; + double gamma_lower_bound = 1.5; + double gamma_upper_bound = 10; + double max_gamma_grade_per_structure = 0; - void coeff(int, char **) override; + void allocate(); + std::vector element_names; // list of elements (used by dump pace/extrapolation) + double rcutmax; // max cutoff for all elements + int nelements; // # of unique elements + bigint bevaluator_timestep; // timestep, on which gamma grade were computed + bigint bevaluator_timestep_shift = 0; // + double *extrapolation_grade_gamma; //per-atom gamma value - void init_style() override; + double **scale; +}; - double init_one(int, int) override; - - void *extract(const char *, int &) override; - - protected: - struct ACEALImpl *aceimpl; - int gamma_grade_eval_freq = 1; - bool is_set_energies_forces = true; // if set, then update forces and energies - int natoms; //total number of atoms - - double gamma_lower_bound = 1.5; - double gamma_upper_bound = 10; - double max_gamma_grade_per_structure = 0; - - void allocate(); - std::vector element_names; // list of elements (used by dump pace/extrapolation) - double rcutmax; // max cutoff for all elements - int nelements; // # of unique elements - int bevaluator_timestep; // timestep, on which gamma grade were computed - int bevaluator_timestep_shift = 0; // - double *extrapolation_grade_gamma; //per-atom gamma value - - double **scale; - }; - -} +} // namespace LAMMPS_NS #endif -#endif \ No newline at end of file +#endif From 70d8146b697645ccb0147da2058f24f0bb4cf8a6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 9 Jul 2022 02:00:39 -0400 Subject: [PATCH 042/364] use correct evflag versions --- src/ML-PACE/pair_pace.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 0033a72823..4e4f226f0a 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -123,15 +123,12 @@ void PairPACE::compute(int eflag, int vflag) ev_init(eflag, vflag); - // downwards modified by YL - double **x = atom->x; double **f = atom->f; int *type = atom->type; // number of atoms in cell int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; // inum: length of the neighborlists list @@ -205,13 +202,13 @@ void PairPACE::compute(int eflag, int vflag) f[j][2] -= fij[2]; // tally per-atom virial contribution - if (vflag) + if (vflag_either) ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, -delz); } // tally energy contribution - if (eflag) { + if (eflag_either) { // evdwl = energy of atom I evdwl = scale[itype][itype] * aceimpl->ace->e_atom; ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); From 81e556068262c12ef53facf0df3244eda84f49ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 9 Jul 2022 02:01:09 -0400 Subject: [PATCH 043/364] rename confusing "natoms" variable. align with pair style pace. --- src/ML-PACE/pair_pace_extrapolation.cpp | 21 ++++++++------------- src/ML-PACE/pair_pace_extrapolation.h | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 624cb69ff5..3e0d665288 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -22,6 +22,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau // #include "pair_pace_extrapolation.h" + #include "atom.h" #include "comm.h" #include "dump_custom.h" @@ -65,13 +66,7 @@ struct ACEALImpl { using namespace LAMMPS_NS; using namespace MathConst; -#define MAXLINE 1024 -#define DELTA 4 - -//added YL - -int elements_num_pace_al = 104; -char const *const elements_pace_al[104] = { +static char const *const elements_pace_al[] = { "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", @@ -79,6 +74,7 @@ char const *const elements_pace_al[104] = { "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; +static constexpr int elements_num_pace_al = sizeof(elements_pace_al) / sizeof(const char *); int AtomicNumberByName_pace_al(char *elname) { @@ -95,7 +91,7 @@ PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) one_coeff = 1; manybody_flag = 1; - natoms = 0; + nmax = 0; aceimpl = new ACEALImpl; scale = nullptr; @@ -164,10 +160,10 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades - if (atom->nlocal > natoms) { + if (atom->nlocal > nmax) { memory->destroy(extrapolation_grade_gamma); - natoms = atom->nlocal; - memory->create(extrapolation_grade_gamma, natoms, "pace/atom:gamma"); + nmax = atom->nlocal; + memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); } //determine the maximum number of neighbours @@ -213,8 +209,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) else aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); } catch (std::exception &e) { - error->all(FLERR, e.what()); - exit(EXIT_FAILURE); + error->one(FLERR, e.what()); } // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index 2ce0966c96..1a403802bb 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -55,7 +55,7 @@ class PairPACEExtrapolation : public Pair { struct ACEALImpl *aceimpl; bigint gamma_grade_eval_freq = 1; bool is_set_energies_forces = true; // if set, then update forces and energies - int natoms; //total number of atoms + int nmax; double gamma_lower_bound = 1.5; double gamma_upper_bound = 10; From f039c00442ea4e43ce3e031368b04015f41bdeb4 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 27 Jul 2022 17:13:46 -0600 Subject: [PATCH 044/364] add dump skip option --- src/AMOEBA/pair_amoeba.cpp | 10 ++ src/MANYBODY/pair_eam.cpp | 11 ++ src/dump.cpp | 98 +++++++++----- src/dump.h | 4 + src/fix_pair.cpp | 271 +++++++++++++++++++++++++++++++++++++ src/fix_pair.h | 54 ++++++++ 6 files changed, 417 insertions(+), 31 deletions(-) create mode 100644 src/fix_pair.cpp create mode 100644 src/fix_pair.h diff --git a/src/AMOEBA/pair_amoeba.cpp b/src/AMOEBA/pair_amoeba.cpp index be5f9c73df..1d37b3c85b 100644 --- a/src/AMOEBA/pair_amoeba.cpp +++ b/src/AMOEBA/pair_amoeba.cpp @@ -2077,6 +2077,16 @@ void *PairAmoeba::extract(const char *str, int &dim) if (strcmp(str,"opbend_pentic") == 0) return (void *) &opbend_pentic; if (strcmp(str,"opbend_sextic") == 0) return (void *) &opbend_sextic; + // requests from FixPair + + if (strcmp(str,"uind") == 0) { + dim = 3; + return (void *) uind; + } else if (strcmp(str,"uinp") == 0) { + dim = 3; + return (void *) uinp; + } + return nullptr; } diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index 834c71a947..031d41387b 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -933,5 +933,16 @@ void *PairEAM::extract(const char *str, int &dim) { dim = 2; if (strcmp(str,"scale") == 0) return (void *) scale; + + // requests from FixPair + + if (strcmp(str,"rho") == 0) { + dim = 0; + return (void *) rho; + } else if (strcmp(str,"fp") == 0) { + dim = 0; + return (void *) fp; + } + return nullptr; } diff --git a/src/dump.cpp b/src/dump.cpp index 9a8bac052a..3062763d89 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -20,11 +20,13 @@ #include "error.h" #include "fix.h" #include "group.h" +#include "input.h" #include "irregular.h" #include "memory.h" #include "modify.h" #include "output.h" #include "update.h" +#include "variable.h" #include @@ -87,6 +89,9 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : Pointers(lmp) delay_flag = 0; write_header_flag = 1; + skipflag = 0; + skipvar = nullptr; + maxfiles = -1; numfiles = 0; fileidx = 0; @@ -165,6 +170,8 @@ Dump::~Dump() delete[] refresh; + delete[] skipvar; + // format_column_user is deallocated by child classes that use it memory->destroy(buf); @@ -298,6 +305,15 @@ void Dump::init() else error->all(FLERR,"Dump could not find refresh compute ID"); } + // if skipflag, check skip variable + + if (skipflag) { + skipindex = input->variable->find(skipvar); + if (skipindex < 0) error->all(FLERR,"Dump skip variable not found"); + if (!input->variable->equalstyle(skipindex)) + error->all(FLERR,"Variable for dump skip is invalid style"); + } + // preallocation for PBC copies if requested if (pbcflag && atom->nlocal > maxpbc) pbc_allocate(); @@ -359,6 +375,15 @@ void Dump::write() nme = count(); + // if skip condition is defined and met, just return + // do it after count() b/c that invoked computes + // NOTE: for multifile, will have already opened file + + if (skipflag) { + double value = input->variable->compute_equal(skipindex); + if (value != 0.0) return; + } + // ntotal = total # of dump lines in snapshot // nmax = max # of dump lines on any proc @@ -1044,6 +1069,12 @@ void Dump::modify_params(int narg, char **arg) append_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; + } else if (strcmp(arg[iarg],"balance") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (nprocs > 1) + balance_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else if (strcmp(arg[iarg],"buffer") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); buffer_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); @@ -1051,6 +1082,32 @@ void Dump::modify_params(int narg, char **arg) error->all(FLERR,"Dump_modify buffer yes not allowed for this style"); iarg += 2; + } else if (strcmp(arg[iarg],"colname") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (strcmp(arg[iarg+1],"default") == 0) { + for (auto item : keyword_user) item.clear(); + iarg += 2; + } else { + if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); + int icol = -1; + if (utils::is_integer(arg[iarg + 1])) { + icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); + if (icol < 0) icol = keyword_user.size() + icol + 1; + icol--; + } else { + try { + icol = key2col.at(arg[iarg + 1]); + } catch (std::out_of_range &) { + icol = -1; + } + } + if ((icol < 0) || (icol >= (int)keyword_user.size())) + error->all(FLERR, "Incorrect dump_modify arguments: {} {} {}", + arg[iarg], arg[iarg+1], arg[iarg+2]); + keyword_user[icol] = arg[iarg+2]; + iarg += 3; + } + } else if (strcmp(arg[iarg],"delay") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); delaystep = utils::bnumeric(FLERR,arg[iarg+1],false,lmp); @@ -1131,31 +1188,6 @@ void Dump::modify_params(int narg, char **arg) flush_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg],"colname") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); - if (strcmp(arg[iarg+1],"default") == 0) { - for (auto item : keyword_user) item.clear(); - iarg += 2; - } else { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); - int icol = -1; - if (utils::is_integer(arg[iarg + 1])) { - icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); - if (icol < 0) icol = keyword_user.size() + icol + 1; - icol--; - } else { - try { - icol = key2col.at(arg[iarg + 1]); - } catch (std::out_of_range &) { - icol = -1; - } - } - if ((icol < 0) || (icol >= (int)keyword_user.size())) - error->all(FLERR, "Incorrect dump_modify arguments: {} {} {}", - arg[iarg], arg[iarg+1], arg[iarg+2]); - keyword_user[icol] = arg[iarg+2]; - iarg += 3; - } } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); @@ -1212,6 +1244,7 @@ void Dump::modify_params(int narg, char **arg) fileidx = 0; } iarg += 2; + } else if (strcmp(arg[iarg],"nfile") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (!multiproc) @@ -1254,6 +1287,15 @@ void Dump::modify_params(int narg, char **arg) pbcflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; + } else if (strcmp(arg[iarg],"skip") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + skipflag = 1; + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) { + delete[] skipvar; + skipvar = utils::strdup(&arg[iarg+1][2]); + } else error->all(FLERR,"Illegal dump_modify command"); + iarg += 2; + } else if (strcmp(arg[iarg],"sort") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (strcmp(arg[iarg+1],"off") == 0) sort_flag = 0; @@ -1274,12 +1316,6 @@ void Dump::modify_params(int narg, char **arg) } iarg += 2; - } else if (strcmp(arg[iarg],"balance") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); - if (nprocs > 1) - balance_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); - iarg += 2; - } else if (strcmp(arg[iarg],"time") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); time_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); diff --git a/src/dump.h b/src/dump.h index 90866a3567..ecff27f7dd 100644 --- a/src/dump.h +++ b/src/dump.h @@ -91,6 +91,10 @@ class Dump : protected Pointers { char *refresh; // compute ID to invoke refresh() on int irefresh; // index of compute + int skipflag; // 1 if skip condition defined + char *skipvar; // name of variable to check for skip condition + int skipindex; // index of skip variable + char boundstr[9]; // encoding of boundary flags char *format; // format string for the file write diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp new file mode 100644 index 0000000000..4171164cac --- /dev/null +++ b/src/fix_pair.cpp @@ -0,0 +1,271 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "fix_pair.h" + +#include "atom.h" +#include "dump.h" +#include "error.h" +#include "force.h" +#include "fix.h" +#include "input.h" +#include "memory.h" +#include "pair.h" +#include "output.h" +#include "variable.h" +#include "update.h" +#include "variable.h" + +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (narg < 7) error->all(FLERR,"Illegal fix pair command"); + + nevery = utils::inumeric(FLERR,arg[3],false,lmp); + if (nevery < 1) error->all(FLERR,"Illegal fix pair command"); + + int n = strlen(arg[4]) + 1; + pairname = new char[n]; + strcpy(pairname,arg[4]); + pstyle = force->pair_match(pairname,1,0); + if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); + + nfield = (narg-5) / 2; + fieldname = new char*[nfield]; + trigger = new int[nfield]; + + nfield = 0; + int iarg = 5; + + while (iarg < narg) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix pair command"); + n = strlen(arg[iarg]) + 1; + fieldname[nfield] = new char[n]; + strcpy(fieldname[nfield],arg[iarg]); + int flag = utils::inumeric(FLERR,arg[iarg+1],true,lmp); + if (flag == 0) trigger[nfield] = 0; + else if (flag == 1) trigger[nfield] = 1; + else error->all(FLERR,"Illegal fix pair command"); + nfield++; + iarg += 2; + } + + // set trigger names = fieldname + "_flag" + + triggername = new char*[nfield]; + + for (int ifield = 0; ifield < nfield; ifield++) { + if (trigger[ifield] == 0) triggername[ifield] = nullptr; + else { + n = strlen(fieldname[ifield]) + 6; + triggername[ifield] = new char[n]; + sprintf(triggername[ifield],"%s_flag",fieldname[ifield]); + } + } + + // extract all fields just to get number of per-atom values, ptrs may be NULL + // also check if triggername can be extracted as a scalar value + + triggerptr = new int*[nfield]; + + int columns,dim; + ncols = 0; + + for (int ifield = 0; ifield < nfield; ifield++) { + void *tmp = pstyle->extract(fieldname[ifield],columns); + //if (!tmp) + // error->all(FLERR,"Fix pair pair style cannot extract {}",fieldname[ifield]); + if (columns) ncols += columns; + else ncols++; + if (trigger[ifield]) { + triggerptr[ifield] = (int *) pstyle->extract(triggername[ifield],dim); + if (!triggerptr[ifield]) + error->all(FLERR,"Fix pair pair style cannot extract {}", + triggername[ifield]); + if (dim) error->all(FLERR,"Fix pair pair style {} is not a scalar", + triggername[ifield]); + } + } + + // settings + // freq = 1 since vector/array always have values + // allows user to specify nevery = 0 for a dump + // which this fix outputs whenever it wants + + peratom_flag = 1; + if (ncols == 1) size_peratom_cols = 0; + else size_peratom_cols = ncols; + peratom_freq = nevery; + + // perform initial allocation of atom-based array + // register with Atom class + + vector = nullptr; + array = nullptr; + grow_arrays(atom->nmax); + atom->add_callback(Atom::GROW); + + // zero the vector/array since dump may access it on timestep 0 + // zero the vector/array since a variable may access it before first run + + int nlocal = atom->nlocal; + + if (ncols == 0) { + for (int i = 0; i < nlocal; i++) + vector[i] = 0.0; + } else { + for (int i = 0; i < nlocal; i++) + for (int m = 0; m < ncols; m++) + array[i][m] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +FixPair::~FixPair() +{ + // unregister callbacks to this fix from Atom class + + atom->delete_callback(id,Atom::GROW); + + delete [] pairname; + for (int ifield = 0; ifield < nfield; ifield++) { + delete [] fieldname[ifield]; + delete [] triggername[ifield]; + } + + delete [] fieldname; + delete [] trigger; + delete [] triggername; + delete [] triggerptr; + + if (ncols == 0) memory->destroy(vector); + else memory->destroy(array); +} + +/* ---------------------------------------------------------------------- */ + +int FixPair::setmask() +{ + int mask = 0; + mask |= PRE_FORCE; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixPair::init() +{ + // make sure pair style still exists + + pstyle = force->pair_match(pairname,1,0); + if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); +} + +/* ---------------------------------------------------------------------- + trigger pair style computation on steps which are multiples of Nevery +------------------------------------------------------------------------- */ + +void FixPair::pre_force(int /*vflag*/) +{ + if (update->ntimestep % nevery) return; + + // set pair style triggers + + for (int ifield = 0; ifield < nfield; ifield++) + if (trigger[ifield]) *(triggerptr[ifield]) = 1; +} + +/* ---------------------------------------------------------------------- + extract results from pair style +------------------------------------------------------------------------- */ + +void FixPair::post_force(int /*vflag*/) +{ + if (update->ntimestep % nevery) return; + + // extract pair style fields one by one + // store their values in this fix + + int nlocal = atom->nlocal; + + int icol = 0; + int columns; + + for (int ifield = 0; ifield < nfield; ifield++) { + void *pvoid = pstyle->extract(fieldname[ifield],columns); + if (pvoid == nullptr) + error->all(FLERR,"Fix pair pair style cannot extract {}",fieldname[ifield]); + + if (columns == 0) { + double *pvector = (double *) pvoid; + if (ncols == 0) { + for (int i = 0; i < nlocal; i++) + vector[i] = pvector[i]; + } else { + for (int i = 0; i < nlocal; i++) + array[i][icol] = pvector[i]; + } + icol++; + + } else { + double **parray = (double **) pvoid; + for (int i = 0; i < nlocal; i++) + for (int m = 0; m < columns; m++) { + array[i][icol] = parray[i][m]; + icol++; + } + } + } + + // unset pair style triggers + + for (int ifield = 0; ifield < nfield; ifield++) + if (trigger[ifield]) *(triggerptr[ifield]) = 0; +} + +/* ---------------------------------------------------------------------- + allocate atom-based vector or array +------------------------------------------------------------------------- */ + +void FixPair::grow_arrays(int nmax) +{ + if (ncols == 0) { + memory->grow(vector,nmax,"store/state:vector"); + vector_atom = vector; + } else { + memory->grow(array,nmax,ncols,"store/state:array"); + array_atom = array; + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based vector or array +------------------------------------------------------------------------- */ + +double FixPair::memory_usage() +{ + double bytes = 0.0; + if (ncols == 0) bytes += (double)atom->nmax * sizeof(double); + else bytes += (double)atom->nmax*ncols * sizeof(double); + return bytes; +} diff --git a/src/fix_pair.h b/src/fix_pair.h new file mode 100644 index 0000000000..3e32b11544 --- /dev/null +++ b/src/fix_pair.h @@ -0,0 +1,54 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(pair,FixPair); +// clang-format on +#else + +#ifndef LMP_FIX_PAIR_H +#define LMP_FIX_PAIR_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixPair : public Fix { + public: + FixPair(class LAMMPS *, int, char **); + ~FixPair() override; + int setmask() override; + void init() override; + void pre_force(int) override; + void post_force(int) override; + + void grow_arrays(int) override; + double memory_usage() override; + + private: + int nevery,nfield,ncols; + char *pairname; + char **fieldname,**triggername; + int *trigger; + int **triggerptr; + + class Pair *pstyle; + double *vector; + double **array; +}; + +} // namespace LAMMPS_NS + +#endif +#endif From 348feddcb65d4c79bff3c6c1ce909ea1aab266f1 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 28 Jul 2022 12:45:20 -0600 Subject: [PATCH 045/364] new fix pair and dump_modify skip commands --- doc/src/Commands_all.rst | 4 +- doc/src/Commands_fix.rst | 1 + doc/src/compute_pair.rst | 4 +- doc/src/dump_modify.rst | 24 ++++++++- doc/src/fix.rst | 1 + doc/src/fix_pair.rst | 104 +++++++++++++++++++++++++++++++++++++ doc/src/pair_amoeba.rst | 12 +++++ doc/src/pair_eam.rst | 25 +++++++-- src/AMOEBA/pair_amoeba.cpp | 5 +- src/MANYBODY/pair_eam.cpp | 5 +- src/dump.cpp | 15 +++--- src/fix_pair.cpp | 27 +++++++--- src/fix_pair.h | 2 + 13 files changed, 206 insertions(+), 23 deletions(-) create mode 100644 doc/src/fix_pair.rst diff --git a/doc/src/Commands_all.rst b/doc/src/Commands_all.rst index 5e309c3ed0..fdde1f8e6c 100644 --- a/doc/src/Commands_all.rst +++ b/doc/src/Commands_all.rst @@ -15,7 +15,9 @@ General commands ================ -An alphabetic list of general LAMMPS commands. +An alphabetic list of general LAMMPS commands. Note that style +commands with many variants, can be more easily accessed via the small +table above. .. table_from_list:: :columns: 5 diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index cb61cbe17b..c5c2fb7cba 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -165,6 +165,7 @@ OPT. * :doc:`orient/fcc ` * :doc:`orient/eco ` * :doc:`pafi ` + * :doc:`pair ` * :doc:`phonon ` * :doc:`pimd ` * :doc:`planeforce ` diff --git a/doc/src/compute_pair.rst b/doc/src/compute_pair.rst index b43c4bd6d7..e399b61aba 100644 --- a/doc/src/compute_pair.rst +++ b/doc/src/compute_pair.rst @@ -93,7 +93,9 @@ Restrictions Related commands """""""""""""""" -:doc:`compute pe `, :doc:`compute bond ` +:doc:`compute pe `, :doc:`compute bond `, +:doc:`fix pair ` + Default """"""" diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index fd916beb4e..0dcb4f198f 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -17,7 +17,7 @@ Syntax * one or more keyword/value pairs may be appended * these keywords apply to various dump styles -* keyword = *append* or *at* or *balance* or *buffer* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* +* keyword = *append* or *at* or *balance* or *buffer* or *delay* or *element* or *every* or *every/time* or *fileper* or *first* or *flush* or *format* or *header* or *image* or *label* or *maxfiles* or *nfile* or *pad* or *pbc* or *precision* or *region* or *refresh* or *scale* or *sfactor* or *skip* or *sort* or *tfactor* or *thermo* or *thresh* or *time* or *units* or *unwrap* .. parsed-literal:: @@ -65,6 +65,8 @@ Syntax *refresh* arg = c_ID = compute ID that supports a refresh operation *scale* arg = *yes* or *no* *sfactor* arg = coordinate scaling factor (> 0.0) + *skip* arg = v_name + v_name = variable with name which evaluates to non-zero (skip) or 0 *sort* arg = *off* or *id* or N or -N off = no sorting of per-atom lines within a snapshot id = sort per-atom lines by atom ID @@ -678,10 +680,28 @@ most effective when the typical magnitude of position data is between ---------- +The *skip* keyword can be used with all dump styles. It allows a dump +snapshot to be skipped (not written to the dump file), if a condition +is met. The condition is computed by an :doc:`equal-style variable +`, which should be specified as v_name, where name is the +variable name. If the variable evaulation returns a non-zero value, +then the dump snapshot is skipped. If it returns zero, the dump +proceeds as usual. Note that :doc:`equal-style variable ` +can contain Boolean operators which effectively evaluate as a true +(non-zero) or false (zero) result. + +The *skip* keyword can be useful for debugging purposes, e.g. to dump +only on a particular timestep. Or to limit output to conditions of +interest, e.g. only when the force on some atom exceeds a threshold +value. + +---------- + The *sort* keyword determines whether lines of per-atom output in a snapshot are sorted or not. A sort value of *off* means they will typically be written in indeterminate order, either in serial or -parallel. This is the case even in serial if the :doc:`atom_modify sort ` option is turned on, which it is by default, to +parallel. This is the case even in serial if the :doc:`atom_modify +sort ` option is turned on, which it is by default, to improve performance. A sort value of *id* means sort the output by atom ID. A sort value of N or -N means sort the output by the value in the Nth column of per-atom info in either ascending or descending diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 2ec4437b39..acddb2f351 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -307,6 +307,7 @@ accelerated styles exist. * :doc:`orient/fcc ` - add grain boundary migration force for FCC * :doc:`orient/eco ` - add generalized grain boundary migration force * :doc:`pafi ` - constrained force averages on hyper-planes to compute free energies (PAFI) +* :doc:`pair ` - access per-atom info from pair styles * :doc:`phonon ` - calculate dynamical matrix from MD simulations * :doc:`pimd ` - Feynman path integral molecular dynamics * :doc:`planeforce ` - constrain atoms to move in a plane diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst new file mode 100644 index 0000000000..c8734299d4 --- /dev/null +++ b/doc/src/fix_pair.rst @@ -0,0 +1,104 @@ +.. index:: fix pair + +fix pair command +======================= + +Syntax +"""""" + +.. parsed-literal:: + + fix ID group-ID pair N pairstyle name flag ... + +* ID, group-ID are documented in :doc:`fix ` command +* pair = style name of this fix command +* N = invoke this fix once every N timesteps +* pairstyle = name of pair style to extract info from (e.g. eam) +* one or more name/flag pairs can be listed +* name = name of quantity the pair style allows extraction of +* flag = 1 if pair style needs to be triggered to produce data for name, 0 if not + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix request all pair 100 eam rho 0 + fix request all pair 100 amoeba uind 0 uinp 0 + + +Description +""""""""""" + +Extract per-atom quantities from a pair style and store them in this +fix so they can be accessed by other LAMMPS commands, e.g. by a +:doc:`dump ` command or by another :doc:`fix `, +:doc:`compute `, or :doc:`variable ` command. + +These are example use cases: + +* extract per-atom density from :doc:`pair_style eam ` to a dump file +* extract induced dipoles from :doc:`pair_style amoeba ` to a dump file +* extract accuracy metrics from a machine-learned potential to trigger output when +a condition is met (see the :doc:`dump_modify skip ` command) + +The *N* argument determines how often the fix is invoked. + +The *pairstyle* argument is the name of the pair style. It can be a +sub-style used in a :doc:`pair_style hybrid ` command. + +One or more *name/flag* pairs of arguments follow. Each *name* is a +per-atom quantity which the pair style must recognize as an extraction +request. See the doc pages for individual :doc:`pair_styles +` to see what fix pair requests (if any) they support. + +The *flag* setting determines whether this fix will also request that +the pair style compute the named quantity to be extracted. If the +quantity is always computed by the pair style, no request is needed; +specify *flag* = 0. If the quantity is not always computed (e.g. it +is expensive to calculate), then specify *flag* = 1. This fix will +then request the quantity only on timesteps it is needed. Again, see +the doc pages for individual :doc:`pair_styles ` to +determine which fix pair requests (if any) need to be triggered with a +*flag* = 1 setting. + +The per-atom data extracted from the pair style is stored by this fix +as either a per-atom vector or array. If there is only one *name* +argument specified and the pair style computes a single value for each +atom, then this fix stores it as a per-atom vector. Otherwise a +per-atom array is created, with its data in the order of the *name* +arguments. + +For example, :doc:`pair_style amoeba ` allows extraction +of two named quantities: "uind" and "uinp", both of which are +3-vectors for each atom, i.e. dipole moments. If this fix specifies +"uind" and "uinp" (in that order), then a 6-column per-atom array will +be created. Columns 1-3 will store the "uind" values; columns 4-6 +will store the "uinp" values. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files +`. None of the :doc:`fix_modify ` options are +relevant to this fix. + +As explained above, this fix produces a per-atom vector or array which +can be accessed by various :doc:`output commands `. If +an array is produced, the number of columns is the sum of the number +of per-atom quantities produced by each *name* argument requested from +the pair style. + +Restrictions +"""""""""""" +none + +Related commands +"""""""""""""""" + +:doc:`compute pair ` + +Default +""""""" + +none diff --git a/doc/src/pair_amoeba.rst b/doc/src/pair_amoeba.rst index a58eb2fabc..b41cb9815b 100644 --- a/doc/src/pair_amoeba.rst +++ b/doc/src/pair_amoeba.rst @@ -156,6 +156,18 @@ settings. ---------- +The *amoeba* and *hippo* pair styles support extraction of two +per-atom quantities by the :doc:`fix pair ` command. This +allows the quantities to be output to files by the :doc:`dump ` +or otherwise processed by other LAMMPS commamds. + +The names of the two quantites are "uind" and "uinp" for the induced +dipole moments for each atom. Neither quantity needs to be triggered +by the :doc:`fix pair ` command in order for these pair +styles to calculate it. + +---------- + Mixing, shift, table, tail correction, restart, rRESPA info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index fd05d7189e..4ba926362f 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -444,6 +444,18 @@ identical to the FS EAM files (see above). ---------- +The eam, eam/alloy, eam/fs, and eam/he pair styles support extraction +of two per-atom quantities by the :doc:`fix pair ` command. +This allows the quantities to be output to files by the :doc:`dump +` or otherwise processed by other LAMMPS commamds. + +The names of the two quantites are "rho" and "fp" for the density and +derivative of the embedding energy for each atom. Neither quantity +needs to be triggered by the :doc:`fix pair ` command in +order for these pair styles to calculate it. + +---------- + .. include:: accel_styles.rst ---------- @@ -459,21 +471,26 @@ a pair_coeff command with I != J arguments for the eam styles. This pair style does not support the :doc:`pair_modify ` shift, table, and tail options. -The eam pair styles do not write their information to :doc:`binary restart files `, since it is stored in tabulated potential files. -Thus, you need to re-specify the pair_style and pair_coeff commands in -an input script that reads a restart file. +The eam pair styles do not write their information to :doc:`binary +restart files `, since it is stored in tabulated potential +files. Thus, you need to re-specify the pair_style and pair_coeff +commands in an input script that reads a restart file. The eam pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*, *middle*, *outer* keywords. + + + ---------- Restrictions """""""""""" All of these styles are part of the MANYBODY package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build +package ` page for more info. Related commands """""""""""""""" diff --git a/src/AMOEBA/pair_amoeba.cpp b/src/AMOEBA/pair_amoeba.cpp index 1d37b3c85b..8229684d29 100644 --- a/src/AMOEBA/pair_amoeba.cpp +++ b/src/AMOEBA/pair_amoeba.cpp @@ -2077,7 +2077,10 @@ void *PairAmoeba::extract(const char *str, int &dim) if (strcmp(str,"opbend_pentic") == 0) return (void *) &opbend_pentic; if (strcmp(str,"opbend_sextic") == 0) return (void *) &opbend_sextic; - // requests from FixPair + // peratom requests from FixPair + // return dim = # of quantites per atom + // 0 = per-atom vector + // 1 or more = # of columns in per-atom array if (strcmp(str,"uind") == 0) { dim = 3; diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index 031d41387b..2534386225 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -934,7 +934,10 @@ void *PairEAM::extract(const char *str, int &dim) dim = 2; if (strcmp(str,"scale") == 0) return (void *) scale; - // requests from FixPair + // peratom requests from FixPair + // return dim = # of quantites per atom + // 0 = per-atom vector + // 1 or more = # of columns in per-atom array if (strcmp(str,"rho") == 0) { dim = 0; diff --git a/src/dump.cpp b/src/dump.cpp index 3062763d89..13e3bcdfcc 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -345,11 +345,6 @@ void Dump::write() if (delay_flag && update->ntimestep < delaystep) return; - // if file per timestep, open new file - - if (multifile) openfile(); - if (fp) clearerr(fp); - // simulation box bounds if (domain->triclinic == 0) { @@ -376,14 +371,20 @@ void Dump::write() nme = count(); // if skip condition is defined and met, just return - // do it after count() b/c that invoked computes - // NOTE: for multifile, will have already opened file + // do this after count() b/c it invokes computes, + // so caller can trigger future invocation of needed computes if (skipflag) { double value = input->variable->compute_equal(skipindex); if (value != 0.0) return; } + // if file per timestep, open new file + // do this after skip check, so no file is opened if skip occurs + + if (multifile) openfile(); + if (fp) clearerr(fp); + // ntotal = total # of dump lines in snapshot // nmax = max # of dump lines on any proc diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 4171164cac..c4c81a4bda 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -81,18 +81,19 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : } } - // extract all fields just to get number of per-atom values, ptrs may be NULL + // extract all fields just to get number of per-atom values + // returned data ptr may be NULL, if pair style has not allocated field yet + // check for recognized field cannot be done until post_force() // also check if triggername can be extracted as a scalar value triggerptr = new int*[nfield]; - int columns,dim; + int dim; ncols = 0; for (int ifield = 0; ifield < nfield; ifield++) { - void *tmp = pstyle->extract(fieldname[ifield],columns); - //if (!tmp) - // error->all(FLERR,"Fix pair pair style cannot extract {}",fieldname[ifield]); + int columns = 0; // set in case fieldname not recognized by pstyle + void *pvoid = pstyle->extract(fieldname[ifield],columns); if (columns) ncols += columns; else ncols++; if (trigger[ifield]) { @@ -175,12 +176,26 @@ int FixPair::setmask() void FixPair::init() { - // make sure pair style still exists + // insure pair style still exists pstyle = force->pair_match(pairname,1,0); if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); } +/* ---------------------------------------------------------------------- */ + +void FixPair::setup(int vflag) +{ + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixPair::setup_pre_force(int vflag) +{ + pre_force(vflag); +} + /* ---------------------------------------------------------------------- trigger pair style computation on steps which are multiples of Nevery ------------------------------------------------------------------------- */ diff --git a/src/fix_pair.h b/src/fix_pair.h index 3e32b11544..a9927cf477 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -30,6 +30,8 @@ class FixPair : public Fix { ~FixPair() override; int setmask() override; void init() override; + void setup(int) override; + void setup_pre_force(int) override; void pre_force(int) override; void post_force(int) override; From a4f4efcea0e69b2fd6cca50746c33d3d759f3ead Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 28 Jul 2022 13:31:58 -0600 Subject: [PATCH 046/364] fix a couple typos and alphabetizing error --- doc/src/dump_modify.rst | 59 +++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 0dcb4f198f..a1f12b9eb9 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -178,6 +178,28 @@ extra buffering. ---------- +The *colname* keyword can be used to change the default header keyword +for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, +and MPIIO variants. The setting for *ID string* replaces the default +text with the provided string. *ID* can be a positive integer when it +represents the column number counting from the left, a negative integer +when it represents the column number from the right (i.e. -1 is the last +column/keyword), or a custom dump keyword (or compute, fix, property, or +variable reference) and then it replaces the string for that specific +keyword. For *atom* dump styles only the keywords "id", "type", "x", +"y", "z", "ix", "iy", "iz" can be accessed via string regardless of +whether scaled or unwrapped coordinates were enabled or disabled, and +it always assumes 8 columns for indexing regardless of whether image +flags are enabled or not. For dump style *cfg* only changes to the +"auxiliary" keywords (6th or later keyword) will become visible. + +The *colname* keyword can be used multiple times. If multiple *colname* +settings refer to the same keyword, the last setting has precedence. A +setting of *default* clears all previous settings, reverting all values +to their default names. + +---------- + The *delay* keyword applies to all dump styles. No snapshots will be output until the specified *Dstep* timestep or later. Specifying *Dstep* < 0 is the same as turning off the delay setting. This is a @@ -359,7 +381,7 @@ always occur if the current timestep is a multiple of $N$, the frequency specified in the :doc:`dump ` command or :doc:`dump_modify every ` command, including timestep 0. It will also always occur if the current simulation time is a multiple -of *Delta*, the time interval specified in the doc:`dump_modify +of *Delta*, the time interval specified in the :doc:`dump_modify every/time ` command. But if this is not the case, a dump snapshot will only be written if @@ -367,10 +389,10 @@ the setting of this keyword is *yes*\ . If it is *no*, which is the default, then it will not be written. Note that if the argument to the :doc:`dump_modify every -` doc:`dump_modify every/time ` commands is -a variable and not a numeric value, then specifying *first yes* is the -only way to write a dump snapshot on the first timestep after the dump -command is invoked. +` or doc:`dump_modify every/time ` commands +is a variable and not a numeric value, then specifying *first yes* is +the only way to write a dump snapshot on the first timestep after the +dump command is invoked. ---------- @@ -382,28 +404,6 @@ performed with dump style *xtc*\ . ---------- -The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, -and MPIIO variants. The setting for *ID string* replaces the default -text with the provided string. *ID* can be a positive integer when it -represents the column number counting from the left, a negative integer -when it represents the column number from the right (i.e. -1 is the last -column/keyword), or a custom dump keyword (or compute, fix, property, or -variable reference) and then it replaces the string for that specific -keyword. For *atom* dump styles only the keywords "id", "type", "x", -"y", "z", "ix", "iy", "iz" can be accessed via string regardless of -whether scaled or unwrapped coordinates were enabled or disabled, and -it always assumes 8 columns for indexing regardless of whether image -flags are enabled or not. For dump style *cfg* only changes to the -"auxiliary" keywords (6th or later keyword) will become visible. - -The *colname* keyword can be used multiple times. If multiple *colname* -settings refer to the same keyword, the last setting has precedence. A -setting of *default* clears all previous settings, reverting all values -to their default names. - ----------- - 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* @@ -747,8 +747,9 @@ are written to the dump file or included in the image. The possible attributes that can be tested for are the same as those that can be specified in the :doc:`dump custom ` command, with the exception of the *element* attribute, since it is not a numeric value. Note -that a different attributes can be used than those output by the :doc:`dump custom ` command. E.g. you can output the coordinates and -stress of atoms whose energy is above some threshold. +that a different attributes can be used than those output by the +:doc:`dump custom ` command. E.g. you can output the +coordinates and stress of atoms whose energy is above some threshold. If an atom-style variable is used as the attribute, then it can produce continuous numeric values or effective Boolean 0/1 values From 4de0944f8bb007c6b031045757770646c3d47ea0 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 28 Jul 2022 15:24:58 -0600 Subject: [PATCH 047/364] streamlined string ops --- src/fix_pair.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index c4c81a4bda..fafc86d903 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -42,9 +42,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : nevery = utils::inumeric(FLERR,arg[3],false,lmp); if (nevery < 1) error->all(FLERR,"Illegal fix pair command"); - int n = strlen(arg[4]) + 1; - pairname = new char[n]; - strcpy(pairname,arg[4]); + pairname = utils::strdup(arg[4]); pstyle = force->pair_match(pairname,1,0); if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); @@ -57,9 +55,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix pair command"); - n = strlen(arg[iarg]) + 1; - fieldname[nfield] = new char[n]; - strcpy(fieldname[nfield],arg[iarg]); + fieldname[nfield] = utils::strdup(arg[iarg]); int flag = utils::inumeric(FLERR,arg[iarg+1],true,lmp); if (flag == 0) trigger[nfield] = 0; else if (flag == 1) trigger[nfield] = 1; @@ -75,9 +71,8 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { if (trigger[ifield] == 0) triggername[ifield] = nullptr; else { - n = strlen(fieldname[ifield]) + 6; - triggername[ifield] = new char[n]; - sprintf(triggername[ifield],"%s_flag",fieldname[ifield]); + auto str = fmt::format("%s_flag", fieldname[ifield]); + triggername[nfield] = utils::strdup(str); } } From b8f4efcb6a703cbaf9f5451954b024a7afbf18c9 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 28 Jul 2022 16:53:39 -0600 Subject: [PATCH 048/364] pre-existing bug fix for delay option with dump computes for pe/virial --- src/dump.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 13e3bcdfcc..048a3712ab 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -341,10 +341,6 @@ void Dump::write() imageint *imagehold; double **xhold,**vhold; - // if timestep < delaystep, just return - - if (delay_flag && update->ntimestep < delaystep) return; - // simulation box bounds if (domain->triclinic == 0) { @@ -370,9 +366,12 @@ void Dump::write() nme = count(); + // if timestep < delaystep, just return // if skip condition is defined and met, just return - // do this after count() b/c it invokes computes, - // so caller can trigger future invocation of needed computes + // must do both these tests after count() b/c it invokes computes, + // this enables caller to trigger future invocation of needed computes + + if (delay_flag && update->ntimestep < delaystep) return; if (skipflag) { double value = input->variable->compute_equal(skipindex); From 842b5b365e7638b2df9e5391f2d6fe61a18cad74 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 28 Jul 2022 17:12:31 -0600 Subject: [PATCH 049/364] doc page clarifications --- doc/src/fix_pair.rst | 18 +++++++++--------- doc/src/pair_eam.rst | 9 +++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index c8734299d4..19a57ca48e 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -52,15 +52,15 @@ per-atom quantity which the pair style must recognize as an extraction request. See the doc pages for individual :doc:`pair_styles ` to see what fix pair requests (if any) they support. -The *flag* setting determines whether this fix will also request that -the pair style compute the named quantity to be extracted. If the -quantity is always computed by the pair style, no request is needed; -specify *flag* = 0. If the quantity is not always computed (e.g. it -is expensive to calculate), then specify *flag* = 1. This fix will -then request the quantity only on timesteps it is needed. Again, see -the doc pages for individual :doc:`pair_styles ` to -determine which fix pair requests (if any) need to be triggered with a -*flag* = 1 setting. +The *flag* setting determines whether this fix will also trigger the +pair style to compute the named quantity so it can be extracted. If +the quantity is always computed by the pair style, no trigger is +needed; specify *flag* = 0. If the quantity is not always computed +(e.g. it is expensive to calculate), then specify *flag* = 1. This +will trigger the quantity to be calculated only on timesteps it is +needed. Again, see the doc pages for individual :doc:`pair_styles +` to determine which fix pair requests (if any) need to be +triggered with a *flag* = 1 setting. The per-atom data extracted from the pair style is stored by this fix as either a per-atom vector or array. If there is only one *name* diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index 4ba926362f..7e3b1b3a3f 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -444,10 +444,11 @@ identical to the FS EAM files (see above). ---------- -The eam, eam/alloy, eam/fs, and eam/he pair styles support extraction -of two per-atom quantities by the :doc:`fix pair ` command. -This allows the quantities to be output to files by the :doc:`dump -` or otherwise processed by other LAMMPS commamds. +The *eam*, *eam/alloy*, *eam/fs*, and *eam/he* pair styles support +extraction of two per-atom quantities by the :doc:`fix pair +` command. This allows the quantities to be output to files +by the :doc:`dump ` or otherwise processed by other LAMMPS +commamds. The names of the two quantites are "rho" and "fp" for the density and derivative of the embedding energy for each atom. Neither quantity From ec4c458c7e8f316a587332297fcbd52cd76c85cc Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 29 Jul 2022 10:54:42 -0600 Subject: [PATCH 050/364] add Pair::extract_atom() method --- src/AMOEBA/pair_amoeba.cpp | 21 +++++++++++++++------ src/AMOEBA/pair_amoeba.h | 1 + src/MANYBODY/pair_eam.cpp | 21 +++++++++++++++------ src/MANYBODY/pair_eam.h | 1 + src/fix_pair.cpp | 6 +++--- src/pair.h | 1 + 6 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/AMOEBA/pair_amoeba.cpp b/src/AMOEBA/pair_amoeba.cpp index 8229684d29..1ea4450432 100644 --- a/src/AMOEBA/pair_amoeba.cpp +++ b/src/AMOEBA/pair_amoeba.cpp @@ -2077,16 +2077,25 @@ void *PairAmoeba::extract(const char *str, int &dim) if (strcmp(str,"opbend_pentic") == 0) return (void *) &opbend_pentic; if (strcmp(str,"opbend_sextic") == 0) return (void *) &opbend_sextic; - // peratom requests from FixPair - // return dim = # of quantites per atom - // 0 = per-atom vector - // 1 or more = # of columns in per-atom array + return nullptr; +} +/* ---------------------------------------------------------------------- + peratom requests from FixPair + return ptr to requested data + also return ncol = # of quantites per atom + 0 = per-atom vector + 1 or more = # of columns in per-atom array + return NULL if str is not recognized +---------------------------------------------------------------------- */ + +void *PairAmoeba::extract_peratom(const char *str, int &ncol) +{ if (strcmp(str,"uind") == 0) { - dim = 3; + ncol = 3; return (void *) uind; } else if (strcmp(str,"uinp") == 0) { - dim = 3; + ncol = 3; return (void *) uinp; } diff --git a/src/AMOEBA/pair_amoeba.h b/src/AMOEBA/pair_amoeba.h index 7b0719bca0..869a5aff4f 100644 --- a/src/AMOEBA/pair_amoeba.h +++ b/src/AMOEBA/pair_amoeba.h @@ -50,6 +50,7 @@ class PairAmoeba : public Pair { void unpack_reverse_grid(int, void *, int, int *) override; void *extract(const char *, int &) override; + void *extract_peratom(const char *, int &) override; double memory_usage() override; protected: diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index 2534386225..b14d47f7f0 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -934,16 +934,25 @@ void *PairEAM::extract(const char *str, int &dim) dim = 2; if (strcmp(str,"scale") == 0) return (void *) scale; - // peratom requests from FixPair - // return dim = # of quantites per atom - // 0 = per-atom vector - // 1 or more = # of columns in per-atom array + return nullptr; +} +/* ---------------------------------------------------------------------- + peratom requests from FixPair + return ptr to requested data + also return ncol = # of quantites per atom + 0 = per-atom vector + 1 or more = # of columns in per-atom array + return NULL if str is not recognized +---------------------------------------------------------------------- */ + +void *PairEAM::extract_peratom(const char *str, int &ncol) +{ if (strcmp(str,"rho") == 0) { - dim = 0; + ncol = 0; return (void *) rho; } else if (strcmp(str,"fp") == 0) { - dim = 0; + ncol = 0; return (void *) fp; } diff --git a/src/MANYBODY/pair_eam.h b/src/MANYBODY/pair_eam.h index 3589ab4ab0..11ab969d18 100644 --- a/src/MANYBODY/pair_eam.h +++ b/src/MANYBODY/pair_eam.h @@ -53,6 +53,7 @@ class PairEAM : public Pair { double init_one(int, int) override; double single(int, int, int, int, double, double, double, double &) override; void *extract(const char *, int &) override; + void *extract_peratom(const char *, int &) override; int pack_forward_comm(int, int *, double *, int, int *) override; void unpack_forward_comm(int, int, double *) override; diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index fafc86d903..bc918c468c 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -83,15 +83,15 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : triggerptr = new int*[nfield]; - int dim; ncols = 0; for (int ifield = 0; ifield < nfield; ifield++) { int columns = 0; // set in case fieldname not recognized by pstyle - void *pvoid = pstyle->extract(fieldname[ifield],columns); + void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); if (columns) ncols += columns; else ncols++; if (trigger[ifield]) { + int dim; triggerptr[ifield] = (int *) pstyle->extract(triggername[ifield],dim); if (!triggerptr[ifield]) error->all(FLERR,"Fix pair pair style cannot extract {}", @@ -222,7 +222,7 @@ void FixPair::post_force(int /*vflag*/) int columns; for (int ifield = 0; ifield < nfield; ifield++) { - void *pvoid = pstyle->extract(fieldname[ifield],columns); + void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); if (pvoid == nullptr) error->all(FLERR,"Fix pair pair style cannot extract {}",fieldname[ifield]); diff --git a/src/pair.h b/src/pair.h index 048abb6bb9..8cda065e19 100644 --- a/src/pair.h +++ b/src/pair.h @@ -215,6 +215,7 @@ class Pair : protected Pointers { // specific child-class methods for certain Pair styles virtual void *extract(const char *, int &) { return nullptr; } + virtual void *extract_peratom(const char *, int &) { return nullptr; } virtual void swap_eam(double *, double **) {} virtual void reset_dt() {} virtual void min_xf_pointers(int, double **, double **) {} From 7125682375d6f143a87f1328ba454e5ae5590cc0 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Tue, 9 Aug 2022 21:18:33 -0500 Subject: [PATCH 051/364] Added get_thermo and extract_box; added get_natoms to documentation; added a "TODO" for all other functions to implement --- doc/src/Fortran.rst | 48 +++++++++ fortran/lammps.f90 | 256 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 256 insertions(+), 48 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index dd848a812e..6a550bf463 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -184,6 +184,11 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f command: :f:func:`command` :f commands_list: :f:func:`commands_list` :f commands_string: :f:func:`commands_string` + :f get_natoms: :f:func:`get_natoms` + :f get_thermo: :f:func:`get_thermo` + :f extract_box: :f:func:`extract_box` + +-------- .. f:function:: lammps(args[,comm]) @@ -202,6 +207,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :o integer comm [optional]: MPI communicator :r lammps: an instance of the :f:type:`lammps` derived type +-------- + .. f:subroutine:: close([finalize]) This method will close down the LAMMPS instance through calling @@ -211,6 +218,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :o logical finalize [optional]: shut down the MPI environment of the LAMMPS library if true. +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like :cpp:func:`lammps_version` @@ -226,6 +235,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :p character(len=*) filename: name of file with LAMMPS commands +-------- + .. f:subroutine:: command(cmd) This method will call :cpp:func:`lammps_command` to have LAMMPS @@ -233,6 +244,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :p character(len=*) cmd: single LAMMPS command +-------- + .. f:subroutine:: commands_list(cmds) This method will call :cpp:func:`lammps_commands_list` to have LAMMPS @@ -240,9 +253,44 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :p character(len=*) cmd(:): list of LAMMPS input lines +-------- + .. f:subroutine:: commands_string(str) This method will call :cpp:func:`lammps_commands_string` to have LAMMPS execute a block of commands from a string. :p character(len=*) str: LAMMPS input in string + +-------- + +.. f:function:: get_natoms() + + This function will call :cpp:func:`lammps_get_natoms` and return the number + of atoms in the system. + + :r real(C_double): number of atoms + +-------- + +.. f:function:: get_thermo(name) + + :p character(len=*) name: string with the name of the thermo keyword + :r real(C_double): value of the requested thermo property or 0.0_C_double + +-------- + +.. f:subroutine:: extract_box(boxlo, boxhi, xy, yz, xz, pflags, boxflag) + + :p real(c_double) boxlo [dimension(3),optional]: vector in which to store + lower-bounds of simulation box + :p real(c_double) boxhi [dimension(3),optional]: vector in which to store + upper-bounds of simulation box + :p real(c_double) xy [optional]: variable in which to store *xy* tilt factor + :p real(c_double) yz [optional]: variable in which to store *yz* tilt factor + :p real(c_double) xz [optional]: variable in which to store *xz* tilt factor + :p logical pflags [dimension(3),optional]: vector in which to store + periodicity flags (``.TRUE.`` means periodic in that dimension) + :p logical boxflag [optional]: variable in which to store boolean denoting + whether the box will change during a simulation + (``.TRUE.`` means box will change) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 144fd15652..7c21028191 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -46,6 +46,8 @@ MODULE LIBLAMMPS PROCEDURE :: commands_string => lmp_commands_string PROCEDURE :: version => lmp_version PROCEDURE :: get_natoms => lmp_get_natoms + PROCEDURE :: get_thermo => lmp_get_thermo + PROCEDURE :: extract_box => lmp_extract_box END TYPE lammps INTERFACE lammps @@ -56,80 +58,202 @@ MODULE LIBLAMMPS INTERFACE FUNCTION lammps_open(argc, argv, comm) BIND(C, name='lammps_open_fortran') IMPORT :: c_ptr, c_int - INTEGER(c_int), VALUE, INTENT(in) :: argc, comm - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: argv + INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv TYPE(c_ptr) :: lammps_open END FUNCTION lammps_open - FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C, name='lammps_open_no_mpi') + FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C) IMPORT :: c_ptr, c_int - INTEGER(c_int), VALUE, INTENT(in) :: argc - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: argv + INTEGER(c_int), VALUE, INTENT(IN) :: argc + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv TYPE(c_ptr), VALUE, INTENT(in) :: handle TYPE(c_ptr) :: lammps_open_no_mpi END FUNCTION lammps_open_no_mpi - SUBROUTINE lammps_close(handle) BIND(C, name='lammps_close') + SUBROUTINE lammps_close(handle) BIND(C) IMPORT :: c_ptr TYPE(c_ptr), VALUE :: handle END SUBROUTINE lammps_close - SUBROUTINE lammps_mpi_init() BIND(C, name='lammps_mpi_init') + SUBROUTINE lammps_mpi_init() BIND(C) END SUBROUTINE lammps_mpi_init - SUBROUTINE lammps_mpi_finalize() BIND(C, name='lammps_mpi_finalize') + SUBROUTINE lammps_mpi_finalize() BIND(C) END SUBROUTINE lammps_mpi_finalize - SUBROUTINE lammps_kokkos_finalize() BIND(C, name='lammps_kokkos_finalize') + SUBROUTINE lammps_kokkos_finalize() BIND(C) END SUBROUTINE lammps_kokkos_finalize - SUBROUTINE lammps_file(handle, filename) BIND(C, name='lammps_file') + SUBROUTINE lammps_file(handle, filename) BIND(C) IMPORT :: c_ptr TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: filename END SUBROUTINE lammps_file - SUBROUTINE lammps_command(handle, cmd) BIND(C, name='lammps_command') + SUBROUTINE lammps_command(handle, cmd) BIND(C) IMPORT :: c_ptr TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: cmd END SUBROUTINE lammps_command - SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C, name='lammps_commands_list') + SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) IMPORT :: c_ptr, c_int TYPE(c_ptr), VALUE :: handle - INTEGER(c_int), VALUE, INTENT(in) :: ncmd - TYPE(c_ptr), DIMENSION(*), INTENT(in) :: cmds + INTEGER(c_int), VALUE, INTENT(IN) :: ncmd + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds END SUBROUTINE lammps_commands_list - SUBROUTINE lammps_commands_string(handle, str) BIND(C, name='lammps_commands_string') + SUBROUTINE lammps_commands_string(handle, str) BIND(C) IMPORT :: c_ptr TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: str END SUBROUTINE lammps_commands_string - FUNCTION lammps_malloc(size) BIND(C, name='malloc') - IMPORT :: c_ptr, c_size_t - INTEGER(c_size_t), value :: size - TYPE(c_ptr) :: lammps_malloc - END FUNCTION lammps_malloc + FUNCTION lammps_get_natoms(handle) BIND(C) + IMPORT :: c_ptr, c_double + TYPE(c_ptr), VALUE :: handle + REAL(c_double) :: lammps_get_natoms + END FUNCTION lammps_get_natoms - SUBROUTINE lammps_free(ptr) BIND(C, name='lammps_free') - IMPORT :: c_ptr - TYPE(c_ptr), VALUE :: ptr - END SUBROUTINE lammps_free + FUNCTION lammps_get_thermo(handle,name) BIND(C) + IMPORT :: c_ptr, c_double, c_char + IMPLICIT NONE + REAL(c_double) :: lammps_get_thermo + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: name + END FUNCTION lammps_get_thermo - FUNCTION lammps_version(handle) BIND(C, name='lammps_version') + SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & + boxflag) BIND(C) + IMPORT :: c_ptr, c_double, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & + boxflag + END SUBROUTINE lammps_extract_box + + ! TODO + !SUBROUTINE lammps_reset_box + + !SUBROUTINE lammps_memory_usage + + !INTEGER (c_int) FUNCTION lammps_get_mpi_comm + !FIXME? type(MPI_Comm) FUNCTION lammps_get_mpi_comm + + !INTEGER (c_int) FUNCTION lammps_extract_setting + + !INTEGER (c_int) FUNCTION lammps_extract_global_datatype + + !(generic) lammps_extract_global + ! TODO: You can fake out the type-casting by declaring non-optional + ! parameters that help the compiler figure out which one to call + + !INTEGER (c_int) FUNCTION lammps_extract_atom_datatype + + !(generic) lammps_extract_atom + + !(generic) lammps_extract_compute + + !(generic) lammps_extract_fix + + !(generic) lammps_extract_variable + + !INTEGER (c_int) lammps_set_variable + + !SUBROUTINE lammps_gather_atoms + + !SUBROUTINE lammps_gather_atoms_concat + + !SUBROUTINE lammps_gather_atoms_subset + + !SUBROUTINE lammps_scatter_atoms + + !SUBROUTINE lammps_scatter_atoms_subset + + !SUBROUTINE lammps_gather_bonds + + !SUBROUTINE lammps_gather + + !SUBROUTINE lammps_gather_concat + + !SUBROUTINE lammps_gather_subset + + !SUBROUTINE lammps_scatter_subset + + !(generic / id, type, and image are special) / requires LAMMPS_BIGBIG + !INTEGER (C_int) FUNCTION lammps_create_atoms + + !INTEGER (C_int) FUNCTION lammps_find_pair_neighlist + + !INTEGER (C_int) FUNCTION lammps_find_fix_neighlist + + !INTEGER (C_int) FUNCTION lammps_find_compute_neighlist + + !INTEGER (C_int) FUNCTION lammps_neighlist_num_elements + + !SUBROUTINE lammps_neighlist_element_neighbors + + FUNCTION lammps_version(handle) BIND(C) IMPORT :: c_ptr, c_int TYPE(c_ptr), VALUE :: handle INTEGER(c_int) :: lammps_version END FUNCTION lammps_version - FUNCTION lammps_get_natoms(handle) BIND(C, name='lammps_get_natoms') - IMPORT :: c_ptr, c_double - TYPE(c_ptr), VALUE :: handle - REAL(c_double) :: lammps_get_natoms - END FUNCTION lammps_get_natoms + !SUBROUTINE lammps_get_os_info + + !LOGICAL FUNCTION lammps_config_has_mpi_support + !LOGICAL FUNCTION lammps_config_has_gzip_support + !LOGICAL FUNCTION lammps_config_has_png_support + !LOGICAL FUNCTION lammps_config_has_jpeg_support + !LOGICAL FUNCTION lammps_config_has_ffmpeg_support + !LOGICAL FUNCTION lammps_config_has_exceptions + !LOGICAL FUNCTION lammps_config_has_package + !INTEGER (C_int) FUNCTION lammps_config_package_count + !SUBROUTINE lammps_config_package_name + + !LOGICAL FUNCTION lammps_config_accelerator + !LOGICAL FUNCTION lammps_has_gpu_device + !SUBROUTINE lammps_get_gpu_device + + !LOGICAL FUNCTION lammps_has_id + !INTEGER (C_int) FUNCTION lammps_id_count + !SUBROUTINE lammps_id_name + + !INTEGER (C_int) FUNCTION lammps_plugin_count + !SUBROUTINE lammps_plugin_name + + !Both of these use LAMMPS_BIGBIG + !INTEGER (LAMMPS_imageint) FUNCTION lammps_encode_image_flags + !SUBROUTINE lammps_decode_image_flags + + !SUBROUTINE lammps_set_fix_external_callback ! may have trouble.... + !FUNCTION lammps_fix_external_get_force() ! returns real(c_double) (:) + + !SUBROUTINE lammps_fix_external_set_energy_global + !SUBROUTINE lammps_fix_external_set_energy_peratom + !SUBROUTINE lammps_fix_external_set_virial_global + !SUBROUTINE lammps_fix_external_set_virial_peratom + !SUBROUTINE lammps_fix_external_set_vector_length + !SUBROUTINE lammps_fix_external_set_vector + + !SUBROUTINE lammps_flush_buffers + + FUNCTION lammps_malloc(size) BIND(C, name='malloc') + IMPORT :: c_ptr, c_size_t + INTEGER(c_size_t), VALUE :: size + TYPE(c_ptr) :: lammps_malloc + END FUNCTION lammps_malloc + + SUBROUTINE lammps_free(ptr) BIND(C) + IMPORT :: c_ptr + TYPE(c_ptr), VALUE :: ptr + END SUBROUTINE lammps_free + + + !LOGICAL FUNCTION lammps_is_running + !SUBROUTINE lammps_force_timeout + !LOGICAL FUNCTION lammps_has_error + !INTEGER (c_int) FUNCTION lammps_get_last_error_message END INTERFACE CONTAINS @@ -140,7 +264,7 @@ CONTAINS TYPE(lammps) FUNCTION lmp_open(args, comm) IMPLICIT NONE INTEGER, INTENT(in), OPTIONAL :: comm - CHARACTER(len=*), INTENT(in), OPTIONAL :: args(:) + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: args(:) TYPE(c_ptr), ALLOCATABLE :: argv(:) INTEGER(c_int) :: i, c_comm, argc @@ -175,7 +299,7 @@ CONTAINS SUBROUTINE lmp_close(self, finalize) IMPLICIT NONE CLASS(lammps) :: self - LOGICAL, INTENT(in), OPTIONAL :: finalize + LOGICAL, INTENT(IN), OPTIONAL :: finalize CALL lammps_close(self%handle) @@ -187,20 +311,6 @@ CONTAINS END IF END SUBROUTINE lmp_close - INTEGER FUNCTION lmp_version(self) - IMPLICIT NONE - CLASS(lammps) :: self - - lmp_version = lammps_version(self%handle) - END FUNCTION lmp_version - - DOUBLE PRECISION FUNCTION lmp_get_natoms(self) - IMPLICIT NONE - CLASS(lammps) :: self - - lmp_get_natoms = lammps_get_natoms(self%handle) - END FUNCTION lmp_get_natoms - SUBROUTINE lmp_file(self, filename) IMPLICIT NONE CLASS(lammps) :: self @@ -260,13 +370,63 @@ CONTAINS CALL lammps_free(tmp) END SUBROUTINE lmp_commands_string + ! equivalent function to lammps_get_natoms + DOUBLE PRECISION FUNCTION lmp_get_natoms(self) + IMPLICIT NONE + CLASS(lammps) :: self + + lmp_get_natoms = lammps_get_natoms(self%handle) + END FUNCTION lmp_get_natoms + + ! equivalent function to lammps_get_thermo + REAL (C_double) FUNCTION lmp_get_thermo(self,name) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*) :: name + TYPE(C_ptr) :: Cname + + Cname = f2c_string(name) + lmp_get_thermo = lammps_get_thermo(self%handle, Cname) + CALL lammps_free(Cname) + END FUNCTION lmp_get_thermo + + ! equivalent subroutine to lammps_extract_box + SUBROUTINE lmp_extract_box (self, boxlo, boxhi, xy, yz, xz, pflags, boxflag) + CLASS(lammps), INTENT(IN) :: self + REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: boxlo(3), boxhi(3) + REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: xy, yz, xz + LOGICAL, INTENT(OUT), OPTIONAL :: pflags(3), boxflag + INTEGER(c_int), TARGET :: C_pflags(3), C_boxflag + TYPE (c_ptr) :: ptr(7) + + ptr = c_null_ptr + IF ( PRESENT(boxlo) ) ptr(1) = C_LOC(boxlo(1)) + IF ( PRESENT(boxhi) ) ptr(2) = C_LOC(boxhi(1)) + IF ( PRESENT(xy) ) ptr(3) = C_LOC(xy) + IF ( PRESENT(yz) ) ptr(4) = C_LOC(yz) + IF ( PRESENT(xz) ) ptr(5) = C_LOC(xz) + IF ( PRESENT(pflags) ) ptr(6) = C_LOC(C_pflags(1)) + IF ( PRESENT(boxflag) ) ptr(7) = C_LOC(C_boxflag) + CALL lammps_extract_box(self%handle, ptr(1), ptr(2), ptr(3), ptr(4), & + ptr(5), ptr(6), ptr(7)) + IF ( PRESENT(pflags) ) pflags = ( C_pflags /= 0_C_int ) + IF ( PRESENT(boxflag) ) boxflag = ( C_boxflag /= 0_C_int ) + END SUBROUTINE lmp_extract_box + + ! equivalent function to lammps_version() + INTEGER FUNCTION lmp_version(self) + IMPLICIT NONE + CLASS(lammps) :: self + + lmp_version = lammps_version(self%handle) + END FUNCTION lmp_version + ! ---------------------------------------------------------------------- ! local helper functions ! copy fortran string to zero terminated c string ! ---------------------------------------------------------------------- FUNCTION f2c_string(f_string) RESULT(ptr) - CHARACTER (len=*), INTENT(in) :: f_string - CHARACTER (len=1, kind=c_char), POINTER :: c_string(:) + CHARACTER (LEN=*), INTENT(IN) :: f_string + CHARACTER (LEN=1, KIND=c_char), POINTER :: c_string(:) TYPE(c_ptr) :: ptr INTEGER(c_size_t) :: i, n From f442fc8540e55f5613cd4a0fa7b59dbdd9fe812c Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 10 Aug 2022 00:55:17 -0500 Subject: [PATCH 052/364] Added reset_box, memory_usage, get_mpi_comm, extract_setting and associated documentation --- doc/src/Fortran.rst | 54 +++++++++++++++ fortran/lammps.f90 | 159 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 203 insertions(+), 10 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 6a550bf463..19182321b5 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -187,6 +187,9 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f get_natoms: :f:func:`get_natoms` :f get_thermo: :f:func:`get_thermo` :f extract_box: :f:func:`extract_box` + :f reset_box: :f:func:`reset_box` + :f memory_usage: :f:func:`memory_usage` + :f extract_setting: :f:func:`extract_setting` -------- @@ -294,3 +297,54 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :p logical boxflag [optional]: variable in which to store boolean denoting whether the box will change during a simulation (``.TRUE.`` means box will change) + +-------- + +.. f:subroutine:: reset_box(boxlo, boxhi, xy, yz, xz) + + :p real(c_double) boxlo [dimension(3)]: vector of three doubles containing + the lower box boundary + :p real(c_double) boxhi [dimension(3)]: vector of three doubles containing + the upper box boundary + :p real(c_double) xy: *x--y* tilt factor + :p real(c_double) yz: *y--z* tilt factor + :p real(c_double) xz: *x--z* tilt factor + +-------- + +.. f:subroutine:: memory_usage(meminfo) + + :p real(c_double) meminfo [dimension(3)]: vector of three doubles in which + to store memory usage data + +-------- + +.. f:function:: get_mpi_comm() + + :r integer: Fortran integer equivalent to the MPI communicator LAMMPS is + using + +.. note:: + + The MPI_F08 module, which is in compliance with the Fortran 2008 standard, + is not directly supported by this function. However, you should be able to + convert between the two using the MPI_VAL member of the communicator. For + example, + + .. code-block:: fortran + + USE MPI_F08 + USE LIBLAMMPS + TYPE (LAMMPS) :: lmp + TYPE (MPI_Comm) :: comm + ! ... [commands to set up LAMMPS/etc.] + comm%MPI_VAL = lmp%get_mpi_comm() + + should assign an MPI_F08 communicator properly. + +-------- + +.. f:function:: extract_setting(keyword) + + :p character(len=*) keyword: string containing the name of the thermo keyword + :r integer(c_int): value of the queried setting or :math:`-1` if unknown diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7c21028191..0e91a378b1 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -30,12 +30,44 @@ MODULE LIBLAMMPS USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_loc, & - c_int, c_char, c_null_char, c_double, c_size_t, c_f_pointer + c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, c_f_pointer IMPLICIT NONE PRIVATE PUBLIC :: lammps + ! These are public-interface constants that have the same purpose as the + ! constants in library.h, except that their types match the type of the + ! constant in question. Their purpose is to determine the type of the + ! return value without something akin to a C/C++ type cast + INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int + INTEGER (c_int), PUBLIC, DIMENSION(2), PARAMETER :: LMP_INT_1D = 1_c_int + INTEGER (c_int), PUBLIC, DIMENSION(2,2), PARAMETER :: LMP_INT_2D = 1_c_int + REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double + REAL (c_double), PUBLIC, DIMENSION(2), PARAMETER :: & + LMP_DOUBLE_1D = 2.0_c_double + REAL (c_double), PUBLIC, DIMENSION(2,2), PARAMETER :: & + LMP_DOUBLE_2D = 3.0_c_double + INTEGER (c_int64_t), PUBLIC, PARAMETER :: LMP_INT64 = 4_c_int64_t + INTEGER (c_int64_t), PUBLIC, DIMENSION(2), PARAMETER :: & + LMP_INT64_1D = 4_c_int64_t + INTEGER (c_int64_t), PUBLIC, DIMENSION(2,2), PARAMETER :: & + LMP_INT64_2D = 5_c_int64_t + CHARACTER(LEN=*), PUBLIC, PARAMETER :: LMP_STRING = 'six' + + ! Data type constants for extracting data from global, atom, compute, and fix + ! + ! Must be kept in sync with the equivalent declarations in + ! src/library.h and python/lammps/constants.py + INTEGER (c_int), PARAMETER :: & + LAMMPS_INT = 0_c_int, & ! 32-bit integer (array) + LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array + LAMMPS_DOUBLE = 2, & ! 64-bit double (array) + LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array + LAMMPS_INT64 = 4, & ! 64-bit integer (array) + LAMMPS_INT64_2D = 5, & ! two-dimensional 64-bit integer array + LAMMPS_STRING = 6 ! C-String + TYPE lammps TYPE(c_ptr) :: handle CONTAINS @@ -44,10 +76,15 @@ MODULE LIBLAMMPS PROCEDURE :: command => lmp_command PROCEDURE :: commands_list => lmp_commands_list PROCEDURE :: commands_string => lmp_commands_string - PROCEDURE :: version => lmp_version PROCEDURE :: get_natoms => lmp_get_natoms PROCEDURE :: get_thermo => lmp_get_thermo PROCEDURE :: extract_box => lmp_extract_box + PROCEDURE :: reset_box => lmp_reset_box + PROCEDURE :: memory_usage => lmp_memory_usage + PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm + PROCEDURE :: extract_setting => lmp_extract_setting + + PROCEDURE :: version => lmp_version END TYPE lammps INTERFACE lammps @@ -117,7 +154,7 @@ MODULE LIBLAMMPS END FUNCTION lammps_get_natoms FUNCTION lammps_get_thermo(handle,name) BIND(C) - IMPORT :: c_ptr, c_double, c_char + IMPORT :: c_ptr, c_double IMPLICIT NONE REAL(c_double) :: lammps_get_thermo TYPE(c_ptr), VALUE :: handle @@ -132,18 +169,47 @@ MODULE LIBLAMMPS boxflag END SUBROUTINE lammps_extract_box - ! TODO - !SUBROUTINE lammps_reset_box + SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE (c_ptr), VALUE :: handle + REAL (c_double), DIMENSION(3) :: boxlo, boxhi + REAL (c_double), VALUE :: xy, yz, xz + END SUBROUTINE lammps_reset_box - !SUBROUTINE lammps_memory_usage + SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + REAL(c_double), DIMENSION(*) :: meminfo + END SUBROUTINE lammps_memory_usage - !INTEGER (c_int) FUNCTION lammps_get_mpi_comm - !FIXME? type(MPI_Comm) FUNCTION lammps_get_mpi_comm + FUNCTION lammps_get_mpi_comm(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE (c_ptr), VALUE :: handle + INTEGER (c_int) :: lammps_get_mpi_comm + END FUNCTION lammps_get_mpi_comm - !INTEGER (c_int) FUNCTION lammps_extract_setting + FUNCTION lammps_extract_setting(handle,keyword) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, keyword + INTEGER (c_int) :: lammps_extract_setting + END FUNCTION lammps_extract_setting - !INTEGER (c_int) FUNCTION lammps_extract_global_datatype + FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name + INTEGER (c_int) :: lammps_extract_global_datatype + END FUNCTION lammps_extract_global_datatype + FUNCTION lammps_extract_global(handle, name) BIND(C) + IMPORT :: c_ptr + TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr) :: lammps_extract_global + END FUNCTION lammps_extract_global !(generic) lammps_extract_global ! TODO: You can fake out the type-casting by declaring non-optional ! parameters that help the compiler figure out which one to call @@ -412,6 +478,79 @@ CONTAINS IF ( PRESENT(boxflag) ) boxflag = ( C_boxflag /= 0_C_int ) END SUBROUTINE lmp_extract_box + ! equivalent function to lammps_reset_box + SUBROUTINE lmp_reset_box (self, boxlo, boxhi, xy, yz, xz) + CLASS(lammps), INTENT(IN) :: self + REAL(C_double), INTENT(IN) :: boxlo(3), boxhi(3), xy, yz, xz + + CALL lammps_reset_box (self%handle, boxlo, boxhi, xy, yz, xz) + END SUBROUTINE lmp_reset_box + + ! equivalent function to lammps_memory_usage + SUBROUTINE lmp_memory_usage(self,meminfo) + CLASS(lammps), INTENT(IN) :: self + INTEGER, PARAMETER :: MEMINFO_ELEM = 3 + REAL (c_double), DIMENSION(MEMINFO_ELEM), INTENT(OUT) :: meminfo + + CALL lammps_memory_usage(self%handle,meminfo) + END SUBROUTINE lmp_memory_usage + + ! equivalent function to lammps_get_mpi_comm + INTEGER FUNCTION lmp_get_mpi_comm (self) + CLASS(lammps), INTENT(IN) :: self + + lmp_get_mpi_comm = lammps_get_mpi_comm(self%handle) + END FUNCTION lmp_get_mpi_comm + + ! equivalent function to lammps_extract_setting + INTEGER (c_int) FUNCTION lmp_extract_setting (self, keyword) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: keyword + TYPE(c_ptr) :: Ckeyword + + Ckeyword = f2c_string(keyword) + lmp_extract_setting = lammps_extract_setting(self%handle, Ckeyword) + CALL lammps_free(Ckeyword) + END FUNCTION lmp_extract_setting + + ! equivalent function to lammps_extract_global_datatype + ! this function doesn't need to be accessed by the user, but is instead used + ! for type checking + INTEGER (c_int) FUNCTION lmp_extract_global_datatype (self, name) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + TYPE(c_ptr) :: Cname + + Cname = f2c_string(name) + lmp_extract_global_datatype & + = lammps_extract_global_datatype(self%handle, Cname) + CALL lammps_free(Cname) + END FUNCTION lmp_extract_global_datatype + + ! equivalent functions to lammps_extract_global (overloaded) + FUNCTION lmp_extract_global_int (self, name, dtype) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int) :: dtype + INTEGER(c_int) :: lmp_extract_global_int + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: datatype + INTEGER(c_int), POINTER :: ptr + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(self%handle, Cname) + IF ( datatype /= LAMMPS_INT ) THEN + ! throw an exception or something; data type doesn't match! + END IF + Cptr = lammps_extract_global(self%handle, Cname) + CALL c_f_pointer(Cptr, ptr) + lmp_extract_global_int = ptr + CALL lammps_free(Cname) + END FUNCTION lmp_extract_global_int + ! TODO need more generics here to match TKR of LMP_INT_1D, LMP_BIGINT, + ! LMP_DOUBLE, LMP_DOUBLE_1D, LMS_STRING [this assumes no one adds anything + ! requiring LMP_DOUBLE_2D and the like!] + ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) IMPLICIT NONE From 6c49937ad7b61d0db06a60c4af0e49240d03aa75 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 10 Aug 2022 11:03:49 -0500 Subject: [PATCH 053/364] Re-ordered type-bound procedures to correspond with the order in library.h --- fortran/lammps.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7c21028191..633abbc1f6 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -44,10 +44,10 @@ MODULE LIBLAMMPS PROCEDURE :: command => lmp_command PROCEDURE :: commands_list => lmp_commands_list PROCEDURE :: commands_string => lmp_commands_string - PROCEDURE :: version => lmp_version PROCEDURE :: get_natoms => lmp_get_natoms PROCEDURE :: get_thermo => lmp_get_thermo PROCEDURE :: extract_box => lmp_extract_box + PROCEDURE :: version => lmp_version END TYPE lammps INTERFACE lammps From 89b9967f2c46764e7181a3160e5659874c712bf5 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 10 Aug 2022 11:37:15 -0500 Subject: [PATCH 054/364] Added part of lmp_extract_global --- fortran/lammps.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 0e91a378b1..64d4c50e48 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -83,6 +83,8 @@ MODULE LIBLAMMPS PROCEDURE :: memory_usage => lmp_memory_usage PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm PROCEDURE :: extract_setting => lmp_extract_setting + PROCEDURE, PRIVATE :: lmp_extract_global_int + GENERIC :: extract_global => lmp_extract_global_int ! TODO PROCEDURE :: version => lmp_version END TYPE lammps @@ -541,6 +543,7 @@ CONTAINS datatype = lammps_extract_global_datatype(self%handle, Cname) IF ( datatype /= LAMMPS_INT ) THEN ! throw an exception or something; data type doesn't match! + WRITE(0,*) 'WARNING: global data type is inconsistent' END IF Cptr = lammps_extract_global(self%handle, Cname) CALL c_f_pointer(Cptr, ptr) From 756074c073a00451929f8b8cd2dfb209151854fb Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 10 Aug 2022 11:39:23 -0500 Subject: [PATCH 055/364] Merge edits from two computers --- fortran/lammps.f90 | 60 ++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 0e91a378b1..7da1a77a81 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -41,17 +41,17 @@ MODULE LIBLAMMPS ! constant in question. Their purpose is to determine the type of the ! return value without something akin to a C/C++ type cast INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int - INTEGER (c_int), PUBLIC, DIMENSION(2), PARAMETER :: LMP_INT_1D = 1_c_int - INTEGER (c_int), PUBLIC, DIMENSION(2,2), PARAMETER :: LMP_INT_2D = 1_c_int + INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 1_c_int + INTEGER (c_int), PUBLIC, DIMENSION(3,3), PARAMETER :: LMP_INT_2D = 1_c_int REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double - REAL (c_double), PUBLIC, DIMENSION(2), PARAMETER :: & + REAL (c_double), PUBLIC, DIMENSION(3), PARAMETER :: & LMP_DOUBLE_1D = 2.0_c_double - REAL (c_double), PUBLIC, DIMENSION(2,2), PARAMETER :: & + REAL (c_double), PUBLIC, DIMENSION(3,3), PARAMETER :: & LMP_DOUBLE_2D = 3.0_c_double INTEGER (c_int64_t), PUBLIC, PARAMETER :: LMP_INT64 = 4_c_int64_t - INTEGER (c_int64_t), PUBLIC, DIMENSION(2), PARAMETER :: & + INTEGER (c_int64_t), PUBLIC, DIMENSION(3), PARAMETER :: & LMP_INT64_1D = 4_c_int64_t - INTEGER (c_int64_t), PUBLIC, DIMENSION(2,2), PARAMETER :: & + INTEGER (c_int64_t), PUBLIC, DIMENSION(3,3), PARAMETER :: & LMP_INT64_2D = 5_c_int64_t CHARACTER(LEN=*), PUBLIC, PARAMETER :: LMP_STRING = 'six' @@ -513,19 +513,19 @@ CONTAINS CALL lammps_free(Ckeyword) END FUNCTION lmp_extract_setting - ! equivalent function to lammps_extract_global_datatype - ! this function doesn't need to be accessed by the user, but is instead used - ! for type checking - INTEGER (c_int) FUNCTION lmp_extract_global_datatype (self, name) - CLASS(lammps), INTENT(IN) :: self - CHARACTER(LEN=*), INTENT(IN) :: name - TYPE(c_ptr) :: Cname - - Cname = f2c_string(name) - lmp_extract_global_datatype & - = lammps_extract_global_datatype(self%handle, Cname) - CALL lammps_free(Cname) - END FUNCTION lmp_extract_global_datatype +! FIXME Now that I think about it...do we need this at all? +! ! equivalent function to lammps_extract_global_datatype +! ! this function doesn't need to be accessed by the user, but is instead used +! ! for type checking +! INTEGER (c_int) FUNCTION lmp_extract_global_datatype (name) +! CHARACTER(LEN=*), INTENT(IN) :: name +! TYPE(c_ptr) :: Cname +! +! Cname = f2c_string(name) +! lmp_extract_global_datatype +! = lammps_extract_global_datatype(c_null_ptr, Cname) +! CALL lammps_free(Cname) +! END FUNCTION lmp_extract_global_datatype ! equivalent functions to lammps_extract_global (overloaded) FUNCTION lmp_extract_global_int (self, name, dtype) @@ -538,7 +538,7 @@ CONTAINS INTEGER(c_int), POINTER :: ptr Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(self%handle, Cname) + datatype = lammps_extract_global_datatype(Cname) IF ( datatype /= LAMMPS_INT ) THEN ! throw an exception or something; data type doesn't match! END IF @@ -547,6 +547,26 @@ CONTAINS lmp_extract_global_int = ptr CALL lammps_free(Cname) END FUNCTION lmp_extract_global_int + FUNCTION lmp_extract_global_int_1d (self, name, dtype) + ! This implementation assumes there are three elements to all arrays + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(3) :: dtype + INTEGER(c_int) :: lmp_extract_global_int + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: datatype + INTEGER(c_int), DIMENSION(3), POINTER :: ptr + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(Cname) + IF ( datatype /= LAMMPS_INT ) THEN + ! throw an exception or something; data type doesn't match! + END IF + Cptr = lammps_extract_global(self%handle, Cname) + CALL c_f_pointer(Cptr, ptr, shape(dtype)) + lmp_extract_global_int = ptr + CALL lammps_free(Cname) + END FUNCTION lmp_extract_global_int_1d ! TODO need more generics here to match TKR of LMP_INT_1D, LMP_BIGINT, ! LMP_DOUBLE, LMP_DOUBLE_1D, LMS_STRING [this assumes no one adds anything ! requiring LMP_DOUBLE_2D and the like!] From b191e295618cf1ebe073f8ce49f71fad47f31ef3 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 10 Aug 2022 17:56:28 -0500 Subject: [PATCH 056/364] Work in progress for extract_global; committing but will probably undo later --- doc/src/Fortran.rst | 157 +++++++++++++++++++++++++++++++++++++++----- fortran/lammps.f90 | 98 +++++++++++++++++++++------ 2 files changed, 220 insertions(+), 35 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 19182321b5..4e093dc49b 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -80,7 +80,7 @@ the optional logical argument set to ``.true.``. Here is a simple example: END PROGRAM testlib It is also possible to pass command line flags from Fortran to C/C++ and -thus make the resulting executable behave similar to the standalone +thus make the resulting executable behave similarly to the standalone executable (it will ignore the `-in/-i` flag, though). This allows to use the command line to configure accelerator and suffix settings, configure screen and logfile output, or to set index style variables @@ -190,6 +190,7 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f reset_box: :f:func:`reset_box` :f memory_usage: :f:func:`memory_usage` :f extract_setting: :f:func:`extract_setting` + :f extract_global: :f:func:`extract_global` -------- @@ -210,7 +211,57 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :o integer comm [optional]: MPI communicator :r lammps: an instance of the :f:type:`lammps` derived type --------- + .. note:: + + The ``MPI_F08`` module, which defines Fortran 2008 bindings for MPI, + is not directly supported by this interface due to the complexities of + supporting both the ``MPI_F08`` and ``MPI`` modules at the same time. + However, you should be able to use the ``MPI_VAL`` member of the + ``MPI_comm`` derived type to access the integer value of the + communicator, such as in + + .. code-block:: Fortran + + PROGRAM testmpi + USE LIBLAMMPS + USE MPI_F08 + TYPE(lammps) :: lmp + lmp = lammps(MPI_COMM_SELF%MPI_VAL) + END PROGRAM testmpi + +Constants Defined by the API +============================ + +The following constants are declared by the Fortran API to resolve the +type/kind/rank signature for return values. These serve the same role as +``LAMMPS_INT``, ``LAMMPS_DOUBLE``, and similar constants in ``src/library.h`` +and those in ``python/lammps/constants.py`` for the C and Python APIs, +respectively. Unlike their C and Python bretheren, however, it is the type +(e.g., ``INTEGER``), kind (e.g., ``C_int``), and rank (e.g., ``DIMENSION(:)``) +of these constants that is used by the calling routine, rather than their +numerical values. + +:f:LMP_INT: 32-bit integer scalars +:f:LMP_INT_1D: 32-bit integer vectors +:f:LMP_INT_2D: 32-bit integer matrices +:f:LMP_DOUBLE: 64-bit real scalars +:f:LMP_DOUBLE_1D: 64-bit real vectors +:f:LMP_DOUBLE_2D: 64-bit real matrices +:f:LMP_INT64: 64-bit integer scalars +:f:LMP_INT64_1D: 64-bit integer vectors +:f:LMP_INT64_2D: 64-bit integer matrices + +.. admonition:: Interaction with LAMMPS_BIGBIG and such + + LAMMPS uses different-sized integers to store various entities, such as + the number of timesteps or the total number of atoms, depending on certain + compiler flags (see the :doc:`size limits ` + documentation). This API is currently agnostic to these settings, and it + is up to the user to know the size of LAMMPS_BIGINT and such and pass + LMP_INT or LMP_INT64, as appropriate, for such entities. + +Procedures Bound to the lammps Derived Type +=========================================== .. f:subroutine:: close([finalize]) @@ -278,12 +329,20 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. .. f:function:: get_thermo(name) + This function will call :cpp:func:`lammps_get_thermo` and return the value + of the corresponding thermodynamic keyword. + :p character(len=*) name: string with the name of the thermo keyword :r real(C_double): value of the requested thermo property or 0.0_C_double -------- .. f:subroutine:: extract_box(boxlo, boxhi, xy, yz, xz, pflags, boxflag) + + This subroutine will call :cpp:func:`lammps_extract_box`. All parameters + are optional, though obviously at least one should be present. The + parameters *pflags* and *boxflag* are stored in LAMMPS as integers, but + should be declared as ``LOGICAL`` variables when calling from Fortran. :p real(c_double) boxlo [dimension(3),optional]: vector in which to store lower-bounds of simulation box @@ -302,6 +361,9 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. .. f:subroutine:: reset_box(boxlo, boxhi, xy, yz, xz) + This subroutine will call :cpp:func:`lammps_reset_box`. All parameters + are required. + :p real(c_double) boxlo [dimension(3)]: vector of three doubles containing the lower box boundary :p real(c_double) boxhi [dimension(3)]: vector of three doubles containing @@ -314,6 +376,9 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. .. f:subroutine:: memory_usage(meminfo) + This subroutine will call :cpp:func:`lammps_memory_usage` and store the + result in the three-element array *meminfo*. + :p real(c_double) meminfo [dimension(3)]: vector of three doubles in which to store memory usage data @@ -321,30 +386,92 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. .. f:function:: get_mpi_comm() + This function returns a Fortran representation of the LAMMPS "world" + communicator. + :r integer: Fortran integer equivalent to the MPI communicator LAMMPS is using -.. note:: + .. note:: - The MPI_F08 module, which is in compliance with the Fortran 2008 standard, - is not directly supported by this function. However, you should be able to - convert between the two using the MPI_VAL member of the communicator. For - example, + The C library interface currently returns type "int" instead of type + "MPI_Fint", which is the C type correspending to Fortran "INTEGER" + types of the default kind. On most compilers, these are the same anyway, + but this interface exchanges values this way to avoid warning messages. - .. code-block:: fortran + .. note:: - USE MPI_F08 - USE LIBLAMMPS - TYPE (LAMMPS) :: lmp - TYPE (MPI_Comm) :: comm - ! ... [commands to set up LAMMPS/etc.] - comm%MPI_VAL = lmp%get_mpi_comm() + The MPI_F08 module, which defines Fortran 2008 bindings for MPI, is not + directly supported by this function. However, you should be able to + convert between the two using the MPI_VAL member of the communicator. + For example, - should assign an MPI_F08 communicator properly. + .. code-block:: fortran + + USE MPI_F08 + USE LIBLAMMPS + TYPE (LAMMPS) :: lmp + TYPE (MPI_Comm) :: comm + ! ... [commands to set up LAMMPS/etc.] + comm%MPI_VAL = lmp%get_mpi_comm() + + should assign an MPI_F08 communicator properly. -------- .. f:function:: extract_setting(keyword) + Query LAMMPS about global settings. See the documentation for the + :c:func:`lammps_extract_setting` function from the C library. + :p character(len=*) keyword: string containing the name of the thermo keyword :r integer(c_int): value of the queried setting or :math:`-1` if unknown + +-------- + +.. f:function:: extract_global(name, dtype) + + Overloaded function to get internal global LAMMPS data. Note that all + currently implemented global types only return scalars or strings; all + array-returning entities currently supported use :f:func:`extract_box`. + + Note that type/kind/rank of the *dtype* argument is used to determine + whether to return a type correspending to a C int, a C int64_t, or a + C double. The type/kind/rank signature of dtype is checked at runtime to + match that of the return value; this type of check cannot be performed at + compile time. For example, + + .. code-block:: fortran + + PROGRAM demo + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE LIBLAMMPS + TYPE(lammps) :: lmp + INTEGER(C_int) :: nlocal + INTEGER(C_int64_t) :: ntimestep + CHARACTER(LEN=10) :: units + REAL(C_double) :: dt + lmp = lammps() + ! other commands + nlocal = lmp%extract_global('nlocal', LMP_INT) + ntimestep = lmp%extract_global('ntimestep', LMP_INT64) + dt = lmp%extract_global('dt', LMP_DOUBLE) + units = lmp%extract_global('units', LMP_STRING) + ! more commands + lmp.close(.TRUE.) + END PROGRAM demo + + would extract the number of atoms on this processor, the current time step, + the size of the current time step, and the units being used into the + variables *nlocal*, *ntimestep*, *dt*, and *units*, respectively. + + *Note*: if this function returns a string, the string must have + length greater than or equal to the length of the string (not including the + terminal NULL character) that LAMMPS returns. If the variable's length is + too short, the string will be truncated. As usual in Fortran, strings + are padded with spaces at the end. + + :p character(len=*) name: string with the name of the extracted property + :p polymorphic dtype: one of *LMP_INT*, *LMP_INT64*, *LMP_DOUBLE*, or + *LMP_STRING* designating the type/kind/rank of the return value + :r polymorphic: value of the extracted property diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 0b4f8d4f4a..f7a58bc572 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -38,10 +38,10 @@ MODULE LIBLAMMPS ! These are public-interface constants that have the same purpose as the ! constants in library.h, except that their types match the type of the - ! constant in question. Their purpose is to determine the type of the + ! constant in question. Their purpose is to specify the type of the ! return value without something akin to a C/C++ type cast INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int - INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 1_c_int + INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 0_c_int INTEGER (c_int), PUBLIC, DIMENSION(3,3), PARAMETER :: LMP_INT_2D = 1_c_int REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double REAL (c_double), PUBLIC, DIMENSION(3), PARAMETER :: & @@ -59,6 +59,8 @@ MODULE LIBLAMMPS ! ! Must be kept in sync with the equivalent declarations in ! src/library.h and python/lammps/constants.py + ! + ! NOT part of the API (the part the user sees) INTEGER (c_int), PARAMETER :: & LAMMPS_INT = 0_c_int, & ! 32-bit integer (array) LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array @@ -84,8 +86,12 @@ MODULE LIBLAMMPS PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm PROCEDURE :: extract_setting => lmp_extract_setting PROCEDURE, PRIVATE :: lmp_extract_global_int - GENERIC :: extract_global => lmp_extract_global_int ! TODO - + PROCEDURE, PRIVATE :: lmp_extract_global_int64_t + PROCEDURE, PRIVATE :: lmp_extract_global_double + PROCEDURE, PRIVATE :: lmp_extract_global_str + GENERIC :: extract_global => lmp_extract_global_int, & + lmp_extract_global_int64_t, lmp_extract_global_double, & + lmp_extract_global_str PROCEDURE :: version => lmp_version END TYPE lammps @@ -207,6 +213,13 @@ MODULE LIBLAMMPS INTEGER (c_int) :: lammps_extract_global_datatype END FUNCTION lammps_extract_global_datatype + FUNCTION c_strlen (str) bind(C,name='strlen') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + TYPE(c_ptr) :: str + INTEGER(c_size_t) :: c_strlen + END FUNCTION c_strlen + FUNCTION lammps_extract_global(handle, name) BIND(C) IMPORT :: c_ptr TYPE(c_ptr), VALUE :: handle, name @@ -530,49 +543,94 @@ CONTAINS ! END FUNCTION lmp_extract_global_datatype ! equivalent functions to lammps_extract_global (overloaded) + ! This implementation assumes there are no non-scalar data that can be + ! extracted through lammps_extract_global FUNCTION lmp_extract_global_int (self, name, dtype) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: name - INTEGER(c_int) :: dtype + INTEGER(c_int), INTENT(IN) :: dtype INTEGER(c_int) :: lmp_extract_global_int TYPE(c_ptr) :: Cname, Cptr INTEGER(c_int) :: datatype INTEGER(c_int), POINTER :: ptr Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(Cname) + datatype = lammps_extract_global_datatype(c_null_ptr, Cname) IF ( datatype /= LAMMPS_INT ) THEN ! throw an exception or something; data type doesn't match! - WRITE(0,*) 'WARNING: global data type is inconsistent' + WRITE(0,*) 'WARNING: global data type is inconsistent (not an int)' END IF Cptr = lammps_extract_global(self%handle, Cname) CALL c_f_pointer(Cptr, ptr) lmp_extract_global_int = ptr CALL lammps_free(Cname) END FUNCTION lmp_extract_global_int - FUNCTION lmp_extract_global_int_1d (self, name, dtype) - ! This implementation assumes there are three elements to all arrays + FUNCTION lmp_extract_global_int64_t (self, name, dtype) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: name - INTEGER(c_int), DIMENSION(3) :: dtype - INTEGER(c_int) :: lmp_extract_global_int + INTEGER(c_int64_t), INTENT(IN) :: dtype + INTEGER(c_int64_t) :: lmp_extract_global_int64_t TYPE(c_ptr) :: Cname, Cptr INTEGER(c_int) :: datatype - INTEGER(c_int), DIMENSION(3), POINTER :: ptr + INTEGER(c_int64_t), POINTER :: ptr Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(Cname) - IF ( datatype /= LAMMPS_INT ) THEN + datatype = lammps_extract_global_datatype(c_null_ptr, Cname) + IF ( datatype /= LAMMPS_INT64 ) THEN ! throw an exception or something; data type doesn't match! + WRITE(0,*) 'WARNING: global data type is inconsistent (not an int64_t)' END IF Cptr = lammps_extract_global(self%handle, Cname) - CALL c_f_pointer(Cptr, ptr, shape(dtype)) - lmp_extract_global_int = ptr + CALL c_f_pointer(Cptr, ptr) + lmp_extract_global_int64_t = ptr CALL lammps_free(Cname) - END FUNCTION lmp_extract_global_int_1d - ! TODO need more generics here to match TKR of LMP_INT_1D, LMP_BIGINT, - ! LMP_DOUBLE, LMP_DOUBLE_1D, LMS_STRING [this assumes no one adds anything - ! requiring LMP_DOUBLE_2D and the like!] + END FUNCTION lmp_extract_global_int64_t + FUNCTION lmp_extract_global_double (self, name, dtype) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + REAL(c_double), INTENT(IN) :: dtype + REAL(c_double) :: lmp_extract_global_double + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: datatype + REAL(c_double), POINTER :: ptr + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(c_null_ptr, Cname) + IF ( datatype /= LAMMPS_DOUBLE ) THEN + ! throw an exception or something; data type doesn't match! + WRITE(0,*) 'WARNING: global data type is inconsistent (not a double)' + END IF + Cptr = lammps_extract_global(self%handle, Cname) + CALL c_f_pointer(Cptr, ptr) + lmp_extract_global_double = ptr + CALL lammps_free(Cname) + END FUNCTION lmp_extract_global_double + FUNCTION lmp_extract_global_str (self, name, dtype) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name, dtype + CHARACTER(LEN=:), ALLOCATABLE :: lmp_extract_global_str + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: datatype + CHARACTER(KIND=c_char,LEN=1), dimension(:), POINTER :: ptr + INTEGER(c_size_t) :: length + INTEGER :: i + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(c_null_ptr, Cname) + IF ( datatype /= LAMMPS_STRING ) THEN + ! throw an exception or something; data type doesn't match! + WRITE(0,*) 'WARNING: global data type is inconsistent (not a string)' + END IF + Cptr = lammps_extract_global(self%handle, Cname) + length = c_strlen(Cptr) + CALL c_f_pointer(Cptr, ptr, [length]) + ALLOCATE ( CHARACTER(LEN=length) :: lmp_extract_global_str ) + FORALL ( I=1:length ) + lmp_extract_global_str(i:i) = ptr(i) + END FORALL + CALL lammps_free(Cname) + ! the allocatable scalar (return value) gets auto-deallocated on return + END FUNCTION lmp_extract_global_str ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) From 4151a1af02f8c45abe083d96f7d523f55e23c217 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 11 Aug 2022 17:46:21 -0500 Subject: [PATCH 057/364] Lots of tinkering with extract_global; back to square 1 --- fortran/lammps.f90 | 326 +++++++++++++++++++++++++++++---------------- 1 file changed, 210 insertions(+), 116 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index f7a58bc572..affab1ef53 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -36,24 +36,24 @@ MODULE LIBLAMMPS PRIVATE PUBLIC :: lammps - ! These are public-interface constants that have the same purpose as the - ! constants in library.h, except that their types match the type of the - ! constant in question. Their purpose is to specify the type of the - ! return value without something akin to a C/C++ type cast - INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int - INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 0_c_int - INTEGER (c_int), PUBLIC, DIMENSION(3,3), PARAMETER :: LMP_INT_2D = 1_c_int - REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double - REAL (c_double), PUBLIC, DIMENSION(3), PARAMETER :: & - LMP_DOUBLE_1D = 2.0_c_double - REAL (c_double), PUBLIC, DIMENSION(3,3), PARAMETER :: & - LMP_DOUBLE_2D = 3.0_c_double - INTEGER (c_int64_t), PUBLIC, PARAMETER :: LMP_INT64 = 4_c_int64_t - INTEGER (c_int64_t), PUBLIC, DIMENSION(3), PARAMETER :: & - LMP_INT64_1D = 4_c_int64_t - INTEGER (c_int64_t), PUBLIC, DIMENSION(3,3), PARAMETER :: & - LMP_INT64_2D = 5_c_int64_t - CHARACTER(LEN=*), PUBLIC, PARAMETER :: LMP_STRING = 'six' +! ! These are public-interface constants that have the same purpose as the +! ! constants in library.h, except that their types match the type of the +! ! constant in question. Their purpose is to specify the type of the +! ! return value without something akin to a C/C++ type cast +! INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int +! INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 0_c_int +! INTEGER (c_int), PUBLIC, DIMENSION(3,3), PARAMETER :: LMP_INT_2D = 1_c_int +! REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double +! REAL (c_double), PUBLIC, DIMENSION(3), PARAMETER :: & +! LMP_DOUBLE_1D = 2.0_c_double +! REAL (c_double), PUBLIC, DIMENSION(3,3), PARAMETER :: & +! LMP_DOUBLE_2D = 3.0_c_double +! INTEGER (c_int64_t), PUBLIC, PARAMETER :: LMP_INT64 = 4_c_int64_t +! INTEGER (c_int64_t), PUBLIC, DIMENSION(3), PARAMETER :: & +! LMP_INT64_1D = 4_c_int64_t +! INTEGER (c_int64_t), PUBLIC, DIMENSION(3,3), PARAMETER :: & +! LMP_INT64_2D = 5_c_int64_t +! CHARACTER(LEN=*), PUBLIC, PARAMETER :: LMP_STRING = 'six' ! Data type constants for extracting data from global, atom, compute, and fix ! @@ -85,13 +85,17 @@ MODULE LIBLAMMPS PROCEDURE :: memory_usage => lmp_memory_usage PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm PROCEDURE :: extract_setting => lmp_extract_setting - PROCEDURE, PRIVATE :: lmp_extract_global_int - PROCEDURE, PRIVATE :: lmp_extract_global_int64_t - PROCEDURE, PRIVATE :: lmp_extract_global_double - PROCEDURE, PRIVATE :: lmp_extract_global_str - GENERIC :: extract_global => lmp_extract_global_int, & - lmp_extract_global_int64_t, lmp_extract_global_double, & - lmp_extract_global_str +! PROCEDURE :: extract_global => lmp_extract_global +! PROCEDURE, PRIVATE :: lmp_extract_global_int +! PROCEDURE, PRIVATE :: lmp_extract_global_int64_t +! PROCEDURE, PRIVATE :: lmp_extract_global_double +! PROCEDURE, PRIVATE :: lmp_extract_global_str +! GENERIC :: extract_global => lmp_extract_global_int, & +! lmp_extract_global_int64_t, lmp_extract_global_double, & +! lmp_extract_global_str +! PROCEDURE, PRIVATE :: lmp_extract_global_scalar +! !PROCEDURE, PRIVATE :: lmp_extract_global_string +! GENERIC :: extract_global => lmp_extract_global_scalar PROCEDURE :: version => lmp_version END TYPE lammps @@ -225,9 +229,6 @@ MODULE LIBLAMMPS TYPE(c_ptr), VALUE :: handle, name TYPE(c_ptr) :: lammps_extract_global END FUNCTION lammps_extract_global - !(generic) lammps_extract_global - ! TODO: You can fake out the type-casting by declaring non-optional - ! parameters that help the compiler figure out which one to call !INTEGER (c_int) FUNCTION lammps_extract_atom_datatype @@ -542,95 +543,186 @@ CONTAINS ! CALL lammps_free(Cname) ! END FUNCTION lmp_extract_global_datatype - ! equivalent functions to lammps_extract_global (overloaded) - ! This implementation assumes there are no non-scalar data that can be - ! extracted through lammps_extract_global - FUNCTION lmp_extract_global_int (self, name, dtype) - CLASS(lammps), INTENT(IN) :: self - CHARACTER(LEN=*), INTENT(IN) :: name - INTEGER(c_int), INTENT(IN) :: dtype - INTEGER(c_int) :: lmp_extract_global_int - TYPE(c_ptr) :: Cname, Cptr - INTEGER(c_int) :: datatype - INTEGER(c_int), POINTER :: ptr + ! equivalent function to lammps_extract_global + ! the return value should be automatically returned and assigned correctly + ! based on the information available from LAMMPS +! SUBROUTINE lmp_extract_global_scalar (self, global_data, name) +! CLASS(lammps), INTENT(IN) :: self +! CLASS(*), INTENT(OUT), POINTER :: global_data +! CHARACTER(LEN=*), INTENT(IN) :: name +! INTEGER(c_int) :: datatype +! TYPE(c_ptr) :: Cname, Cptr +! INTEGER(c_size_t) :: length, i +! CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Fptr +! +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(self%handle, Cname) +! ! above could be c_null_ptr in place of self%handle...doesn't matter +! Cptr = lammps_extract_global(self%handle, Cname) +! SELECT CASE (datatype) +! CASE (LAMMPS_INT) +! SELECT TYPE (global_data) +! TYPE IS (INTEGER(c_int)) +! CALL C_F_POINTER(Cptr, global_data) +! CLASS DEFAULT +! ! FIXME +! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' +! STOP +! END SELECT +! CASE (LAMMPS_INT64) +! SELECT TYPE (global_data) +! TYPE IS (INTEGER(c_int64_t)) +! CALL C_F_POINTER(Cptr, global_data) +! CLASS DEFAULT +! ! FIXME +! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' +! STOP +! END SELECT +! CASE (LAMMPS_DOUBLE) +! SELECT TYPE (global_data) +! TYPE IS (REAL(c_double)) +! CALL C_F_POINTER(Cptr, global_data) +! CLASS DEFAULT +! ! FIXME +! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' +! STOP +! END SELECT +! CASE (LAMMPS_STRING) +! SELECT TYPE (global_data) +! TYPE IS (CHARACTER(LEN=*)) +! length = c_strlen(Cptr) +! CALL C_F_POINTER(Cptr, Fptr, [length]) +! IF ( length < len(global_data) ) length = len(global_data) +! FORALL ( i = 1:length ) +! global_data(i:i) = Fptr(i) +! END FORALL +! END SELECT +! CASE DEFAULT +! ! FIXME +! WRITE (0,'(A,1X,I0,1X,A)') 'ERROR: Unknown type', datatype, & +! 'returned from extract_global_datatype' +! STOP +! END SELECT +! CALL lammps_free(Cname) +! END SUBROUTINE lmp_extract_global_scalar +! +! SUBROUTINE lmp_extract_global_string (self, global_data, name) +! CLASS(lammps), INTENT(IN) :: self +! CHARACTER(LEN=*), INTENT(OUT) :: global_data +! CHARACTER(LEN=*), INTENT(IN) :: name +! INTEGER(c_int) :: datatype +! TYPE(c_ptr) :: Cname, Cptr +! CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Fptr +! INTEGER(c_size_t) :: length +! INTEGER :: i +! +! global_data = '' +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(self%handle, Cname) +! IF ( datatype /= LAMMPS_STRING ) THEN +! ! FIXME +! WRITE (0,'(A)') 'ERROR: Cannot assign string to non-string variable.' +! STOP +! END IF +! Cptr = lammps_extract_global(self%handle, Cname) +! length = c_strlen(Cptr) +! CALL C_F_POINTER(Cptr, Fptr, [length]) +! IF ( length < len(global_data) ) length = len(global_data) +! FORALL ( i = 1:length ) +! global_data(i:i) = Fptr(i) +! END FORALL +! CALL lammps_free(Cname) +! END SUBROUTINE lmp_extract_global_string - Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(c_null_ptr, Cname) - IF ( datatype /= LAMMPS_INT ) THEN - ! throw an exception or something; data type doesn't match! - WRITE(0,*) 'WARNING: global data type is inconsistent (not an int)' - END IF - Cptr = lammps_extract_global(self%handle, Cname) - CALL c_f_pointer(Cptr, ptr) - lmp_extract_global_int = ptr - CALL lammps_free(Cname) - END FUNCTION lmp_extract_global_int - FUNCTION lmp_extract_global_int64_t (self, name, dtype) - CLASS(lammps), INTENT(IN) :: self - CHARACTER(LEN=*), INTENT(IN) :: name - INTEGER(c_int64_t), INTENT(IN) :: dtype - INTEGER(c_int64_t) :: lmp_extract_global_int64_t - TYPE(c_ptr) :: Cname, Cptr - INTEGER(c_int) :: datatype - INTEGER(c_int64_t), POINTER :: ptr - - Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(c_null_ptr, Cname) - IF ( datatype /= LAMMPS_INT64 ) THEN - ! throw an exception or something; data type doesn't match! - WRITE(0,*) 'WARNING: global data type is inconsistent (not an int64_t)' - END IF - Cptr = lammps_extract_global(self%handle, Cname) - CALL c_f_pointer(Cptr, ptr) - lmp_extract_global_int64_t = ptr - CALL lammps_free(Cname) - END FUNCTION lmp_extract_global_int64_t - FUNCTION lmp_extract_global_double (self, name, dtype) - CLASS(lammps), INTENT(IN) :: self - CHARACTER(LEN=*), INTENT(IN) :: name - REAL(c_double), INTENT(IN) :: dtype - REAL(c_double) :: lmp_extract_global_double - TYPE(c_ptr) :: Cname, Cptr - INTEGER(c_int) :: datatype - REAL(c_double), POINTER :: ptr - - Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(c_null_ptr, Cname) - IF ( datatype /= LAMMPS_DOUBLE ) THEN - ! throw an exception or something; data type doesn't match! - WRITE(0,*) 'WARNING: global data type is inconsistent (not a double)' - END IF - Cptr = lammps_extract_global(self%handle, Cname) - CALL c_f_pointer(Cptr, ptr) - lmp_extract_global_double = ptr - CALL lammps_free(Cname) - END FUNCTION lmp_extract_global_double - FUNCTION lmp_extract_global_str (self, name, dtype) - CLASS(lammps), INTENT(IN) :: self - CHARACTER(LEN=*), INTENT(IN) :: name, dtype - CHARACTER(LEN=:), ALLOCATABLE :: lmp_extract_global_str - TYPE(c_ptr) :: Cname, Cptr - INTEGER(c_int) :: datatype - CHARACTER(KIND=c_char,LEN=1), dimension(:), POINTER :: ptr - INTEGER(c_size_t) :: length - INTEGER :: i - - Cname = f2c_string(name) - datatype = lammps_extract_global_datatype(c_null_ptr, Cname) - IF ( datatype /= LAMMPS_STRING ) THEN - ! throw an exception or something; data type doesn't match! - WRITE(0,*) 'WARNING: global data type is inconsistent (not a string)' - END IF - Cptr = lammps_extract_global(self%handle, Cname) - length = c_strlen(Cptr) - CALL c_f_pointer(Cptr, ptr, [length]) - ALLOCATE ( CHARACTER(LEN=length) :: lmp_extract_global_str ) - FORALL ( I=1:length ) - lmp_extract_global_str(i:i) = ptr(i) - END FORALL - CALL lammps_free(Cname) - ! the allocatable scalar (return value) gets auto-deallocated on return - END FUNCTION lmp_extract_global_str +! ! equivalent functions to lammps_extract_global (overloaded) +! ! This implementation assumes there are no non-scalar data that can be +! ! extracted through lammps_extract_global +! FUNCTION lmp_extract_global_int (self, name, dtype) +! CLASS(lammps), INTENT(IN) :: self +! CHARACTER(LEN=*), INTENT(IN) :: name +! INTEGER(c_int), INTENT(IN) :: dtype +! INTEGER(c_int) :: lmp_extract_global_int +! TYPE(c_ptr) :: Cname, Cptr +! INTEGER(c_int) :: datatype +! INTEGER(c_int), POINTER :: ptr +! +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) +! IF ( datatype /= LAMMPS_INT ) THEN +! ! throw an exception or something; data type doesn't match! +! WRITE(0,*) 'WARNING: global data type is inconsistent (not an int)' +! END IF +! Cptr = lammps_extract_global(self%handle, Cname) +! CALL C_F_POINTER(Cptr, ptr) +! lmp_extract_global_int = ptr +! CALL lammps_free(Cname) +! END FUNCTION lmp_extract_global_int +! FUNCTION lmp_extract_global_int64_t (self, name, dtype) +! CLASS(lammps), INTENT(IN) :: self +! CHARACTER(LEN=*), INTENT(IN) :: name +! INTEGER(c_int64_t), INTENT(IN) :: dtype +! INTEGER(c_int64_t) :: lmp_extract_global_int64_t +! TYPE(c_ptr) :: Cname, Cptr +! INTEGER(c_int) :: datatype +! INTEGER(c_int64_t), POINTER :: ptr +! +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) +! IF ( datatype /= LAMMPS_INT64 ) THEN +! ! throw an exception or something; data type doesn't match! +! WRITE(0,*) 'WARNING: global data type is inconsistent (not an int64_t)' +! END IF +! Cptr = lammps_extract_global(self%handle, Cname) +! CALL C_F_POINTER(Cptr, ptr) +! lmp_extract_global_int64_t = ptr +! CALL lammps_free(Cname) +! END FUNCTION lmp_extract_global_int64_t +! FUNCTION lmp_extract_global_double (self, name, dtype) +! CLASS(lammps), INTENT(IN) :: self +! CHARACTER(LEN=*), INTENT(IN) :: name +! REAL(c_double), INTENT(IN) :: dtype +! REAL(c_double) :: lmp_extract_global_double +! TYPE(c_ptr) :: Cname, Cptr +! INTEGER(c_int) :: datatype +! REAL(c_double), POINTER :: ptr +! +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) +! IF ( datatype /= LAMMPS_DOUBLE ) THEN +! ! throw an exception or something; data type doesn't match! +! WRITE(0,*) 'WARNING: global data type is inconsistent (not a double)' +! END IF +! Cptr = lammps_extract_global(self%handle, Cname) +! CALL C_F_POINTER(Cptr, ptr) +! lmp_extract_global_double = ptr +! CALL lammps_free(Cname) +! END FUNCTION lmp_extract_global_double +! FUNCTION lmp_extract_global_str (self, name, dtype) +! CLASS(lammps), INTENT(IN) :: self +! CHARACTER(LEN=*), INTENT(IN) :: name, dtype +! CHARACTER(LEN=:), ALLOCATABLE :: lmp_extract_global_str +! TYPE(c_ptr) :: Cname, Cptr +! INTEGER(c_int) :: datatype +! CHARACTER(KIND=c_char,LEN=1), dimension(:), POINTER :: ptr +! INTEGER(c_size_t) :: length +! INTEGER :: i +! +! Cname = f2c_string(name) +! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) +! IF ( datatype /= LAMMPS_STRING ) THEN +! ! throw an exception or something; data type doesn't match! +! WRITE(0,*) 'WARNING: global data type is inconsistent (not a string)' +! END IF +! Cptr = lammps_extract_global(self%handle, Cname) +! length = c_strlen(Cptr) +! CALL C_F_POINTER(Cptr, ptr, [length]) +! ALLOCATE ( CHARACTER(LEN=length) :: lmp_extract_global_str ) +! FORALL ( I=1:length ) +! lmp_extract_global_str(i:i) = ptr(i) +! END FORALL +! CALL lammps_free(Cname) +! ! the allocatable scalar (return value) gets auto-deallocated on return +! END FUNCTION lmp_extract_global_str ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) @@ -659,3 +751,5 @@ CONTAINS c_string(n+1) = c_null_char END FUNCTION f2c_string END MODULE LIBLAMMPS + +! vim: ts=2 sts=2 sw=2 et From 88a3a3864076be17891995dc299d8e4004744da0 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 00:04:25 -0500 Subject: [PATCH 058/364] I think I finally fixed extract_global; we'll check it in the morning --- doc/src/Fortran.rst | 79 +++++++---------- fortran/lammps.f90 | 203 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 198 insertions(+), 84 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 4e093dc49b..9fa91a9dd8 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -229,37 +229,6 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. lmp = lammps(MPI_COMM_SELF%MPI_VAL) END PROGRAM testmpi -Constants Defined by the API -============================ - -The following constants are declared by the Fortran API to resolve the -type/kind/rank signature for return values. These serve the same role as -``LAMMPS_INT``, ``LAMMPS_DOUBLE``, and similar constants in ``src/library.h`` -and those in ``python/lammps/constants.py`` for the C and Python APIs, -respectively. Unlike their C and Python bretheren, however, it is the type -(e.g., ``INTEGER``), kind (e.g., ``C_int``), and rank (e.g., ``DIMENSION(:)``) -of these constants that is used by the calling routine, rather than their -numerical values. - -:f:LMP_INT: 32-bit integer scalars -:f:LMP_INT_1D: 32-bit integer vectors -:f:LMP_INT_2D: 32-bit integer matrices -:f:LMP_DOUBLE: 64-bit real scalars -:f:LMP_DOUBLE_1D: 64-bit real vectors -:f:LMP_DOUBLE_2D: 64-bit real matrices -:f:LMP_INT64: 64-bit integer scalars -:f:LMP_INT64_1D: 64-bit integer vectors -:f:LMP_INT64_2D: 64-bit integer matrices - -.. admonition:: Interaction with LAMMPS_BIGBIG and such - - LAMMPS uses different-sized integers to store various entities, such as - the number of timesteps or the total number of atoms, depending on certain - compiler flags (see the :doc:`size limits ` - documentation). This API is currently agnostic to these settings, and it - is up to the user to know the size of LAMMPS_BIGINT and such and pass - LMP_INT or LMP_INT64, as appropriate, for such entities. - Procedures Bound to the lammps Derived Type =========================================== @@ -429,17 +398,19 @@ Procedures Bound to the lammps Derived Type -------- -.. f:function:: extract_global(name, dtype) +.. f:function:: extract_global(name) - Overloaded function to get internal global LAMMPS data. Note that all - currently implemented global types only return scalars or strings; all - array-returning entities currently supported use :f:func:`extract_box`. + Function to get internal global LAMMPS data. - Note that type/kind/rank of the *dtype* argument is used to determine - whether to return a type correspending to a C int, a C int64_t, or a - C double. The type/kind/rank signature of dtype is checked at runtime to - match that of the return value; this type of check cannot be performed at - compile time. For example, + Note that this function actually does not return a value, but rather + associates the the pointer on the left-hand side of the assignment to point + to internal LAMMPS data (with the exception of string data, which are + copied returned as ordinary Fortran strings). Pointers must be of the + correct data type to point to said data (typically INTEGER(c_int), + INTEGER(c_int64_t), or REAL(c_double)) and have appropriate rank. + The pointer being associated with LAMMPS data is type- and rank-checked at + run-time. + want via an overloaded assignment operator. For example, .. code-block:: fortran @@ -447,16 +418,16 @@ Procedures Bound to the lammps Derived Type USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t USE LIBLAMMPS TYPE(lammps) :: lmp - INTEGER(C_int) :: nlocal - INTEGER(C_int64_t) :: ntimestep + INTEGER(C_int), POINTER :: nlocal + INTEGER(C_int64_t), POINTER :: ntimestep CHARACTER(LEN=10) :: units - REAL(C_double) :: dt + REAL(C_double), POINTER :: dt lmp = lammps() ! other commands - nlocal = lmp%extract_global('nlocal', LMP_INT) - ntimestep = lmp%extract_global('ntimestep', LMP_INT64) - dt = lmp%extract_global('dt', LMP_DOUBLE) - units = lmp%extract_global('units', LMP_STRING) + nlocal = lmp%extract_global('nlocal') + ntimestep = lmp%extract_global('ntimestep') + dt = lmp%extract_global('dt') + units = lmp%extract_global('units') ! more commands lmp.close(.TRUE.) END PROGRAM demo @@ -472,6 +443,14 @@ Procedures Bound to the lammps Derived Type are padded with spaces at the end. :p character(len=*) name: string with the name of the extracted property - :p polymorphic dtype: one of *LMP_INT*, *LMP_INT64*, *LMP_DOUBLE*, or - *LMP_STRING* designating the type/kind/rank of the return value - :r polymorphic: value of the extracted property + :r polymorphic: the left-hand side of the assignment should be either a + string (if expecting string data) or a C-interoperable pointer to the + extracted property. If expecting vector data, the pointer should have + dimension ":". + +.. note:: + + Functions such as extract_global and extract_atom actually return a + derived type, and an overloaded operator tells the compiler how to pull the + data out of that derived type when the assignment is made. The user need + not worry about these implementation details. diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index affab1ef53..312d6b7b1f 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -31,29 +31,11 @@ MODULE LIBLAMMPS USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_loc, & c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, c_f_pointer + USE, INTRINSIC :: ISO_Fortran_env, ONLY : ERROR_UNIT, OUTPUT_UNIT ! FIXME IMPLICIT NONE PRIVATE - PUBLIC :: lammps - -! ! These are public-interface constants that have the same purpose as the -! ! constants in library.h, except that their types match the type of the -! ! constant in question. Their purpose is to specify the type of the -! ! return value without something akin to a C/C++ type cast -! INTEGER (c_int), PUBLIC, PARAMETER :: LMP_INT = 0_c_int -! INTEGER (c_int), PUBLIC, DIMENSION(3), PARAMETER :: LMP_INT_1D = 0_c_int -! INTEGER (c_int), PUBLIC, DIMENSION(3,3), PARAMETER :: LMP_INT_2D = 1_c_int -! REAL (c_double), PUBLIC, PARAMETER :: LMP_DOUBLE = 2.0_c_double -! REAL (c_double), PUBLIC, DIMENSION(3), PARAMETER :: & -! LMP_DOUBLE_1D = 2.0_c_double -! REAL (c_double), PUBLIC, DIMENSION(3,3), PARAMETER :: & -! LMP_DOUBLE_2D = 3.0_c_double -! INTEGER (c_int64_t), PUBLIC, PARAMETER :: LMP_INT64 = 4_c_int64_t -! INTEGER (c_int64_t), PUBLIC, DIMENSION(3), PARAMETER :: & -! LMP_INT64_1D = 4_c_int64_t -! INTEGER (c_int64_t), PUBLIC, DIMENSION(3,3), PARAMETER :: & -! LMP_INT64_2D = 5_c_int64_t -! CHARACTER(LEN=*), PUBLIC, PARAMETER :: LMP_STRING = 'six' + PUBLIC :: lammps, ASSIGNMENT(=) ! Data type constants for extracting data from global, atom, compute, and fix ! @@ -62,7 +44,7 @@ MODULE LIBLAMMPS ! ! NOT part of the API (the part the user sees) INTEGER (c_int), PARAMETER :: & - LAMMPS_INT = 0_c_int, & ! 32-bit integer (array) + LAMMPS_INT = 0, & ! 32-bit integer (array) LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array LAMMPS_DOUBLE = 2, & ! 64-bit double (array) LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array @@ -85,17 +67,7 @@ MODULE LIBLAMMPS PROCEDURE :: memory_usage => lmp_memory_usage PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm PROCEDURE :: extract_setting => lmp_extract_setting -! PROCEDURE :: extract_global => lmp_extract_global -! PROCEDURE, PRIVATE :: lmp_extract_global_int -! PROCEDURE, PRIVATE :: lmp_extract_global_int64_t -! PROCEDURE, PRIVATE :: lmp_extract_global_double -! PROCEDURE, PRIVATE :: lmp_extract_global_str -! GENERIC :: extract_global => lmp_extract_global_int, & -! lmp_extract_global_int64_t, lmp_extract_global_double, & -! lmp_extract_global_str -! PROCEDURE, PRIVATE :: lmp_extract_global_scalar -! !PROCEDURE, PRIVATE :: lmp_extract_global_string -! GENERIC :: extract_global => lmp_extract_global_scalar + PROCEDURE :: extract_global => lmp_extract_global PROCEDURE :: version => lmp_version END TYPE lammps @@ -103,6 +75,33 @@ MODULE LIBLAMMPS MODULE PROCEDURE lmp_open END INTERFACE lammps + ! Constants to use in working with lammps_data + ENUM, BIND(C) + ENUMERATOR :: DATA_INT, DATA_INT_1D, DATA_INT_2D + ENUMERATOR :: DATA_INT64, DATA_INT64_1D, DATA_INT64_2D + ENUMERATOR :: DATA_DOUBLE, DATA_DOUBLE_1D, DATA_DOUBLE_2D + ENUMERATOR :: DATA_STRING + END ENUM + ! Derived type for receiving LAMMPS data (in lieu of the ability to type cast + ! pointers) + + TYPE lammps_data + INTEGER(c_int) :: datatype + INTEGER(c_int), POINTER :: i32 + INTEGER(c_int), DIMENSION(:), POINTER :: i32_vec + INTEGER(c_int64_t), POINTER :: i64 + INTEGER(c_int64_t), DIMENSION(:), POINTER :: i64_vec + REAL(c_double), POINTER :: r64 + REAL(c_double), DIMENSION(:), POINTER :: r64_vec + CHARACTER(LEN=:), ALLOCATABLE :: str + END TYPE lammps_data + + INTERFACE ASSIGNMENT(=) + MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & + assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & + assign_string_to_lammps_data + END INTERFACE + ! interface definitions for calling functions in library.cpp INTERFACE FUNCTION lammps_open(argc, argv, comm) BIND(C, name='lammps_open_fortran') @@ -543,6 +542,78 @@ CONTAINS ! CALL lammps_free(Cname) ! END FUNCTION lmp_extract_global_datatype + ! equivalent function to lammps_extract_global + ! the assignment is actually overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_global (self, name) result(global_data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + TYPE(lammps_data) :: global_data + + INTEGER(c_int) :: datatype + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_size_t) :: length, i + CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Fptr + + ! Determine vector length + ! FIXME Is there a way to get the length of the vector from C rather + ! than defining it here AND in the Python API? + SELECT CASE (name) + CASE ('boxlo','boxhi','sublo','subhi','sublo_lambda','subhi_lambda', & + 'periodicity') + length = 3 + CASE DEFAULT + length = 1 + ! string cases are overridden later + END SELECT + + Cname = f2c_string(name) + datatype = lammps_extract_global_datatype(self%handle, Cname) + ! above could be c_null_ptr in place of self%handle...doesn't matter + Cptr = lammps_extract_global(self%handle, Cname) + CALL lammps_free(Cname) + + SELECT CASE (datatype) + CASE (LAMMPS_INT) + IF ( length == 1 ) THEN + global_data%datatype = DATA_INT + CALL C_F_POINTER(Cptr, global_data%i32) + ELSE + global_data%datatype = DATA_INT_1D + CALL C_F_POINTER(Cptr, global_data%i32_vec, [length]) + END IF + CASE (LAMMPS_INT64) + IF ( length == 1 ) THEN + global_data%datatype = DATA_INT64 + CALL C_F_POINTER(Cptr, global_data%i64) + ELSE + global_data%datatype = DATA_INT64_1D + CALL C_F_POINTER(Cptr, global_data%i64_vec, [length]) + END IF + CASE (LAMMPS_DOUBLE) + IF ( length == 1 ) THEN + global_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, global_data%r64) + ELSE + global_data%datatype = DATA_DOUBLE_1D + CALL C_F_POINTER(Cptr, global_data%r64_vec, [length]) + END IF + CASE (LAMMPS_STRING) + global_data%datatype = DATA_STRING + length = c_strlen(Cptr) + CALL C_F_POINTER(Cptr, Fptr, [length]) + ALLOCATE ( CHARACTER(LEN=length) :: global_data%str ) + FORALL ( I=1:length ) + global_data%str(i:i) = Fptr(i) + END FORALL + CASE DEFAULT + WRITE(ERROR_UNIT,'(A)') 'ERROR: Unknown pointer type in& + & extract_global' + STOP + END SELECT + + END FUNCTION + ! equivalent function to lammps_extract_global ! the return value should be automatically returned and assigned correctly ! based on the information available from LAMMPS @@ -732,13 +803,77 @@ CONTAINS lmp_version = lammps_version(self%handle) END FUNCTION lmp_version + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_int_to_lammps_data (lhs, rhs) + INTEGER(c_int), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_INT ) THEN + lhs => rhs%i32 + ELSE + WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' + STOP + END IF + END SUBROUTINE assign_int_to_lammps_data + + SUBROUTINE assign_int64_to_lammps_data (lhs, rhs) + INTEGER(c_int64_t), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_INT64 ) THEN + lhs => rhs%i64 + ELSE + WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' + STOP + END IF + END SUBROUTINE assign_int64_to_lammps_data + + SUBROUTINE assign_double_to_lammps_data (lhs, rhs) + REAL(c_double), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE ) THEN + lhs => rhs%r64 + ELSE + WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' + STOP + END IF + END SUBROUTINE assign_double_to_lammps_data + + SUBROUTINE assign_doublevec_to_lammps_data (lhs, rhs) + REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + lhs => rhs%r64_vec + ELSE + WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' + STOP + END IF + END SUBROUTINE assign_doublevec_to_lammps_data + + SUBROUTINE assign_string_to_lammps_data (lhs, rhs) + CHARACTER(LEN=*), INTENT(OUT) :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_STRING ) THEN + lhs = rhs%str + ELSE + WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' + STOP + END IF + END SUBROUTINE assign_string_to_lammps_data + + ! ---------------------------------------------------------------------- ! local helper functions ! copy fortran string to zero terminated c string ! ---------------------------------------------------------------------- FUNCTION f2c_string(f_string) RESULT(ptr) - CHARACTER (LEN=*), INTENT(IN) :: f_string - CHARACTER (LEN=1, KIND=c_char), POINTER :: c_string(:) + CHARACTER(LEN=*), INTENT(IN) :: f_string + CHARACTER(LEN=1, KIND=c_char), POINTER :: c_string(:) TYPE(c_ptr) :: ptr INTEGER(c_size_t) :: i, n From 9b0c2d82c39810bf8a9898092176868495429169 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 08:23:20 -0500 Subject: [PATCH 059/364] Missing comma --- doc/src/Fortran.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 9fa91a9dd8..49bc3c803b 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -49,7 +49,7 @@ found together with equivalent examples in C and C++ in the Creating or deleting a LAMMPS object ************************************ -With the Fortran interface the creation of a :cpp:class:`LAMMPS +With the Fortran interface, the creation of a :cpp:class:`LAMMPS ` instance is included in the constructor for creating the :f:func:`lammps` derived type. To import the definition of that type and its type bound procedures you need to add a ``USE From 9d89bc8f8260ae335b37c75361f1d3d864977683 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 09:40:29 -0500 Subject: [PATCH 060/364] Typo fixes/etc. in documentation --- doc/src/Fortran.rst | 81 ++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 49bc3c803b..84d8e46576 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -120,9 +120,9 @@ Executing LAMMPS commands ========================= Once a LAMMPS instance is created, it is possible to "drive" the LAMMPS -simulation by telling LAMMPS to read commands from a file, or pass +simulation by telling LAMMPS to read commands from a file or to pass individual or multiple commands from strings or lists of strings. This -is done similar to how it is implemented in the `C-library +is done similarly to how it is implemented in the `C-library ` interface. Before handing off the calls to the C-library interface, the corresponding Fortran versions of the calls (:f:func:`file`, :f:func:`command`, :f:func:`commands_list`, and @@ -178,23 +178,23 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. class instance that any of the included calls are forwarded to. :f c_ptr handle: reference to the LAMMPS class - :f close: :f:func:`close` - :f version: :f:func:`version` - :f file: :f:func:`file` - :f command: :f:func:`command` - :f commands_list: :f:func:`commands_list` - :f commands_string: :f:func:`commands_string` - :f get_natoms: :f:func:`get_natoms` - :f get_thermo: :f:func:`get_thermo` - :f extract_box: :f:func:`extract_box` - :f reset_box: :f:func:`reset_box` - :f memory_usage: :f:func:`memory_usage` - :f extract_setting: :f:func:`extract_setting` - :f extract_global: :f:func:`extract_global` + :f subroutine close: :f:func:`close` + :f function version: :f:func:`version` + :f subroutine file: :f:func:`file` + :f subroutine command: :f:func:`command` + :f subroutine commands_list: :f:func:`commands_list` + :f subroutine commands_string: :f:func:`commands_string` + :f function get_natoms: :f:func:`get_natoms` + :f function get_thermo: :f:func:`get_thermo` + :f subroutine extract_box: :f:func:`extract_box` + :f subroutine reset_box: :f:func:`reset_box` + :f subroutine memory_usage: :f:func:`memory_usage` + :f function extract_setting: :f:func:`extract_setting` + :f function extract_global: :f:func:`extract_global` -------- -.. f:function:: lammps(args[,comm]) +.. f:function:: lammps([args][,comm]) This is the constructor for the Fortran class and will forward the arguments to a call to either :cpp:func:`lammps_open_fortran` @@ -207,7 +207,7 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. If *comm* is not provided, ``MPI_COMM_WORLD`` is assumed. For more details please see the documentation of :cpp:func:`lammps_open`. - :p character(len=*) args(*) [optional]: arguments as list of strings + :o character(len=*) args(*) [optional]: arguments as list of strings :o integer comm [optional]: MPI communicator :r lammps: an instance of the :f:type:`lammps` derived type @@ -306,26 +306,40 @@ Procedures Bound to the lammps Derived Type -------- -.. f:subroutine:: extract_box(boxlo, boxhi, xy, yz, xz, pflags, boxflag) +.. f:subroutine:: extract_box([boxlo][, boxhi][, xy][, yz][, xz][, pflag]s[, boxflag]) This subroutine will call :cpp:func:`lammps_extract_box`. All parameters are optional, though obviously at least one should be present. The parameters *pflags* and *boxflag* are stored in LAMMPS as integers, but should be declared as ``LOGICAL`` variables when calling from Fortran. - :p real(c_double) boxlo [dimension(3),optional]: vector in which to store + :o real(c_double) boxlo [dimension(3),optional]: vector in which to store lower-bounds of simulation box - :p real(c_double) boxhi [dimension(3),optional]: vector in which to store + :o real(c_double) boxhi [dimension(3),optional]: vector in which to store upper-bounds of simulation box - :p real(c_double) xy [optional]: variable in which to store *xy* tilt factor - :p real(c_double) yz [optional]: variable in which to store *yz* tilt factor - :p real(c_double) xz [optional]: variable in which to store *xz* tilt factor - :p logical pflags [dimension(3),optional]: vector in which to store + :o real(c_double) xy [optional]: variable in which to store *xy* tilt factor + :o real(c_double) yz [optional]: variable in which to store *yz* tilt factor + :o real(c_double) xz [optional]: variable in which to store *xz* tilt factor + :o logical pflags [dimension(3),optional]: vector in which to store periodicity flags (``.TRUE.`` means periodic in that dimension) - :p logical boxflag [optional]: variable in which to store boolean denoting + :o logical boxflag [optional]: variable in which to store boolean denoting whether the box will change during a simulation (``.TRUE.`` means box will change) +.. note:: + + Note that a frequent use case of this function is to extract only one or + more of the options rather than all seven. For example, assuming "lmp" + represents a properly-initalized LAMMPS instance, the following code will + extract the periodic box settings into the variable "periodic": + + .. code-block:: Fortran + + ! code to start up + logical :: periodic(3) + ! code to initialize LAMMPS / run things / etc. + call lmp%extract_box(pflags = periodic) + -------- .. f:subroutine:: reset_box(boxlo, boxhi, xy, yz, xz) @@ -409,8 +423,7 @@ Procedures Bound to the lammps Derived Type correct data type to point to said data (typically INTEGER(c_int), INTEGER(c_int64_t), or REAL(c_double)) and have appropriate rank. The pointer being associated with LAMMPS data is type- and rank-checked at - run-time. - want via an overloaded assignment operator. For example, + run-time want via an overloaded assignment operator. For example, .. code-block:: fortran @@ -443,14 +456,14 @@ Procedures Bound to the lammps Derived Type are padded with spaces at the end. :p character(len=*) name: string with the name of the extracted property - :r polymorphic: the left-hand side of the assignment should be either a - string (if expecting string data) or a C-interoperable pointer to the - extracted property. If expecting vector data, the pointer should have - dimension ":". + :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment + should be either a string (if expecting string data) or a C-interoperable + pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted + property. If expecting vector data, the pointer should have dimension ":". .. note:: Functions such as extract_global and extract_atom actually return a - derived type, and an overloaded operator tells the compiler how to pull the - data out of that derived type when the assignment is made. The user need - not worry about these implementation details. + derived type, and an overloaded operator tells the compiler how to + associate the pointer with the relevant data when the assignment is made. + The user need not worry about these implementation details. From 05be7fe8cadf375d092f690ff6bb9bee1e57b793 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 11:33:28 -0500 Subject: [PATCH 061/364] Possibly-read-for-inclusion version of extract_global and associated documentation --- doc/src/Fortran.rst | 32 ++++--- fortran/lammps.f90 | 206 ++++---------------------------------------- src/library.cpp | 4 +- 3 files changed, 39 insertions(+), 203 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 84d8e46576..d3b68a3570 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -414,16 +414,24 @@ Procedures Bound to the lammps Derived Type .. f:function:: extract_global(name) - Function to get internal global LAMMPS data. + This function calls :c:func:`lammps_extract_global` and returns either a + string or a pointer to internal global LAMMPS data, depending on the data + requested through *name*. Note that this function actually does not return a value, but rather - associates the the pointer on the left-hand side of the assignment to point + associates the pointer on the left side of the assignment to point to internal LAMMPS data (with the exception of string data, which are - copied returned as ordinary Fortran strings). Pointers must be of the + copied and returned as ordinary Fortran strings). Pointers must be of the correct data type to point to said data (typically INTEGER(c_int), - INTEGER(c_int64_t), or REAL(c_double)) and have appropriate rank. - The pointer being associated with LAMMPS data is type- and rank-checked at - run-time want via an overloaded assignment operator. For example, + INTEGER(c_int64_t), or REAL(c_double)) and have compatible kind and rank. + The pointer being associated with LAMMPS data is type-, kind-, and + rank-checked at run-time via an overloaded assignment operator. + The pointers returned by this function are generally persistent; therefore + it is not necessary to call the function again, unless a :doc:`clear` + command has been issued, which wipes out and recreates the contents of + the :cpp:class:`LAMMPS ` class. + + For example, .. code-block:: fortran @@ -461,9 +469,11 @@ Procedures Bound to the lammps Derived Type pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted property. If expecting vector data, the pointer should have dimension ":". -.. note:: + .. warning:: - Functions such as extract_global and extract_atom actually return a - derived type, and an overloaded operator tells the compiler how to - associate the pointer with the relevant data when the assignment is made. - The user need not worry about these implementation details. + Modifying the data in the location pointed to by the returned pointer + may lead to inconsistent internal data and thus may cause failures or + crashes or bogus simulations. In general it is thus usually better + to use a LAMMPS input command that sets or changes these parameters. + Those will take care of all side effects and necessary updates of + settings derived from such settings. diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 312d6b7b1f..459eedb830 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -72,7 +72,7 @@ MODULE LIBLAMMPS END TYPE lammps INTERFACE lammps - MODULE PROCEDURE lmp_open + MODULE PROCEDURE lmp_open END INTERFACE lammps ! Constants to use in working with lammps_data @@ -82,9 +82,9 @@ MODULE LIBLAMMPS ENUMERATOR :: DATA_DOUBLE, DATA_DOUBLE_1D, DATA_DOUBLE_2D ENUMERATOR :: DATA_STRING END ENUM + ! Derived type for receiving LAMMPS data (in lieu of the ability to type cast ! pointers) - TYPE lammps_data INTEGER(c_int) :: datatype INTEGER(c_int), POINTER :: i32 @@ -96,6 +96,12 @@ MODULE LIBLAMMPS CHARACTER(LEN=:), ALLOCATABLE :: str END TYPE lammps_data + ! This overloads the assignment operator (=) so that assignments of the + ! form + ! nlocal = extract_global('nlocal') + ! which are of the form "pointer to double = type(lammps_data)" result in + ! re-associating the pointer on the left with the appropriate piece of + ! LAMMPS data (after checking type-compatibility) INTERFACE ASSIGNMENT(=) MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & @@ -104,7 +110,7 @@ MODULE LIBLAMMPS ! interface definitions for calling functions in library.cpp INTERFACE - FUNCTION lammps_open(argc, argv, comm) BIND(C, name='lammps_open_fortran') + FUNCTION lammps_open(argc, argv, comm) BIND(C,name='lammps_open_fortran') IMPORT :: c_ptr, c_int INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv @@ -216,7 +222,7 @@ MODULE LIBLAMMPS INTEGER (c_int) :: lammps_extract_global_datatype END FUNCTION lammps_extract_global_datatype - FUNCTION c_strlen (str) bind(C,name='strlen') + FUNCTION c_strlen (str) BIND(C,name='strlen') IMPORT :: c_ptr, c_size_t IMPLICIT NONE TYPE(c_ptr) :: str @@ -330,11 +336,14 @@ MODULE LIBLAMMPS TYPE(c_ptr), VALUE :: ptr END SUBROUTINE lammps_free - !LOGICAL FUNCTION lammps_is_running + !SUBROUTINE lammps_force_timeout + !LOGICAL FUNCTION lammps_has_error + !INTEGER (c_int) FUNCTION lammps_get_last_error_message + END INTERFACE CONTAINS @@ -392,6 +401,7 @@ CONTAINS END IF END SUBROUTINE lmp_close + ! equivalent function to lammps_file() SUBROUTINE lmp_file(self, filename) IMPLICIT NONE CLASS(lammps) :: self @@ -528,10 +538,8 @@ CONTAINS CALL lammps_free(Ckeyword) END FUNCTION lmp_extract_setting -! FIXME Now that I think about it...do we need this at all? +! FIXME Do we need this to be visible to the user? ! ! equivalent function to lammps_extract_global_datatype -! ! this function doesn't need to be accessed by the user, but is instead used -! ! for type checking ! INTEGER (c_int) FUNCTION lmp_extract_global_datatype (name) ! CHARACTER(LEN=*), INTENT(IN) :: name ! TYPE(c_ptr) :: Cname @@ -611,190 +619,8 @@ CONTAINS & extract_global' STOP END SELECT - END FUNCTION - ! equivalent function to lammps_extract_global - ! the return value should be automatically returned and assigned correctly - ! based on the information available from LAMMPS -! SUBROUTINE lmp_extract_global_scalar (self, global_data, name) -! CLASS(lammps), INTENT(IN) :: self -! CLASS(*), INTENT(OUT), POINTER :: global_data -! CHARACTER(LEN=*), INTENT(IN) :: name -! INTEGER(c_int) :: datatype -! TYPE(c_ptr) :: Cname, Cptr -! INTEGER(c_size_t) :: length, i -! CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Fptr -! -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(self%handle, Cname) -! ! above could be c_null_ptr in place of self%handle...doesn't matter -! Cptr = lammps_extract_global(self%handle, Cname) -! SELECT CASE (datatype) -! CASE (LAMMPS_INT) -! SELECT TYPE (global_data) -! TYPE IS (INTEGER(c_int)) -! CALL C_F_POINTER(Cptr, global_data) -! CLASS DEFAULT -! ! FIXME -! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' -! STOP -! END SELECT -! CASE (LAMMPS_INT64) -! SELECT TYPE (global_data) -! TYPE IS (INTEGER(c_int64_t)) -! CALL C_F_POINTER(Cptr, global_data) -! CLASS DEFAULT -! ! FIXME -! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' -! STOP -! END SELECT -! CASE (LAMMPS_DOUBLE) -! SELECT TYPE (global_data) -! TYPE IS (REAL(c_double)) -! CALL C_F_POINTER(Cptr, global_data) -! CLASS DEFAULT -! ! FIXME -! WRITE(0,'(A)') 'ERROR: Incompatible pointer type in extract_global' -! STOP -! END SELECT -! CASE (LAMMPS_STRING) -! SELECT TYPE (global_data) -! TYPE IS (CHARACTER(LEN=*)) -! length = c_strlen(Cptr) -! CALL C_F_POINTER(Cptr, Fptr, [length]) -! IF ( length < len(global_data) ) length = len(global_data) -! FORALL ( i = 1:length ) -! global_data(i:i) = Fptr(i) -! END FORALL -! END SELECT -! CASE DEFAULT -! ! FIXME -! WRITE (0,'(A,1X,I0,1X,A)') 'ERROR: Unknown type', datatype, & -! 'returned from extract_global_datatype' -! STOP -! END SELECT -! CALL lammps_free(Cname) -! END SUBROUTINE lmp_extract_global_scalar -! -! SUBROUTINE lmp_extract_global_string (self, global_data, name) -! CLASS(lammps), INTENT(IN) :: self -! CHARACTER(LEN=*), INTENT(OUT) :: global_data -! CHARACTER(LEN=*), INTENT(IN) :: name -! INTEGER(c_int) :: datatype -! TYPE(c_ptr) :: Cname, Cptr -! CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Fptr -! INTEGER(c_size_t) :: length -! INTEGER :: i -! -! global_data = '' -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(self%handle, Cname) -! IF ( datatype /= LAMMPS_STRING ) THEN -! ! FIXME -! WRITE (0,'(A)') 'ERROR: Cannot assign string to non-string variable.' -! STOP -! END IF -! Cptr = lammps_extract_global(self%handle, Cname) -! length = c_strlen(Cptr) -! CALL C_F_POINTER(Cptr, Fptr, [length]) -! IF ( length < len(global_data) ) length = len(global_data) -! FORALL ( i = 1:length ) -! global_data(i:i) = Fptr(i) -! END FORALL -! CALL lammps_free(Cname) -! END SUBROUTINE lmp_extract_global_string - -! ! equivalent functions to lammps_extract_global (overloaded) -! ! This implementation assumes there are no non-scalar data that can be -! ! extracted through lammps_extract_global -! FUNCTION lmp_extract_global_int (self, name, dtype) -! CLASS(lammps), INTENT(IN) :: self -! CHARACTER(LEN=*), INTENT(IN) :: name -! INTEGER(c_int), INTENT(IN) :: dtype -! INTEGER(c_int) :: lmp_extract_global_int -! TYPE(c_ptr) :: Cname, Cptr -! INTEGER(c_int) :: datatype -! INTEGER(c_int), POINTER :: ptr -! -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) -! IF ( datatype /= LAMMPS_INT ) THEN -! ! throw an exception or something; data type doesn't match! -! WRITE(0,*) 'WARNING: global data type is inconsistent (not an int)' -! END IF -! Cptr = lammps_extract_global(self%handle, Cname) -! CALL C_F_POINTER(Cptr, ptr) -! lmp_extract_global_int = ptr -! CALL lammps_free(Cname) -! END FUNCTION lmp_extract_global_int -! FUNCTION lmp_extract_global_int64_t (self, name, dtype) -! CLASS(lammps), INTENT(IN) :: self -! CHARACTER(LEN=*), INTENT(IN) :: name -! INTEGER(c_int64_t), INTENT(IN) :: dtype -! INTEGER(c_int64_t) :: lmp_extract_global_int64_t -! TYPE(c_ptr) :: Cname, Cptr -! INTEGER(c_int) :: datatype -! INTEGER(c_int64_t), POINTER :: ptr -! -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) -! IF ( datatype /= LAMMPS_INT64 ) THEN -! ! throw an exception or something; data type doesn't match! -! WRITE(0,*) 'WARNING: global data type is inconsistent (not an int64_t)' -! END IF -! Cptr = lammps_extract_global(self%handle, Cname) -! CALL C_F_POINTER(Cptr, ptr) -! lmp_extract_global_int64_t = ptr -! CALL lammps_free(Cname) -! END FUNCTION lmp_extract_global_int64_t -! FUNCTION lmp_extract_global_double (self, name, dtype) -! CLASS(lammps), INTENT(IN) :: self -! CHARACTER(LEN=*), INTENT(IN) :: name -! REAL(c_double), INTENT(IN) :: dtype -! REAL(c_double) :: lmp_extract_global_double -! TYPE(c_ptr) :: Cname, Cptr -! INTEGER(c_int) :: datatype -! REAL(c_double), POINTER :: ptr -! -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) -! IF ( datatype /= LAMMPS_DOUBLE ) THEN -! ! throw an exception or something; data type doesn't match! -! WRITE(0,*) 'WARNING: global data type is inconsistent (not a double)' -! END IF -! Cptr = lammps_extract_global(self%handle, Cname) -! CALL C_F_POINTER(Cptr, ptr) -! lmp_extract_global_double = ptr -! CALL lammps_free(Cname) -! END FUNCTION lmp_extract_global_double -! FUNCTION lmp_extract_global_str (self, name, dtype) -! CLASS(lammps), INTENT(IN) :: self -! CHARACTER(LEN=*), INTENT(IN) :: name, dtype -! CHARACTER(LEN=:), ALLOCATABLE :: lmp_extract_global_str -! TYPE(c_ptr) :: Cname, Cptr -! INTEGER(c_int) :: datatype -! CHARACTER(KIND=c_char,LEN=1), dimension(:), POINTER :: ptr -! INTEGER(c_size_t) :: length -! INTEGER :: i -! -! Cname = f2c_string(name) -! datatype = lammps_extract_global_datatype(c_null_ptr, Cname) -! IF ( datatype /= LAMMPS_STRING ) THEN -! ! throw an exception or something; data type doesn't match! -! WRITE(0,*) 'WARNING: global data type is inconsistent (not a string)' -! END IF -! Cptr = lammps_extract_global(self%handle, Cname) -! length = c_strlen(Cptr) -! CALL C_F_POINTER(Cptr, ptr, [length]) -! ALLOCATE ( CHARACTER(LEN=length) :: lmp_extract_global_str ) -! FORALL ( I=1:length ) -! lmp_extract_global_str(i:i) = ptr(i) -! END FORALL -! CALL lammps_free(Cname) -! ! the allocatable scalar (return value) gets auto-deallocated on return -! END FUNCTION lmp_extract_global_str - ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) IMPLICIT NONE diff --git a/src/library.cpp b/src/library.cpp index 584504599e..563f9376fc 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1156,8 +1156,8 @@ Please also see :cpp:func:`lammps_extract_setting`, may lead to inconsistent internal data and thus may cause failures or crashes or bogus simulations. In general it is thus usually better to use a LAMMPS input command that sets or changes these parameters. - Those will takes care of all side effects and necessary updates of - settings derived from such settings. Where possible a reference to + Those will take care of all side effects and necessary updates of + settings derived from such settings. Where possible, a reference to such a command or a relevant section of the manual is given below. The following tables list the supported names, their data types, length From c2ded124a586c06d4142bdd6159f8290b3fd371c Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 11:34:29 -0500 Subject: [PATCH 062/364] fixed spacing --- fortran/lammps.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 459eedb830..d66f0cc3c5 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -44,7 +44,7 @@ MODULE LIBLAMMPS ! ! NOT part of the API (the part the user sees) INTEGER (c_int), PARAMETER :: & - LAMMPS_INT = 0, & ! 32-bit integer (array) + LAMMPS_INT = 0, & ! 32-bit integer (array) LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array LAMMPS_DOUBLE = 2, & ! 64-bit double (array) LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array From c6972d483f63c4096c85da807a6c034ea20b8d55 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 11:43:21 -0500 Subject: [PATCH 063/364] Made spacing consistent; added IMPLICIT NONE where it was not implied already and removed it where it was redundant --- fortran/lammps.f90 | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index d66f0cc3c5..787476f21c 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -112,6 +112,7 @@ MODULE LIBLAMMPS INTERFACE FUNCTION lammps_open(argc, argv, comm) BIND(C,name='lammps_open_fortran') IMPORT :: c_ptr, c_int + IMPLICIT NONE INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv TYPE(c_ptr) :: lammps_open @@ -119,6 +120,7 @@ MODULE LIBLAMMPS FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C) IMPORT :: c_ptr, c_int + IMPLICIT NONE INTEGER(c_int), VALUE, INTENT(IN) :: argc TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv TYPE(c_ptr), VALUE, INTENT(in) :: handle @@ -127,6 +129,7 @@ MODULE LIBLAMMPS SUBROUTINE lammps_close(handle) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle END SUBROUTINE lammps_close @@ -141,18 +144,21 @@ MODULE LIBLAMMPS SUBROUTINE lammps_file(handle, filename) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: filename END SUBROUTINE lammps_file SUBROUTINE lammps_command(handle, cmd) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: cmd END SUBROUTINE lammps_command SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) IMPORT :: c_ptr, c_int + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle INTEGER(c_int), VALUE, INTENT(IN) :: ncmd TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds @@ -160,12 +166,14 @@ MODULE LIBLAMMPS SUBROUTINE lammps_commands_string(handle, str) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle TYPE(c_ptr), VALUE :: str END SUBROUTINE lammps_commands_string FUNCTION lammps_get_natoms(handle) BIND(C) IMPORT :: c_ptr, c_double + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle REAL(c_double) :: lammps_get_natoms END FUNCTION lammps_get_natoms @@ -179,19 +187,19 @@ MODULE LIBLAMMPS END FUNCTION lammps_get_thermo SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & - boxflag) BIND(C) - IMPORT :: c_ptr, c_double, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & - boxflag + boxflag) BIND(C) + IMPORT :: c_ptr, c_double, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & + boxflag END SUBROUTINE lammps_extract_box SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) IMPORT :: c_ptr, c_double IMPLICIT NONE - TYPE (c_ptr), VALUE :: handle - REAL (c_double), DIMENSION(3) :: boxlo, boxhi - REAL (c_double), VALUE :: xy, yz, xz + TYPE(c_ptr), VALUE :: handle + REAL(c_double), DIMENSION(3) :: boxlo, boxhi + REAL(c_double), VALUE :: xy, yz, xz END SUBROUTINE lammps_reset_box SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) @@ -204,22 +212,22 @@ MODULE LIBLAMMPS FUNCTION lammps_get_mpi_comm(handle) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE (c_ptr), VALUE :: handle - INTEGER (c_int) :: lammps_get_mpi_comm + TYPE(c_ptr), VALUE :: handle + INTEGER c_int) :: lammps_get_mpi_comm END FUNCTION lammps_get_mpi_comm FUNCTION lammps_extract_setting(handle,keyword) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE TYPE(c_ptr), VALUE :: handle, keyword - INTEGER (c_int) :: lammps_extract_setting + INTEGER(c_int) :: lammps_extract_setting END FUNCTION lammps_extract_setting FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE TYPE(c_ptr), VALUE :: handle, name - INTEGER (c_int) :: lammps_extract_global_datatype + INTEGER(c_int) :: lammps_extract_global_datatype END FUNCTION lammps_extract_global_datatype FUNCTION c_strlen (str) BIND(C,name='strlen') @@ -231,6 +239,7 @@ MODULE LIBLAMMPS FUNCTION lammps_extract_global(handle, name) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle, name TYPE(c_ptr) :: lammps_extract_global END FUNCTION lammps_extract_global @@ -327,12 +336,14 @@ MODULE LIBLAMMPS FUNCTION lammps_malloc(size) BIND(C, name='malloc') IMPORT :: c_ptr, c_size_t + IMPLICIT NONE INTEGER(c_size_t), VALUE :: size TYPE(c_ptr) :: lammps_malloc END FUNCTION lammps_malloc SUBROUTINE lammps_free(ptr) BIND(C) IMPORT :: c_ptr + IMPLICIT NONE TYPE(c_ptr), VALUE :: ptr END SUBROUTINE lammps_free @@ -352,7 +363,6 @@ CONTAINS ! Constructor for the LAMMPS class. ! Combined wrapper around lammps_open_fortran() and lammps_open_no_mpi() TYPE(lammps) FUNCTION lmp_open(args, comm) - IMPLICIT NONE INTEGER, INTENT(in), OPTIONAL :: comm CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: args(:) TYPE(c_ptr), ALLOCATABLE :: argv(:) @@ -387,7 +397,6 @@ CONTAINS ! Combined Fortran wrapper around lammps_close() and lammps_mpi_finalize() SUBROUTINE lmp_close(self, finalize) - IMPLICIT NONE CLASS(lammps) :: self LOGICAL, INTENT(IN), OPTIONAL :: finalize @@ -403,7 +412,6 @@ CONTAINS ! equivalent function to lammps_file() SUBROUTINE lmp_file(self, filename) - IMPLICIT NONE CLASS(lammps) :: self CHARACTER(len=*) :: filename TYPE(c_ptr) :: str @@ -415,7 +423,6 @@ CONTAINS ! equivalent function to lammps_command() SUBROUTINE lmp_command(self, cmd) - IMPLICIT NONE CLASS(lammps) :: self CHARACTER(len=*) :: cmd TYPE(c_ptr) :: str @@ -427,7 +434,6 @@ CONTAINS ! equivalent function to lammps_commands_list() SUBROUTINE lmp_commands_list(self, cmds) - IMPLICIT NONE CLASS(lammps) :: self CHARACTER(len=*), INTENT(in), OPTIONAL :: cmds(:) TYPE(c_ptr), ALLOCATABLE :: cmdv(:) @@ -451,7 +457,6 @@ CONTAINS ! equivalent function to lammps_commands_string() SUBROUTINE lmp_commands_string(self, str) - IMPLICIT NONE CLASS(lammps) :: self CHARACTER(len=*) :: str TYPE(c_ptr) :: tmp @@ -463,7 +468,6 @@ CONTAINS ! equivalent function to lammps_get_natoms DOUBLE PRECISION FUNCTION lmp_get_natoms(self) - IMPLICIT NONE CLASS(lammps) :: self lmp_get_natoms = lammps_get_natoms(self%handle) @@ -623,7 +627,6 @@ CONTAINS ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) - IMPLICIT NONE CLASS(lammps) :: self lmp_version = lammps_version(self%handle) From 257b551c921458467b21c14da23482ac8b0c1a7a Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 11:44:55 -0500 Subject: [PATCH 064/364] Missed lammps_version implicit none --- fortran/lammps.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 787476f21c..c0ceadb839 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -291,6 +291,7 @@ MODULE LIBLAMMPS FUNCTION lammps_version(handle) BIND(C) IMPORT :: c_ptr, c_int + IMPLICIT NONE TYPE(c_ptr), VALUE :: handle INTEGER(c_int) :: lammps_version END FUNCTION lammps_version From 4c975c34c1c36631a48709f5e659a39bd97bf51d Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 12 Aug 2022 11:55:30 -0500 Subject: [PATCH 065/364] Deleted the parenthesis instead of the space... --- fortran/lammps.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index c0ceadb839..ecef8c3e67 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -213,7 +213,7 @@ MODULE LIBLAMMPS IMPORT :: c_ptr, c_int IMPLICIT NONE TYPE(c_ptr), VALUE :: handle - INTEGER c_int) :: lammps_get_mpi_comm + INTEGER(c_int) :: lammps_get_mpi_comm END FUNCTION lammps_get_mpi_comm FUNCTION lammps_extract_setting(handle,keyword) BIND(C) From 196d52fdb335182301f8b96c3c4e63341f606100 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sat, 13 Aug 2022 19:09:40 -0500 Subject: [PATCH 066/364] Missing comma --- doc/src/Fortran.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index d3b68a3570..081108c719 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -52,7 +52,7 @@ Creating or deleting a LAMMPS object With the Fortran interface, the creation of a :cpp:class:`LAMMPS ` instance is included in the constructor for creating the :f:func:`lammps` derived type. To import the definition of -that type and its type bound procedures you need to add a ``USE +that type and its type bound procedures, you need to add a ``USE LIBLAMMPS`` statement. Internally it will call either :cpp:func:`lammps_open_fortran` or :cpp:func:`lammps_open_no_mpi` from the C library API to create the class instance. All arguments are From 8b181ed58a5c3fb53a654e38246ad0c8128c4564 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 15 Aug 2022 21:11:58 -0500 Subject: [PATCH 067/364] Minor tweaks to docs; fixed typo and capitalization to be consistent --- doc/src/Fortran.rst | 20 ++++++++++---------- fortran/README | 4 ++-- fortran/lammps.f90 | 6 +++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 081108c719..0db5f8f097 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -81,7 +81,7 @@ the optional logical argument set to ``.true.``. Here is a simple example: It is also possible to pass command line flags from Fortran to C/C++ and thus make the resulting executable behave similarly to the standalone -executable (it will ignore the `-in/-i` flag, though). This allows to +executable (it will ignore the `-in/-i` flag, though). This allows one to use the command line to configure accelerator and suffix settings, configure screen and logfile output, or to set index style variables from the command line and more. Here is a correspondingly adapted @@ -207,7 +207,7 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. If *comm* is not provided, ``MPI_COMM_WORLD`` is assumed. For more details please see the documentation of :cpp:func:`lammps_open`. - :o character(len=*) args(*) [optional]: arguments as list of strings + :o character(len=\*) args(\*) [optional]: arguments as list of strings :o integer comm [optional]: MPI communicator :r lammps: an instance of the :f:type:`lammps` derived type @@ -256,7 +256,7 @@ Procedures Bound to the lammps Derived Type This method will call :cpp:func:`lammps_file` to have LAMMPS read and process commands from a file. - :p character(len=*) filename: name of file with LAMMPS commands + :p character(len=\*) filename: name of file with LAMMPS commands -------- @@ -265,7 +265,7 @@ Procedures Bound to the lammps Derived Type This method will call :cpp:func:`lammps_command` to have LAMMPS execute a single command. - :p character(len=*) cmd: single LAMMPS command + :p character(len=\*) cmd: single LAMMPS command -------- @@ -274,7 +274,7 @@ Procedures Bound to the lammps Derived Type This method will call :cpp:func:`lammps_commands_list` to have LAMMPS execute a list of input lines. - :p character(len=*) cmd(:): list of LAMMPS input lines + :p character(len=\*) cmd(:): list of LAMMPS input lines -------- @@ -283,7 +283,7 @@ Procedures Bound to the lammps Derived Type This method will call :cpp:func:`lammps_commands_string` to have LAMMPS execute a block of commands from a string. - :p character(len=*) str: LAMMPS input in string + :p character(len=\*) str: LAMMPS input in string -------- @@ -301,12 +301,12 @@ Procedures Bound to the lammps Derived Type This function will call :cpp:func:`lammps_get_thermo` and return the value of the corresponding thermodynamic keyword. - :p character(len=*) name: string with the name of the thermo keyword + :p character(len=\*) name: string with the name of the thermo keyword :r real(C_double): value of the requested thermo property or 0.0_C_double -------- -.. f:subroutine:: extract_box([boxlo][, boxhi][, xy][, yz][, xz][, pflag]s[, boxflag]) +.. f:subroutine:: extract_box([boxlo][, boxhi][, xy][, yz][, xz][, pflags][, boxflag]) This subroutine will call :cpp:func:`lammps_extract_box`. All parameters are optional, though obviously at least one should be present. The @@ -407,7 +407,7 @@ Procedures Bound to the lammps Derived Type Query LAMMPS about global settings. See the documentation for the :c:func:`lammps_extract_setting` function from the C library. - :p character(len=*) keyword: string containing the name of the thermo keyword + :p character(len=\*) keyword: string containing the name of the thermo keyword :r integer(c_int): value of the queried setting or :math:`-1` if unknown -------- @@ -463,7 +463,7 @@ Procedures Bound to the lammps Derived Type too short, the string will be truncated. As usual in Fortran, strings are padded with spaces at the end. - :p character(len=*) name: string with the name of the extracted property + :p character(len=\*) name: string with the name of the extracted property :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment should be either a string (if expecting string data) or a C-interoperable pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted diff --git a/fortran/README b/fortran/README index 653b6a966e..57d163e197 100644 --- a/fortran/README +++ b/fortran/README @@ -3,9 +3,9 @@ and allows the LAMMPS library interface to be invoked from Fortran codes. It requires a Fortran compiler that supports the Fortran 2003 standard. This interface is based on and supersedes the previous Fortran interfaces -in the examples/COUPLE/fortran* folders. But is fully supported by the +in the examples/COUPLE/fortran* folders, but is fully supported by the LAMMPS developers and included in the documentation and unit testing. Details on this Fortran interface and how to build programs using it -are in the manual in the doc/html/pg_fortran.html file. +are in the manual in the doc/html/Fortran.html file. diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index ecef8c3e67..5916823df1 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -123,7 +123,7 @@ MODULE LIBLAMMPS IMPLICIT NONE INTEGER(c_int), VALUE, INTENT(IN) :: argc TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv - TYPE(c_ptr), VALUE, INTENT(in) :: handle + TYPE(c_ptr), VALUE, INTENT(IN) :: handle TYPE(c_ptr) :: lammps_open_no_mpi END FUNCTION lammps_open_no_mpi @@ -364,7 +364,7 @@ CONTAINS ! Constructor for the LAMMPS class. ! Combined wrapper around lammps_open_fortran() and lammps_open_no_mpi() TYPE(lammps) FUNCTION lmp_open(args, comm) - INTEGER, INTENT(in), OPTIONAL :: comm + INTEGER, INTENT(IN), OPTIONAL :: comm CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: args(:) TYPE(c_ptr), ALLOCATABLE :: argv(:) INTEGER(c_int) :: i, c_comm, argc @@ -436,7 +436,7 @@ CONTAINS ! equivalent function to lammps_commands_list() SUBROUTINE lmp_commands_list(self, cmds) CLASS(lammps) :: self - CHARACTER(len=*), INTENT(in), OPTIONAL :: cmds(:) + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cmds(:) TYPE(c_ptr), ALLOCATABLE :: cmdv(:) INTEGER :: i, ncmd From 06285556c9b9e487f9b6dba3e9261c12a9063dbd Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Tue, 16 Aug 2022 02:34:15 -0600 Subject: [PATCH 068/364] Move unified L-J initialization to definition --- examples/mliap/pickle_mliap_unified_lj_Ar.py | 10 ---------- python/lammps/mliap/mliap_unified_lj.py | 9 +++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/mliap/pickle_mliap_unified_lj_Ar.py b/examples/mliap/pickle_mliap_unified_lj_Ar.py index c7a16b44a7..4421c61fe4 100644 --- a/examples/mliap/pickle_mliap_unified_lj_Ar.py +++ b/examples/mliap/pickle_mliap_unified_lj_Ar.py @@ -6,14 +6,4 @@ from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ if __name__ == '__main__': unified = MLIAPUnifiedLJ() - unified.element_types = ["Ar"] - unified.ndescriptors = 1 - unified.nparams = 3 - # Mimicking the LJ pair-style: - # pair_style lj/cut 2.5 - # pair_coeff * * 1 1 - unified.epsilon = 1.0 - unified.sigma = 1.0 - unified.rcutfac = 1.25 - unified.pickle('mliap_unified_lj_Ar.pkl') diff --git a/python/lammps/mliap/mliap_unified_lj.py b/python/lammps/mliap/mliap_unified_lj.py index 62892c93bf..8794ba64c5 100644 --- a/python/lammps/mliap/mliap_unified_lj.py +++ b/python/lammps/mliap/mliap_unified_lj.py @@ -7,6 +7,15 @@ class MLIAPUnifiedLJ(MLIAPUnified): def __init__(self): super().__init__() + self.element_types = ["Ar"] + self.ndescriptors = 1 + self.nparams = 3 + # Mimicking the LJ pair-style: + # pair_style lj/cut 2.5 + # pair_coeff * * 1 1 + self.epsilon = 1.0 + self.sigma = 1.0 + self.rcutfac = 1.25 def compute_gradients(self, data): """Test compute_gradients.""" From 7a76a6ee367243a2129f54791bec929b84147241 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Tue, 16 Aug 2022 02:35:31 -0600 Subject: [PATCH 069/364] Implement python-side unified support, add example --- examples/mliap/mliap_unified_lj_Ar.py | 65 +++++++++++++++++++++++++++ python/lammps/mliap/__init__.py | 2 +- python/lammps/mliap/loader.py | 9 ++++ src/ML-IAP/mliap_unifiedpy.pyx | 20 ++++++++- 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 examples/mliap/mliap_unified_lj_Ar.py diff --git a/examples/mliap/mliap_unified_lj_Ar.py b/examples/mliap/mliap_unified_lj_Ar.py new file mode 100644 index 0000000000..9b1c11be7d --- /dev/null +++ b/examples/mliap/mliap_unified_lj_Ar.py @@ -0,0 +1,65 @@ +# Demonstrate how to load a unified model from python. +# This is essentially the same as in.mliap.unified.lj.Ar +# except that python is the driving program, and lammps +# is in library mode. + +before_loading =\ +"""# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 3.0 87287 loop geom +""" +after_loading =\ +""" + +pair_style mliap unified EXISTS +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +""" + +import lammps + +lmp = lammps.lammps(cmdargs=['-echo','both']) + +# Before defining the pair style, you must do the following: +import lammps.mliap +lammps.mliap.activate_mliappy(lmp) +# Otherwise, when running lammps in library mode, +# you will get an error + +# Setup the simulation to just before declaring +# the mliap unified pair style +lmp.commands_string(before_loading) + +# Define the model however you like. In this example +# we simply import the unified L-J example from mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +unified = MLIAPUnifiedLJ() + +# You can also load the model from a pickle file. +# import pickle +# with open('mliap_unified_lj_Ar.pkl', 'rb') as pfile: +# unified = pickle.load(pfile) + +# Connect the L-J model to the mliap unified pair style. +lammps.mliap.load_unified(unified) + + +# Run the simulation with the mliap unified pair style +# Use pre-loaded model by specifying model filename as "EXISTS" +lmp.commands_string(after_loading) diff --git a/python/lammps/mliap/__init__.py b/python/lammps/mliap/__init__.py index 57fe97d803..b29346f255 100644 --- a/python/lammps/mliap/__init__.py +++ b/python/lammps/mliap/__init__.py @@ -17,4 +17,4 @@ if not pylib.Py_IsInitialized(): raise RuntimeError("This interpreter is not compatible with python-based mliap for LAMMPS.") del sysconfig, ctypes, library, pylib -from .loader import load_model, activate_mliappy +from .loader import load_model, load_unified, activate_mliappy diff --git a/python/lammps/mliap/loader.py b/python/lammps/mliap/loader.py index e50ba8cb93..284af01b05 100644 --- a/python/lammps/mliap/loader.py +++ b/python/lammps/mliap/loader.py @@ -80,3 +80,12 @@ def load_model(model): "the pair style. Call lammps.mliap.activate_mliappy(lmp)." ) from ie mliap_model_python_couple.load_from_python(model) + +def load_unified(model): + try: + import mliap_unifiedpy + except ImportError as ie: + raise ImportError("ML-IAP python module must be activated before loading\n" + "the pair style. Call lammps.mliap.activate_mliappy(lmp)." + ) from ie + mliap_unifiedpy.load_from_python(model) diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unifiedpy.pyx index d34137e3f6..4a488e3eb2 100644 --- a/src/ML-IAP/mliap_unifiedpy.pyx +++ b/src/ML-IAP/mliap_unifiedpy.pyx @@ -98,6 +98,9 @@ cdef extern from "mliap_unified.h" namespace "LAMMPS_NS": cdef void update_pair_forces(MLIAPData *, double *) except + +LOADED_MODEL = None + + # @property sans getter def write_only_property(fset): return property(fget=None, fset=fset) @@ -334,8 +337,16 @@ cdef public void compute_forces_python(unified_int, MLIAPData *data) except * wi cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, MLIAPDummyDescriptor * descriptor) with gil: str_fname = fname.decode('utf-8') - with open(str_fname, 'rb') as pfile: - unified = pickle.load(pfile) + if str_fname == 'EXISTS': + if LOADED_MODEL is None: + raise ValueError("No unified model loaded") + unified = LOADED_MODEL + elif str_fname.endswith(".pt") or str_fname.endswith('.pth'): + import torch + unified = torch.load(str_fname) + else: + with open(str_fname, 'rb') as pfile: + unified = pickle.load(pfile) unified_int = MLIAPUnifiedInterface(unified) unified_int.model = model @@ -370,3 +381,8 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, free(elements) return unified_int + + +def load_from_python(unified): + global LOADED_MODEL + LOADED_MODEL = unified From 7104d1bfcab0f4749c801598475bcc8f93415696 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Tue, 16 Aug 2022 02:56:53 -0600 Subject: [PATCH 070/364] Change hippynn examples to load from .pt files --- examples/mliap/in.mliap.unified.hippynn.Al | 2 +- examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh | 2 +- examples/mliap/in.mliap.unified.hippynn.InP | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al index 02af7ababa..e92de9bb00 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al +++ b/examples/mliap/in.mliap.unified.hippynn.Al @@ -24,7 +24,7 @@ mass 1 26.981 # choose potential -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pkl +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pt pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index 583f7c645e..b6322d9e7d 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -24,7 +24,7 @@ mass 1 26.981 # choose potential -pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pkl +pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pt pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP index 26fce32e19..c4cafbcae3 100644 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -26,7 +26,7 @@ mass 2 30.98 # choose potential # Specify MLIAP Unified pair style -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pkl +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pt pair_coeff * * In P #dump 4 all custom 1 forces.xyz fx fy fz From 80257099de276b8f2905641cf31f1d6e568572c3 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 30 Aug 2022 10:58:55 -0600 Subject: [PATCH 071/364] Adding methods needed to efficiently create bonds --- src/fix_update_special_bonds.cpp | 91 +++++++++++++++++++++++++++----- src/fix_update_special_bonds.h | 6 +++ src/neighbor.cpp | 10 ++++ src/neighbor.h | 1 + src/ntopo.cpp | 16 ++++++ src/ntopo.h | 1 + 6 files changed, 113 insertions(+), 12 deletions(-) diff --git a/src/fix_update_special_bonds.cpp b/src/fix_update_special_bonds.cpp index c31aefd28d..f2715beebc 100644 --- a/src/fix_update_special_bonds.cpp +++ b/src/fix_update_special_bonds.cpp @@ -26,6 +26,8 @@ using namespace LAMMPS_NS; using namespace FixConst; +#define DELTA 10000 + /* ---------------------------------------------------------------------- */ FixUpdateSpecialBonds::FixUpdateSpecialBonds(LAMMPS *lmp, int narg, char **arg) : @@ -61,13 +63,17 @@ void FixUpdateSpecialBonds::setup(int /*vflag*/) if (force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0) error->all(FLERR, "Fix update/special/bonds requires special Coulomb weights = 1,1,1"); + // Implies neighbor->special_flag = [X, 2, 1, 1] new_broken_pairs.clear(); broken_pairs.clear(); + + new_created_pairs.clear(); + created_pairs.clear(); } /* ---------------------------------------------------------------------- - Update special bond list and atom bond arrays, empty broken bond list + Update special bond list and atom bond arrays, empty broken/created lists ------------------------------------------------------------------------- */ void FixUpdateSpecialBonds::pre_exchange() @@ -83,21 +89,19 @@ void FixUpdateSpecialBonds::pre_exchange() for (auto const &it : broken_pairs) { tagi = it.first; tagj = it.second; - i = atom->map(tagi); j = atom->map(tagj); // remove i from special bond list for atom j and vice versa + // ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0 if (i < nlocal) { slist = special[i]; n1 = nspecial[i][0]; for (m = 0; m < n1; m++) if (slist[m] == tagj) break; - n3 = nspecial[i][2]; - for (; m < n3 - 1; m++) slist[m] = slist[m + 1]; + for (; m < n1 - 1; m++) slist[m] = slist[m + 1]; nspecial[i][0]--; - nspecial[i][1]--; - nspecial[i][2]--; + nspecial[i][1] = nspecial[i][2] = nspecial[i][0]; } if (j < nlocal) { @@ -105,19 +109,43 @@ void FixUpdateSpecialBonds::pre_exchange() n1 = nspecial[j][0]; for (m = 0; m < n1; m++) if (slist[m] == tagi) break; - n3 = nspecial[j][2]; - for (; m < n3 - 1; m++) slist[m] = slist[m + 1]; + for (; m < n1 - 1; m++) slist[m] = slist[m + 1]; nspecial[j][0]--; - nspecial[j][1]--; - nspecial[j][2]--; + nspecial[j][1] = nspecial[j][2] = nspecial[j][0]; } } + for (auto const &it : created_pairs) { + tagi = it.first; + tagj = it.second; + i = atom->map(tagi); + j = atom->map(tagj); + + // add i to special bond list for atom j and vice versa + // ignore n2, n3 since 1-3, 1-4 special factors required to be 1.0 + n1 = nspecial[i][0]; + if (n1 >= atom->maxspecial) + error->one(FLERR,"Special list size exceeded in fix update/special/bond"); + special[i][n1] = tagj; + nspecial[i][0] += 1; + nspecial[i][1] = nspecial[i][2] = nspecial[i][0]; + + n1 = nspecial[j][0]; + if (n1 >= atom->maxspecial) + error->one(FLERR,"Special list size exceeded in fix update/special/bond"); + special[j][n1] = tagi; + nspecial[j][0] += 1; + nspecial[j][1] = nspecial[j][2] = nspecial[j][0]; + } + broken_pairs.clear(); + created_pairs.clear(); } /* ---------------------------------------------------------------------- - Loop neighbor list and update special bond lists for recently broken bonds + Update special lists for recently broken/created bonds + Assumes appropriate atom/bond arrays were updated, e.g. had called + neighbor->add_temporary_bond(i1, i2, btype); ------------------------------------------------------------------------- */ void FixUpdateSpecialBonds::pre_force(int /*vflag*/) @@ -129,7 +157,7 @@ void FixUpdateSpecialBonds::pre_force(int /*vflag*/) int nlocal = atom->nlocal; tagint *tag = atom->tag; - NeighList *list = force->pair->list; // may need to be generalized to work with pair hybrid* + NeighList *list = force->pair->list; // may need to be generalized for pair hybrid* numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -163,7 +191,37 @@ void FixUpdateSpecialBonds::pre_force(int /*vflag*/) } } } + + for (auto const &it : new_created_pairs) { + tag1 = it.first; + tag2 = it.second; + i1 = atom->map(tag1); + i2 = atom->map(tag2); + + // Loop through atoms of owned atoms i j and update SB bits + if (i1 < nlocal) { + jlist = firstneigh[i1]; + jnum = numneigh[i1]; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + if (j >> SBBITS & 3 != 0) continue; // Skip bonded pairs + if (tag[j] == tag2) jlist[jj] = j ^ (1 << SBBITS); // Add 1-2 special bond bits + } + } + + if (i2 < nlocal) { + jlist = firstneigh[i2]; + jnum = numneigh[i2]; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + if (j >> SBBITS & 3 != 0) continue; // Skip bonded pairs + if (tag[j] == tag1) jlist[jj] = j ^ (1 << SBBITS); // Add 1-2 special bond bits + } + } + } + new_broken_pairs.clear(); + new_created_pairs.clear(); } /* ---------------------------------------------------------------------- */ @@ -174,3 +232,12 @@ void FixUpdateSpecialBonds::add_broken_bond(int i, int j) new_broken_pairs.push_back(tag_pair); broken_pairs.push_back(tag_pair); } + +/* ---------------------------------------------------------------------- */ + +void FixUpdateSpecialBonds::add_created_bond(int i, int j) +{ + auto tag_pair = std::make_pair(atom->tag[i], atom->tag[j]); + new_created_pairs.push_back(tag_pair); + created_pairs.push_back(tag_pair); +} \ No newline at end of file diff --git a/src/fix_update_special_bonds.h b/src/fix_update_special_bonds.h index 52981d4d99..825977d37f 100644 --- a/src/fix_update_special_bonds.h +++ b/src/fix_update_special_bonds.h @@ -35,12 +35,18 @@ class FixUpdateSpecialBonds : public Fix { void pre_exchange() override; void pre_force(int) override; void add_broken_bond(int, int); + void add_created_bond(int, int); protected: // Create two arrays to store bonds broken this timestep (new) // and since the last neighbor list build std::vector> new_broken_pairs; std::vector> broken_pairs; + + // Create two arrays to store newly created this timestep (new) + // and since the last neighbor list build + std::vector> new_created_pairs; + std::vector> created_pairs; }; } // namespace LAMMPS_NS diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 560392ae6d..ec4f11d1bd 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2829,6 +2829,16 @@ bigint Neighbor::get_nneigh_half() return nneighhalf; } +/* ---------------------------------------------------------------------- + add pair of atoms to bondlist array + will only persist until the next neighbor build +------------------------------------------------------------------------- */ + +void Neighbor::add_temporary_bond(int i1, int i2, int btype) +{ + neigh_bond->add_temporary_bond(i1, i2, btype); +} + /* ---------------------------------------------------------------------- return # of bytes of allocated memory ------------------------------------------------------------------------- */ diff --git a/src/neighbor.h b/src/neighbor.h index 3492693766..33a228d46a 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -165,6 +165,7 @@ class Neighbor : protected Pointers { bigint get_nneigh_full(); // return number of neighbors in a regular full neighbor list bigint get_nneigh_half(); // return number of neighbors in a regular half neighbor list + void add_temporary_bond(int, int, int); // add temporary bond to bondlist array double memory_usage(); bigint last_setup_bins; // step of last neighbor::setup_bins() call diff --git a/src/ntopo.cpp b/src/ntopo.cpp index 68b251be0f..f1cd547e44 100644 --- a/src/ntopo.cpp +++ b/src/ntopo.cpp @@ -24,6 +24,7 @@ using namespace LAMMPS_NS; #define LB_FACTOR 1.5 +#define DELTA 10000 /* ---------------------------------------------------------------------- */ @@ -207,6 +208,21 @@ void NTopo::dihedral_check(int nlist, int **list) /* ---------------------------------------------------------------------- */ +void NTopo::add_temporary_bond(int i1, int i2, int btype) +{ + if (nbondlist == maxbond) { + maxbond += DELTA; + memory->grow(bondlist, maxbond, 3, "neigh_topo:bondlist"); + } + + bondlist[nbondlist][0] = i1; + bondlist[nbondlist][1] = i2; + bondlist[nbondlist][2] = btype; + nbondlist++; +} + +/* ---------------------------------------------------------------------- */ + double NTopo::memory_usage() { double bytes = 0; diff --git a/src/ntopo.h b/src/ntopo.h index c60d94d52d..e03cf809a9 100644 --- a/src/ntopo.h +++ b/src/ntopo.h @@ -28,6 +28,7 @@ class NTopo : protected Pointers { virtual void build() = 0; + void add_temporary_bond(int, int, int); double memory_usage(); protected: From 8fafd4d8fb9ff27a6ea917931824f33e3ee51418 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 30 Aug 2022 13:25:36 -0600 Subject: [PATCH 072/364] Restarting additional BPM settings, adding virial contributions from tangential bonds --- examples/bpm/impact/brokenDump | 7087 +++++++++-------- .../log.17Feb2022.impact.rotational.g++.4 | 219 - .../log.4May2022.impact.rotational.g++.4 | 219 + examples/bpm/pour/log.17Feb2022.pour.g++.4 | 1091 --- examples/bpm/pour/log.4May2022.pour.g++.4 | 1096 +++ src/BPM/bond_bpm.cpp | 28 + src/BPM/bond_bpm.h | 5 +- src/BPM/bond_bpm_rotational.cpp | 73 +- src/BPM/bond_bpm_rotational.h | 6 +- src/BPM/bond_bpm_spring.cpp | 25 + src/BPM/bond_bpm_spring.h | 2 + src/bond.cpp | 85 + src/bond.h | 1 + src/fix_update_special_bonds.cpp | 6 + 14 files changed, 5424 insertions(+), 4519 deletions(-) delete mode 100644 examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 create mode 100644 examples/bpm/impact/log.4May2022.impact.rotational.g++.4 delete mode 100644 examples/bpm/pour/log.17Feb2022.pour.g++.4 create mode 100644 examples/bpm/pour/log.4May2022.pour.g++.4 diff --git a/examples/bpm/impact/brokenDump b/examples/bpm/impact/brokenDump index ef78518c91..0a2316cd5e 100644 --- a/examples/bpm/impact/brokenDump +++ b/examples/bpm/impact/brokenDump @@ -1,3173 +1,3914 @@ -276 5469 5471 -288 1815 1931 -290 1810 1815 -293 1815 1816 -295 5350 5351 -300 1813 1815 -288 1815 1931 -276 5469 5471 -278 5475 5477 -283 5349 5350 -287 5470 5477 -290 5472 5477 -292 5350 5352 -294 5477 5478 -295 5350 5351 -305 1702 1704 -308 1705 5351 -313 1699 1704 -324 1820 5471 -327 1813 1814 -332 1937 1938 -339 5228 5349 -350 1811 1818 -353 1817 5348 -361 1588 1700 -362 1700 5348 -364 1817 5469 -368 1700 5228 -368 1704 1819 -372 1817 5467 -373 5351 5470 -374 1701 1818 -374 1817 5468 -377 1584 1694 -380 5231 5349 -383 1588 5349 -383 5231 5350 -386 1458 1574 -388 1811 1812 -399 1464 1580 -399 1817 1822 -306 1938 5471 -308 1928 1933 -309 1933 1934 -310 1933 2048 -311 5712 5830 -313 1931 1933 -332 1937 1938 -333 1938 1939 -333 2056 2171 -338 1938 1940 -340 2172 2174 -352 2172 5712 -353 2056 2057 -355 2056 2172 -359 5712 5831 -362 2057 2169 -367 1932 1938 -368 2052 5709 -372 2052 2053 -375 5712 5713 -375 2172 2173 -377 2174 2286 -385 5711 5712 -385 2169 5709 -386 1935 1936 -387 2054 2055 -387 2169 5829 -398 2277 2278 -399 2057 2171 -303 5232 5350 -303 5477 5595 -304 5352 5470 -306 1938 5471 -306 5483 5484 -312 5350 5355 -312 5481 5483 -312 5471 5591 -316 5471 5590 -318 5357 5470 -324 1820 5471 -330 5470 5475 -331 5354 5473 -332 5476 5481 -332 5471 5589 -332 5483 5601 -339 5228 5349 -341 5473 5474 -343 5358 5476 -346 5349 5352 -346 5355 5357 -347 5237 5350 -350 5357 5358 -351 5354 5467 -353 1817 5348 -358 5348 5467 -362 1700 5348 -362 5601 5602 -366 5470 5471 -367 5472 5475 -371 5476 5477 -372 1817 5467 -372 5480 5593 -373 5351 5470 -373 5601 5603 -374 1817 5468 -380 5231 5349 -383 1588 5349 -383 5231 5350 -387 5478 5481 -388 5234 5353 -389 5596 5601 -397 5484 5486 -400 5593 5601 -303 5477 5595 -311 5712 5830 -312 5471 5591 -316 5471 5590 -319 5717 5719 -325 5831 5833 -332 5471 5589 -349 5603 5604 -355 5717 5722 -359 5712 5831 -368 2052 5709 -370 5720 5722 -372 5480 5593 -372 5600 5603 -373 5600 5604 -373 5601 5603 -374 5587 5594 -375 5712 5713 -379 5588 5708 -381 5600 5714 -383 5720 5721 -385 5711 5712 -385 2169 5709 -387 2169 5829 -388 5722 5723 -391 5828 5829 -394 5833 5948 -398 5710 5712 -400 5593 5601 -401 1820 1822 -403 1817 1819 -404 1586 1588 -405 1569 1685 -410 1821 1938 -411 1822 5469 -412 1568 1575 -413 1822 1937 -421 1699 1819 -421 5232 5349 -422 1704 1814 -423 1582 1584 -431 1565 1572 -431 1578 1688 -431 1812 1929 -433 5469 5472 -435 1467 1585 -442 1809 1810 -448 1685 1692 -448 1698 1808 -451 1703 5349 -454 1563 1679 -454 1935 1937 -455 1703 5351 -457 1582 1694 -458 1813 1816 -459 1695 1805 -460 1926 1927 -461 1699 1814 -468 1810 1816 -471 1814 1819 -476 1701 1819 -478 1566 1682 -480 1818 1929 -481 1920 1925 -482 1580 1587 -485 5468 5469 -486 1689 1805 -490 1457 1464 -490 1806 1810 -493 1587 1588 -493 1814 1816 -497 1682 1689 -498 1699 1816 -500 1688 1805 -500 1689 1695 -402 2049 2051 -402 2054 2057 -410 1821 1938 -416 2052 5588 -417 2055 2056 -420 1939 2049 -423 1923 1930 -423 2161 2271 -426 2050 2160 -431 1812 1929 -431 2044 2154 -437 2284 2393 -441 1940 2054 -441 2174 5832 -442 2166 2173 -448 1927 1928 -449 2286 5949 -451 2163 2170 -452 2037 2038 -457 2396 2397 -460 1926 1927 -461 1936 2046 -461 2406 2513 -464 1930 1934 -465 2055 5712 -471 1931 1934 -473 1940 5710 -474 2154 2159 -475 2274 2275 -477 1933 2049 -478 1923 2040 -479 2037 2039 -479 2399 2400 -480 1818 1929 -481 1920 1925 -482 1930 2048 -482 2039 2042 -482 2164 2280 -482 2174 5830 -485 1930 1931 -486 1930 1936 -486 2046 2053 -487 1928 1930 -488 2167 2283 -495 2156 2159 -498 1928 1934 -403 5368 5369 -407 5484 5601 -409 5601 5604 -412 5232 5352 -414 5476 5596 -416 5123 5236 -419 5484 5602 -421 5232 5349 -421 5472 5595 -422 5129 5242 -425 5362 5363 -426 5347 5354 -426 5352 5355 -430 5246 5359 -433 5469 5472 -434 5481 5484 -437 5135 5248 -438 5365 5366 -439 5358 5478 -439 5483 5596 -441 5362 5369 -450 5363 5482 -450 5484 5487 -456 5484 5607 -458 5480 5599 -459 5242 5243 -461 5235 5236 -463 5479 5486 -464 5482 5483 -467 5234 5347 -467 5361 5362 -469 5232 5355 -470 5474 5475 -474 5116 5117 -475 5356 5363 -480 5234 5240 -481 5485 5487 -484 5480 5484 -485 5468 5469 -488 5476 5478 -493 5233 5238 -494 5356 5361 -495 5118 5238 -496 5363 5483 -497 5018 5128 -498 5233 5240 -500 5370 5488 -406 5591 5711 -406 5722 5724 -406 5969 5976 -407 5721 5725 -408 5600 5720 -409 5601 5604 -413 5597 5717 -419 5970 6089 -421 5472 5595 -421 6074 6081 -425 5719 5722 -425 5964 6083 -426 5594 5598 -426 5831 5838 -429 5840 5841 -436 5833 5838 -437 5724 5843 -439 5593 5595 -441 5951 5958 -444 5830 5831 -446 5713 5831 -449 5831 5951 -449 2286 5949 -453 5722 5725 -453 5709 5829 -454 5599 5600 -454 5591 5710 -455 5834 5842 -458 5480 5599 -459 5724 5837 -462 5589 5592 -462 6084 6202 -464 5598 5603 -465 2055 5712 -472 5954 5955 -473 1940 5710 -476 5594 5708 -477 5856 5975 -482 2174 5830 -482 5844 5963 -484 5714 5721 -488 5592 5708 -490 6083 6090 -501 1802 1807 -503 1805 1807 -504 1689 1806 -507 1569 1679 -507 1693 1805 -510 1688 1693 -511 1575 1690 -518 1799 1807 -520 1227 1340 -521 1803 1804 -522 1347 1463 -525 1575 1691 -528 1804 1925 -529 1581 1697 -531 1446 1562 -531 1573 1576 -535 1574 1575 -536 1802 1809 -548 1692 1693 -552 1693 1807 -553 1575 1692 -553 1819 1821 -555 1699 1813 -560 1922 1925 -569 5109 5111 -569 1705 1819 -576 1570 1690 -580 1808 1809 -584 1581 1696 -586 1471 5111 -589 1459 1576 -599 1702 1705 -502 2160 2167 -503 1922 1924 -503 2036 2037 -504 1922 2037 -504 2169 5830 -505 2057 2174 -505 2168 2283 -507 1924 2040 -507 2281 2390 -514 2162 2167 -514 2167 2168 -515 1929 1934 -515 2044 2159 -524 1929 1936 -530 2165 2167 -536 2167 2282 -549 2158 2274 -549 2519 2520 -560 1922 1925 -560 2035 2039 -560 2158 2276 -561 2289 5832 -562 1932 1939 -562 2263 2372 -567 2041 2157 -567 2381 2382 -581 1920 2037 -583 1920 1927 -583 5950 5953 -586 2042 2045 -593 5951 5952 -596 5833 5950 -600 2158 2159 -502 5254 5255 -507 5232 5237 -508 5473 5478 -511 5239 5240 -512 5111 5112 -513 5233 5353 -519 4901 5011 -519 5012 5122 -522 5235 5238 -522 5240 5241 -523 5260 5261 -523 5364 5369 -525 5490 5608 -528 5237 5238 -538 5479 5480 -542 5488 5493 -553 5611 5613 -555 5246 5365 -555 5489 5608 -557 4895 5005 -561 5481 5601 -564 5140 5141 -569 5109 5111 -571 5114 5235 -572 5488 5495 -573 5230 5237 -582 5490 5492 -584 5024 5134 -586 1471 5111 -587 5244 5367 -587 5352 5354 -587 5490 5495 -591 5486 5599 -594 5347 5348 -502 5959 6077 -504 2169 5830 -507 5606 5726 -519 5835 5948 -521 5967 6086 -523 5733 5852 -524 5719 5842 -529 5609 5728 -529 5833 5836 -541 5956 5958 -541 5968 5971 -547 5717 5723 -549 5961 6074 -551 6071 6190 -553 5611 5613 -554 5588 5710 -558 5594 5714 -559 5592 5713 -561 5481 5601 -564 5970 6083 -568 5853 5972 -569 5592 5716 -574 5606 5727 -574 5835 5955 -579 5592 5710 -583 5950 5953 -590 5855 5862 -591 5486 5599 -591 5718 5831 -593 5951 5952 -596 5605 5726 -596 5833 5950 -602 1820 1821 -603 1461 1571 -606 1683 1793 -607 1808 1815 -609 1322 1329 -610 1583 1585 -615 1576 1579 -616 1699 1811 -621 1557 1673 -622 1583 5229 -630 1468 1470 -634 1470 1471 -634 5111 5229 -635 1469 1471 -635 1469 1586 -639 1572 1576 -639 1698 1814 -639 1809 1926 -644 5229 5230 -645 1588 1702 -649 1690 1693 -652 1696 1813 -656 1574 1579 -657 1693 1813 -658 1819 1820 -659 1467 1577 -661 1455 1565 -669 1695 1811 -677 1100 1107 -678 1221 1334 -679 1433 1440 -679 1688 1696 -680 1687 1807 -682 1812 1816 -683 1689 1799 -689 1585 5229 -690 1701 1811 -692 1007 1014 -693 1466 1471 -696 1328 1335 -699 1582 1585 -601 1928 2048 -606 2619 2620 -610 2162 2165 -613 2387 2388 -615 2040 2047 -615 2266 2375 -619 2039 2159 -622 2053 2057 -624 2151 2156 -626 2053 2171 -627 2169 2174 -627 2287 2402 -628 2172 5830 -629 2291 2402 -634 2619 2621 -637 2034 2042 -639 1809 1926 -641 2613 2614 -646 1924 2034 -649 2145 2152 -649 2136 2137 -652 2626 2730 -653 2148 2155 -654 1932 1933 -655 1934 2048 -656 2501 2502 -660 2274 2276 -662 2253 2254 -672 1934 1937 -673 2369 2370 -675 2146 2262 -678 1917 1924 -685 2052 2054 -689 1929 1930 -697 1917 2034 -700 2057 5709 -604 5611 5618 -605 4907 5017 -611 5244 5359 -628 5245 5252 -634 5111 5229 -644 5229 5230 -647 5023 5024 -648 5012 5128 -651 4897 4898 -658 5111 5230 -659 5267 5380 -660 5608 5613 -661 5602 5603 -667 5236 5238 -675 5159 5272 -675 5247 5250 -681 5604 5607 -684 5386 5387 -684 5475 5478 -603 5953 5956 -604 5611 5618 -605 6076 6078 -617 6440 6447 -622 5716 5717 -625 5966 5973 -627 5956 6076 -628 2172 5830 -631 6071 6078 -634 5610 5612 -640 5592 5598 -643 5595 5598 -645 5599 5604 -646 5987 5994 -647 5610 5615 -648 5959 6076 -658 5605 5606 -658 5729 5734 -660 5608 5613 -661 5602 5603 -662 5593 5598 -664 6331 6338 -676 5615 5734 -681 5604 5607 -689 5726 5727 -690 5603 5723 -690 5604 5723 -690 5833 5953 -691 5867 5874 -694 5598 5717 -697 5714 5716 -700 2057 5709 -701 1448 1449 -710 1810 1813 -711 1467 1583 -714 1574 1581 -727 1459 1573 -749 1453 1459 -753 1571 1573 -755 1442 1449 -755 1799 1806 -759 1661 1668 -759 1685 1690 -762 1453 1456 -764 1804 1920 -770 1571 1572 -772 1442 1448 -774 1581 1691 -778 1319 1326 -778 1699 1702 -778 1698 1813 -784 1587 1697 -788 1570 1576 -789 1684 1690 -791 1796 1803 -792 1106 1113 -794 1583 1586 -797 1335 1445 -797 5107 5109 -799 1451 1452 -800 1806 1809 -702 5829 5948 -704 1919 1920 -708 2376 2483 -711 2291 5949 -716 2037 2044 -721 2160 2162 -724 2489 2490 -728 1918 1919 -728 1927 2042 -730 2496 2601 -731 5832 5950 -732 1928 1931 -734 2279 2281 -738 2020 2130 -750 1918 2034 -752 2055 5710 -757 2608 2712 -764 1804 1920 -772 2276 2277 -773 2153 2156 -775 2275 2390 -783 2401 2403 -787 2286 5829 -791 1929 1937 -792 2035 2151 -798 1932 1934 -708 4793 4900 -709 5036 5146 -711 5243 5356 -724 5152 5153 -726 5239 5246 -733 5483 5602 -746 5245 5253 -754 5236 5243 -756 5245 5250 -758 5230 5232 -762 4919 5029 -764 5607 5610 -770 5347 5355 -771 5364 5487 -787 5234 5235 -789 5125 5132 -791 5364 5484 -797 5107 5109 -702 5829 5948 -703 5732 5734 -710 6227 6343 -711 2291 5949 -711 6221 6337 -719 5597 5711 -719 5846 5847 -725 5753 5760 -730 5618 5732 -731 5832 5950 -734 5853 5966 -734 6080 6081 -745 5958 6071 -751 6101 6108 -752 2055 5710 -754 5598 5601 -755 5721 5834 -755 6107 6114 -759 5965 6088 -764 5607 5610 -770 5725 5728 -771 5954 6074 -772 5963 5965 -774 5965 6082 -775 5845 5848 -793 6199 6200 -793 6446 6453 -795 5727 5840 -795 5961 6082 -799 5734 5737 -804 1454 1455 -805 1098 1211 -807 1687 1689 -809 1331 1332 -810 984 1094 -817 1332 1450 -820 1326 1442 -826 1442 1444 -827 1221 1333 -834 1911 1918 -846 1095 1208 -846 1821 1822 -851 1691 1692 -855 1800 1804 -858 1574 1580 -865 1338 1448 -867 995 1002 -871 1703 1704 -872 1196 1203 -872 1687 1799 -876 1819 1822 -880 1197 1310 -882 1332 1333 -883 881 989 -883 1687 1801 -886 1082 1089 -887 1587 1704 -887 1689 1807 -888 1704 5351 -890 1818 1937 -897 1690 1691 -804 1919 1922 -809 2149 2265 -824 1921 2037 -825 2052 5710 -834 1911 1918 -834 2041 2158 -835 2041 2045 -849 1921 2031 -856 2037 2042 -872 1917 1919 -888 5950 5952 -890 1818 1937 -803 5467 5468 -807 5011 5018 -808 5130 5250 -808 5254 5261 -813 5130 5253 -819 5131 5132 -819 5485 5492 -819 5488 5490 -834 4882 4883 -842 5364 5370 -845 5352 5467 -847 5227 5234 -848 5370 5490 -853 5125 5131 -855 5485 5493 -862 5020 5021 -863 5228 5348 -871 5599 5601 -874 5108 5114 -876 5366 5370 -878 5008 5015 -878 5369 5488 -879 5015 5133 -885 5021 5131 -888 1704 5351 -890 5125 5133 -890 5366 5485 -812 6081 6085 -814 5850 5968 -818 6452 6459 -819 5725 5730 -820 5723 5725 -825 2052 5710 -826 5604 5728 -832 5725 5842 -837 6102 6220 -846 5959 6082 -846 5973 6086 -861 6084 6201 -870 5598 5716 -871 5599 5601 -871 5725 5845 -871 6085 6201 -887 6233 6349 -892 6077 6196 -899 6337 6344 -903 1576 1578 -904 1336 1339 -909 1704 1705 -909 1806 1917 -913 1218 1325 -913 1700 1705 -923 1470 1586 -924 1304 1311 -929 880 887 -929 978 1088 -931 875 983 -934 1325 1330 -936 1459 1574 -940 1571 1576 -948 1695 1813 -950 1325 1332 -955 1821 1937 -962 1212 1325 -968 1421 1428 -970 1336 1450 -972 1816 1821 -974 1817 1818 -978 1076 1083 -980 1806 1807 -986 1577 1579 -987 1325 1333 -994 1457 1458 -995 1216 1328 -999 1214 1215 -1000 1810 1925 -904 2162 2277 -907 1923 1924 -907 2172 5832 -909 1806 1917 -909 2396 2403 -916 2291 6070 -917 2391 2504 -918 5829 5830 -919 2157 2158 -921 2405 5952 -923 1915 1916 -923 2259 2266 -940 2043 2050 -948 1913 1916 -951 2040 2048 -952 2279 2398 -955 1821 1937 -955 2405 2519 -964 2276 2282 -964 2498 2505 -967 2256 2263 -973 2043 2160 -979 1932 1937 -984 2390 2392 -998 2392 2395 -1000 1810 1925 -902 5132 5251 -904 5131 5251 -911 4786 4787 -922 5242 5249 -934 5360 5479 -939 5136 5138 -946 5488 5489 -969 5249 5362 -976 5364 5367 -979 5257 5259 -979 5257 5264 -981 5249 5368 -983 5243 5362 -988 5393 5506 -994 5248 5255 -906 5966 5974 -907 2172 5832 -916 2291 6070 -918 5829 5830 -926 6092 6093 -936 5600 5722 -936 5963 5968 -937 5963 5964 -940 5853 5974 -941 5851 5856 -946 5966 5971 -948 5858 5859 -951 5840 5960 -963 5847 5960 -966 5605 5612 -973 5838 5951 -979 5852 5857 -987 5851 5974 -988 5730 5843 -993 5841 5845 -994 6355 6362 -996 5851 5854 -997 5965 5968 -1007 1683 1801 -1015 1575 1581 -1016 1693 1696 -1017 1465 1582 -1018 1676 1677 -1019 1332 1336 -1024 1464 1574 -1026 1532 1539 -1027 1212 1319 -1036 1442 1559 -1042 1087 1090 -1043 1790 1797 -1044 1678 1681 -1044 1804 1919 -1059 1330 1444 -1059 1458 1568 -1066 1690 1692 -1071 1792 1905 -1073 1692 1807 -1074 1212 1216 -1077 1690 1807 -1080 1071 1184 -1083 1326 1436 -1090 1705 5469 -1098 1681 1684 -1003 2505 2610 -1004 2168 2288 -1013 2257 2372 -1029 2372 2373 -1037 2154 2161 -1037 2162 2168 -1040 2279 2282 -1044 1804 1919 -1050 1933 1939 -1055 2276 2279 -1064 2389 2506 -1071 1792 1905 -1073 2162 2282 -1078 2278 2392 -1084 2156 2161 -1085 6072 6190 -1089 2719 2820 -1014 5512 5513 -1019 5370 5487 -1026 5010 5013 -1032 5228 5347 -1032 5244 5362 -1033 5130 5135 -1059 5009 5013 -1064 5240 5244 -1070 5488 5608 -1076 5480 5481 -1078 5015 5016 -1085 5029 5030 -1088 5252 5253 -1089 5130 5133 -1090 5127 5128 -1090 1705 5469 -1091 5118 5241 -1094 5487 5490 -1096 5235 5237 -1002 6081 6199 -1004 5962 5964 -1008 5955 5956 -1010 5841 5847 -1011 5968 5969 -1014 5961 6080 -1015 5954 5961 -1016 6206 6316 -1018 5948 5956 -1020 6671 6678 -1022 5844 5845 -1023 5714 5715 -1023 5841 5842 -1032 5843 5844 -1032 5841 5844 -1033 5967 5968 -1038 5963 5969 -1039 5972 5973 -1041 6238 6245 -1044 5844 5962 -1048 5966 5968 -1052 5839 5841 -1053 6428 6435 -1054 5953 5958 -1056 5961 5967 -1060 6076 6079 -1071 6083 6084 -1071 6322 6323 -1072 5839 5954 -1082 6433 6435 -1085 6072 6190 -1088 5754 5873 -1088 5834 5841 -1097 5728 5729 -1098 5843 5849 -1102 1336 1456 -1113 1688 1695 -1117 1801 1802 -1118 731 738 -1118 1696 1698 -1121 1335 1450 -1132 1327 1330 -1136 1453 1455 -1139 1330 1442 -1139 1686 1801 -1142 646 653 -1149 1802 1803 -1155 1327 1444 -1157 953 960 -1158 1216 1327 -1169 1341 1451 -1173 643 650 -1176 1806 1923 -1178 1696 1699 -1181 552 652 -1184 1216 1330 -1185 1330 1335 -1186 1686 1796 -1198 640 647 -1101 2839 2937 -1102 2044 2160 -1107 2274 2279 -1112 6069 6073 -1114 2152 2268 -1128 1912 2028 -1131 2165 2168 -1144 2043 2048 -1148 2402 6068 -1152 2269 2384 -1156 2051 2171 -1159 2150 2270 -1174 2269 2378 -1176 1806 1923 -1176 2269 2386 -1181 2385 2492 -1193 2404 2407 -1194 2516 2521 -1198 1930 2046 -1199 2384 2385 -1103 5611 5616 -1105 5015 5019 -1111 5014 5021 -1113 5493 5496 -1114 4892 5010 -1115 5250 5253 -1127 4891 4892 -1128 5248 5250 -1131 5132 5245 -1133 5136 5259 -1133 5256 5371 -1135 5253 5256 -1139 5495 5496 -1142 4890 4892 -1144 4880 4884 -1146 5014 5022 -1156 5014 5016 -1157 5244 5249 -1159 5011 5128 -1163 5258 5377 -1164 4483 4582 -1174 4360 4361 -1174 5015 5131 -1176 5014 5019 -1178 5239 5247 -1179 5262 5265 -1181 5247 5249 -1187 4772 4885 -1187 5016 5019 -1187 5130 5248 -1190 4588 4589 -1194 4476 4477 -1200 5247 5248 -1103 5611 5616 -1103 6107 6108 -1105 6204 6207 -1111 6201 6202 -1112 6069 6073 -1112 6210 6324 -1114 5739 5860 -1128 5597 5716 -1135 5852 5858 -1141 6084 6090 -1148 2402 6068 -1148 6200 6204 -1150 5865 5978 -1150 6206 6323 -1152 5720 5727 -1157 5854 5857 -1160 5833 5951 -1168 5604 5606 -1168 5849 5850 -1173 6074 6075 -1175 5743 5860 -1180 5959 5962 -1181 5610 5728 -1190 5960 5967 -1195 5951 5956 -1195 6204 6318 -1212 641 743 -1212 1692 1808 -1213 1680 1796 -1215 557 564 -1216 664 671 -1216 737 744 -1220 1098 1205 -1231 1680 1681 -1234 1451 1457 -1237 1681 1795 -1245 1179 1292 -1247 1576 1690 -1249 1092 1199 -1249 1324 1436 -1254 473 480 -1260 468 563 -1260 551 558 -1260 1695 1696 -1265 1211 1212 -1265 1693 1695 -1269 1332 1442 -1272 1808 1810 -1277 1670 1677 -1280 1178 1185 -1287 1320 1430 -1289 1679 1685 -1291 1694 1696 -1294 1212 1218 -1294 1564 1678 -1296 844 851 -1297 549 649 -1298 1324 1438 -1298 1670 1675 -1210 2165 2171 -1211 2500 2506 -1214 2279 2284 -1227 6068 6069 -1233 2269 2273 -1233 2492 2499 -1235 2153 2270 -1248 2385 2498 -1258 2263 2378 -1267 2516 6187 -1268 2050 2166 -1268 2146 2264 -1268 3111 3198 -1269 1906 1907 -1272 2500 2501 -1273 2493 2604 -1277 2497 2499 -1277 2521 6306 -1280 2395 2398 -1283 2054 2171 -1283 2501 2508 -1292 2401 2407 -1295 2800 2898 -1299 3034 3125 -1201 5258 5379 -1203 4902 5014 -1204 5256 5258 -1207 5248 5249 -1209 4595 4698 -1213 5242 5362 -1214 4704 4705 -1214 4784 4897 -1216 5131 5133 -1220 4367 4464 -1222 5359 5360 -1231 5467 5475 -1232 5244 5361 -1234 4373 4470 -1234 5500 5501 -1235 4168 4255 -1239 5490 5613 -1244 5129 5247 -1254 5607 5608 -1255 5131 5136 -1260 4261 4262 -1262 5124 5241 -1262 5260 5262 -1271 5611 5612 -1272 5124 5129 -1273 5120 5241 -1281 5128 5129 -1282 5020 5027 -1283 5264 5265 -1286 5262 5267 -1293 4370 4467 -1296 4363 4364 -1299 4711 4816 -1202 5957 5958 -1203 5723 5728 -1214 5969 5971 -1215 6329 6437 -1217 5837 5842 -1220 5730 5848 -1221 5610 5731 -1221 5853 5854 -1227 5957 5959 -1227 6068 6069 -1228 6684 6791 -1230 6379 6386 -1230 6477 6590 -1230 6902 6909 -1236 5849 5851 -1239 5490 5613 -1243 5729 5736 -1245 6077 6078 -1253 5610 5734 -1257 5609 5723 -1265 5963 6083 -1267 2516 6187 -1271 5611 5612 -1273 5956 5959 -1278 5745 5858 -1278 5863 5866 -1279 5962 5965 -1279 6079 6082 -1279 6262 6269 -1281 6690 6797 -1284 5840 5847 -1285 6992 7088 -1288 5966 5967 -1288 6584 6591 -1288 6579 6689 -1290 6090 6202 -1293 6780 6884 -1296 5721 5840 -1297 5597 5598 -1297 5853 5857 -1300 5745 5749 -1302 1235 1236 -1303 1455 1573 -1304 1222 1333 -1311 1678 1679 -1313 1210 1216 -1324 548 555 -1328 1796 1797 -1329 1329 1439 -1331 1670 1671 -1341 1210 1213 -1342 1584 1700 -1344 1678 1680 -1356 4995 5109 -1361 1801 1804 -1366 1807 1808 -1367 459 554 -1374 1314 1424 -1374 1287 1403 -1376 1215 1322 -1377 750 856 -1382 1328 1330 -1388 647 749 -1395 1096 1207 -1399 1330 1445 -1307 2689 2790 -1308 2497 2612 -1315 2154 2156 -1316 2521 6188 -1318 2171 2173 -1320 2264 2267 -1325 2695 2796 -1326 2898 2899 -1328 3028 3119 -1329 2799 2800 -1331 3138 3225 -1332 2908 3003 -1334 2045 2048 -1334 2045 2047 -1337 2500 2503 -1338 2161 2277 -1343 2261 2380 -1343 2910 2911 -1349 2045 2051 -1352 2264 2270 -1353 1922 2042 -1353 2565 2566 -1356 2454 2559 -1356 2676 2677 -1358 1917 1918 -1358 2803 2901 -1360 2057 2172 -1364 2577 2578 -1366 2815 2913 -1370 3131 3132 -1374 2707 2808 -1384 2229 2230 -1397 3031 3122 -1399 2162 2274 -1302 4473 4474 -1304 5370 5493 -1305 4364 4461 -1307 4271 4363 -1308 4990 4995 -1310 5263 5270 -1311 4592 4695 -1316 5122 5129 -1316 5133 5136 -1317 5072 5182 -1317 5256 5261 -1318 4274 4366 -1320 4701 4702 -1320 4828 4829 -1321 5375 5493 -1325 4480 4579 -1326 5489 5490 -1330 5241 5242 -1330 5374 5375 -1333 4717 4822 -1333 5024 5141 -1350 4364 4368 -1352 4262 4360 -1355 4363 4368 -1356 4995 5109 -1357 4585 4586 -1362 5370 5373 -1367 5496 5613 -1369 4155 4156 -1369 5239 5241 -1375 5473 5480 -1375 5617 5622 -1376 4708 4813 -1377 4835 4942 -1380 4585 4695 -1388 5132 5138 -1389 4162 4249 -1389 4265 4357 -1393 5241 5247 -1398 5107 5114 -1309 6327 6330 -1310 5898 6017 -1314 6578 6585 -1319 5725 5848 -1321 5717 5718 -1324 5739 5745 -1333 6208 6209 -1341 6322 6437 -1343 5832 5951 -1354 5590 5595 -1363 5957 5964 -1367 5496 5613 -1368 5604 5722 -1374 5745 5866 -1375 5617 5622 -1380 5732 5852 -1380 5839 5845 -1387 5839 5956 -1388 5594 5595 -1393 5749 5866 -1395 5751 5864 -1395 6443 6444 -1401 1286 1293 -1403 1096 1205 -1404 1205 1213 -1407 554 561 -1407 1327 1328 -1410 474 569 -1411 1800 1801 -1420 1575 1576 -1422 1328 1333 -1422 1397 1404 -1426 1448 1450 -1433 1458 1573 -1448 1327 1329 -1451 1070 1077 -1454 560 567 -1454 850 857 -1463 1564 1684 -1464 1684 1687 -1467 1664 1781 -1479 1453 1458 -1481 1324 1326 -1481 1585 1588 -1486 1587 1702 -1489 1468 1471 -1497 1564 1569 -1405 2919 2920 -1407 2157 2162 -1413 2393 2399 -1418 2700 2707 -1435 3021 3022 -1436 2809 2907 -1437 2375 2380 -1442 2391 2392 -1454 2925 2926 -1461 2598 2605 -1463 2157 2164 -1465 2034 2041 -1483 2259 2265 -1483 2393 2395 -1483 2497 2502 -1493 2393 2400 -1405 5246 5250 -1434 5253 5255 -1436 5107 5115 -1449 5373 5493 -1458 5254 5374 -1470 4367 4368 -1476 5467 5469 -1476 5372 5491 -1483 4899 4902 -1485 5116 5123 -1493 5263 5264 -1496 4790 4903 -1499 4707 4708 -1409 5743 5861 -1415 6333 6445 -1419 5616 5737 -1421 5742 5855 -1422 5970 6088 -1434 6367 6374 -1435 6330 6445 -1441 5739 5858 -1451 5856 5969 -1456 5618 5740 -1459 5624 5744 -1459 5739 5852 -1460 5731 5851 -1469 5971 5974 -1473 6356 6470 -1480 5999 6006 -1484 5993 6000 -1486 5840 5842 -1491 5737 5740 -1492 5844 5957 -1496 5871 5984 -1498 5732 5737 -1500 5829 5833 -1502 1450 1451 -1514 1227 1334 -1514 1324 1329 -1515 1464 1465 -1518 1085 1086 -1518 1448 1453 -1532 1085 1087 -1537 1081 1084 -1537 1552 1672 -1543 1093 1096 -1546 1693 1808 -1551 1800 1911 -1556 973 1087 -1559 1676 1683 -1563 1096 1101 -1563 1329 1444 -1566 1086 1087 -1571 1101 1208 -1576 1090 1093 -1576 1466 5108 -1577 985 1099 -1580 1094 1101 -1581 1085 1199 -1583 974 975 -1587 1082 1084 -1600 983 990 -1505 2379 2380 -1506 2049 2056 -1512 3128 3129 -1516 2383 2385 -1519 2700 2701 -1521 2155 2271 -1526 2384 2391 -1532 2606 2609 -1534 2156 2270 -1535 2402 5949 -1536 2170 2286 -1537 2053 2169 -1538 2036 2039 -1539 2507 2508 -1551 1800 1911 -1553 2604 2606 -1555 2498 2500 -1560 2931 2932 -1561 2599 2709 -1562 2035 2041 -1568 2713 2814 -1571 2389 2500 -1577 2694 2701 -1597 2383 2492 -1598 2701 2808 -1503 5491 5493 -1505 5260 5380 -1510 5013 5127 -1526 4889 4999 -1530 5376 5491 -1531 5118 5124 -1532 5142 5259 -1536 4897 4904 -1548 5131 5138 -1550 5246 5367 -1553 4706 4708 -1566 5136 5142 -1571 5371 5379 -1576 1466 5108 -1579 5165 5278 -1580 5352 5475 -1580 5382 5385 -1582 5478 5483 -1501 5977 6094 -1506 6005 6012 -1515 5869 5872 -1526 5954 5959 -1535 2402 5949 -1536 5842 5845 -1537 5871 5991 -1543 5766 5885 -1548 5965 5967 -1550 5849 5856 -1576 5632 5633 -1585 5875 5992 -1590 5844 5850 -1590 6244 6251 -1595 5742 5861 -1595 5990 5991 -1596 5748 5861 -1605 1207 1208 -1614 1235 1237 -1618 1088 1090 -1621 1210 1215 -1652 1088 1095 -1652 1330 1332 -1653 979 981 -1665 1208 1210 -1668 1092 1205 -1672 876 988 -1689 1683 1799 -1700 1451 1453 -1605 2256 2261 -1613 2045 2165 -1625 2155 2272 -1629 2389 2498 -1632 2038 2039 -1644 2381 2388 -1654 2493 2606 -1660 2144 2261 -1660 2279 2392 -1679 2278 2279 -1683 2151 2159 -1689 2254 2255 -1700 2261 2264 -1609 5136 5139 -1612 4789 4796 -1620 5123 5124 -1622 5232 5234 -1645 5237 5355 -1646 4902 5022 -1675 5255 5373 -1679 4905 4908 -1693 5255 5256 -1695 4889 4890 -1609 5621 5735 -1620 5750 5752 -1631 6074 6082 -1632 6098 6099 -1633 5855 5857 -1638 5743 5866 -1639 5725 5727 -1653 5854 5856 -1667 5960 5961 -1670 5977 6092 -1672 5749 5751 -1698 5970 5971 -1699 6080 6085 -1704 979 982 -1707 1106 1108 -1746 1002 1113 -1756 1227 1339 -1759 1685 1686 -1764 1793 1800 -1765 1122 1236 -1771 866 968 -1774 1216 1333 -1779 1689 1693 -1792 1187 1188 -1702 2250 2257 -1704 2387 2394 -1716 2153 2154 -1729 2258 2261 -1744 1903 2013 -1755 2517 2622 -1757 2039 2153 -1759 2045 2050 -1762 2521 2628 -1770 2251 2366 -1772 2265 2272 -1774 2151 2153 -1780 2395 2397 -1786 1922 2036 -1793 2593 2703 -1800 2631 2632 -1702 5251 5252 -1707 5504 5510 -1710 5384 5390 -1711 5254 5256 -1715 5390 5503 -1724 5258 5371 -1726 5503 5504 -1727 5018 5134 -1728 4905 5022 -1728 5121 5124 -1739 5503 5505 -1740 4544 4647 -1759 4996 5004 -1759 5384 5503 -1765 5256 5374 -1767 4431 4432 -1767 4896 5010 -1769 4772 4886 -1778 5384 5504 -1785 5114 5115 -1787 5470 5472 -1790 5149 5150 -1790 5267 5385 -1794 5119 5121 -1795 4886 4890 -1799 5123 5241 -1704 5839 5962 -1716 6217 6218 -1722 5960 5968 -1723 6084 6085 -1726 6080 6088 -1738 6078 6195 -1738 6317 6318 -1741 5720 5725 -1753 6077 6083 -1761 6317 6321 -1763 6090 6091 -1764 6092 6094 -1765 5965 6080 -1771 5974 5975 -1776 6097 6100 -1782 5737 5742 -1789 5967 5973 -1789 6092 6097 -1796 5976 5977 -1796 6215 6325 -1806 1100 1102 -1814 1354 5109 -1825 1324 1327 -1825 1570 1685 -1829 1798 1800 -1832 1575 1685 -1834 1563 1678 -1843 1352 4994 -1844 1576 1581 -1844 1799 1801 -1849 1208 1209 -1851 1579 1582 -1856 1339 1341 -1860 1198 1203 -1860 1218 1333 -1865 1122 1237 -1868 1210 1327 -1877 1554 1670 -1892 1230 1345 -1894 1670 1678 -1898 973 976 -1900 1222 1339 -1807 6305 6306 -1814 2616 2617 -1815 2011 2017 -1816 2034 2035 -1820 2625 2632 -1824 2015 2017 -1833 2264 2266 -1833 2282 2284 -1840 2017 2018 -1841 2017 2133 -1847 2016 2017 -1848 2603 2608 -1851 2010 2018 -1857 2377 2380 -1858 2017 2135 -1859 2603 2717 -1863 2742 6308 -1869 2164 2168 -1871 2608 2717 -1871 2626 2735 -1881 2375 2382 -1890 2150 2153 -1890 2606 2607 -1898 2133 2134 -1804 5266 5268 -1805 5265 5268 -1810 5352 5357 -1813 5259 5260 -1814 1354 5109 -1814 5257 5262 -1814 5377 5379 -1821 5006 5122 -1824 4895 5010 -1831 4759 4760 -1837 5268 5271 -1843 1352 4994 -1843 5270 5271 -1848 4663 4768 -1850 5269 5276 -1850 5268 5273 -1852 5629 5634 -1867 5251 5258 -1877 4992 4995 -1881 5267 5268 -1883 5510 5631 -1884 5256 5373 -1887 5271 5274 -1888 5386 5506 -1889 5635 5636 -1894 5112 5114 -1894 5114 5233 -1803 5977 6097 -1807 6305 6306 -1811 6090 6207 -1812 5972 5974 -1814 6073 6187 -1830 6426 6430 -1833 6331 6332 -1834 6099 6211 -1836 6088 6090 -1837 6093 6094 -1846 6089 6090 -1847 6223 6224 -1848 5630 5750 -1852 5629 5634 -1857 6309 6419 -1860 5960 5965 -1860 6085 6207 -1867 6310 6318 -1872 5865 5986 -1872 5973 5974 -1872 6218 6328 -1874 6444 6448 -1875 6211 6219 -1875 6216 6219 -1880 6310 6311 -1883 5510 5631 -1889 5635 5636 -1889 6230 6340 -1894 6311 6419 -1896 6311 6427 -1897 6098 6105 -1910 1349 4991 -1915 975 1086 -1915 1115 1120 -1922 1463 1464 -1923 1350 4991 -1925 989 990 -1926 990 1094 -1938 1084 1087 -1942 1085 1090 -1942 1089 1196 -1945 1570 1575 -1946 1466 5109 -1950 1213 1215 -1979 860 962 -1980 1095 1202 -1997 1096 1208 -1999 1332 1449 -1918 2168 2282 -1921 2384 2386 -1923 2134 2252 -1923 2520 2631 -1931 2260 2376 -1932 1918 2028 -1933 2255 2374 -1936 2156 2276 -1938 2625 2627 -1939 2519 6189 -1951 2496 2607 -1951 2515 2630 -1955 6191 6307 -1959 2163 2164 -1962 2152 2270 -1967 2056 5712 -1974 2516 2518 -1975 2377 2489 -1977 2028 2035 -1988 2605 2715 -1992 2626 2736 -1994 2493 2598 -1998 2238 2245 -1906 5119 5120 -1910 1349 4991 -1910 5274 5389 -1915 5156 5275 -1920 4760 4761 -1923 1350 4991 -1925 5388 5505 -1929 5017 5024 -1929 5117 5236 -1931 4874 4992 -1931 5508 5511 -1933 5233 5235 -1937 5375 5494 -1943 5011 5012 -1946 1466 5109 -1951 5385 5505 -1953 5386 5393 -1964 5154 5274 -1967 4873 4881 -1976 5508 5513 -1980 5113 5120 -1989 5266 5273 -1991 4886 4996 -1994 5269 5270 -1995 5371 5373 -1904 6434 6441 -1905 6339 6451 -1906 6222 6225 -1906 6445 6446 -1910 5719 5724 -1922 5985 6104 -1924 6085 6090 -1925 6325 6332 -1935 6448 6559 -1937 5867 5868 -1937 6107 6109 -1948 6217 6222 -1955 6191 6307 -1956 5959 5961 -1962 6081 6082 -1965 6456 6563 -1966 6236 6346 -1966 6310 6315 -1979 5730 5849 -1979 6446 6447 -1985 6228 6231 -2002 984 990 -2009 1216 1325 -2019 984 1088 -2024 1081 1195 -2025 1091 1092 -2038 1080 1081 -2039 1078 1189 -2046 1565 1570 -2047 864 970 -2048 752 753 -2057 1079 1080 -2062 1329 1445 -2064 968 976 -2070 1331 1338 -2075 1802 1804 -2076 1073 1074 -2083 974 979 -2088 980 981 -2098 1224 1331 -2014 2389 2394 -2015 2601 2608 -2017 2255 2371 -2017 2379 2494 -2022 2711 2714 -2026 2609 2612 -2034 2709 2716 -2038 2249 2368 -2044 2140 2144 -2044 2156 2271 -2052 2251 2368 -2054 2613 2615 -2056 2282 2398 -2056 2710 2817 -2058 2155 2270 -2059 2489 2495 -2060 2369 2371 -2063 2379 2486 -2067 2028 2034 -2074 2486 2487 -2074 2496 2497 -2086 2491 2494 -2088 2371 2374 -2092 2260 2375 -2092 2374 2375 -2100 2390 2391 -2004 5277 5280 -2006 5386 5392 -2007 5014 5015 -2008 5382 5384 -2021 5138 5259 -2023 5259 5262 -2027 5269 5274 -2027 5490 5493 -2030 5155 5162 -2033 5122 5128 -2040 5378 5379 -2043 5009 5119 -2046 5271 5272 -2061 5277 5279 -2064 5268 5391 -2073 4996 5003 -2074 5162 5163 -2076 5160 5283 -2080 5274 5277 -2089 5233 5234 -2094 4993 5000 -2098 5268 5385 -2014 5850 5969 -2016 6203 6318 -2018 6557 6558 -2021 5849 5854 -2028 5721 5842 -2032 5729 5849 -2034 6449 6450 -2045 5731 5854 -2060 6203 6204 -2070 6663 6764 -2090 6559 6560 -2098 5730 5736 -2099 6210 6325 -2099 6327 6329 -2102 1082 1083 -2105 1330 1450 -2114 1093 1094 -2129 971 976 -2132 1088 1093 -2138 1336 1338 -2159 863 864 -2162 1067 1068 -2166 977 978 -2168 759 859 -2173 861 864 -2173 1076 1078 -2188 869 971 -2198 861 867 -2199 1090 1095 -2103 2704 2811 -2105 2602 2712 -2106 2285 2398 -2107 2503 2615 -2108 2607 2612 -2114 2259 2261 -2117 2368 2369 -2123 2615 2618 -2128 2282 2285 -2129 2255 2369 -2130 2377 2382 -2135 2706 2713 -2136 2382 2495 -2136 2611 2721 -2156 2150 2264 -2159 2255 2368 -2172 2604 2605 -2182 2805 2812 -2195 2708 2819 -2196 2811 2817 -2199 2262 2264 -2103 5153 5272 -2108 5045 5161 -2109 4878 4993 -2110 5278 5285 -2111 5256 5379 -2112 5160 5275 -2113 5161 5162 -2118 5629 5636 -2121 4648 4759 -2121 5044 5051 -2139 5159 5277 -2148 5163 5166 -2156 5273 5392 -2159 5386 5388 -2165 5168 5281 -2176 5166 5169 -2179 5158 5278 -2180 4907 5023 -2185 4794 4911 -2196 5164 5166 -2198 4880 4998 -2114 6353 6461 -2118 5629 5636 -2123 6079 6201 -2125 6327 6332 -2130 6454 6565 -2131 5610 5726 -2137 6564 6668 -2150 6569 6570 -2154 6558 6559 -2158 6234 6237 -2162 5846 5848 -2168 5882 5883 -2172 6322 6324 -2177 6453 6560 -2177 6558 6564 -2184 5964 5965 -2184 6202 6207 -2187 6199 6201 -2187 6562 6670 -2192 6203 6209 -2194 6557 6564 -2196 6207 6209 -2197 6685 6796 -2203 1803 1920 -2206 981 1091 -2211 62 63 -2220 757 861 -2223 860 861 -2223 1079 1086 -2228 1088 1094 -2231 976 978 -2233 859 866 -2233 1095 1207 -2238 419 420 -2239 1321 1327 -2240 1074 1075 -2251 335 419 -2257 413 414 -2258 757 859 -2262 751 754 -2266 1073 1080 -2267 420 509 -2270 145 146 -2271 1319 1327 -2273 414 503 -2273 650 746 -2274 329 413 -2274 979 1093 -2275 328 329 -2275 1797 1914 -2278 1322 1327 -2290 648 650 -2294 753 853 -2202 2265 2267 -2203 1803 1920 -2206 2811 2818 -2207 2621 2729 -2227 2377 2494 -2230 2814 2819 -2234 2602 2713 -2236 2360 2367 -2240 2033 2150 -2243 2609 2723 -2244 2813 2816 -2254 2806 2910 -2256 2361 2474 -2261 2812 2816 -2263 1918 2036 -2265 1916 2030 -2271 2817 2818 -2275 1797 1914 -2281 2373 2379 -2285 2609 2614 -2288 2810 2918 -2291 2148 2150 -2294 2145 2150 -2295 2383 2388 -2201 5159 5278 -2214 5165 5166 -2214 5373 5376 -2224 5165 5284 -2230 5000 5115 -2233 5154 5277 -2234 5465 5578 -2235 5007 5121 -2235 5504 5508 -2238 5168 5287 -2244 5578 5580 -2247 5165 5283 -2247 5168 5289 -2253 4906 4913 -2253 5464 5465 -2254 5273 5391 -2255 4438 4543 -2268 4995 5000 -2273 4990 4991 -2273 5268 5383 -2276 4875 4877 -2280 5003 5113 -2285 5162 5281 -2295 5160 5278 -2297 5173 5180 -2212 6445 6448 -2220 6209 6210 -2226 6080 6082 -2231 6582 6686 -2232 6448 6560 -2232 6568 6571 -2248 5705 5825 -2248 6562 6671 -2261 6580 6582 -2262 6688 6691 -2263 6205 6206 -2265 6575 6576 -2273 6676 6679 -2276 6574 6682 -2277 6557 6559 -2284 5730 5731 -2285 6562 6567 -2286 6582 6694 -2289 6202 6203 -2295 6325 6330 -2296 6451 6565 -2302 1075 1078 -2304 324 327 -2305 859 867 -2307 1092 1207 -2309 1210 1212 -2310 975 1085 -2312 1072 1075 -2317 752 859 -2325 746 751 -2326 1072 1189 -2328 330 418 -2331 1072 1078 -2336 1326 1444 -2340 1576 1688 -2346 757 867 -2348 325 326 -2354 1658 1665 -2355 864 867 -2355 1087 1089 -2356 421 424 -2359 326 410 -2360 1067 1074 -2363 247 325 -2365 756 856 -2371 418 420 -2385 416 417 -2386 420 421 -2396 864 866 -2397 521 522 -2398 975 1079 -2301 3570 3572 -2303 2733 2740 -2303 2814 2821 -2306 2810 2816 -2307 2904 2911 -2315 2261 2266 -2315 2382 2388 -2315 2824 2922 -2325 2922 2930 -2328 2816 2918 -2336 2256 2257 -2340 2804 2912 -2343 3606 3613 -2344 2494 2497 -2352 2147 2150 -2353 2929 3024 -2359 2918 2921 -2373 1942 1948 -2375 2366 2372 -2379 2383 2389 -2383 2264 2265 -2383 2700 2808 -2385 2494 2495 -2389 1942 1947 -2392 1942 1946 -2392 2273 2386 -2395 2267 2272 -2396 2918 2920 -2397 3500 3505 -2398 1948 2064 -2400 2703 2709 -2304 4764 4881 -2304 5167 5174 -2307 5141 5260 -2311 5172 5289 -2323 5170 5171 -2335 5608 5609 -2340 5001 5116 -2346 5287 5288 -2362 5118 5236 -2364 5172 5295 -2365 5372 5485 -2371 5463 5465 -2383 5458 5465 -2384 5276 5277 -2385 5054 5171 -2392 5154 5271 -2395 5290 5297 -2397 4790 4796 -2399 5459 5465 -2304 6329 6443 -2306 6204 6319 -2309 6680 6681 -2319 6204 6321 -2322 6567 6671 -2328 6447 6448 -2335 5608 5609 -2337 7478 7479 -2339 6676 6784 -2344 6332 6440 -2349 6443 6445 -2350 6675 6776 -2351 6448 6450 -2351 6568 6682 -2354 2057 5830 -2361 6570 6574 -2373 7289 7361 -2376 6447 6560 -2378 6444 6557 -2379 6322 6327 -2380 6580 6688 -2390 6077 6082 -2393 6449 6563 -2393 6673 6676 -2396 6680 6685 -2400 6206 6210 -2404 1334 1336 -2410 862 863 -2424 427 520 -2453 421 514 -2456 527 528 -2457 324 412 -2459 861 862 -2464 1181 1188 -2477 749 750 -2488 1183 1186 -2493 326 330 -2497 748 749 -2497 753 754 -2497 1205 1206 -2407 2257 2366 -2408 3430 3500 -2413 3505 3568 -2421 2909 3014 -2422 2496 2608 -2423 2383 2500 -2423 3484 3546 -2439 2468 2475 -2444 3599 3600 -2449 3341 3343 -2451 1954 2064 -2452 2703 2710 -2457 1831 1946 -2464 2711 2712 -2479 3478 3546 -2482 2263 2267 -2483 3702 7498 -2485 2708 2713 -2494 2711 2713 -2413 5272 5279 -2418 5175 5295 -2426 5578 5583 -2434 4684 4795 -2434 5175 5178 -2435 5155 5161 -2435 5272 5274 -2437 5334 5452 -2444 5141 5259 -2451 5452 5459 -2460 4794 4799 -2467 5164 5171 -2469 5451 5452 -2480 5453 5566 -2482 5290 5291 -2482 5605 5613 -2494 4905 4906 -2496 4906 4912 -2499 5127 5129 -2500 5049 5169 -2403 6450 6565 -2408 6674 6680 -2412 6082 6083 -2412 6554 6560 -2434 6329 6445 -2434 6679 6784 -2439 6573 6677 -2444 7144 7230 -2445 6561 6665 -2449 7252 7253 -2451 5833 5956 -2452 6557 6565 -2455 6206 6322 -2461 5592 5711 -2461 7144 7145 -2462 6450 6557 -2463 6668 6675 -2467 6680 6682 -2468 6562 6568 -2468 7221 7222 -2477 7379 7380 -2478 7204 7282 -2478 7416 7472 -2479 7253 7325 -2480 6640 6642 -2482 5605 5613 -2482 6668 6676 -2496 7434 7490 -2502 523 526 -2504 1182 1295 -2512 331 332 -2513 979 984 -2519 648 651 -2535 1199 1205 -2543 425 426 -2544 432 521 -2546 1235 4874 -2556 1074 1187 -2560 864 976 -2562 507 601 -2563 426 520 -2565 427 523 -2568 1079 1084 -2569 644 740 -2573 424 426 -2578 1379 1380 -2582 1092 1096 -2587 751 756 -2594 1573 1574 -2600 648 754 -2513 3702 3703 -2518 2383 2495 -2522 2599 2710 -2527 2808 2810 -2531 2812 2916 -2544 3506 3570 -2551 2703 2811 -2573 2603 2712 -2585 3701 3702 -2587 3504 3511 -2598 2606 2608 -2505 5452 5457 -2510 5583 5586 -2512 5447 5560 -2522 4544 4653 -2524 5446 5447 -2526 5292 5295 -2528 4789 4797 -2542 5243 5361 -2546 1235 4874 -2551 5019 5139 -2555 5119 5126 -2561 5290 5292 -2565 4684 4688 -2567 5008 5014 -2567 5446 5448 -2569 4903 4904 -2572 5440 5447 -2583 5459 5460 -2589 5446 5453 -2590 4647 4654 -2590 5289 5290 -2594 5295 5296 -2597 5445 5447 -2501 5843 5845 -2505 6532 6642 -2508 7307 7379 -2513 5860 5863 -2513 6794 6795 -2515 6562 6676 -2515 7409 7410 -2516 6669 6776 -2517 7264 7265 -2524 6316 6317 -2539 5615 5735 -2539 6554 6561 -2548 6670 6673 -2550 7475 7477 -2556 6562 6668 -2568 5717 5724 -2568 6531 6642 -2568 6782 6783 -2569 7343 7344 -2571 7414 7416 -2572 6784 6785 -2581 6776 6782 -2581 7479 7480 -2585 6321 6324 -2591 6559 6561 -2592 7345 7414 -2592 7480 7526 -2594 5855 5860 -2598 6199 6204 -2607 1289 1296 -2609 601 602 -2616 417 421 -2619 1072 1077 -2621 245 327 -2627 1730 1731 -2628 1180 1186 -2629 512 513 -2629 534 628 -2631 330 333 -2632 1183 1297 -2633 1180 1297 -2641 529 627 -2643 1077 1184 -2644 746 754 -2644 1485 1602 -2647 1731 1842 -2650 547 651 -2658 326 327 -2661 653 755 -2668 1183 1184 -2668 1291 1294 -2669 1290 1406 -2686 653 749 -2695 1731 1848 -2607 2611 2715 -2612 2386 2500 -2612 3437 3509 -2615 3600 3607 -2619 2822 2825 -2628 2497 2604 -2630 2905 3006 -2631 3257 3340 -2635 2614 2723 -2640 3540 3547 -2647 1731 1842 -2653 2822 2827 -2654 2391 2395 -2667 2492 2500 -2668 3567 3570 -2683 2815 2919 -2695 1731 1848 -2615 5460 5575 -2617 5328 5451 -2620 5440 5441 -2631 4103 4110 -2631 5281 5287 -2631 5333 5451 -2634 4462 4567 -2638 4794 4797 -2643 5018 5019 -2658 5440 5442 -2661 5434 5435 -2662 5442 5445 -2665 5260 5267 -2666 5008 5013 -2666 5330 5451 -2669 5233 5241 -2678 5459 5572 -2678 5465 5583 -2679 4902 5016 -2679 5270 5389 -2679 5292 5297 -2682 5328 5445 -2684 5147 5267 -2685 5337 5339 -2687 4682 4797 -2687 5322 5445 -2687 5327 5445 -2688 5122 5127 -2690 5460 5577 -2692 5164 5170 -2694 5324 5445 -2698 5294 5407 -2609 6787 6895 -2618 7436 7437 -2625 7320 7391 -2640 7371 7436 -2643 7435 7437 -2646 6788 6789 -2647 6782 6784 -2654 6890 6897 -2659 6330 6332 -2663 7375 7443 -2665 6781 6889 -2666 6684 6790 -2672 6638 6640 -2674 7409 7414 -2676 6082 6085 -2678 7416 7478 -2692 6638 6642 -2705 645 651 -2710 553 652 -2712 332 416 -2713 1731 1847 -2717 1072 1184 -2722 93 157 -2726 1400 1407 -2731 645 648 -2740 896 1004 -2740 1400 1401 -2744 421 512 -2744 753 757 -2745 546 646 -2748 328 330 -2748 336 424 -2749 553 657 -2750 1290 1296 -2754 422 423 -2755 634 635 -2756 112 113 -2756 429 518 -2762 325 328 -2763 1730 1737 -2767 528 622 -2769 1205 1207 -2770 113 179 -2770 1088 1089 -2771 864 869 -2775 552 651 -2775 1081 1083 -2776 1092 1093 -2786 330 336 -2787 553 649 -2791 111 181 -2791 1078 1083 -2792 1208 1213 -2798 1076 1077 -2800 1288 1408 -2703 2721 2722 -2712 2497 2607 -2714 1916 1918 -2723 2152 2153 -2737 2372 2377 -2744 2052 2057 -2750 2912 2915 -2752 3501 3508 -2793 2495 2502 -2702 5135 5254 -2708 4904 5020 -2716 4683 4690 -2717 5454 5457 -2719 5440 5445 -2728 5251 5259 -2732 5578 5579 -2737 5320 5321 -2739 4891 4898 -2742 5339 5452 -2745 5435 5554 -2748 5137 5138 -2749 5298 5415 -2755 5054 5170 -2756 4685 4688 -2756 4794 4796 -2757 4684 4796 -2759 4684 4797 -2778 5466 5583 -2779 5052 5169 -2783 5460 5462 -2786 4573 4580 -2786 5454 5456 -2787 5300 5413 -2790 5257 5258 -2796 5052 5055 -2797 4903 4910 -2798 5454 5572 -2704 6678 6785 -2707 6206 6324 -2725 7411 7414 -2731 7337 7339 -2733 6684 6785 -2747 6770 6777 -2761 6570 6674 -2763 6784 6787 -2770 6677 6678 -2770 6667 6778 -2771 6085 6202 -2776 5843 5848 -2777 7344 7414 -2788 6691 6694 -2793 7343 7350 -2799 6562 6565 -2806 1189 1192 -2810 111 113 -2810 528 629 -2818 433 526 -2820 250 328 -2821 553 555 -2822 111 114 -2825 1075 1077 -2834 1078 1081 -2841 113 187 -2854 1718 1720 -2858 642 740 -2861 556 559 -2869 640 641 -2872 554 556 -2873 1484 1491 -2874 555 556 -2874 1182 1186 -2890 556 657 -2894 463 554 -2813 2146 2150 -2855 2810 2913 -2869 2257 2374 -2898 2814 2816 -2809 5251 5256 -2809 5583 5584 -2813 5263 5268 -2818 5320 5322 -2826 5294 5415 -2828 4898 5016 -2828 5297 5410 -2837 5275 5282 -2841 5457 5460 -2846 5448 5451 -2846 5460 5465 -2848 5315 5434 -2852 5454 5571 -2852 5582 5583 -2855 4677 4683 -2864 5294 5413 -2871 5171 5290 -2875 4574 4683 -2883 5386 5391 -2884 5243 5244 -2890 5462 5583 -2801 6332 6445 -2812 7339 7342 -2814 6685 6688 -2815 7480 7485 -2832 6692 6693 -2832 6882 6976 -2836 7259 7337 -2842 6982 6983 -2844 6562 6564 -2849 5681 5801 -2849 7406 7414 -2851 6556 6561 -2866 6786 6890 -2866 7265 7266 -2868 7480 7483 -2875 6686 6688 -2876 6670 6778 -2877 7263 7265 -2889 7265 7343 -2891 6881 6889 -2893 7417 7477 -2899 7260 7265 -2901 638 734 -2904 1289 1294 -2910 1183 1185 -2911 1288 1405 -2917 463 562 -2918 1397 1402 -2919 1188 1189 -2926 1212 1213 -2927 1073 1078 -2929 647 743 -2934 1485 1600 -2937 462 557 -2937 1400 1405 -2938 157 164 -2941 1282 1402 -2943 1187 1194 -2953 1205 1210 -2968 642 648 -2969 1399 1402 -2984 1184 1186 -2988 648 748 -2990 1278 1394 -2994 1596 1712 -2994 1718 1725 -2919 2361 2476 -2922 1921 1922 -2927 2262 2263 -2938 2810 2912 -2979 2255 2366 -2985 2809 2913 -2901 4578 4691 -2905 4474 4579 -2905 5277 5278 -2907 5259 5261 -2917 5161 5166 -2921 5419 5420 -2924 5460 5583 -2936 5454 5460 -2938 5560 5567 -2944 4474 4478 -2948 5436 5439 -2950 5273 5386 -2958 5434 5439 -2959 5554 5555 -2963 5436 5554 -2965 5326 5446 -2970 5436 5553 -2973 5333 5446 -2974 5438 5439 -2980 5436 5438 -2982 5428 5435 -2989 5265 5267 -2989 5435 5548 -2993 5431 5436 -2999 5431 5439 -2909 6570 6681 -2909 6772 6775 -2909 6776 6783 -2909 7180 7258 -2922 6783 6889 -2922 7262 7265 -2928 7258 7263 -2934 6675 6784 -2943 7265 7342 -2953 6204 6206 -2954 6665 6672 -2961 6883 6886 -2964 6673 6675 -2973 7260 7336 -2975 6558 6562 -2978 6668 6673 -2981 7256 7260 -2984 6880 6886 -2989 6786 6884 -2990 5957 5962 -2993 5954 5962 -3002 1181 1186 -3005 1290 1408 -3029 1403 1404 -3030 981 1093 -3030 1182 1297 -3034 157 162 -3036 642 647 -3062 981 985 -3063 1085 1092 -3067 756 863 -3067 1723 1725 -3075 1078 1195 -3077 1597 1712 -3080 645 646 -3090 467 468 -3096 469 568 -3006 2909 3009 -3009 2806 2912 -3029 2153 2155 -3039 1800 1919 -3064 2812 2813 -3065 2914 3015 -3006 5298 5413 -3010 5318 5438 -3016 4904 5022 -3020 5452 5453 -3021 5441 5447 -3027 4904 4908 -3031 5321 5322 -3033 5130 5247 -3033 5296 5297 -3034 5241 5244 -3037 5169 5171 -3038 5431 5438 -3048 5453 5454 -3056 5327 5440 -3069 5419 5426 -3073 5166 5168 -3083 5418 5421 -3085 5256 5259 -3085 5419 5424 -3093 5306 5425 -3001 7079 7080 -3026 7339 7414 -3037 6667 6670 -3047 7083 7089 -3053 7422 7478 -3057 6764 6771 -3072 6662 6670 -3073 6881 6883 -3078 7476 7480 -3082 6886 6984 -3084 6085 6088 -3089 6982 6984 -3089 7480 7525 -3091 6884 6886 -3092 6878 6883 -3093 6667 6669 -3099 6777 6883 -3100 5839 5842 -3133 469 563 -3135 560 562 -3139 1607 1614 -3152 464 471 -3152 465 560 -3156 1723 1726 -3157 1597 1717 -3164 1080 1193 -3166 471 560 -3171 472 568 -3174 465 471 -3190 1292 1299 -3103 2709 2710 -3121 2793 2898 -3132 2904 2905 -3149 3000 3007 -3176 2804 2906 -3106 5287 5292 -3106 5421 5423 -3127 4904 4905 -3135 5421 5424 -3137 5304 5424 -3146 5420 5421 -3157 5156 5162 -3157 5295 5297 -3167 5427 5428 -3101 6780 6878 -3107 6775 6878 -3107 6882 6883 -3110 6663 6770 -3113 6878 6880 -3114 6884 6891 -3116 6775 6875 -3119 6875 6878 -3124 6987 7081 -3126 6671 6672 -3126 6880 6883 -3128 6780 6883 -3147 6877 6878 -3149 7480 7527 -3152 7477 7480 -3156 6678 6679 -3191 6986 7082 -3197 6885 6886 -3203 1289 1297 -3205 1180 1185 -3215 552 646 -3215 642 742 -3246 553 651 -3246 631 632 -3249 1290 1294 -3255 636 639 -3264 1404 1405 -3280 756 861 -3284 1520 1521 -3218 2055 2057 -3280 2034 2036 -3220 5419 5425 -3222 5310 5425 -3224 5318 5437 -3236 5266 5267 -3251 5377 5378 -3253 5304 5427 -3254 5276 5280 -3265 5431 5432 -3274 5432 5433 -3285 5312 5425 -3290 5309 5427 -3297 5298 5416 -3298 5160 5162 -3248 6981 6987 -3257 6560 6561 -3273 5837 5844 -3285 6785 6786 -3300 6769 6869 -3303 464 472 -3318 463 557 -3318 636 638 -3318 1083 1196 -3322 380 464 -3338 638 742 -3341 966 1070 -3347 1402 1404 -3366 1077 1190 -3377 469 475 -3377 1640 1647 -3380 1284 1394 -3395 1402 1519 -3397 961 1069 -3302 5592 5594 -3301 5416 5421 -3310 5271 5273 -3314 5306 5427 -3314 5428 5429 -3321 5303 5422 -3324 5310 5427 -3327 5303 5416 -3350 5310 5433 -3358 5174 5287 -3364 5312 5433 -3369 5171 5172 -3302 5592 5594 -3304 6671 6676 -3305 6976 6984 -3309 6983 6987 -3311 6882 6982 -3319 6869 6877 -3335 6769 6877 -3347 7170 7171 -3366 6987 7079 -3367 7080 7084 -3376 6881 6888 -3387 6874 6877 -3389 7080 7170 -3392 6890 6891 -3397 7172 7174 -3402 647 748 -3410 373 374 -3415 1069 1075 -3430 373 375 -3438 647 750 -3441 1399 1519 -3456 1388 1395 -3463 633 639 -3467 1277 1278 -3469 1282 1285 -3471 465 554 -3471 642 645 -3475 961 1072 -3480 535 633 -3482 1168 1279 -3419 2362 2363 -3430 5304 5422 -3456 5421 5422 -3457 5437 5438 -3409 6783 6887 -3434 7255 7256 -3454 7262 7334 -3459 6787 6790 -3459 6984 6986 -3490 6559 6562 -3496 6783 6787 -3501 1164 1271 -3518 1173 1280 -3523 1286 1287 -3527 957 1061 -3532 540 634 -3537 749 754 -3546 1291 1293 -3565 1180 1292 -3569 958 1069 -3589 955 958 -3592 531 625 -3502 2005 2115 -3507 5258 5259 -3529 5316 5439 -3562 5318 5439 -3581 5275 5276 -3597 5293 5294 -3505 6787 6789 -3511 6884 6889 -3524 5622 5624 -3541 7169 7172 -3549 5593 5594 -3561 6983 7079 -3571 6985 6986 -3598 7076 7083 -3604 1280 1286 -3608 533 634 -3639 533 534 -3655 1288 1402 -3658 1162 1271 -3665 1388 1393 -3677 642 743 -3681 1265 1382 -3685 1167 1279 -3625 5462 5575 -3634 5316 5433 -3637 5204 5323 -3646 5508 5510 -3652 5324 5443 -3697 5503 5508 -3674 5839 5844 -3711 529 532 -3718 1167 1274 -3720 1162 1273 -3728 1277 1282 -3730 950 951 -3752 1157 1158 -3759 1067 1069 -3766 527 529 -3795 641 737 -3703 5596 5598 -3714 6581 6582 -3812 1044 1151 -3816 642 748 -3840 1293 1409 -3843 643 648 -3873 1186 1189 -3878 1230 1337 -3830 5593 5600 -3812 5271 5277 -3840 5304 5421 -3827 5598 5600 -3830 5593 5600 -3903 1403 1408 -3910 957 1067 -3918 978 1082 -3960 646 651 -3965 1283 1284 -3968 958 961 -3978 646 647 -3909 5303 5421 -3967 5154 5272 -3974 5459 5578 -3981 5309 5422 -3995 5275 5280 -3979 7252 7259 -4028 1463 1468 -4040 1260 1370 -4064 1071 1072 -4070 1184 1190 -4057 2922 2923 -4038 5321 5440 -4013 7337 7344 -4023 7344 7409 -4041 5968 5970 -4047 7342 7344 -4061 7344 7415 -4129 944 945 -4131 851 958 -4154 1250 1251 -4169 1143 1250 -4171 918 1022 -4186 1138 1250 -4191 1244 1250 -4197 1072 1074 -4122 2614 2718 -4144 1818 1822 -4171 5596 5603 -4114 5434 5441 -4122 5172 5287 -4173 5434 5436 -4178 5453 5572 -4110 7174 7252 -4112 7260 7342 -4171 5596 5603 -4183 7257 7260 -4222 1250 1255 -4280 1229 1237 -4294 1233 1340 -4299 1344 1460 -4218 2139 2140 -4244 2140 2250 -4255 2010 2011 -4202 5171 5289 -4209 5572 5577 -4221 5448 5566 -4242 5178 5295 -4254 5415 5417 -4262 5297 5298 -4280 5417 5418 -4289 5177 5295 -4292 5445 5446 -4211 7413 7477 -4216 7416 7477 -4239 6328 6335 -4245 7409 7416 -4263 7411 7416 -4269 7472 7477 -4272 7417 7475 -4296 7483 7485 -4307 1003 1109 -4317 1149 1256 -4325 1265 1266 -4329 1256 1257 -4336 1137 1244 -4347 999 1109 -4359 1189 1190 -4360 1116 1120 -4365 1228 1339 -4393 1265 1273 -4349 2055 5591 -4377 6078 6079 -4386 2822 2922 -4376 5425 5433 -4381 5442 5447 -4392 5430 5433 -4301 7417 7422 -4304 7416 7417 -4343 7260 7263 -4356 6787 6887 -4367 6578 6689 -4377 6078 6079 -4385 7341 7406 -4425 1224 1230 -4431 1265 1270 -4484 2138 2253 -4427 5439 5442 -4433 5298 5421 -4444 4878 4880 -4449 5433 5553 -4455 4877 4878 -4457 4878 4990 -4464 4880 4883 -4473 4880 4881 -4499 5444 5557 -4452 7413 7469 -4566 1035 1142 -4547 5450 5563 -4614 1136 1137 -4666 1023 1130 -4623 2920 3021 -4626 1887 1888 -4655 1818 1935 -4656 2137 2247 -4665 1770 1881 -4626 5428 5430 -4666 5439 5559 -4703 2808 2815 -4729 1894 2004 -4731 2135 2137 -4750 1897 2007 -4775 1891 2001 -4701 5444 5448 -4731 5456 5569 -4752 5448 5453 -4758 5454 5569 -4733 7082 7089 -4736 6676 6678 -4819 2397 2504 -4822 1886 1891 -4844 2013 2014 -4854 1891 2006 -4825 5444 5563 -4895 5450 5569 -4819 6985 6992 -4957 1532 1533 -4959 1579 1580 -4991 1469 1470 -5003 461 468 -5019 524 525 -5019 1082 1087 -5042 955 960 -5008 5615 5729 -5041 7349 7350 -5046 7258 7265 -5112 960 1064 -5115 846 952 -5145 650 753 -5180 1284 1400 -5183 1398 1514 -5188 973 975 -5197 851 953 -5127 1799 1805 -5167 1937 1940 -5223 518 524 -5226 836 938 -5228 646 648 -5265 1515 1631 -5272 862 864 -5290 421 426 -5257 3001 3098 -5231 6991 6998 -5319 537 631 -5320 1396 1399 -5321 1284 1285 -5336 524 529 -5340 543 643 -5342 530 531 -5360 644 748 -5392 975 976 -5372 5054 5164 -5392 5047 5054 -5401 524 526 -5403 419 424 -5410 429 526 -5410 974 981 -5425 1085 1093 -5431 638 740 -5470 648 653 -5490 973 978 -5447 5272 5277 -5427 6893 6894 -5453 6981 7081 -5523 631 636 -5582 524 531 -5583 427 518 -5503 5585 5698 -5555 4936 4937 -5566 4934 5050 -5573 5052 5053 -5586 5203 5210 -5504 6698 6699 -5563 6984 6987 -5602 631 638 -5607 423 512 -5627 427 432 -5644 427 521 -5646 427 526 -5646 4820 4933 -5673 4933 4934 -5697 5586 5701 -5704 529 531 -5733 416 512 -5740 1920 1921 -5716 4934 4938 -5764 5096 5212 -5772 5212 5219 -5776 5089 5096 -5789 5094 5096 -5800 5212 5214 -5850 535 538 -5853 526 527 -5859 1799 1804 -5802 5091 5096 -5814 5096 5102 -5816 5049 5054 -5862 5101 5106 -5865 5206 5213 -5887 6878 6885 -5901 431 432 -5932 633 634 -5970 341 432 -5992 529 534 -5932 5102 5218 -5966 5103 5223 -6089 2051 2166 -6092 5217 5220 -6574 418 419 -6597 4707 4714 -6640 334 335 -6664 4701 4708 -6773 4713 4720 -6791 4477 4582 -6753 5984 5991 -6773 5991 6110 -6845 534 635 -6812 4689 4696 -6824 4576 4583 -6828 4476 4483 -6854 4586 4695 -6953 6882 6886 -7017 522 616 -7051 2397 2401 -7009 7262 7340 -7033 5865 5866 -7050 6984 6985 -7092 5608 5615 -7114 1282 1399 -7170 5852 5860 -7249 426 427 -7296 979 1087 -7247 5864 5871 -7399 2401 2406 -7387 5048 5054 -7448 1406 1407 -7427 2400 2406 -7443 2406 2518 -7442 4938 5052 -7496 4823 4930 +599 1817 5468 +600 1808 1815 +554 1938 5471 +548 5471 5591 +554 1938 5471 +571 5471 5590 +572 5471 5589 +599 1817 5468 +548 5471 5591 +571 5471 5590 +572 5471 5589 +608 1814 1815 +616 1815 1926 +622 5231 5350 +622 1818 1935 +635 1818 1929 +638 5468 5469 +648 1806 1923 +648 1818 1937 +649 1811 1812 +650 1822 5468 +650 1822 1935 +652 5469 5472 +655 1822 5589 +660 1812 1813 +662 1816 1929 +666 1810 1923 +672 1935 1937 +676 1810 1812 +676 1822 1938 +677 1806 1917 +677 1822 1937 +679 1812 1816 +683 1819 1937 +683 1816 1931 +684 1816 1937 +686 1810 1931 +695 1583 1584 +699 1821 1822 +700 1812 1929 +616 1815 1926 +635 1818 1929 +648 1806 1923 +650 1822 1935 +660 1923 1930 +662 1816 1929 +666 1810 1923 +671 1935 1936 +672 1935 1937 +676 1822 1938 +677 1806 1917 +683 1816 1931 +686 1810 1931 +687 2052 5709 +692 1923 2040 +692 2169 5709 +694 2052 5588 +696 1936 1940 +700 1812 1929 +605 5477 5596 +610 5467 5468 +611 5237 5350 +622 5231 5350 +628 5467 5474 +629 5473 5474 +635 5467 5472 +637 5473 5480 +638 5468 5469 +640 5474 5475 +646 5354 5467 +647 5467 5475 +650 1822 5468 +652 5347 5354 +652 5469 5472 +653 5479 5480 +658 5473 5478 +661 5472 5475 +661 5474 5478 +663 5480 5481 +665 5358 5478 +668 5227 5234 +669 5480 5593 +670 5347 5355 +671 5234 5347 +672 5479 5486 +674 5352 5354 +674 5475 5478 +677 5471 5472 +678 5478 5593 +679 5478 5481 +681 5352 5355 +682 5352 5475 +682 5468 5471 +687 5352 5357 +687 5486 5599 +689 5232 5234 +689 5481 5601 +690 5476 5478 +691 5480 5484 +693 5484 5599 +694 5471 5477 +700 5479 5484 +655 1822 5589 +669 5480 5593 +678 5478 5593 +687 5486 5599 +687 2052 5709 +692 2169 5709 +693 5484 5599 +693 5594 5600 +694 2052 5588 +695 5600 5714 +699 5828 5829 +700 5951 5958 +704 1806 1925 +706 1810 1925 +711 1816 1932 +711 1937 1940 +712 1800 1917 +716 1926 1931 +720 1457 1464 +721 1804 1917 +722 5469 5470 +722 1803 1920 +728 1820 5471 +729 1802 1809 +730 1925 1928 +734 1353 1469 +735 1923 1925 +737 5230 5231 +738 1804 1925 +739 1810 1926 +739 1816 1821 +740 1911 1918 +743 1822 5471 +745 1821 1937 +746 1458 1574 +755 1586 5231 +756 1469 4994 +756 1463 1470 +756 1467 1577 +756 1815 1931 +757 1804 1919 +758 1683 1793 +758 1800 1919 +760 1809 1810 +762 1692 1808 +763 5469 5471 +763 1932 1937 +765 1808 1810 +766 1914 1915 +769 1804 1806 +769 1821 1938 +771 1806 1809 +774 1926 1933 +776 1459 1574 +776 1568 1575 +776 1573 1574 +779 4994 5110 +779 5111 5229 +779 5229 5230 +781 1804 1807 +783 1797 1908 +783 1800 1806 +784 5112 5229 +787 1799 1804 +788 1799 1805 +789 1464 1580 +789 1802 1807 +795 1807 1810 +800 1674 1790 +800 1790 1797 +703 2057 5709 +704 5952 6071 +711 1816 1932 +711 1937 1940 +711 2052 5710 +712 1800 1917 +716 1926 1931 +717 2169 5829 +719 2277 2278 +721 1804 1917 +722 1803 1920 +724 2037 2038 +727 1940 2052 +730 1925 1928 +730 1940 2054 +731 1928 1930 +734 2169 5830 +735 1923 1925 +736 1928 1931 +736 1924 2040 +736 2044 2154 +736 2057 5710 +740 1911 1918 +745 1928 1934 +746 1923 1928 +746 1923 1931 +748 1921 2031 +749 1939 1940 +750 2170 2286 +751 1928 2048 +754 1928 2040 +755 1931 1933 +756 1917 1919 +756 1815 1931 +757 1804 1919 +758 1800 1919 +758 1933 2043 +759 1930 2040 +761 2057 5830 +762 1921 2038 +762 2283 2284 +763 1932 1937 +764 2287 2402 +766 1914 1915 +766 2040 2047 +769 1821 1938 +771 2161 2271 +774 1926 1933 +774 2406 2513 +778 2040 2042 +782 1930 1931 +784 2174 5829 +785 1912 2028 +788 2043 2048 +788 2041 2157 +790 1923 1924 +793 1940 2055 +795 2038 2039 +796 2174 5830 +799 1931 1934 +799 1937 1938 +799 2286 2287 +702 5114 5233 +702 5484 5601 +703 5470 5472 +704 5116 5117 +704 5255 5368 +707 5352 5470 +707 5495 5608 +710 5232 5237 +711 5232 5355 +713 5483 5602 +714 5478 5483 +716 5476 5477 +717 5232 5235 +718 5470 5471 +720 5227 5235 +721 5230 5232 +721 5599 5607 +722 5469 5470 +722 5482 5483 +725 5364 5484 +726 5123 5236 +728 1820 5471 +729 5366 5485 +729 5483 5601 +734 5350 5355 +737 5230 5231 +737 5350 5357 +739 5234 5235 +741 5374 5375 +742 5488 5495 +743 1822 5471 +745 5481 5484 +746 5114 5227 +749 5500 5501 +749 5606 5607 +751 5486 5605 +751 5604 5607 +751 5614 5615 +753 5479 5487 +760 5601 5602 +762 5113 5120 +763 5000 5110 +763 5469 5471 +763 5492 5605 +765 5108 5114 +767 5112 5227 +771 5472 5477 +773 5476 5596 +775 5381 5494 +778 5486 5487 +779 4994 5110 +779 5111 5229 +779 5229 5230 +779 5375 5488 +779 5470 5477 +781 5107 5108 +783 5116 5118 +784 5112 5229 +784 5242 5243 +784 5602 5604 +787 5368 5369 +787 5475 5477 +789 5233 5235 +791 5129 5242 +791 5602 5603 +792 5248 5249 +794 5485 5486 +795 5477 5478 +702 5484 5601 +703 2057 5709 +704 5952 6071 +708 5957 5964 +709 5593 5600 +711 2052 5710 +717 2169 5829 +718 5709 5829 +720 5736 5855 +721 5593 5601 +721 5599 5607 +722 5720 5721 +729 5483 5601 +730 5598 5600 +730 5828 5830 +733 5735 5742 +733 5709 5830 +733 5958 6077 +734 2169 5830 +736 2057 5710 +738 5714 5722 +740 5598 5601 +747 5605 5606 +749 5606 5607 +751 5486 5605 +751 5604 5607 +751 5614 5615 +751 5849 5856 +757 5841 5954 +759 5621 5741 +760 5601 5602 +761 5721 5722 +761 2057 5830 +761 5828 5833 +763 5492 5605 +769 5835 5948 +772 5721 5725 +776 5615 5735 +784 5602 5604 +784 2174 5829 +785 5833 5835 +786 5969 5976 +790 5726 5727 +791 5602 5603 +795 5831 5951 +796 2174 5830 +798 5605 5726 +799 5960 5961 +801 1568 1685 +801 1586 5229 +802 1463 1465 +802 1799 1800 +803 4991 5107 +803 1673 1680 +803 1685 1692 +803 5108 5112 +804 1799 1806 +804 1806 1807 +804 1911 1916 +805 1799 1802 +807 1807 1809 +808 1573 1575 +808 1586 1588 +808 5350 5351 +808 5351 5352 +810 1354 1469 +813 4994 5109 +813 1353 1468 +816 1580 1587 +816 1819 1821 +818 5351 5470 +819 1685 1690 +820 1689 1799 +821 1463 1468 +821 1911 1912 +823 1464 1574 +823 1575 1685 +823 1689 1806 +824 1471 5229 +824 1685 1687 +824 1799 1801 +825 1570 1575 +827 1583 1586 +827 1676 1677 +831 1463 1464 +833 1683 1801 +835 1805 1806 +836 5108 5109 +841 1586 1587 +841 1687 1807 +842 1686 1687 +843 1686 1802 +845 1681 1793 +847 1676 1681 +848 1471 5108 +849 1570 1690 +849 1687 1689 +849 1692 1802 +850 1684 1690 +851 1808 1809 +852 1676 1678 +853 1348 1465 +853 1464 1465 +854 1462 1464 +854 1464 1579 +854 1471 1583 +856 1348 1468 +857 1684 1687 +857 1687 1801 +857 1687 1799 +858 1570 1576 +859 1806 1810 +860 1585 5229 +860 1585 1588 +864 1462 1465 +865 1354 5109 +868 1681 1683 +870 1459 1576 +871 1573 1576 +872 1354 1468 +872 1683 1799 +873 1686 1801 +876 1585 1587 +877 1459 1579 +879 1687 1802 +882 1683 1686 +885 1584 1585 +885 1681 1801 +886 1466 5108 +886 1583 1585 +893 4995 5109 +896 1459 1464 +900 1354 1466 +900 1682 1684 +801 2045 2047 +802 2041 2158 +802 2396 2403 +803 1929 1931 +803 2039 2154 +804 1911 1916 +805 2045 2048 +805 2154 2159 +808 2040 2048 +812 1918 1919 +812 2045 2051 +812 2045 2157 +814 2040 2045 +814 2154 2161 +817 1928 1933 +818 1932 1938 +819 1932 1934 +819 2047 2050 +821 1911 1912 +821 2045 2165 +821 2156 2161 +822 2048 2050 +823 2286 5829 +825 2055 5710 +825 2047 2157 +828 2036 2038 +829 2156 2159 +829 2172 5830 +831 2161 2276 +831 2274 2281 +838 2167 2277 +839 1931 1932 +839 2022 2029 +841 1938 1939 +842 2159 2161 +842 2164 2280 +844 2276 2277 +848 2039 2153 +849 6191 6307 +852 2049 2050 +855 2050 2051 +856 2047 2165 +859 2161 2162 +861 5710 5712 +861 2157 2164 +863 5830 5832 +868 2162 2276 +869 2050 2165 +873 2631 6191 +874 5831 5832 +875 2276 2282 +876 2031 2036 +876 2290 2399 +879 2044 2161 +879 5712 5830 +881 2163 2165 +881 2161 2277 +884 2051 2165 +884 2507 2508 +885 2055 5591 +887 2051 2166 +889 2277 2279 +890 2160 2161 +890 2519 2520 +892 1933 1934 +896 2163 2164 +897 2393 2394 +897 2394 2501 +898 2282 2284 +898 2405 5952 +803 4991 5107 +803 5108 5112 +803 5118 5123 +803 5366 5487 +806 5477 5590 +808 5350 5351 +808 5351 5352 +812 5507 5620 +818 5351 5470 +822 5115 5116 +822 5122 5123 +822 5483 5596 +822 5484 5602 +824 5247 5248 +825 5365 5372 +825 5364 5487 +826 5129 5247 +829 5255 5373 +829 5364 5370 +832 5477 5595 +832 5483 5484 +832 5484 5486 +832 5611 5612 +834 5123 5241 +837 5124 5129 +840 5373 5374 +841 5000 5115 +842 5250 5255 +843 5130 5247 +843 5349 5350 +844 5122 5124 +846 5366 5370 +848 5248 5250 +848 5363 5483 +850 5249 5250 +853 5499 5500 +856 5365 5370 +859 5118 5121 +859 5235 5238 +859 5481 5482 +862 5124 5127 +865 5230 5237 +865 5256 5373 +865 5367 5370 +869 4995 5110 +869 5476 5483 +874 5350 5352 +875 5250 5256 +876 5374 5376 +877 5364 5482 +877 5376 5381 +879 5130 5250 +884 5250 5253 +884 5365 5373 +888 5001 5115 +891 5364 5369 +891 5381 5499 +891 5481 5483 +893 4995 5109 +894 4990 4997 +897 4997 5113 +898 5245 5250 +899 4995 5115 +900 5245 5247 +900 5371 5378 +803 5604 5609 +803 5970 6089 +805 5620 5627 +806 5477 5590 +810 5606 5610 +811 6196 6203 +812 5507 5620 +813 5612 5726 +815 6197 6313 +816 5856 5975 +816 6083 6090 +823 2286 5829 +825 2055 5710 +829 2172 5830 +832 5477 5595 +832 5611 5612 +832 5854 5855 +833 6084 6202 +833 6197 6307 +836 5971 5976 +837 5835 5955 +840 5971 6089 +840 6084 6090 +841 5732 5733 +843 5969 5974 +847 5737 5742 +847 5958 6071 +848 6075 6187 +849 6201 6202 +849 6085 6202 +849 6191 6307 +850 5727 5840 +852 5954 5955 +853 5855 5862 +855 5609 5723 +856 5610 5726 +858 6201 6203 +859 5740 5741 +861 5710 5712 +862 5604 5728 +862 5955 6074 +862 5955 5959 +863 5830 5832 +863 5954 5956 +864 5737 5855 +865 5955 5956 +865 5953 6071 +865 6088 6089 +866 5970 6088 +866 6083 6085 +866 6197 6312 +867 5835 5956 +867 5974 5976 +867 6083 6088 +868 5961 5967 +869 6085 6090 +871 5610 5728 +871 5954 5959 +872 5606 5728 +872 5740 5742 +872 5954 6074 +873 5857 5862 +873 6088 6090 +874 5831 5832 +877 5857 5975 +877 5948 5956 +877 6068 6075 +878 6074 6076 +879 5712 5830 +880 5974 5975 +881 5833 5836 +882 6192 6307 +883 5955 6076 +885 2055 5591 +888 5954 5957 +888 6201 6204 +891 6198 6203 +893 5961 6074 +894 5609 5728 +895 6198 6313 +897 5740 5743 +898 5830 5833 +898 5959 5961 +900 6068 6076 +901 1683 1684 +904 1570 1682 +906 1815 1816 +907 1677 1793 +913 1570 1572 +916 1571 1573 +918 1572 1573 +925 1467 1583 +928 1459 1571 +931 1582 1585 +937 1459 1461 +938 1810 1815 +942 1580 1582 +943 1566 1683 +944 1465 1582 +945 1560 1670 +949 1821 1932 +953 1461 1462 +958 1821 1939 +962 1577 1585 +965 1676 1683 +967 1566 1682 +968 1460 1465 +978 1460 1462 +979 1813 1815 +984 1348 1460 +986 1350 1468 +989 1565 1572 +994 1455 1571 +902 2165 2171 +904 2284 2285 +905 2277 2284 +907 2279 2282 +908 6191 6306 +910 2164 2165 +910 2285 2399 +912 1933 2048 +912 2400 2513 +914 2282 2398 +915 2163 2168 +916 2162 2164 +918 2033 2036 +920 2274 2276 +921 2401 2513 +923 2166 2171 +923 2164 2274 +925 1915 1916 +925 2274 2279 +926 2289 2290 +928 2056 2166 +929 1916 2031 +929 5712 5713 +929 2156 2158 +929 2158 2276 +931 2151 2156 +931 2279 2281 +932 2151 2158 +933 2030 2036 +935 2285 2398 +936 2162 2168 +936 2168 2170 +938 2165 2168 +940 2513 2518 +941 2399 2404 +949 1821 1932 +949 2274 2275 +949 2518 2520 +954 2056 2173 +957 2166 2168 +958 1821 1939 +958 5711 5712 +958 2274 2282 +959 2520 6191 +960 2399 2405 +961 2281 2398 +964 1932 1939 +964 1933 1939 +965 2170 2280 +967 2151 2153 +969 2168 2171 +969 2171 2173 +969 2512 2513 +970 2396 2398 +970 2521 2631 +971 1933 2049 +974 5712 5832 +974 2151 2152 +974 5832 5833 +977 2158 2268 +977 6192 6306 +985 2519 2521 +987 2289 5832 +990 2035 2153 +991 2281 2390 +995 5829 5833 +996 5712 5831 +997 2512 2514 +999 2172 2173 +904 5123 5242 +904 5252 5253 +904 5250 5252 +905 5245 5248 +906 5376 5379 +911 5245 5253 +912 5501 5502 +913 5245 5252 +913 5371 5372 +916 5121 5124 +917 5113 5121 +919 5118 5124 +920 5252 5256 +921 5130 5245 +922 5246 5250 +925 5367 5369 +926 5120 5121 +926 5245 5246 +926 5371 5374 +929 5123 5124 +935 5367 5368 +938 5363 5482 +939 5119 5124 +943 5132 5245 +944 5126 5130 +944 5256 5371 +945 5382 5499 +946 5363 5369 +948 5126 5247 +948 5502 5620 +953 5119 5239 +956 5117 5230 +956 5362 5368 +956 5499 5502 +957 5232 5350 +960 4995 5107 +961 5502 5619 +963 5001 5113 +963 5119 5120 +965 5118 5233 +965 5378 5381 +968 5371 5379 +971 5126 5127 +972 5116 5123 +974 5378 5379 +992 5125 5126 +902 5737 5860 +904 5728 5729 +905 5726 5734 +906 5971 6094 +907 5723 5730 +908 5732 5852 +911 5831 5833 +912 5728 5734 +912 5852 5855 +915 5829 5830 +916 5974 5977 +921 5742 5855 +923 5833 5838 +925 5833 5956 +926 5953 5956 +926 6198 6318 +927 5620 5625 +927 5723 5843 +927 5953 5955 +929 5712 5713 +929 5857 5980 +930 5728 5730 +930 5974 5980 +930 6088 6094 +932 6085 6207 +933 5733 5734 +933 5961 6082 +934 6088 6207 +934 6085 6091 +935 5953 6076 +936 5965 6088 +937 5728 5731 +939 5833 5951 +939 6073 6075 +939 6198 6312 +940 5956 6076 +944 6088 6091 +946 5726 5731 +946 5733 5737 +948 5502 5620 +949 5621 5622 +949 5831 5838 +950 5857 5860 +951 5724 5843 +951 6192 6312 +952 5727 5731 +952 5959 5962 +954 5852 5860 +955 6080 6081 +957 5718 5838 +957 5730 5736 +958 5711 5712 +959 5729 5730 +961 5502 5619 +964 5836 5838 +966 5739 5852 +966 5951 5953 +967 5855 5860 +967 6192 6309 +968 5620 5622 +970 5731 5846 +971 5958 6076 +974 5739 5860 +974 5832 5833 +974 5953 5958 +975 5724 5844 +975 5837 5838 +977 5725 5730 +977 6192 6306 +979 5737 5852 +980 5731 5733 +985 5730 5849 +986 5725 5843 +987 6199 6207 +987 2289 5832 +988 5837 5844 +989 5619 5625 +993 5843 5849 +993 6193 6194 +995 5730 5731 +995 5837 5839 +995 5829 5833 +996 5712 5831 +999 5619 5622 +1000 6199 6204 +1004 1460 1461 +1006 1465 1577 +1020 1580 1581 +1026 1574 1581 +1027 1454 1461 +1028 1344 1460 +1033 1579 1580 +1043 1574 1579 +1047 1461 1465 +1047 1465 1579 +1049 1350 1460 +1056 1350 1466 +1057 1681 1684 +1062 1799 1807 +1085 1343 1460 +1086 1574 1576 +1093 1466 4991 +1002 2401 2404 +1004 2170 2288 +1005 2507 2514 +1006 2404 2406 +1007 2172 5832 +1008 2173 2174 +1010 2033 2035 +1010 2405 2406 +1014 5950 5951 +1019 2521 6189 +1021 2521 6191 +1024 2035 2145 +1024 2510 2517 +1028 2396 2401 +1032 2028 2145 +1032 2515 2518 +1034 2162 2282 +1034 2512 2515 +1034 2518 2521 +1039 5829 5950 +1039 2510 2515 +1042 2028 2033 +1047 2167 2168 +1048 2401 2403 +1051 2507 2509 +1057 2509 2512 +1058 2028 2029 +1059 1916 2030 +1060 2401 2407 +1061 2396 2397 +1061 2506 2507 +1062 2174 2289 +1062 2406 2407 +1071 2504 2507 +1073 2517 2518 +1074 5832 5950 +1077 2507 2512 +1080 2274 2277 +1081 2028 2030 +1085 2511 2512 +1086 2403 2510 +1088 2394 2506 +1091 2395 2507 +1092 2162 2277 +1092 2516 2517 +1092 6190 6191 +1093 2166 2173 +1100 2516 2518 +1003 5003 5113 +1006 5252 5365 +1008 5118 5120 +1010 5119 5126 +1014 5251 5252 +1017 5378 5382 +1025 5258 5371 +1037 5126 5245 +1040 5377 5378 +1046 5362 5369 +1047 5498 5502 +1049 5118 5238 +1064 5235 5237 +1073 5382 5497 +1075 5118 5241 +1080 4997 5001 +1088 5497 5502 +1091 4995 4997 +1094 5497 5505 +1095 5236 5237 +1001 5730 5850 +1001 5848 5849 +1004 5730 5848 +1005 6087 6207 +1006 5729 5731 +1007 5739 5858 +1007 5835 5838 +1007 5972 5975 +1008 5622 5740 +1009 5731 5848 +1009 5739 5743 +1010 5727 5730 +1010 5731 5849 +1013 5733 5854 +1014 5950 5951 +1017 5725 5848 +1017 5846 5849 +1019 5731 5736 +1019 5848 5854 +1019 5973 6094 +1019 2521 6189 +1020 5842 5843 +1020 5973 5977 +1020 6087 6091 +1021 5731 5851 +1021 6086 6091 +1023 6086 6094 +1024 5852 5858 +1025 5725 5845 +1026 5849 5854 +1026 5849 5850 +1028 5852 5859 +1029 5736 5854 +1031 5731 5854 +1031 5842 5844 +1034 5849 5851 +1037 5730 5843 +1038 6200 6204 +1039 6198 6310 +1048 5836 5839 +1049 5731 5734 +1049 5842 5845 +1049 5733 5852 +1049 5972 5977 +1053 6068 6073 +1056 5736 5737 +1059 5736 5849 +1059 5737 5854 +1060 5839 5842 +1064 5610 5731 +1067 5727 5848 +1068 5729 5849 +1069 5857 5859 +1071 5841 5842 +1072 5972 5980 +1073 5834 5839 +1074 6200 6318 +1076 5859 5972 +1077 6199 6205 +1078 6194 6312 +1079 5738 5743 +1083 5835 5839 +1084 5972 5978 +1086 6075 6195 +1089 5972 5979 +1089 6193 6310 +1092 5618 5622 +1092 5857 5972 +1092 6190 6191 +1115 1349 1466 +1131 4991 4995 +1133 1574 1575 +1143 1354 4991 +1150 1350 4991 +1154 4990 4991 +1157 4991 4992 +1158 1908 1913 +1167 1905 1906 +1171 1349 4991 +1179 1349 4874 +1180 1905 1910 +1184 4874 4991 +1184 5107 5109 +1186 1349 4992 +1194 1905 1907 +1194 1905 1908 +1197 1574 1580 +1199 4991 5109 +1102 2277 2282 +1105 2167 2282 +1107 1912 2030 +1107 2174 2288 +1107 2400 2507 +1108 5951 5952 +1108 2394 2507 +1110 2510 2511 +1115 2403 2518 +1119 1913 2030 +1120 2174 5950 +1120 2405 2519 +1121 2516 2521 +1122 2041 2159 +1126 5829 5948 +1129 1913 1915 +1133 2407 2518 +1137 1912 2022 +1137 2151 2159 +1138 2166 2283 +1138 2521 6188 +1146 6069 6073 +1152 1910 1912 +1158 1908 1913 +1165 6188 6306 +1167 1905 1906 +1168 1910 1913 +1180 1905 1910 +1181 2407 2519 +1181 6069 6187 +1186 2045 2159 +1187 2174 2286 +1188 2504 2511 +1192 2628 6188 +1194 1905 1907 +1198 2519 6072 +1200 1899 1906 +1200 2039 2159 +1113 5230 5235 +1114 5502 5617 +1117 4996 4997 +1130 5236 5238 +1131 4991 4995 +1136 5249 5368 +1138 5247 5250 +1154 4990 4991 +1155 5384 5497 +1156 5617 5622 +1166 4997 4998 +1171 5250 5367 +1184 5107 5109 +1184 5236 5243 +1185 5617 5625 +1199 5118 5236 +1103 6192 6304 +1108 5951 5952 +1109 6194 6310 +1114 6070 6071 +1114 6070 6076 +1115 5834 5841 +1115 6087 6205 +1119 5972 6092 +1122 5840 5842 +1124 5972 5974 +1126 5829 5948 +1126 5973 6092 +1128 5745 5858 +1130 5725 5840 +1135 5622 5738 +1145 5855 5857 +1146 6069 6073 +1153 5739 5745 +1153 5853 5972 +1156 5617 5622 +1157 6200 6310 +1159 5973 6093 +1160 6086 6093 +1165 5855 5856 +1167 5727 5846 +1174 5738 5745 +1181 6069 6187 +1185 5617 5625 +1186 6070 6073 +1188 5738 5746 +1198 2519 6072 +1200 5721 5840 +1200 5835 5954 +1205 1349 1354 +1214 1809 1920 +1217 1240 1349 +1229 1792 1907 +1229 1792 1908 +1235 1686 1796 +1236 1804 1809 +1244 5109 5112 +1245 1788 1907 +1246 5109 5110 +1246 1809 1925 +1251 1809 1926 +1253 1788 1899 +1254 1350 1354 +1254 1925 1926 +1256 1791 1792 +1278 1348 1350 +1280 1680 1797 +1280 1790 1792 +1288 1680 1796 +1290 1788 1791 +1300 1349 1350 +1205 6188 6304 +1208 2174 5832 +1211 2519 6189 +1214 1809 1920 +1215 2041 2045 +1229 1792 1907 +1243 1926 1927 +1245 1788 1907 +1251 1809 1926 +1253 1788 1899 +1254 1925 1926 +1258 5832 5838 +1259 2042 2045 +1262 2167 2283 +1263 2039 2044 +1267 2040 2041 +1274 1927 1928 +1278 2282 2283 +1282 2166 2167 +1215 5617 5624 +1228 5504 5617 +1231 5236 5241 +1243 5250 5365 +1244 5109 5112 +1246 5109 5110 +1268 5497 5504 +1205 6188 6304 +1211 2519 6189 +1212 6194 6304 +1214 5624 5738 +1215 5617 5624 +1224 6189 6191 +1228 6194 6311 +1258 5832 5838 +1259 6191 6192 +1261 5958 5959 +1269 5726 5728 +1276 6199 6206 +1301 1681 1796 +1305 1790 1795 +1315 1680 1795 +1319 1343 1350 +1323 1681 1795 +1329 1782 1899 +1333 1350 1351 +1354 1789 1795 +1354 1789 1792 +1354 5110 5111 +1355 1675 1795 +1359 1786 1788 +1367 1675 1792 +1372 1787 1790 +1378 1786 1899 +1380 1786 1907 +1390 1782 1893 +1393 1788 1789 +1306 1924 1928 +1309 2519 6191 +1310 1928 2043 +1312 5832 5951 +1313 2165 2167 +1320 2162 2167 +1321 1928 2042 +1329 1782 1899 +1378 1786 1899 +1380 1786 1907 +1316 5111 5112 +1354 5110 5111 +1382 5501 5619 +1384 5501 5620 +1309 2519 6191 +1312 5832 5951 +1317 6200 6316 +1338 5733 5846 +1364 5606 5726 +1368 5619 5620 +1372 5620 5621 +1378 5614 5620 +1382 5501 5619 +1384 5501 5620 +1396 5619 5621 +1403 1782 1901 +1405 1677 1681 +1410 1804 1920 +1415 1787 1789 +1427 1677 1678 +1445 1675 1677 +1447 1787 1788 +1450 5111 5230 +1451 1675 1787 +1472 1671 1787 +1477 1670 1677 +1495 1462 1463 +1499 1469 5110 +1410 1804 1920 +1416 2279 2284 +1425 2044 2159 +1445 2284 2393 +1458 2516 6187 +1472 2031 2038 +1484 2284 2398 +1486 2032 2038 +1488 2042 2043 +1495 1927 2043 +1404 5368 5370 +1430 5006 5116 +1446 5116 5121 +1450 5111 5230 +1479 4999 5116 +1489 5129 5248 +1499 1469 5110 +1416 5621 5740 +1420 5614 5621 +1435 5616 5621 +1439 5733 5853 +1458 2516 6187 +1516 1347 1463 +1520 1781 1788 +1557 1338 1448 +1558 1348 1463 +1580 1560 1678 +1593 1454 1455 +1594 1782 1788 +1598 1564 1678 +1504 2398 2399 +1510 2038 2148 +1512 2033 2038 +1512 6069 6189 +1516 2393 2399 +1521 2284 2399 +1543 2033 2153 +1556 2037 2044 +1567 2038 2154 +1568 2038 2153 +1598 2042 2044 +1598 2504 2509 +1508 5000 5116 +1516 5129 5130 +1530 5127 5130 +1538 5001 5116 +1550 4880 4996 +1567 5128 5129 +1568 5128 5135 +1574 5128 5130 +1589 5009 5125 +1512 6069 6189 +1574 6072 6073 +1606 1459 1462 +1610 1353 1463 +1612 1558 1560 +1618 1553 1670 +1626 1679 1684 +1630 1448 1456 +1631 1684 1686 +1635 1553 1554 +1637 1455 1456 +1642 1553 1558 +1644 1554 1664 +1645 1558 1561 +1654 1557 1673 +1661 1439 1446 +1661 1440 1446 +1664 1440 1556 +1666 1455 1459 +1669 1547 1548 +1671 1553 1555 +1675 1556 1557 +1676 1680 1790 +1678 1673 1674 +1680 1554 1555 +1684 1437 1547 +1685 1564 1679 +1690 1331 1332 +1690 1555 1558 +1690 1679 1685 +1694 1453 1456 +1699 1563 1564 +1620 2275 2390 +1630 2390 2391 +1630 2518 2519 +1630 2506 2509 +1631 2275 2279 +1632 2511 2616 +1637 2390 2392 +1637 2399 2400 +1638 2275 2391 +1640 2397 2504 +1647 2262 2269 +1648 2384 2391 +1649 2505 2509 +1662 2276 2279 +1662 2504 2512 +1664 2029 2030 +1675 2279 2392 +1677 2395 2506 +1677 2505 2616 +1678 2406 2519 +1681 2392 2395 +1683 2263 2378 +1686 2278 2279 +1693 2391 2395 +1698 2506 2508 +1699 2504 2616 +1700 2510 2518 +1603 5121 5123 +1604 5125 5127 +1620 5013 5125 +1628 5009 5013 +1633 5251 5258 +1650 5008 5009 +1655 5010 5013 +1660 5127 5128 +1660 5256 5374 +1669 5122 5128 +1670 5256 5379 +1672 5013 5127 +1673 5008 5010 +1676 5255 5374 +1678 5256 5261 +1679 5012 5128 +1680 4892 5008 +1682 5138 5257 +1682 5255 5261 +1684 5258 5379 +1691 5377 5382 +1693 5254 5255 +1694 5012 5127 +1697 5258 5377 +1700 5254 5256 +1607 6071 6072 +1702 1561 1563 +1704 1569 1679 +1709 1554 1672 +1710 1336 1338 +1715 1437 1555 +1717 1563 1569 +1719 1672 1673 +1720 1556 1561 +1720 1557 1558 +1722 1440 1441 +1723 1441 1555 +1723 1547 1554 +1723 1552 1664 +1724 1329 1445 +1726 1439 1441 +1734 1563 1679 +1741 1439 1444 +1742 1674 1675 +1744 1675 1790 +1745 1441 1556 +1747 1681 1686 +1748 1435 1441 +1749 1435 1437 +1751 1569 1686 +1755 1217 1218 +1756 1329 1444 +1763 1679 1686 +1766 1329 1335 +1770 1438 1441 +1771 1224 1331 +1773 1562 1563 +1776 1670 1671 +1781 1453 1459 +1783 1331 1338 +1791 1437 1438 +1792 1430 1547 +1793 1555 1556 +1794 1436 1438 +1800 1459 1573 +1800 1563 1678 +1701 2394 2395 +1701 2385 2498 +1701 2492 2499 +1703 2030 2033 +1703 2610 2616 +1705 2278 2394 +1710 2027 2029 +1711 2023 2139 +1711 2512 2518 +1714 2506 2618 +1714 2505 2618 +1715 2391 2504 +1715 2407 6189 +1719 2389 2391 +1719 2501 2508 +1722 2250 2257 +1730 2610 2617 +1736 2385 2500 +1737 2504 2506 +1739 2503 2508 +1740 2399 2406 +1742 2389 2506 +1743 2389 2501 +1744 2401 2518 +1745 2401 2406 +1746 2031 2033 +1748 2610 2618 +1752 2503 2618 +1753 2389 2498 +1756 2400 2406 +1757 2391 2392 +1757 2493 2604 +1758 2612 2618 +1759 2389 2500 +1761 2386 2500 +1762 2492 2500 +1762 2504 2505 +1762 2503 2613 +1763 2610 2615 +1764 2615 2618 +1765 2140 2256 +1766 2388 2389 +1767 2611 2721 +1771 2503 2615 +1772 2383 2500 +1772 2502 2508 +1779 2399 2401 +1781 2032 2033 +1784 2492 2497 +1786 2611 2615 +1787 2027 2147 +1787 2387 2388 +1787 2383 2389 +1789 2493 2497 +1790 2502 2613 +1791 2612 2615 +1792 2027 2139 +1792 2386 2388 +1793 2392 2393 +1797 2612 2613 +1800 2391 2506 +1703 5258 5262 +1704 5251 5259 +1710 4896 5008 +1714 5138 5259 +1714 5253 5254 +1715 5377 5384 +1718 5256 5259 +1719 5012 5129 +1720 4891 4898 +1722 5258 5259 +1727 5258 5264 +1730 5010 5011 +1731 5377 5385 +1732 5012 5013 +1733 4896 4898 +1736 5264 5385 +1738 5264 5383 +1739 5011 5012 +1743 5136 5259 +1744 5257 5264 +1747 4896 5016 +1752 5257 5258 +1757 5136 5253 +1758 5136 5254 +1761 5263 5270 +1762 5135 5248 +1765 5135 5253 +1769 5135 5254 +1774 5138 5142 +1774 5251 5256 +1776 5262 5385 +1777 5136 5141 +1780 5000 5001 +1788 5137 5257 +1790 5136 5142 +1795 4898 4899 +1715 2407 6189 +1736 6072 6189 +1756 5957 5958 +1761 6072 6190 +1801 1336 1456 +1811 1430 1431 +1814 1670 1672 +1816 1430 1437 +1816 1554 1558 +1818 1458 1459 +1822 1670 1675 +1823 1430 1435 +1829 1110 1217 +1829 1324 1444 +1829 1457 1458 +1834 1672 1675 +1842 1558 1672 +1846 1456 1459 +1849 1552 1554 +1851 1324 1436 +1854 1552 1558 +1861 1435 1438 +1863 1324 1326 +1866 1675 1789 +1874 1454 1459 +1877 880 887 +1877 1320 1436 +1877 1446 1563 +1878 1671 1675 +1881 1457 1459 +1887 1554 1670 +1888 862 869 +1888 874 881 +1888 1329 1330 +1892 1671 1789 +1893 1304 1311 +1894 1314 1424 +1894 1671 1672 +1897 868 875 +1899 1671 1674 +1802 2721 2723 +1807 2721 2722 +1808 2715 2722 +1817 2383 2386 +1818 2615 2723 +1819 2492 2495 +1821 2032 2147 +1822 2133 2140 +1822 2383 2385 +1825 2406 2518 +1826 2383 2388 +1826 2385 2492 +1827 2381 2386 +1829 2728 2829 +1837 2032 2148 +1837 2272 2381 +1841 2378 2383 +1842 2614 2615 +1844 2721 2726 +1851 2267 2383 +1852 2267 2381 +1853 2244 2251 +1858 2391 2498 +1859 2278 2393 +1862 2726 2728 +1871 2378 2379 +1871 2395 2504 +1875 2134 2250 +1884 2835 2836 +1885 2378 2380 +1886 2267 2380 +1891 2726 2729 +1894 2263 2380 +1898 2612 2614 +1900 2266 2267 +1803 4896 5010 +1806 5130 5135 +1809 5256 5258 +1835 5137 5144 +1836 5269 5270 +1837 5134 5141 +1842 5134 5136 +1844 5137 5142 +1845 5139 5141 +1847 5139 5142 +1848 5027 5144 +1851 5130 5133 +1852 4777 4784 +1853 5250 5373 +1860 4896 5011 +1860 5027 5143 +1863 5137 5140 +1864 5139 5140 +1866 5137 5145 +1877 5027 5145 +1880 5135 5136 +1883 5377 5379 +1886 5026 5033 +1888 4784 4891 +1895 5025 5145 +1898 4891 4899 +1901 1327 1444 +1902 1197 1310 +1902 1670 1678 +1904 1446 1556 +1906 1675 1678 +1908 780 886 +1910 1319 1320 +1913 1673 1675 +1916 1331 1339 +1917 863 971 +1919 683 785 +1920 868 869 +1921 1319 1324 +1921 1678 1680 +1921 1669 1671 +1925 1675 1680 +1928 880 881 +1928 1324 1327 +1935 1671 1781 +1936 1082 1089 +1938 1664 1671 +1941 779 786 +1941 1196 1203 +1942 867 869 +1942 868 870 +1944 1327 1329 +1946 880 882 +1946 1558 1678 +1951 965 972 +1951 1305 1421 +1951 1680 1681 +1955 879 881 +1956 768 874 +1957 864 869 +1957 1321 1327 +1961 1083 1196 +1964 689 785 +1965 1322 1327 +1966 874 876 +1966 1212 1319 +1966 1319 1321 +1969 874 875 +1971 880 885 +1974 780 885 +1975 873 875 +1978 864 971 +1979 689 791 +1983 978 1088 +1983 1205 1206 +1983 1210 1324 +1985 763 870 +1985 1328 1329 +1985 1673 1678 +1986 1415 1422 +1989 1103 1104 +1989 1679 1680 +1995 1210 1212 +1997 780 781 +1997 1304 1309 +1998 970 971 +1999 779 781 +2000 873 876 +1919 2265 2266 +1923 2516 6189 +1927 2931 2932 +1930 2611 2614 +1931 2808 2809 +1932 2263 2372 +1934 2264 2266 +1934 2815 2913 +1937 2261 2263 +1937 2829 2837 +1939 2251 2366 +1944 2259 2265 +1945 2472 2577 +1949 2465 2466 +1949 2502 2607 +1952 2261 2264 +1952 2925 2926 +1954 2352 2459 +1956 2583 2584 +1957 2821 2919 +1958 2257 2372 +1962 2345 2346 +1962 2695 2701 +1963 2257 2373 +1964 2229 2230 +1965 2701 2802 +1965 2829 2836 +1969 2257 2261 +1970 2810 2913 +1972 2256 2261 +1973 2366 2372 +1975 1995 1996 +1975 2144 2261 +1976 2919 2920 +1977 2694 2695 +1977 2726 2837 +1979 2809 2810 +1979 3034 3125 +1982 2257 2374 +1985 2113 2229 +1987 2924 2926 +1989 2257 2366 +1991 2149 2265 +1992 1879 1995 +1992 2230 2345 +1992 2467 2472 +1992 2807 2809 +1993 2913 2918 +1993 3131 3132 +1994 2112 2113 +1994 2577 2582 +1999 2465 2467 +1904 4782 4784 +1907 5031 5143 +1914 5025 5140 +1917 4896 4899 +1917 4896 4901 +1920 5024 5134 +1922 5027 5031 +1923 4784 4785 +1927 4782 4899 +1929 4465 4564 +1931 5024 5139 +1933 4805 4912 +1944 5033 5143 +1948 4452 4453 +1948 5031 5145 +1950 4916 5032 +1951 5024 5141 +1953 4459 4558 +1953 5019 5024 +1957 5033 5034 +1961 5025 5030 +1962 4895 5011 +1964 5024 5140 +1965 4704 4705 +1971 4471 4570 +1974 4894 4900 +1981 4440 4441 +1982 4894 4901 +1989 4680 4686 +1995 4894 4899 +1995 5032 5033 +1998 5024 5030 +2000 4337 4434 +1913 5956 5959 +1923 2516 6189 +1926 5957 5959 +1995 6080 6082 +1999 5965 6082 +2004 684 785 +2004 867 870 +2005 1197 1309 +2011 695 791 +2011 4330 4331 +2012 1643 1650 +2013 1199 1205 +2014 1210 1321 +2015 1532 1539 +2016 1650 1760 +2017 1197 1198 +2017 1206 1319 +2018 970 972 +2018 1533 1649 +2018 1878 1879 +2019 879 882 +2022 689 790 +2022 966 1076 +2023 688 695 +2024 694 4331 +2024 683 784 +2024 876 879 +2026 775 885 +2026 867 976 +2029 1760 1767 +2031 1091 1092 +2034 1210 1327 +2035 870 873 +2035 1761 1878 +2037 690 791 +2037 1206 1210 +2037 1415 1420 +2041 779 784 +2041 1210 1216 +2042 864 973 +2043 778 885 +2043 1070 1077 +2043 1210 1322 +2046 694 695 +2046 1304 1306 +2047 967 972 +2048 865 870 +2050 1215 1322 +2051 878 879 +2051 1760 1765 +2052 970 973 +2052 1305 1306 +2052 1645 1650 +2053 1235 1236 +2054 864 976 +2055 694 696 +2055 1422 1532 +2055 1533 1534 +2059 1532 1537 +2059 1877 1878 +2060 778 781 +2060 1209 1210 +2060 1305 1420 +2062 693 695 +2062 1122 1235 +2063 1196 1197 +2064 1760 1878 +2065 678 784 +2066 1235 1237 +2066 1417 1422 +2067 684 787 +2067 967 1076 +2068 1532 1649 +2069 689 695 +2071 1236 1240 +2071 1532 1534 +2072 684 790 +2072 1417 1537 +2073 1098 1205 +2075 877 879 +2075 1192 1198 +2076 684 784 +2080 4329 4331 +2081 1235 1240 +2082 690 790 +2084 866 870 +2084 1648 1649 +2085 1529 1532 +2085 1648 1650 +2085 1761 1762 +2085 1762 1767 +2086 680 784 +2088 684 782 +2088 690 695 +2089 1531 1534 +2090 1192 1309 +2096 1417 1420 +2097 690 796 +2099 1300 1420 +2099 1534 1648 +2002 2464 2465 +2002 2611 2723 +2004 2259 2264 +2004 2802 2807 +2005 2694 2696 +2006 2695 2696 +2007 2467 2470 +2009 2918 2920 +2010 2693 2694 +2011 2258 2261 +2011 2347 2352 +2011 2696 2802 +2012 2344 2345 +2013 2230 2231 +2013 2352 2464 +2014 2696 2701 +2014 2926 2927 +2015 2584 2688 +2016 3138 3225 +2017 1996 2112 +2017 2113 2114 +2017 2228 2229 +2018 1878 1879 +2018 2582 2584 +2019 2255 2366 +2020 2584 2694 +2020 2584 2585 +2022 2353 2464 +2027 2255 2257 +2028 2810 2912 +2029 1996 1997 +2030 2607 2612 +2031 2579 2582 +2032 2919 2926 +2036 1994 1995 +2036 2345 2347 +2038 2579 2585 +2039 2256 2259 +2039 2467 2582 +2041 2347 2353 +2042 2111 2112 +2046 2347 2350 +2046 2693 2695 +2050 2516 6188 +2051 2231 2344 +2052 2149 2259 +2054 2920 2921 +2055 2585 2693 +2057 1879 1880 +2059 1877 1878 +2061 2696 2804 +2062 2804 2807 +2064 2467 2469 +2065 2137 2247 +2065 2143 2149 +2065 2144 2259 +2066 1997 2111 +2068 2228 2231 +2069 2142 2149 +2070 2609 2612 +2070 2696 2801 +2073 2114 2228 +2074 2462 2467 +2079 2921 3021 +2081 1994 1997 +2082 2111 2114 +2083 1880 1994 +2085 2258 2260 +2086 1877 1880 +2092 2462 2464 +2094 2574 2582 +2096 2609 2611 +2098 2258 2259 +2001 4787 4894 +2005 5023 5025 +2011 4330 4331 +2014 4577 4680 +2015 4464 4465 +2019 5254 5374 +2020 5031 5033 +2023 5031 5151 +2025 4780 4781 +2029 4349 4446 +2034 5023 5024 +2035 4782 4787 +2039 5254 5261 +2040 4783 4785 +2041 4440 4447 +2041 5025 5028 +2043 4672 4783 +2051 4361 4458 +2055 4785 4788 +2060 4686 4687 +2061 4459 4564 +2063 5027 5028 +2066 4687 4693 +2066 5022 5023 +2073 5020 5028 +2089 4459 4563 +2091 5261 5374 +2092 5034 5037 +2094 4676 4783 +2094 5254 5259 +2096 4915 4922 +2099 4907 5017 +2100 4440 4442 +2012 5962 5964 +2042 5964 5965 +2049 5963 5964 +2050 2516 6188 +2102 1760 1762 +2102 1762 1877 +2104 1121 1122 +2104 1207 1210 +2105 693 696 +2105 1075 1076 +2105 1126 1235 +2106 1208 1215 +2107 1240 4874 +2108 1205 1207 +2109 967 1081 +2109 1645 1765 +2112 775 877 +2112 1648 1651 +2114 1195 1196 +2115 1300 1306 +2117 1195 1198 +2118 1759 1762 +2119 1192 1306 +2120 872 873 +2120 968 971 +2120 1096 1207 +2121 1417 1419 +2123 696 4329 +2125 866 976 +2125 1092 1207 +2125 1195 1201 +2125 1645 1651 +2128 690 788 +2129 1092 1199 +2129 1205 1208 +2129 1208 1209 +2130 1092 1205 +2130 1303 1306 +2131 1208 1210 +2132 686 790 +2133 686 782 +2133 871 876 +2133 1207 1208 +2134 1092 1096 +2144 1085 1199 +2147 968 973 +2149 1096 1205 +2152 1101 1214 +2152 1417 1529 +2153 1092 1093 +2154 1240 4875 +2155 1085 1086 +2156 4329 4332 +2159 1646 1648 +2162 975 1086 +2162 1090 1092 +2163 1208 1213 +2164 968 976 +2164 1095 1208 +2166 690 692 +2168 776 784 +2168 1085 1090 +2169 1095 1096 +2170 1530 1534 +2171 975 1079 +2171 981 1085 +2172 1086 1087 +2172 1529 1531 +2174 1122 1126 +2175 1205 1210 +2181 1090 1093 +2181 1100 1107 +2181 1647 1648 +2189 776 781 +2190 1354 4992 +2194 1758 1762 +2195 1010 4648 +2195 1645 1647 +2199 1085 1087 +2102 1762 1877 +2105 2227 2231 +2107 2142 2147 +2108 2250 2255 +2108 2360 2367 +2108 2693 2696 +2111 2142 2259 +2113 2231 2342 +2113 2366 2368 +2114 2349 2464 +2116 2915 2918 +2118 2692 2696 +2120 2226 2231 +2120 2347 2349 +2121 2110 2114 +2123 2342 2350 +2128 2255 2258 +2128 2367 2368 +2131 2226 2227 +2132 2349 2456 +2132 2921 3020 +2133 2227 2342 +2133 2342 2347 +2134 1875 1877 +2134 2342 2349 +2134 2806 2807 +2135 2144 2149 +2135 2806 2810 +2136 2349 2350 +2136 2604 2609 +2137 2691 2693 +2138 2932 3027 +2139 2579 2581 +2142 2349 2353 +2143 1992 1994 +2143 2497 2607 +2145 2114 2226 +2146 1993 1997 +2146 2144 2264 +2148 2581 2693 +2152 2927 3027 +2154 2226 2234 +2157 2462 2463 +2159 2361 2474 +2159 2927 3026 +2160 2696 2799 +2161 2144 2146 +2161 2799 2807 +2162 2109 2114 +2162 2144 2147 +2162 3027 3032 +2165 2109 2226 +2165 2143 2144 +2166 2611 2715 +2169 2116 2226 +2169 2349 2462 +2169 2709 2716 +2170 2348 2349 +2172 2469 2574 +2174 2144 2256 +2175 2253 2258 +2175 2932 3034 +2176 1876 1880 +2178 2226 2233 +2179 3026 3027 +2180 2921 2926 +2182 2256 2258 +2182 3027 3034 +2183 2574 2581 +2185 2365 2367 +2185 2926 3027 +2187 2109 2110 +2189 2139 2144 +2189 2250 2251 +2190 3027 3029 +2192 2139 2142 +2192 2146 2256 +2195 2109 2111 +2195 2605 2715 +2197 2257 2258 +2104 4452 4454 +2106 4669 4774 +2107 4330 4332 +2108 4343 4446 +2108 4907 5022 +2110 5026 5027 +2117 4808 4921 +2118 5133 5136 +2123 5132 5133 +2127 4902 4907 +2128 4785 4787 +2131 4908 5022 +2140 4344 4446 +2140 4780 4787 +2141 4678 4789 +2147 4908 5020 +2149 5374 5379 +2150 4662 4663 +2154 4337 4439 +2154 4900 4901 +2156 4329 4332 +2156 4451 4453 +2156 4678 4684 +2157 5019 5136 +2162 4439 4440 +2163 4332 4337 +2165 4904 4908 +2168 4338 4439 +2169 4335 4439 +2169 4446 4451 +2169 4910 5026 +2170 4337 4440 +2173 4905 5022 +2174 4332 4335 +2175 4454 4459 +2176 4337 4338 +2178 4786 4787 +2182 4900 4902 +2182 4910 5028 +2185 4780 4782 +2190 4902 4905 +2191 4335 4337 +2192 4343 4445 +2193 4437 4440 +2194 4440 4445 +2198 5136 5139 +2109 5965 6083 +2110 5963 6083 +2129 5970 6083 +2140 5979 6092 +2143 5751 5864 +2147 6205 6206 +2150 5741 5742 +2159 6098 6099 +2160 5873 5880 +2169 5744 5745 +2174 5977 6092 +2174 6120 6238 +2177 6202 6203 +2180 6098 6217 +2187 6202 6209 +2188 5870 5871 +2191 5622 5743 +2192 6089 6090 +2192 6092 6100 +2192 6452 6459 +2195 5977 6097 +2198 5745 5746 +2198 6099 6100 +2198 6090 6202 +2200 5743 5746 +2200 6105 6217 +2201 1085 1092 +2201 1240 4992 +2202 1412 1420 +2203 1080 1187 +2208 777 885 +2209 975 1087 +2210 1083 1084 +2211 968 969 +2212 691 696 +2223 1456 1458 +2225 1757 1765 +2226 777 781 +2234 1302 1420 +2239 1084 1195 +2240 777 883 +2252 777 877 +2256 1302 1306 +2256 1757 1762 +2257 1530 1646 +2259 1082 1087 +2260 969 973 +2261 865 872 +2262 686 788 +2264 979 1087 +2264 1529 1530 +2270 969 970 +2271 1758 1875 +2272 692 693 +2273 1640 1646 +2280 1082 1084 +2289 978 1082 +2294 776 783 +2295 871 872 +2202 2605 2609 +2203 2810 2910 +2207 2226 2228 +2208 2257 2263 +2212 2256 2264 +2215 2606 2609 +2219 2143 2258 +2220 2365 2474 +2224 1993 2109 +2225 2910 2918 +2225 3027 3028 +2228 2142 2144 +2233 2251 2252 +2236 2252 2255 +2236 2605 2717 +2238 2031 2032 +2240 2139 2140 +2248 2917 2918 +2249 2139 2141 +2251 2917 2921 +2254 2709 2717 +2258 2025 2031 +2258 2581 2685 +2261 1915 2031 +2266 1875 1876 +2271 1758 1875 +2274 2251 2255 +2275 2805 2806 +2276 2474 2476 +2276 2691 2692 +2280 2921 3018 +2283 2368 2371 +2287 2030 2031 +2288 2921 3026 +2289 1992 1993 +2294 2468 2475 +2294 2698 2799 +2295 1876 1992 +2202 4336 4337 +2206 4338 4445 +2206 4904 4905 +2210 4678 4791 +2211 4676 4791 +2212 4678 4783 +2213 4344 4445 +2216 4899 4901 +2224 5374 5381 +2228 4897 4905 +2229 4678 4682 +2230 4343 4440 +2233 4338 4440 +2235 4344 4448 +2237 4779 4780 +2237 4788 4902 +2241 4330 4337 +2247 4899 4902 +2249 4454 4457 +2253 4336 4440 +2253 4677 4684 +2258 4338 4437 +2260 4448 4451 +2266 4327 4332 +2266 4451 4454 +2266 4669 4779 +2274 4450 4451 +2275 4903 5020 +2281 4443 4451 +2282 4785 4786 +2284 4677 4682 +2291 4910 5020 +2296 5635 5636 +2202 5977 6094 +2202 6440 6447 +2203 5976 6089 +2204 5757 5870 +2205 6446 6453 +2209 6202 6207 +2212 5975 5976 +2212 6452 6453 +2214 6097 6100 +2220 6548 6555 +2221 6099 6103 +2224 6451 6453 +2225 5741 5743 +2226 5744 5749 +2232 6316 6317 +2234 5746 5749 +2235 6103 6217 +2235 6202 6204 +2240 5744 5751 +2240 5749 5752 +2241 6452 6454 +2244 5746 5748 +2247 6232 6239 +2248 6316 6318 +2250 5747 5749 +2255 5741 5748 +2258 5751 5752 +2258 6448 6453 +2260 6344 6458 +2261 6103 6219 +2265 6217 6225 +2266 5766 5885 +2267 6219 6225 +2268 5750 5751 +2268 6005 6012 +2271 5627 5748 +2275 6343 6458 +2277 6094 6095 +2281 5747 5748 +2282 5630 5750 +2283 6095 6097 +2283 6080 6085 +2289 6223 6224 +2290 6224 6225 +2290 6343 6350 +2293 5892 6005 +2294 5885 5886 +2296 5635 5636 +2296 6119 6126 +2296 6343 6349 +2298 6653 6660 +2300 5750 5755 +2301 4762 4763 +2302 1081 1084 +2302 1640 1647 +2305 1757 1764 +2307 1647 1757 +2312 973 975 +2318 866 974 +2318 1126 1237 +2328 1193 1195 +2330 680 782 +2333 685 692 +2334 1301 1306 +2338 1301 1309 +2345 4328 4329 +2346 771 877 +2347 973 976 +2349 973 1087 +2351 1007 1014 +2352 691 692 +2352 1080 1084 +2360 1124 4651 +2363 1007 1008 +2363 1096 1213 +2364 973 978 +2365 1194 1195 +2367 1192 1194 +2374 971 972 +2380 1101 1213 +2383 1007 1009 +2386 971 973 +2391 1013 1014 +2394 1011 1121 +2398 691 4328 +2400 686 692 +2305 2812 2910 +2309 2365 2482 +2310 2495 2502 +2311 2143 2259 +2312 2255 2368 +2331 2586 2593 +2353 2254 2255 +2358 2368 2369 +2361 2513 2520 +2363 2916 2917 +2370 2253 2255 +2374 2253 2260 +2374 2917 2923 +2393 2110 2226 +2398 2513 2625 +2301 4762 4763 +2303 4903 4904 +2306 4344 4443 +2310 4340 4445 +2310 5629 5636 +2313 4332 4334 +2324 4460 4564 +2326 4334 4439 +2326 5141 5254 +2329 4683 4690 +2334 4768 4769 +2340 4899 4900 +2345 4328 4329 +2347 4568 4677 +2347 4657 4762 +2348 4897 4902 +2357 4775 4882 +2368 4460 4566 +2369 5638 5645 +2371 4460 4563 +2375 4897 4898 +2376 4679 4682 +2376 4676 4786 +2378 4779 4781 +2386 4465 4570 +2386 4664 4774 +2394 4327 4328 +2397 4465 4569 +2398 691 4328 +2399 4449 4454 +2302 5752 5755 +2303 6097 6102 +2306 5752 5754 +2306 6090 6207 +2309 5747 5754 +2310 5629 5636 +2310 6222 6225 +2310 6233 6349 +2313 6345 6458 +2315 6006 6125 +2315 6090 6208 +2316 6345 6350 +2319 6224 6228 +2323 5645 5759 +2323 5757 5878 +2324 6094 6096 +2325 6653 6654 +2328 6090 6091 +2330 6102 6219 +2341 5976 6095 +2343 6334 6335 +2348 5752 5753 +2350 5765 5766 +2352 6219 6220 +2353 6348 6350 +2355 6348 6349 +2359 5755 5758 +2362 6457 6458 +2365 5755 5757 +2365 6234 6349 +2366 6340 6341 +2367 6457 6459 +2369 5638 5645 +2370 6224 6340 +2376 6234 6239 +2379 5884 5885 +2386 6096 6097 +2391 6340 6342 +2396 6237 6239 +2397 5640 5645 +2409 1080 1193 +2426 1079 1084 +2433 1121 1123 +2434 1079 1087 +2437 4650 4651 +2451 1413 1529 +2461 1192 1301 +2469 1079 1086 +2469 1641 1647 +2476 1412 1419 +2494 1354 4994 +2496 968 975 +2422 2917 3018 +2425 2474 2475 +2426 2254 2369 +2459 2253 2369 +2467 2368 2370 +2467 2513 2514 +2473 2233 2342 +2486 2365 2370 +2404 4774 4779 +2412 4782 4785 +2413 4460 4569 +2421 4897 4904 +2425 4346 4443 +2426 4466 4570 +2427 5525 5638 +2429 4776 4779 +2434 4779 4782 +2437 4650 4651 +2437 4663 4774 +2440 4327 4431 +2443 4340 4443 +2447 5635 5642 +2448 4768 4770 +2449 4683 4684 +2452 4684 4685 +2455 5635 5640 +2459 4466 4572 +2461 4460 4561 +2464 4773 4779 +2465 4683 4688 +2471 4768 4775 +2477 4664 4773 +2478 4778 4779 +2481 4466 4569 +2485 4663 4773 +2489 4658 4664 +2491 4334 4431 +2492 4663 4664 +2493 4340 4437 +2493 4544 4653 +2494 4462 4569 +2497 4682 4685 +2500 4658 4773 +2405 6218 6328 +2406 6228 6342 +2408 6237 6238 +2408 6345 6463 +2409 6220 6222 +2423 6097 6214 +2423 6121 6238 +2424 6121 6126 +2426 6348 6463 +2438 5766 5767 +2438 6340 6345 +2441 5876 5883 +2442 5976 5977 +2444 6457 6463 +2447 5635 5642 +2455 5635 5640 +2462 6089 6094 +2469 5636 5637 +2472 6455 6456 +2477 5633 5753 +2480 6234 6354 +2485 6228 6345 +2485 6340 6347 +2487 6005 6010 +2490 6124 6126 +2520 1123 1126 +2553 1187 1194 +2561 1010 4538 +2569 1188 1194 +2579 1010 4649 +2588 1301 1303 +2589 1015 4648 +2589 1188 1301 +2591 1302 1418 +2600 978 1087 +2502 2476 2479 +2507 2475 2476 +2519 2476 2588 +2530 2473 2475 +2534 2025 2032 +2537 2365 2477 +2543 2469 2580 +2549 2030 2032 +2557 2473 2580 +2558 2476 2477 +2572 2027 2032 +2575 3018 3020 +2578 2473 2588 +2579 2607 2613 +2584 2032 2142 +2590 2580 2582 +2593 2476 2478 +2503 4567 4569 +2507 4456 4563 +2508 4334 4437 +2512 4462 4567 +2512 4661 4663 +2515 4570 4575 +2516 4771 4779 +2517 4567 4570 +2519 4663 4768 +2519 4664 4771 +2520 4657 4767 +2522 4462 4568 +2524 4561 4569 +2524 4685 4688 +2524 4777 4782 +2531 4767 4769 +2531 4777 4778 +2532 4572 4575 +2537 4660 4664 +2544 4575 4577 +2547 4658 4768 +2552 4657 4768 +2554 4567 4572 +2556 4454 4456 +2556 4658 4661 +2561 1010 4538 +2564 4685 4687 +2569 4660 4773 +2571 4676 4681 +2585 4666 4778 +2589 4666 4771 +2596 4658 4767 +2598 4686 4688 +2599 4780 4786 +2501 6005 6007 +2505 5876 5881 +2507 5882 5883 +2517 5886 5887 +2518 6124 6125 +2519 6006 6007 +2520 6348 6354 +2524 5761 5878 +2524 5876 5878 +2541 5976 6094 +2546 6348 6351 +2554 5742 5861 +2555 6237 6240 +2557 5883 5884 +2568 5742 5743 +2570 5753 5755 +2573 5767 5885 +2575 6347 6348 +2578 6004 6007 +2581 5887 5892 +2583 5881 5884 +2583 6446 6447 +2599 6001 6007 +2605 1096 1208 +2613 1015 1121 +2615 1101 1208 +2628 1015 4761 +2628 1093 1095 +2646 1908 1915 +2654 1240 4877 +2659 1301 1302 +2667 1301 1418 +2688 1295 1301 +2696 1085 1088 +2607 2254 2370 +2617 2469 2582 +2619 2613 2614 +2621 2581 2582 +2646 1908 1915 +2655 2473 2478 +2655 2615 2724 +2662 1909 1915 +2665 2473 2583 +2676 2582 2585 +2685 2364 2477 +2690 1915 2025 +2700 2363 2370 +2611 4655 4767 +2616 4572 4577 +2616 4679 4685 +2620 4449 4450 +2624 4683 4691 +2626 5522 5641 +2628 1015 4761 +2636 4576 4577 +2644 4455 4561 +2644 4570 4577 +2649 4680 4685 +2662 4462 4561 +2670 4573 4580 +2675 4652 4657 +2677 5521 5528 +2679 4658 4765 +2683 4659 4660 +2692 4686 4693 +2694 4675 4786 +2601 6124 6243 +2602 5885 5887 +2604 6124 6127 +2606 6121 6243 +2618 6457 6460 +2619 5887 6010 +2619 5889 6002 +2619 6085 6088 +2626 5522 5641 +2626 5755 5760 +2637 6345 6347 +2641 5753 5873 +2641 5760 5878 +2645 5883 5887 +2648 5753 5754 +2648 5887 6002 +2654 5767 5772 +2656 5887 5890 +2660 5887 5893 +2661 5767 5890 +2663 5765 5772 +2667 6102 6214 +2669 5887 6004 +2687 5651 5771 +2688 5761 5879 +2689 5760 5873 +2717 871 878 +2730 1352 4992 +2738 1015 4649 +2744 901 4538 +2752 906 4538 +2762 1012 4649 +2763 906 4649 +2768 1087 1088 +2769 1015 4651 +2797 1013 4649 +2797 1125 1126 +2704 2025 2030 +2705 1910 2030 +2710 1910 1915 +2745 2027 2030 +2750 1915 2030 +2751 2022 2030 +2752 2473 2582 +2762 2604 2605 +2718 4660 4661 +2720 4572 4574 +2720 4692 4693 +2722 4572 4685 +2723 4456 4555 +2727 4679 4681 +2728 4677 4685 +2736 4456 4561 +2739 4691 4693 +2744 901 4538 +2749 4567 4568 +2749 4688 4691 +2750 4674 4681 +2752 906 4538 +2753 4679 4680 +2756 4555 4561 +2784 4692 4694 +2785 4690 4691 +2791 4691 4694 +2705 6095 6096 +2712 6220 6221 +2715 5889 6010 +2719 5879 5884 +2723 6089 6096 +2723 6096 6102 +2724 5884 5886 +2725 5766 5879 +2737 6214 6220 +2740 6007 6124 +2745 5760 5879 +2752 5889 6008 +2756 6003 6007 +2763 5895 6008 +2763 6122 6124 +2765 6002 6007 +2780 6002 6010 +2799 5893 6008 +2817 901 4432 +2818 1013 1015 +2819 1013 4651 +2820 1238 4875 +2827 1124 4761 +2832 1124 1126 +2832 1126 1238 +2833 4541 4649 +2837 901 4539 +2839 1088 1090 +2847 1012 1013 +2849 906 4539 +2852 1238 4877 +2858 1352 4877 +2872 1238 4763 +2872 1352 4994 +2808 3012 3019 +2812 2471 2478 +2848 3020 3023 +2849 2472 2582 +2854 3019 3020 +2880 3017 3019 +2810 4692 4699 +2814 4677 4683 +2817 901 4432 +2823 4698 4699 +2827 1124 4761 +2832 4694 4697 +2833 4541 4649 +2835 4697 4699 +2848 4574 4677 +2865 4689 4694 +2868 4658 4660 +2873 4705 4810 +2885 4689 4690 +2898 4699 4700 +2811 5893 6010 +2813 5893 6013 +2818 6014 6015 +2842 6002 6009 +2847 5766 5886 +2868 5887 6005 +2870 6003 6122 +2881 6008 6016 +2908 794 4432 +2911 971 976 +2938 1124 4763 +2940 971 978 +2946 869 971 +2958 799 4432 +2969 869 978 +2982 869 976 +2988 794 4431 +2990 799 4539 +2901 2620 2724 +2918 2724 2729 +2934 2472 2583 +2903 4680 4682 +2904 4700 4810 +2906 4689 4696 +2908 794 4432 +2921 4571 4680 +2942 4700 4809 +2958 799 4432 +2966 4680 4687 +2980 4810 4815 +2984 4653 4660 +2988 794 4431 +2990 4572 4680 +2902 5892 6012 +2904 5904 6023 +2907 6015 6016 +2913 5892 6010 +2918 6235 6238 +2922 6123 6127 +2928 6013 6016 +2928 6304 6305 +2929 6017 6024 +2937 6122 6123 +2949 5893 6011 +2950 6002 6122 +2957 6123 6243 +2960 6021 6134 +2973 5892 6011 +2974 6235 6243 +2980 6014 6019 +2983 5891 6011 +2984 5892 5898 +2995 5892 5893 +2995 5898 6011 +2999 6455 6463 +3000 6347 6455 +3014 794 4328 +3039 794 4433 +3073 696 4328 +3090 1353 4994 +3092 906 4541 +3021 2724 2731 +3040 2692 2799 +3014 794 4328 +3021 4654 4765 +3039 794 4433 +3039 4816 4817 +3054 4817 4823 +3073 696 4328 +3075 4650 4652 +3079 4654 4658 +3080 4696 4697 +3092 906 4541 +3002 5891 5898 +3004 6235 6240 +3005 5893 6016 +3006 5891 5892 +3010 5893 5898 +3021 6011 6016 +3025 6016 6018 +3027 6016 6019 +3028 5778 5891 +3028 5885 5891 +3029 6236 6240 +3030 5890 5892 +3030 6454 6459 +3040 6236 6354 +3045 5885 5890 +3052 5896 5898 +3052 6235 6241 +3058 6346 6354 +3068 5772 5885 +3071 6235 6242 +3075 6123 6241 +3075 6346 6351 +3083 6346 6347 +3093 5896 5897 +3096 6455 6460 +3107 904 4539 +3112 799 4433 +3116 906 1013 +3158 1090 1095 +3161 866 968 +3171 1088 1095 +3191 1088 1089 +3141 2729 2731 +3107 4652 4655 +3112 799 4433 +3164 4653 4654 +3188 4654 4655 +3102 5778 5897 +3106 5895 6016 +3118 6346 6352 +3120 6454 6566 +3132 6236 6352 +3135 6089 6091 +3141 6453 6454 +3150 5896 5899 +3155 6445 6447 +3157 6454 6571 +3170 6451 6565 +3184 6448 6560 +3187 5777 5784 +3198 6019 6021 +3213 1013 4650 +3225 1095 1207 +3233 1301 1308 +3213 1013 4650 +3202 6448 6565 +3206 6456 6460 +3209 6454 6565 +3213 6447 6560 +3227 6456 6462 +3233 6456 6571 +3243 6304 6306 +3245 5895 5899 +3246 6561 6671 +3250 6554 6560 +3251 6450 6565 +3267 6559 6560 +3271 6455 6462 +3273 5895 6014 +3278 6557 6560 +3284 6560 6561 +3290 6559 6562 +3294 6557 6565 +3297 6561 6562 +3371 4649 4651 +3383 4649 4652 +3394 1095 1202 +3325 2934 2941 +3337 2935 3036 +3340 2836 2940 +3345 2513 2515 +3327 4680 4681 +3338 4695 4702 +3363 4697 4700 +3369 4695 4696 +3371 5381 5500 +3383 4649 4652 +3305 6557 6562 +3311 6564 6565 +3313 6561 6670 +3316 6450 6557 +3320 6563 6564 +3326 6557 6564 +3327 6345 6348 +3329 6563 6565 +3333 6563 6571 +3334 5894 5899 +3334 6558 6562 +3336 6561 6665 +3353 6346 6461 +3355 6563 6568 +3357 6346 6353 +3363 6555 6665 +3367 6456 6569 +3368 6558 6564 +3379 5894 5901 +3382 6556 6665 +3464 696 4433 +3489 1302 1412 +3414 3029 3032 +3424 2728 2837 +3425 3029 3034 +3432 3125 3130 +3435 3130 3132 +3408 5381 5387 +3421 4680 4792 +3427 5379 5382 +3431 4695 4700 +3460 5381 5382 +3464 696 4433 +3482 5380 5381 +3494 5379 5380 +3417 6555 6666 +3418 6556 6670 +3466 6222 6227 +3476 6563 6570 +3477 6664 6665 +3489 6343 6345 +3500 6552 6662 +3508 1295 1412 +3509 1300 1302 +3529 1085 1093 +3531 799 4435 +3542 797 4433 +3546 975 1085 +3569 979 1085 +3512 3131 3133 +3527 3127 3130 +3574 2836 2840 +3583 2940 2942 +3590 2834 2837 +3524 4698 4700 +3528 5262 5379 +3531 799 4435 +3537 5261 5380 +3542 797 4433 +3544 5261 5381 +3549 4702 4703 +3552 5261 5379 +3560 4700 4703 +3563 4592 4701 +3581 4701 4703 +3595 4592 4598 +3598 4703 4706 +3505 6342 6343 +3515 5781 5900 +3518 6227 6342 +3521 6651 6752 +3526 6343 6344 +3528 5894 5902 +3528 6659 6666 +3540 5781 5902 +3540 6664 6666 +3555 6664 6667 +3560 6659 6660 +3561 5779 5902 +3561 6661 6666 +3563 6660 6666 +3577 6658 6660 +3585 5780 5787 +3588 6758 6759 +3598 6558 6670 +3601 1302 1303 +3608 3030 3037 +3623 2836 2837 +3625 2939 2941 +3625 2941 3036 +3642 2941 2942 +3653 2840 2942 +3663 2941 3044 +3676 3037 3134 +3680 3049 3140 +3685 3042 3043 +3687 2942 2945 +3611 4591 4598 +3618 4698 4705 +3630 4596 4701 +3639 4596 4598 +3646 4596 4706 +3674 4703 4705 +3676 4596 4709 +3694 4492 4591 +3602 5779 5897 +3606 5781 5785 +3614 6662 6664 +3615 6655 6660 +3617 6556 6662 +3623 5780 5785 +3632 6659 6661 +3642 5780 5786 +3647 5666 5786 +3647 6558 6668 +3655 5782 5785 +3665 5672 5786 +3673 5779 5784 +3691 5780 5788 +3694 5666 5788 +3696 5672 5792 +3702 1013 4541 +3739 3146 3147 +3748 3042 3044 +3755 3147 3240 +3771 3036 3038 +3775 3047 3049 +3781 2739 6420 +3787 3031 3128 +3796 2942 2943 +3702 1013 4541 +3711 4704 4706 +3713 4591 4599 +3721 4485 4492 +3737 4490 4492 +3748 4704 4709 +3771 4490 4599 +3774 4596 4599 +3776 4388 4492 +3782 4594 4599 +3785 4388 4491 +3800 4704 4711 +3701 5670 5786 +3718 5664 5788 +3722 6305 6419 +3726 5782 5784 +3726 6227 6337 +3737 5672 5794 +3748 6661 6667 +3750 5670 5788 +3769 6305 6309 +3775 5783 5785 +3781 2739 6420 +3797 5672 5676 +3810 2832 2837 +3815 3140 3148 +3817 2740 2847 +3822 3147 3151 +3824 2945 3044 +3834 3044 3050 +3836 3042 3047 +3839 3235 3322 +3844 3047 3050 +3845 3234 3241 +3849 3047 3148 +3850 3044 3047 +3852 3042 3050 +3852 3147 3148 +3853 3042 3049 +3853 3047 3052 +3855 3045 3050 +3856 3043 3047 +3857 2944 2945 +3857 3045 3047 +3858 2945 3042 +3858 3050 3052 +3863 2945 3045 +3865 3145 3148 +3866 3143 3148 +3874 2941 2947 +3875 2943 2944 +3879 2944 2950 +3880 2947 3042 +3880 3051 3052 +3887 2941 2945 +3889 2940 2941 +3892 3052 3053 +3895 2950 3045 +3895 3234 3242 +3898 3147 3242 +3801 4596 4601 +3803 4492 4493 +3803 4495 4599 +3820 4491 4493 +3822 4594 4601 +3827 5671 5676 +3829 4493 4496 +3850 5673 5794 +3856 4392 4491 +3858 4601 4704 +3863 4495 4496 +3865 4704 4710 +3871 4387 4394 +3886 4392 4394 +3890 5677 5684 +3897 4493 4499 +3812 5678 5792 +3813 5669 5788 +3816 6306 6309 +3818 5783 5788 +3824 5663 5784 +3827 5671 5676 +3839 5678 5798 +3843 5670 5794 +3843 5783 5784 +3850 5673 5794 +3864 5676 5792 +3864 5678 5800 +3878 5676 5678 +3880 5678 5682 +3881 5670 5789 +3890 5677 5684 +3891 5676 5794 +3933 1295 1302 +3987 859 860 +3904 2838 2839 +3909 3145 3242 +3912 2839 2840 +3914 3145 3150 +3914 3239 3241 +3919 3239 3242 +3922 2837 2839 +3922 3143 3149 +3923 3237 3242 +3937 3150 3237 +3944 3052 3143 +3944 3143 3150 +3951 3322 3324 +3952 2839 2943 +3952 3322 3323 +3956 3145 3237 +3957 3239 3322 +3965 3239 3330 +3973 3242 3244 +3982 3323 3404 +3987 2726 2731 +3988 3046 3052 +3991 3239 3244 +3992 3322 3327 +3993 2731 2832 +3994 3052 3149 +3996 3045 3052 +3996 3322 3325 +3999 3052 3148 +3901 4392 4499 +3903 5677 5682 +3909 4495 4600 +3925 4494 4496 +3931 5683 5684 +3953 4295 4393 +3961 4494 4499 +3964 5684 5685 +3973 5679 5682 +3973 5562 5682 +3981 4394 4395 +3991 4494 4501 +3991 5682 5685 +3992 5683 5690 +3996 4393 4395 +3903 5677 5682 +3905 5676 5797 +3908 5783 5790 +3914 5676 5800 +3921 5675 5794 +3930 5676 5795 +3931 5683 5684 +3939 6558 6669 +3940 6558 6662 +3941 5783 5789 +3948 6661 6664 +3949 6647 6654 +3954 5676 5681 +3964 5684 5685 +3971 6663 6664 +3973 5562 5682 +3973 5679 5682 +3973 6658 6661 +3977 5669 5789 +3988 6468 6575 +3989 6656 6663 +3991 5682 5685 +3992 5683 5690 +4007 2923 3026 +4010 3327 3329 +4011 3327 3330 +4012 2923 3025 +4014 3404 3405 +4020 2923 3018 +4025 3237 3244 +4033 3325 3330 +4040 3238 3244 +4044 3404 3406 +4048 3013 3110 +4053 3244 3325 +4063 3323 3327 +4012 4395 4398 +4016 4394 4397 +4019 5683 5688 +4023 4397 4499 +4034 5570 5689 +4044 4294 4301 +4053 4397 4398 +4062 5568 5688 +4065 5685 5688 +4082 4299 4393 +4094 4397 4500 +4019 5683 5688 +4028 6569 6570 +4029 6661 6663 +4045 6569 6680 +4053 6019 6022 +4055 6581 6582 +4055 6663 6764 +4062 5568 5688 +4062 6569 6571 +4062 6576 6680 +4065 5685 5688 +4068 5675 5789 +4082 6021 6142 +4084 6570 6574 +4085 6569 6574 +4096 5680 5682 +4097 6680 6688 +4099 6574 6680 +4128 696 4331 +4141 797 4331 +4150 797 4435 +4102 3327 3404 +4105 3024 3026 +4112 3327 3412 +4117 3405 3480 +4119 3405 3409 +4121 3406 3412 +4133 3404 3409 +4154 3024 3029 +4158 3474 3481 +4161 3406 3409 +4168 2508 2613 +4170 3327 3332 +4198 3029 3031 +4102 4299 4301 +4124 4299 4401 +4147 4207 4300 +4147 5576 5689 +4148 5683 5691 +4149 5679 5681 +4150 797 4435 +4151 5574 5689 +4153 4396 4398 +4154 5570 5691 +4158 4331 4433 +4163 5685 5687 +4164 4294 4302 +4166 4331 4435 +4167 4331 4332 +4174 5568 5691 +4182 4331 4434 +4197 5574 5691 +4106 5675 5795 +4108 6574 6682 +4112 6680 6683 +4115 6017 6019 +4117 6022 6142 +4117 6021 6140 +4117 6680 6685 +4119 6570 6680 +4120 6680 6682 +4123 6027 6140 +4123 6570 6571 +4130 6764 6771 +4132 6460 6571 +4135 6674 6680 +4136 6568 6571 +4137 6681 6788 +4138 6681 6685 +4140 6025 6140 +4142 6687 6788 +4147 5576 5689 +4148 5683 5691 +4149 5679 5681 +4151 5574 5689 +4151 6680 6681 +4154 5570 5691 +4163 5685 5687 +4165 6025 6142 +4166 6685 6687 +4168 6685 6688 +4174 5568 5691 +4174 6146 6147 +4176 6080 6199 +4176 6661 6772 +4180 6764 6772 +4182 6140 6148 +4183 6573 6574 +4187 6794 6795 +4189 6687 6795 +4190 6019 6024 +4195 6147 6148 +4197 5574 5691 +4201 962 969 +4210 1440 1555 +4204 3029 3130 +4209 3325 3332 +4227 3133 3138 +4239 3130 3133 +4253 3024 3025 +4271 3405 3482 +4282 3327 3407 +4290 3474 3482 +4238 5576 5695 +4246 5674 5681 +4259 5582 5695 +4275 5576 5697 +4294 5574 5694 +4299 5574 5697 +4211 6788 6796 +4214 6687 6796 +4219 6146 6265 +4220 6571 6573 +4226 6566 6571 +4232 6024 6142 +4233 6682 6683 +4237 6795 6799 +4238 5576 5695 +4241 6794 6899 +4242 6794 6796 +4245 6147 6151 +4246 5674 5681 +4249 6795 6899 +4254 6017 6018 +4258 6145 6148 +4259 5582 5695 +4266 6691 6796 +4275 5576 5697 +4278 6153 6265 +4286 6683 6684 +4287 6899 6900 +4291 6899 6901 +4294 5574 5694 +4296 6142 6143 +4296 6151 6265 +4299 5574 5697 +4300 6683 6685 +4301 3138 3230 +4302 3129 3130 +4306 3122 3130 +4317 3133 3136 +4345 3406 3407 +4352 3406 3482 +4364 3403 3482 +4370 3231 3232 +4302 4206 4213 +4308 4299 4302 +4309 5582 5701 +4339 4396 4401 +4340 4301 4302 +4349 5580 5695 +4384 4300 4302 +4388 4301 4304 +4390 5582 5703 +4305 6151 6267 +4306 6796 6799 +4306 6799 6901 +4326 6271 6272 +4328 6024 6137 +4337 6899 6904 +4337 6906 7000 +4341 6265 6273 +4349 5580 5695 +4360 6573 6683 +4360 6685 6690 +4363 6272 6273 +4365 6143 6145 +4368 6796 6797 +4368 6904 6906 +4369 5680 5681 +4375 5680 5687 +4397 6690 6796 +4405 3128 3133 +4408 3479 3481 +4411 3475 3543 +4455 3326 3332 +4457 3479 3482 +4458 3138 3231 +4476 3481 3543 +4497 3408 3409 +4408 5685 5686 +4431 5573 5691 +4433 5568 5686 +4447 5580 5697 +4472 4302 4305 +4474 5586 5701 +4477 5574 5692 +4479 4302 4308 +4480 5580 5700 +4408 5685 5686 +4416 6661 6767 +4417 7006 7007 +4425 6278 6388 +4431 5573 5691 +4433 5568 5686 +4434 6145 6150 +4434 6904 6907 +4439 6904 6910 +4442 6150 6267 +4443 6453 6459 +4445 6272 6276 +4447 5580 5697 +4451 5686 5688 +4452 5686 5691 +4456 6798 6799 +4464 6143 6144 +4465 6276 6388 +4465 7000 7008 +4467 6459 6566 +4470 6572 6573 +4470 6904 7008 +4474 6901 6902 +4475 7000 7007 +4477 7007 7097 +4480 5580 5700 +4480 6270 6273 +4485 6904 6909 +4487 6265 6268 +4489 5686 5687 +4492 6902 6904 +4500 7005 7007 +4502 3326 3407 +4508 3144 3237 +4518 3408 3483 +4524 3128 3129 +4533 3031 3122 +4534 3144 3231 +4550 3479 3551 +4559 3139 3231 +4566 3139 3230 +4567 3407 3408 +4567 3408 3482 +4568 3144 3236 +4573 3477 3482 +4596 3479 3543 +4598 3142 3236 +4507 4211 4300 +4530 4211 4213 +4535 5580 5703 +4555 5586 5703 +4568 4304 4401 +4585 5586 5707 +4586 4211 4308 +4511 7005 7008 +4512 6267 6268 +4519 6276 6390 +4521 7003 7008 +4526 7097 7105 +4536 7005 7105 +4545 6690 6791 +4547 7097 7104 +4553 7103 7104 +4554 7102 7105 +4556 6660 6661 +4563 6268 6270 +4564 6797 6798 +4572 6798 6902 +4572 7104 7188 +4574 7102 7104 +4580 6150 6262 +4587 5686 5693 +4595 6902 6903 +4598 7194 7195 +4627 904 4541 +4660 904 4435 +4667 1413 1523 +4672 962 963 +4691 854 963 +4699 962 967 +4609 3145 3236 +4610 3543 3545 +4618 3139 3236 +4618 3537 3544 +4641 3133 3135 +4645 3139 3228 +4663 3479 3484 +4667 3141 3236 +4667 3544 3545 +4676 3135 3139 +4686 3477 3484 +4606 4327 4334 +4627 904 4541 +4636 4235 4327 +4645 5572 5692 +4655 4327 4335 +4660 904 4435 +4667 4213 4214 +4692 5573 5692 +4616 6394 6395 +4635 7188 7196 +4647 7005 7010 +4653 7102 7196 +4657 7100 7105 +4669 6388 6396 +4674 6903 6909 +4674 7188 7195 +4688 6909 7003 +4699 7003 7010 +4711 967 970 +4718 1406 1407 +4735 854 956 +4742 963 964 +4746 848 854 +4754 956 964 +4762 852 956 +4765 961 964 +4770 964 967 +4788 964 966 +4790 965 967 +4710 3542 3544 +4720 3545 3548 +4730 3135 3136 +4733 3544 3597 +4743 3141 3228 +4746 3234 3236 +4766 3134 3135 +4766 3546 3551 +4789 3545 3605 +4794 3484 3546 +4706 4141 4228 +4708 5579 5697 +4711 5579 5692 +4721 4233 4235 +4723 4228 4235 +4739 4233 4335 +4744 4228 4236 +4763 4134 4141 +4776 4233 4236 +4776 5585 5703 +4779 4139 4141 +4789 4330 4335 +4708 5579 5697 +4710 6395 6396 +4710 7102 7107 +4755 7193 7196 +4767 7189 7273 +4768 7191 7196 +4780 7195 7196 +4782 7201 7279 +4792 6270 6275 +4801 959 964 +4806 848 950 +4807 965 966 +4813 848 956 +4825 848 958 +4832 852 854 +4833 852 964 +4840 852 958 +4858 846 848 +4888 841 846 +4891 841 842 +4895 852 959 +4898 959 965 +4802 3234 3235 +4804 3597 3604 +4807 3546 3548 +4808 3546 3553 +4828 3598 3604 +4831 3128 3135 +4831 3597 3605 +4836 3542 3605 +4841 3234 3239 +4851 3547 3548 +4857 3542 3602 +4859 3547 3605 +4864 3602 3604 +4872 3600 3605 +4873 3597 3602 +4879 3604 3645 +4883 3602 3605 +4900 3645 3652 +4807 4053 4134 +4808 4139 4236 +4828 5698 5703 +4839 4134 4142 +4840 4233 4238 +4884 5585 5704 +4892 4231 4236 +4896 4238 4330 +4802 5697 5698 +4808 6275 6390 +4809 6393 6396 +4809 7193 7199 +4809 7195 7199 +4811 7196 7198 +4828 5698 5703 +4829 7199 7281 +4830 7010 7100 +4833 7285 7286 +4836 6269 6275 +4844 6268 6269 +4845 6150 6269 +4857 7107 7191 +4867 7199 7279 +4873 7279 7287 +4876 5698 5700 +4883 7198 7199 +4884 5585 5704 +4896 6395 6399 +4899 7286 7287 +4904 857 959 +4906 851 852 +4908 850 959 +4910 846 849 +4914 851 959 +4917 1758 1869 +4922 849 851 +4938 850 851 +4943 1758 1877 +4945 841 843 +4952 735 842 +4963 843 849 +4971 735 835 +4979 844 851 +4990 735 843 +4925 3645 3653 +4943 1758 1877 +4949 3602 3653 +4958 3605 3607 +4972 3646 3678 +4979 3645 3650 +4985 3602 3650 +4985 3646 3650 +4995 3647 3650 +4998 3645 3648 +4939 4231 4238 +4947 4139 4142 +4910 7100 7107 +4926 7284 7287 +4935 7286 7364 +4937 7199 7282 +4940 7286 7290 +4963 5698 5705 +4967 7364 7365 +4981 7364 7366 +4984 6275 6385 +4991 7282 7287 +5002 739 843 +5011 736 843 +5018 1752 1869 +5022 1756 1869 +5027 844 846 +5031 1752 1863 +5036 733 735 +5036 1752 1871 +5044 844 845 +5065 1756 1877 +5072 1746 1863 +5073 1756 1871 +5076 843 844 +5084 733 835 +5015 3646 3679 +5017 3602 3607 +5030 3547 3606 +5034 3600 3607 +5036 1752 1871 +5048 3675 3679 +5065 1756 1877 +5065 2336 2343 +5073 1756 1871 +5084 3602 3648 +5036 5586 5704 +5032 7371 7436 +5036 5586 5704 +5049 7290 7366 +5088 7364 7369 +5102 733 843 +5118 729 835 +5121 1750 1863 +5101 3648 3653 +5104 3648 3650 +5119 3644 3679 +5148 3649 3650 +5154 3648 3655 +5161 3649 3679 +5187 3607 3648 +5188 2227 2344 +5127 4396 4403 +5185 4299 4304 +5119 7287 7289 +5127 7369 7371 +5130 7191 7197 +5131 5698 5699 +5154 7436 7443 +5168 6655 6761 +5171 6390 6391 +5193 7369 7372 +5243 3677 3679 +5291 3649 3680 +5224 4304 4396 +5263 4125 4206 +5217 7197 7198 +5243 7289 7290 +5252 7204 7282 +5258 7369 7443 +5299 7289 7295 +5310 4206 4214 +5372 4118 4125 +5311 7366 7367 +5314 7288 7289 +5346 6766 6772 +5360 7367 7369 +5365 7369 7374 +5373 7289 7367 +5418 728 735 +5478 632 728 +5481 733 736 +5489 728 736 +5406 4123 4125 +5414 4304 4305 +5439 4118 4124 +5459 4304 4403 +5463 4211 4214 +5478 4208 4214 +5482 4042 4124 +5496 4123 4214 +5415 7441 7443 +5529 1761 1877 +5542 738 843 +5529 1761 1877 +5509 4123 4129 +5523 4118 4126 +5526 4123 4126 +5546 4302 4303 +5564 4304 4402 +5568 4042 4118 +5583 4211 4216 +5506 7439 7443 +5521 7367 7368 +5557 7374 7439 +5602 4211 4303 +5612 4209 4214 +5616 4041 4126 +5617 4297 4303 +5621 4042 4045 +5627 4123 4128 +5628 4042 4126 +5634 4210 4303 +5659 4043 4045 +5662 4303 4304 +5696 4043 4044 +5789 630 728 +5789 630 733 +5795 738 838 +5715 4121 4126 +5849 733 738 +5856 732 738 +5833 4209 4216 +5888 4044 4126 +5909 731 733 +5941 731 732 +5944 630 730 +5946 625 626 +5951 626 630 +5956 730 731 +5959 627 730 +5973 626 627 +5983 629 730 +5988 619 626 +5917 4121 4128 +6013 629 725 +6037 619 624 +6039 624 627 +6050 619 620 +6063 624 629 +6083 519 620 +6009 4044 4045 +6013 4044 4127 +6052 4128 4209 +6228 620 621 +6242 621 624 +6250 4046 4047 +6259 622 624 +6292 519 613 +6250 4046 4047 +6337 618 621 +6354 613 621 +6364 621 623 +6378 622 623 +6445 616 621 +6514 517 613 +6539 6275 6391 +6656 517 615 +6724 513 517 +6760 517 616 +6765 512 513 +6784 506 512 +6792 513 514 +6801 522 616 +6831 516 517 +6853 506 514 +6854 515 616 +6877 511 514 +6885 417 506 +6908 514 516 +6921 415 506 +6942 515 516 +6947 411 506 +6959 509 515 +6966 509 514 +7022 411 500 +7023 420 509 +7043 411 508 +7047 415 508 +7068 412 508 +7093 415 509 +7099 409 500 +7102 413 509 +7135 409 502 +7160 414 508 +7161 409 508 +7174 409 503 +7175 409 411 +7177 409 415 +7180 414 509 +7185 409 414 +7194 409 412 +7173 6274 6281 +7231 414 503 +7204 6280 6281 diff --git a/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 b/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 deleted file mode 100644 index b76854d5d9..0000000000 --- a/examples/bpm/impact/log.17Feb2022.impact.rotational.g++.4 +++ /dev/null @@ -1,219 +0,0 @@ -LAMMPS (17 Feb 2022) -units lj -dimension 3 -boundary f f f -atom_style bpm/sphere -special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0 -newton on off -comm_modify vel yes cutoff 2.6 -lattice fcc 1.0 -Lattice spacing in x,y,z = 1.5874011 1.5874011 1.5874011 -region box block -25 15 -22 22 -22 22 -create_box 1 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50 -Created orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - 1 by 2 by 2 MPI processor grid - -region disk cylinder x 0.0 0.0 20.0 -0.5 0.5 -create_atoms 1 region disk -Created 7529 atoms - using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - create_atoms CPU = 0.002 seconds -group plate region disk -7529 atoms in group plate - -region ball sphere 8.0 0.0 0.0 6.0 -create_atoms 1 region ball -Created 3589 atoms - using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) - create_atoms CPU = 0.001 seconds -group projectile region ball -3589 atoms in group projectile - -displace_atoms all random 0.1 0.1 0.1 134598738 -Displacing atoms ... - -neighbor 1.0 bin -pair_style gran/hooke/history 1.0 NULL 0.5 NULL 0.1 1 -pair_coeff 1 1 - -fix 1 all nve/bpm/sphere - -create_bonds many plate plate 1 0.0 1.5 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2.6 - binsize = 1, bins = 64 70 70 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) command create_bonds, occasional - attributes: full, newton on - pair build: full/bin - stencil: full/bin/3d - bin: standard - (2) pair gran/hooke/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Added 38559 bonds, new total = 38559 -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 1 1 - special bond factors coul: 0 1 1 - 15 = max # of 1-2 neighbors - 101 = max # of special neighbors - special bonds CPU = 0.001 seconds -create_bonds many projectile projectile 2 0.0 1.5 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -WARNING: Bonds are defined but no bond style is set (../force.cpp:192) -WARNING: Likewise 1-2 special neighbor interactions != 1.0 (../force.cpp:194) -Added 21869 bonds, new total = 60428 -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 1 1 - special bond factors coul: 0 1 1 - 16 = max # of 1-2 neighbors - 101 = max # of special neighbors - special bonds CPU = 0.001 seconds - -neighbor 0.3 bin -special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 - -bond_style bpm/rotational store/local brkbond 100 time id1 id2 -bond_coeff 1 1.0 0.2 0.02 0.02 0.05 0.01 0.01 0.01 0.1 0.2 0.002 0.002 -bond_coeff 2 1.0 0.2 0.02 0.02 0.20 0.04 0.04 0.04 0.1 0.2 0.002 0.002 - -velocity projectile set -0.05 0.0 0.0 -compute nbond all nbond/atom -compute tbond all reduce sum c_nbond - -timestep 0.05 -thermo_style custom step ke pe pxx pyy pzz c_tbond -thermo 100 -thermo_modify lost ignore lost/bond ignore -#dump 1 all custom 100 atomDump id radius x y z c_nbond - -dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] -dump_modify 2 header no - -run 7500 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.3 - ghost atom cutoff = 2.6 - binsize = 0.65, bins = 98 108 108 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair gran/hooke/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 33.34 | 33.34 | 33.35 Mbytes -Step KinEng PotEng Pxx Pyy Pzz c_tbond - 0 0.00053238861 0 3.8217307e-05 0 0 10.8703 - 100 0.00053238861 0 3.8217307e-05 1.2166373e-20 1.2308212e-20 10.8703 - 200 0.00053238861 0 3.8217307e-05 1.2454467e-20 1.2479589e-20 10.8703 - 300 0.00053238861 0 3.8217307e-05 1.2256702e-20 1.2621091e-20 10.8703 - 400 0.00053238861 0 3.8217307e-05 1.2170534e-20 1.2751666e-20 10.8703 - 500 0.00053093549 0 3.8484194e-05 7.645531e-08 1.4861825e-07 10.8703 - 600 0.00051485902 0 4.0340751e-05 3.8615876e-07 4.8663463e-07 10.869221 - 700 0.00049942978 0 3.8684008e-05 4.5363318e-07 4.4560229e-07 10.85501 - 800 0.00049465262 0 3.6604612e-05 1.4755468e-07 2.0062093e-07 10.820651 - 900 0.00048784775 0 3.5333139e-05 3.5118328e-07 6.6697625e-07 10.769563 - 1000 0.00048345699 0 3.4702137e-05 7.0312998e-07 4.0218318e-07 10.730347 - 1100 0.00047945073 0 3.5065961e-05 6.2813891e-07 7.4640359e-07 10.703184 - 1200 0.00047512604 0 3.4833144e-05 8.5208604e-07 8.7277583e-07 10.686634 - 1300 0.00047401428 0 3.4236869e-05 1.0321827e-06 7.4545242e-07 10.678 - 1400 0.00047619121 0 3.4416549e-05 8.7518021e-07 7.3979503e-07 10.671704 - 1500 0.0004668728 0 3.4495751e-05 1.4077823e-06 1.517373e-06 10.666127 - 1600 0.00045088371 0 3.3264301e-05 1.8499661e-06 1.9842415e-06 10.66073 - 1700 0.00044275099 0 3.2471064e-05 1.9028747e-06 2.2248947e-06 10.6458 - 1800 0.0004424362 0 3.1846336e-05 1.6208492e-06 1.9291602e-06 10.620615 - 1900 0.00043678957 0 3.1260936e-05 1.4673956e-06 1.6120523e-06 10.603166 - 2000 0.00042747562 0 3.0652107e-05 1.6455486e-06 1.53127e-06 10.576003 - 2100 0.0004214344 0 3.0240727e-05 1.8873967e-06 1.5258622e-06 10.539845 - 2200 0.00041712779 0 3.0329566e-05 1.8846152e-06 1.4971471e-06 10.49937 - 2300 0.00041095769 0 3.0000572e-05 2.3585924e-06 1.6773177e-06 10.471668 - 2400 0.00040883568 0 2.9625158e-05 1.9105554e-06 1.8720763e-06 10.45116 - 2500 0.00040762685 0 2.9441541e-05 1.6848938e-06 1.8877532e-06 10.437309 - 2600 0.00040579873 0 2.9255988e-05 1.7523874e-06 1.636423e-06 10.422378 - 2700 0.00040340975 0 2.9035693e-05 1.673158e-06 1.9038932e-06 10.410505 - 2800 0.00040170914 0 2.8829361e-05 1.6711978e-06 1.9776001e-06 10.400792 - 2900 0.00040015113 0 2.8614186e-05 1.5982427e-06 1.7994733e-06 10.393416 - 3000 0.00040029253 0 2.8470718e-05 1.5589166e-06 1.6682302e-06 10.385321 - 3100 0.00040037329 0 2.8483376e-05 1.2831526e-06 1.4788005e-06 10.378485 - 3200 0.00040142612 0 2.8481287e-05 1.1577988e-06 1.3495778e-06 10.373988 - 3300 0.00040105092 0 2.8547009e-05 1.2155138e-06 1.2633439e-06 10.370031 - 3400 0.00039950673 0 2.8340939e-05 1.1182251e-06 1.1624668e-06 10.364274 - 3500 0.00039715236 0 2.824813e-05 1.3086462e-06 1.2029185e-06 10.360496 - 3600 0.00039446552 0 2.8112283e-05 1.1232321e-06 1.0077217e-06 10.353121 - 3700 0.00039263296 0 2.7927975e-05 1.1083636e-06 1.2091857e-06 10.346645 - 3800 0.00039061341 0 2.7819957e-05 1.1836841e-06 1.3566272e-06 10.341069 - 3900 0.00038985051 0 2.7681947e-05 1.3588359e-06 1.4099727e-06 10.329196 - 4000 0.00038815347 0 2.7492102e-05 1.1111719e-06 1.1700718e-06 10.318043 - 4100 0.00038651302 0 2.7444105e-05 9.9563429e-07 1.4085969e-06 10.311027 - 4200 0.00038565809 0 2.7177341e-05 9.5736307e-07 1.0404482e-06 10.299155 - 4300 0.0003847255 0 2.7029216e-05 9.6204756e-07 1.140804e-06 10.292319 - 4400 0.0003844421 0 2.6841047e-05 9.6570404e-07 1.2319818e-06 10.286203 - 4500 0.0003842788 0 2.6633558e-05 9.6452478e-07 1.1954945e-06 10.278287 - 4600 0.00038365139 0 2.6514403e-05 9.6185846e-07 1.2002452e-06 10.270732 - 4700 0.00038271503 0 2.6374349e-05 9.4061833e-07 1.1774211e-06 10.264796 - 4800 0.00038233688 0 2.638398e-05 1.1644119e-06 1.3746239e-06 10.25742 - 4900 0.00038223496 0 2.6279821e-05 1.1345508e-06 1.4709213e-06 10.246987 - 5000 0.00038219402 0 2.6188871e-05 1.0115151e-06 1.2024203e-06 10.240511 - 5100 0.00038195153 0 2.6137945e-05 1.009856e-06 1.1961088e-06 10.236014 - 5200 0.00038170903 0 2.6103563e-05 1.0046761e-06 1.1881008e-06 10.232236 - 5300 0.00038194303 0 2.6111938e-05 1.0533375e-06 1.2621634e-06 10.230617 - 5400 0.00038147407 0 2.6078641e-05 1.082228e-06 1.2915223e-06 10.230098 - 5500 0.00038156894 0 2.6084488e-05 1.1395485e-06 1.3592644e-06 10.227759 - 5600 0.00038169434 0 2.6085704e-05 1.1173618e-06 1.3003599e-06 10.2256 - 5700 0.00038219734 0 2.6095279e-05 1.1026614e-06 1.280455e-06 10.223621 - 5800 0.00038268758 0 2.6113437e-05 1.1096198e-06 1.2565503e-06 10.222902 - 5900 0.00038300658 0 2.6131709e-05 1.1123595e-06 1.235992e-06 10.222182 - 6000 0.00038250316 0 2.606995e-05 1.1590744e-06 1.2888416e-06 10.221123 - 6100 0.0003821526 0 2.6025605e-05 1.1434025e-06 1.3141861e-06 10.219503 - 6200 0.00038185711 0 2.5991255e-05 1.1471391e-06 1.3427373e-06 10.219503 - 6300 0.00038197679 0 2.5996965e-05 1.1338082e-06 1.3315258e-06 10.218604 - 6400 0.00038232311 0 2.6035805e-05 1.1353407e-06 1.3306683e-06 10.217884 - 6500 0.00038255543 0 2.6091572e-05 1.1768703e-06 1.3629611e-06 10.217704 - 6600 0.00038251887 0 2.6068968e-05 1.1808094e-06 1.3969697e-06 10.217344 - 6700 0.00038177389 0 2.6004288e-05 1.1659866e-06 1.423638e-06 10.218084 - 6800 0.00038096291 0 2.5969494e-05 1.1377343e-06 1.4348787e-06 10.218103 - 6900 0.00038090601 0 2.5951546e-05 1.1327767e-06 1.4311663e-06 10.217024 - 7000 0.00038088094 0 2.5946255e-05 1.1652568e-06 1.4567559e-06 10.215944 - 7100 0.00038094624 0 2.5972593e-05 1.1558871e-06 1.4692935e-06 10.214684 - 7200 0.00038168738 0 2.6002e-05 1.1562707e-06 1.4881081e-06 10.212705 - 7300 0.00038200854 0 2.6038768e-05 1.1339903e-06 1.4808455e-06 10.212345 - 7400 0.00038187543 0 2.6044759e-05 1.101743e-06 1.4758679e-06 10.213084 - 7500 0.00038165297 0 2.6004536e-05 1.0892731e-06 1.4872621e-06 10.214742 -Loop time of 28.804 on 4 procs for 7500 steps with 11111 atoms - -Performance: 1124843.305 tau/day, 260.380 timesteps/s -97.5% 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.26977 | 0.28058 | 0.2866 | 1.3 | 0.97 -Bond | 22.742 | 23.598 | 24.671 | 16.6 | 81.92 -Neigh | 0.54555 | 0.5728 | 0.60272 | 3.2 | 1.99 -Comm | 1.4024 | 2.5619 | 3.5079 | 54.8 | 8.89 -Output | 0.025307 | 0.025833 | 0.027022 | 0.4 | 0.09 -Modify | 1.592 | 1.6506 | 1.7059 | 4.0 | 5.73 -Other | | 0.1147 | | | 0.40 - -Nlocal: 2777.75 ave 2887 max 2682 min -Histogram: 1 0 0 0 2 0 0 0 0 1 -Nghost: 1152.5 ave 1189 max 1125 min -Histogram: 1 0 1 0 0 1 0 0 0 1 -Neighs: 11515.5 ave 12520 max 10831 min -Histogram: 1 1 0 0 1 0 0 0 0 1 - -Total # of neighbors = 46062 -Ave neighs/atom = 4.1456215 -Ave special neighs/atom = 10.214742 -Neighbor list builds = 408 -Dangerous builds = 0 -Total wall time: 0:00:28 diff --git a/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 b/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 new file mode 100644 index 0000000000..8eb87d3c2e --- /dev/null +++ b/examples/bpm/impact/log.4May2022.impact.rotational.g++.4 @@ -0,0 +1,219 @@ +LAMMPS (4 May 2022) +units lj +dimension 3 +boundary f f f +atom_style bpm/sphere +special_bonds lj 0.0 1.0 1.0 coul 0.0 1.0 1.0 +newton on off +comm_modify vel yes cutoff 2.6 +lattice fcc 1.0 +Lattice spacing in x,y,z = 1.5874011 1.5874011 1.5874011 +region box block -25 15 -22 22 -22 22 +create_box 1 box bond/types 2 extra/bond/per/atom 20 extra/special/per/atom 50 +Created orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + 1 by 2 by 2 MPI processor grid + +region disk cylinder x 0.0 0.0 20.0 -0.5 0.5 +create_atoms 1 region disk +Created 7529 atoms + using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + create_atoms CPU = 0.002 seconds +group plate region disk +7529 atoms in group plate + +region ball sphere 8.0 0.0 0.0 6.0 +create_atoms 1 region ball +Created 3589 atoms + using lattice units in orthogonal box = (-39.685026 -34.922823 -34.922823) to (23.811016 34.922823 34.922823) + create_atoms CPU = 0.001 seconds +group projectile region ball +3589 atoms in group projectile + +displace_atoms all random 0.1 0.1 0.1 134598738 +Displacing atoms ... + +neighbor 1.0 bin +pair_style gran/hooke/history 1.0 NULL 0.5 NULL 0.1 1 +pair_coeff 1 1 + +fix 1 all nve/bpm/sphere + +create_bonds many plate plate 1 0.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2.6 + binsize = 1, bins = 64 70 70 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) command create_bonds, occasional + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard + (2) pair gran/hooke/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Added 38559 bonds, new total = 38559 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 15 = max # of 1-2 neighbors + 101 = max # of special neighbors + special bonds CPU = 0.001 seconds +create_bonds many projectile projectile 2 0.0 1.5 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +WARNING: Bonds are defined but no bond style is set (../force.cpp:192) +WARNING: Likewise 1-2 special neighbor interactions != 1.0 (../force.cpp:194) +Added 21869 bonds, new total = 60428 +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 1 1 + special bond factors coul: 0 1 1 + 16 = max # of 1-2 neighbors + 101 = max # of special neighbors + special bonds CPU = 0.002 seconds + +neighbor 0.3 bin +special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 + +bond_style bpm/rotational store/local brkbond 100 time id1 id2 +bond_coeff 1 1.0 0.2 0.02 0.02 0.05 0.01 0.01 0.01 0.1 0.2 0.002 0.002 +bond_coeff 2 1.0 0.2 0.02 0.02 0.20 0.04 0.04 0.04 0.1 0.2 0.002 0.002 + +velocity projectile set -0.05 0.0 0.0 +compute nbond all nbond/atom +compute tbond all reduce sum c_nbond + +timestep 0.05 +thermo_style custom step ke pe pxx pyy pzz c_tbond +thermo 100 +thermo_modify lost ignore lost/bond ignore +#dump 1 all custom 100 atomDump id radius x y z c_nbond + +dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] +dump_modify 2 header no + +run 7500 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 2.6 + binsize = 0.65, bins = 98 108 108 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair gran/hooke/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 33.22 | 33.22 | 33.22 Mbytes + Step KinEng PotEng Pxx Pyy Pzz c_tbond + 0 0.00053238861 0 3.8217307e-05 -7.6534847e-14 1.9906102e-13 10.8703 + 100 0.00053238861 0 3.8217307e-05 -4.2831948e-13 5.7428612e-13 10.8703 + 200 0.00053238861 0 3.8217307e-05 -1.4067913e-12 1.4975493e-12 10.8703 + 300 0.00053238861 0 3.8217307e-05 -8.77782e-13 3.8245851e-13 10.8703 + 400 0.00053238861 0 3.8217307e-05 -8.5835238e-13 6.5448014e-13 10.8703 + 500 0.00053093549 0 4.0340893e-05 4.501394e-07 5.3690512e-07 10.8703 + 600 0.00051485902 0 6.6761034e-05 4.6258948e-06 5.2285428e-06 10.869221 + 700 0.00049942978 0 9.5499005e-05 9.3031413e-07 4.5389354e-06 10.85501 + 800 0.00049465262 0 5.6810167e-05 -5.5619903e-06 -1.6010295e-06 10.820651 + 900 0.00048784775 0 1.5747004e-05 2.0522042e-05 2.5481542e-05 10.769563 + 1000 0.00048345699 0 2.1159666e-05 1.2232747e-05 1.4767665e-05 10.730347 + 1100 0.00047945073 0 5.2779833e-05 -2.6136504e-05 -2.7689007e-05 10.703184 + 1200 0.00047512604 0 6.3234312e-05 -1.7082136e-05 -2.9178979e-05 10.686634 + 1300 0.00047401428 0 2.5474717e-05 -7.4782876e-06 -1.9808965e-05 10.678 + 1400 0.00047619121 0 2.5189461e-05 2.9476227e-06 -4.4149511e-06 10.671704 + 1500 0.0004668728 0 5.8798861e-05 -2.6192143e-06 1.0805172e-06 10.666127 + 1600 0.00045088371 0 5.8377694e-05 2.2911269e-06 4.339717e-06 10.66073 + 1700 0.00044275099 0 4.0766018e-05 2.7748031e-05 2.8202527e-05 10.6458 + 1800 0.0004424362 0 3.0460351e-05 2.9690484e-05 3.3464889e-05 10.620615 + 1900 0.00043678957 0 3.809598e-05 2.4448755e-06 1.2651201e-05 10.603166 + 2000 0.00042747562 0 4.2315209e-05 -7.6783024e-06 -3.3357359e-06 10.576003 + 2100 0.0004214344 0 2.6171505e-05 5.5424035e-06 -4.1153085e-06 10.539845 + 2200 0.00041712779 0 3.0796803e-05 1.1362383e-05 7.7103875e-07 10.49937 + 2300 0.00041095769 0 4.141148e-05 1.4142023e-06 -1.0982633e-05 10.471668 + 2400 0.00040883568 0 3.5835323e-05 -1.0216635e-05 -2.3669763e-05 10.45116 + 2500 0.00040762685 0 2.879385e-05 -1.4074395e-05 -1.9314875e-05 10.437309 + 2600 0.00040579873 0 2.771644e-05 -2.316844e-05 -2.2961097e-05 10.422378 + 2700 0.00040340975 0 3.4482945e-05 -3.075929e-05 -2.3321344e-05 10.410505 + 2800 0.00040170914 0 3.1147943e-05 -2.4329639e-05 -1.1787678e-05 10.400792 + 2900 0.00040015113 0 2.3214992e-05 -1.8068374e-05 3.8127871e-06 10.393416 + 3000 0.00040029253 0 2.7275906e-05 -7.0762689e-06 1.3782424e-05 10.385321 + 3100 0.00040037329 0 2.962113e-05 -1.3795312e-06 5.3267315e-06 10.378485 + 3200 0.00040142612 0 2.86096e-05 4.4289601e-06 -3.3950404e-06 10.373988 + 3300 0.00040105092 0 2.5423615e-05 9.5689359e-06 -2.5296344e-06 10.370031 + 3400 0.00039950673 0 2.6405258e-05 9.5776239e-06 -7.3789982e-07 10.364274 + 3500 0.00039715236 0 3.115696e-05 1.0986224e-05 6.6898207e-06 10.360496 + 3600 0.00039446552 0 2.8426837e-05 9.6296098e-06 1.5057875e-05 10.353121 + 3700 0.00039263296 0 2.567768e-05 6.347291e-06 2.4842157e-05 10.346645 + 3800 0.00039061341 0 2.7635193e-05 5.0165135e-06 2.5989901e-05 10.341069 + 3900 0.00038985051 0 2.8639932e-05 1.056365e-05 2.4463803e-05 10.329196 + 4000 0.00038815347 0 2.6613146e-05 2.0316396e-05 2.1434368e-05 10.318043 + 4100 0.00038651302 0 2.4759493e-05 1.9632349e-05 1.3524912e-05 10.311027 + 4200 0.00038565809 0 2.5290845e-05 1.9908233e-05 8.3895516e-06 10.299155 + 4300 0.0003847255 0 2.6461182e-05 1.9385332e-05 5.664874e-06 10.292319 + 4400 0.0003844421 0 2.4464435e-05 1.4675545e-05 6.8223863e-06 10.286203 + 4500 0.0003842788 0 2.3080348e-05 7.1469159e-06 6.8395849e-06 10.278287 + 4600 0.00038365139 0 2.4937615e-05 2.3854793e-06 4.6100509e-06 10.270732 + 4700 0.00038271503 0 2.431281e-05 -3.127707e-06 3.8840673e-07 10.264796 + 4800 0.00038233688 0 2.3727372e-05 -3.9575833e-06 1.5658614e-06 10.25742 + 4900 0.00038223496 0 2.3842519e-05 2.6005447e-06 4.5031882e-06 10.246987 + 5000 0.00038219402 0 2.4705111e-05 8.2018492e-06 4.0121467e-06 10.240511 + 5100 0.00038195153 0 2.5112089e-05 9.1687723e-06 3.3825795e-06 10.236014 + 5200 0.00038170903 0 2.4166312e-05 4.6680528e-06 3.0359762e-06 10.232236 + 5300 0.00038194303 0 2.4293657e-05 3.067111e-06 2.1353614e-06 10.230617 + 5400 0.00038147407 0 2.472142e-05 5.2915485e-06 -1.7472423e-06 10.230098 + 5500 0.00038156894 0 2.4839317e-05 6.6216457e-06 -2.7544087e-06 10.227759 + 5600 0.00038169434 0 2.4600407e-05 3.8679618e-06 1.2622251e-07 10.2256 + 5700 0.00038219734 0 2.4459589e-05 2.0025919e-07 -1.1917672e-08 10.223621 + 5800 0.00038268758 0 2.4768428e-05 8.7913744e-07 -1.4000329e-06 10.222902 + 5900 0.00038300658 0 2.4827866e-05 3.6621944e-06 -2.2178729e-07 10.222182 + 6000 0.00038250316 0 2.4309432e-05 4.3755483e-06 2.2736019e-06 10.221123 + 6100 0.0003821526 0 2.4396115e-05 3.3855804e-06 4.4742551e-06 10.219503 + 6200 0.00038185711 0 2.4795348e-05 1.7569948e-06 4.3229904e-06 10.219503 + 6300 0.00038197679 0 2.4817115e-05 1.237731e-07 3.9285574e-06 10.218604 + 6400 0.00038232311 0 2.4723664e-05 -8.7946112e-07 2.6215619e-06 10.217884 + 6500 0.00038255543 0 2.4821878e-05 -4.8948257e-07 3.9392146e-07 10.217704 + 6600 0.00038251887 0 2.4923895e-05 -1.1107041e-07 -8.3900047e-07 10.217344 + 6700 0.00038177389 0 2.4664007e-05 -6.4474733e-07 -2.1004826e-06 10.218084 + 6800 0.00038096291 0 2.4262293e-05 -1.7159941e-06 -2.8149643e-06 10.218103 + 6900 0.00038090601 0 2.4179172e-05 -2.2622259e-06 -2.1268271e-06 10.217024 + 7000 0.00038088094 0 2.4363443e-05 -2.4652531e-06 -8.209416e-07 10.215944 + 7100 0.00038094624 0 2.5119358e-05 -1.5432706e-06 1.1465135e-06 10.214684 + 7200 0.00038168738 0 2.5565338e-05 -1.4052753e-07 3.3146851e-06 10.212705 + 7300 0.00038200854 0 2.5436565e-05 4.353807e-07 3.3504276e-06 10.212345 + 7400 0.00038187543 0 2.4764819e-05 6.7297502e-07 1.5923471e-06 10.213084 + 7500 0.00038165297 0 2.4015684e-05 7.8657712e-07 1.0138435e-06 10.214742 +Loop time of 32.2292 on 4 procs for 7500 steps with 11111 atoms + +Performance: 1005300.744 tau/day, 232.709 timesteps/s +96.2% 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.29763 | 0.30464 | 0.31393 | 1.1 | 0.95 +Bond | 25.936 | 26.533 | 27.431 | 11.7 | 82.33 +Neigh | 0.60911 | 0.63557 | 0.66475 | 2.8 | 1.97 +Comm | 1.7247 | 2.7138 | 3.3823 | 40.5 | 8.42 +Output | 0.020408 | 0.020935 | 0.02227 | 0.5 | 0.06 +Modify | 1.8299 | 1.8724 | 1.9325 | 2.9 | 5.81 +Other | | 0.1491 | | | 0.46 + +Nlocal: 2777.75 ave 2887 max 2682 min +Histogram: 1 0 0 0 2 0 0 0 0 1 +Nghost: 1152.5 ave 1189 max 1125 min +Histogram: 1 0 1 0 0 1 0 0 0 1 +Neighs: 11515.5 ave 12520 max 10831 min +Histogram: 1 1 0 0 1 0 0 0 0 1 + +Total # of neighbors = 46062 +Ave neighs/atom = 4.1456215 +Ave special neighs/atom = 10.214742 +Neighbor list builds = 408 +Dangerous builds = 0 +Total wall time: 0:00:32 diff --git a/examples/bpm/pour/log.17Feb2022.pour.g++.4 b/examples/bpm/pour/log.17Feb2022.pour.g++.4 deleted file mode 100644 index a61c0f1181..0000000000 --- a/examples/bpm/pour/log.17Feb2022.pour.g++.4 +++ /dev/null @@ -1,1091 +0,0 @@ -LAMMPS (17 Feb 2022) -units lj -dimension 3 -boundary m m m -atom_style bpm/sphere -special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 -newton on off -comm_modify vel yes cutoff 3.3 -region box block -15 15 -15 15 0 60.0 -create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 -Created orthogonal box = (-15 -15 0) to (15 15 60) - 1 by 1 by 4 MPI processor grid - -molecule my_mol "rect.mol" -Read molecule template my_mol: - 1 molecules - 0 fragments - 63 atoms with max type 1 - 297 bonds with max type 1 - 0 angles with max type 0 - 0 dihedrals with max type 0 - 0 impropers with max type 0 -region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in -region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in - -pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 -bond_style bpm/rotational -pair_coeff 1 1 -bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 - -compute nbond all nbond/atom -compute tbond all reduce sum c_nbond -compute_modify thermo_temp dynamic/dof yes - -fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL -fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl -fix 3 all gravity 1e-4 vector 0 0 -1 -fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 -fix 5 all nve/bpm/sphere - -timestep 0.05 -thermo_style custom step ke pe pxx pyy pzz c_tbond -thermo 100 -#dump 1 all custom 500 atomDump id radius x y z c_nbond mol - -run 100000 - generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.3 - ghost atom cutoff = 3.3 - binsize = 0.65, bins = 47 47 93 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair gran/hertz/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes -Step KinEng PotEng Pxx Pyy Pzz c_tbond - 0 -0 0 0 0 0 0 - 100 0.0018331948 0 2.0050936e-07 1.2082282e-06 2.8712165e-06 9.4285714 - 200 0.0025933558 0 7.3469794e-07 2.0155735e-06 3.3061759e-06 9.4285714 - 300 0.0036964813 0 3.7946479e-07 5.3005435e-06 2.9691719e-06 9.4285714 - 400 0.0060104433 0 1.5778321e-06 8.4396021e-06 4.0232206e-06 9.4285714 - 500 0.0074435972 0 1.6102287e-06 1.1551491e-05 4.2257246e-06 9.4285714 - 600 0.0077862298 0 1.048357e-06 1.3758458e-05 3.3770448e-06 9.4285714 - 700 0.0075577591 0 1.1527593e-06 1.2533681e-05 3.9545936e-06 9.4285714 - 800 0.0073958844 0 1.1164823e-06 1.2917327e-05 3.2263757e-06 9.4285714 - 900 0.007553697 0 1.190904e-06 1.3294768e-05 3.1421027e-06 9.4285714 - 1000 0.0075815901 0 1.0181785e-06 1.3265265e-05 3.4107996e-06 9.4285714 - 1100 0.0075277384 0 2.0708356e-06 1.2219251e-05 3.2773337e-06 9.4285714 - 1200 0.0075026507 0 1.8286317e-06 1.2395764e-05 3.2819583e-06 9.4285714 - 1300 0.0075665473 0 1.8498736e-06 1.2455125e-05 3.3519775e-06 9.4285714 - 1400 0.0076224701 0 3.1234422e-06 1.0777609e-05 3.8865172e-06 9.4285714 - 1500 0.007603467 0 2.8536732e-06 1.1077739e-05 3.8107558e-06 9.4285714 - 1600 0.0059810407 0 4.3809396e-06 1.6996767e-05 6.5539764e-06 9.4285714 - 1700 0.0080230318 0 5.7884097e-06 2.4435559e-05 7.2370109e-06 9.4285714 - 1800 0.0087482398 0 5.9323986e-06 2.7190078e-05 7.7151041e-06 9.4285714 - 1900 0.0086877574 0 6.1023555e-06 2.6625737e-05 7.8193078e-06 9.4285714 - 2000 0.0086771118 0 6.1635853e-06 2.633267e-05 8.0008845e-06 9.4285714 - 2100 0.0084670091 0 6.7873752e-06 2.5434046e-05 9.0971224e-06 9.4285714 - 2200 0.0083650907 0 8.1704442e-06 2.3699108e-05 8.4515642e-06 9.4285714 - 2300 0.0083549595 0 8.2648511e-06 2.2510949e-05 8.2508581e-06 9.4285714 - 2400 0.0083151535 0 7.7718631e-06 2.2224878e-05 8.8086351e-06 9.4285714 - 2500 0.0083898757 0 7.1987828e-06 2.2855932e-05 9.1000336e-06 9.4285714 - 2600 0.0084145705 0 6.968992e-06 2.3030741e-05 9.2694955e-06 9.4285714 - 2700 0.0082712696 0 7.5971438e-06 2.3186553e-05 1.026296e-05 9.4285714 - 2800 0.0073688706 0 1.0092165e-05 1.6341178e-05 1.0496887e-05 9.4285714 - 2900 0.0072732669 0 8.9857642e-06 1.454313e-05 1.0637501e-05 9.4285714 - 3000 0.0072225948 0 8.5616417e-06 1.4225089e-05 1.0924921e-05 9.4285714 - 3100 0.0048244969 0 6.912522e-06 1.30395e-05 1.3824006e-05 9.4285714 - 3200 0.0045717035 0 5.7159512e-06 1.1181938e-05 1.5108391e-05 9.4285714 - 3300 0.0047679567 0 6.0163783e-06 1.1603014e-05 1.5759942e-05 9.4285714 - 3400 0.0048448212 0 6.3252851e-06 1.2378054e-05 1.5212593e-05 9.4285714 - 3500 0.0048364711 0 6.4847771e-06 1.2719874e-05 1.4888067e-05 9.4285714 - 3600 0.0047125947 0 7.5131511e-06 1.375252e-05 1.5244253e-05 9.4285714 - 3700 0.0045641049 0 7.3441262e-06 1.2981907e-05 1.5049034e-05 9.4285714 - 3800 0.0045540235 0 6.8443099e-06 1.1748155e-05 1.4685806e-05 9.4285714 - 3900 0.0047271202 0 6.7919886e-06 1.2153009e-05 1.4801772e-05 9.4285714 - 4000 0.0049115261 0 6.9084016e-06 1.2385892e-05 1.5231153e-05 9.4285714 - 4100 0.0046819157 0 6.4190119e-06 1.1228312e-05 1.5132413e-05 9.4285714 - 4200 0.0035133816 0 3.6896921e-06 6.5442286e-06 1.4368405e-05 9.4285714 - 4300 0.0031933917 0 1.9641761e-06 3.4983806e-06 1.6912795e-05 9.4285714 - 4400 0.0033515272 0 2.3967939e-06 4.0160705e-06 1.7056596e-05 9.4285714 - 4500 0.0034928951 0 3.0724834e-06 4.4355514e-06 1.6962392e-05 9.4285714 - 4600 0.0029992338 0 3.319899e-06 4.3436095e-06 2.0334274e-05 9.4285714 - 4700 0.0030650658 0 3.9633397e-06 5.6588274e-06 1.8991224e-05 9.4285714 - 4800 0.0031180382 0 4.925768e-06 6.3708181e-06 1.7810728e-05 9.4285714 - 4900 0.0030365003 0 4.6849771e-06 5.6291872e-06 1.8029418e-05 9.4285714 - 5000 0.0030259714 0 5.1846803e-06 5.5730554e-06 1.7488984e-05 9.4285714 - 5100 0.0030499975 0 5.6322417e-06 5.9148203e-06 1.6923105e-05 9.4285714 - 5200 0.003005436 0 5.6903188e-06 5.6637593e-06 1.6700127e-05 9.4285714 - 5300 0.0030000941 0 5.7591855e-06 5.3398134e-06 1.6904108e-05 9.4285714 - 5400 0.0031465827 0 6.1148362e-06 6.2148373e-06 1.7041724e-05 9.4285714 - 5500 0.0031981585 0 5.8718482e-06 5.9970835e-06 1.7984043e-05 9.4285714 - 5600 0.0031525115 0 5.3390747e-06 5.1610119e-06 1.8924721e-05 9.4285714 - 5700 0.0032128781 0 5.6775112e-06 5.2023225e-06 1.9109577e-05 9.4285714 - 5800 0.0030092855 0 5.7676512e-06 4.4808095e-06 2.1160289e-05 9.4285714 - 5900 0.0025015767 0 6.5110611e-06 5.0853279e-06 2.290709e-05 9.4285714 - 6000 0.0024438438 0 6.4803568e-06 4.9314657e-06 2.1450483e-05 9.4285714 - 6100 0.0023816456 0 4.2004621e-06 4.3412206e-06 2.3366694e-05 9.4285714 - 6200 0.0024459343 0 3.4052114e-06 2.3122757e-06 2.3018902e-05 9.4285714 - 6300 0.0025205884 0 3.0607555e-06 2.7404005e-06 2.3612151e-05 9.4285714 - 6400 0.0033754198 0 5.4041464e-06 1.0129204e-05 2.3881911e-05 9.4285714 - 6500 0.0037812296 0 6.9287106e-06 1.2845513e-05 2.4385157e-05 9.4285714 - 6600 0.0038043567 0 4.4366794e-06 1.559564e-05 2.4372156e-05 9.4285714 - 6700 0.0038213959 0 5.6461713e-06 1.6081939e-05 2.556403e-05 9.4285714 - 6800 0.0036977776 0 6.1083638e-06 1.3260883e-05 2.8030458e-05 9.4285714 - 6900 0.0034769765 0 4.281986e-06 1.4287795e-05 2.803258e-05 9.4285714 - 7000 0.0031526409 0 4.8687091e-06 1.1290097e-05 2.9635973e-05 9.4285714 - 7100 0.00317737 0 4.866629e-06 9.8108506e-06 3.1076433e-05 9.4285714 - 7200 0.0034448361 0 4.6533797e-06 1.15597e-05 3.0195614e-05 9.4285714 - 7300 0.0036147362 0 3.4867601e-06 1.2192841e-05 3.0431851e-05 9.4285714 - 7400 0.0035651675 0 2.812314e-06 1.0900977e-05 2.9422055e-05 9.4285714 - 7500 0.0036394064 0 2.6684242e-06 1.038371e-05 2.9650533e-05 9.4285714 - 7600 0.0033086177 0 2.6357178e-06 1.0363505e-05 3.3327311e-05 9.4285714 - 7700 0.0033410425 0 3.9955363e-06 9.2059943e-06 3.3580724e-05 9.4285714 - 7800 0.0035764747 0 7.127102e-06 8.9311151e-06 3.402089e-05 9.4285714 - 7900 0.0039500913 0 1.1222589e-05 9.0137729e-06 3.5074285e-05 9.4285714 - 8000 0.0042963353 0 1.5982303e-05 8.4904673e-06 3.5704562e-05 9.4285714 - 8100 0.0048297614 0 2.2809259e-05 7.6782291e-06 3.714467e-05 9.4285714 - 8200 0.0052301447 0 2.8015774e-05 6.9131186e-06 3.8310186e-05 9.4285714 - 8300 0.005169511 0 2.8580467e-05 6.1476914e-06 3.7651259e-05 9.4285714 - 8400 0.005224324 0 2.9402221e-05 5.0117679e-06 3.873174e-05 9.4285714 - 8500 0.0053049309 0 3.0666777e-05 4.125785e-06 3.9482985e-05 9.4285714 - 8600 0.0052459952 0 3.0525628e-05 4.1952646e-06 3.8726938e-05 9.4285714 - 8700 0.0052955657 0 3.0177531e-05 5.0224986e-06 3.8941323e-05 9.4285714 - 8800 0.0053972257 0 3.1021226e-05 5.261711e-06 3.9283466e-05 9.4285714 - 8900 0.0053679679 0 3.1133172e-05 4.9109387e-06 3.9111316e-05 9.4285714 - 9000 0.0053793586 0 3.0629197e-05 5.8147275e-06 3.8870113e-05 9.4285714 - 9100 0.0048447626 0 3.0571485e-05 6.6542996e-06 4.1908678e-05 9.4285714 - 9200 0.0048688926 0 3.0874982e-05 6.5780749e-06 4.2143302e-05 9.4285714 - 9300 0.0048538957 0 3.0564193e-05 8.1762092e-06 4.2503239e-05 9.4285714 - 9400 0.0046986454 0 2.8378911e-05 1.0639019e-05 4.4317403e-05 9.4285714 - 9500 0.0046145139 0 2.513485e-05 1.036053e-05 4.5570422e-05 9.4285714 - 9600 0.0045277961 0 2.056713e-05 9.8647996e-06 4.5858869e-05 9.4285714 - 9700 0.0043935298 0 1.8390341e-05 9.0322729e-06 4.6271482e-05 9.4285714 - 9800 0.0045363488 0 2.0469706e-05 9.7216528e-06 4.5805899e-05 9.4285714 - 9900 0.0046509978 0 1.9525081e-05 9.5233466e-06 4.862056e-05 9.4285714 - 10000 0.0046493894 0 1.7602305e-05 9.4408537e-06 5.0053515e-05 9.4285714 - 10100 0.0046514856 0 1.6724832e-05 9.9699479e-06 4.928713e-05 9.4285714 - 10200 0.0046209533 0 1.4889196e-05 1.0767419e-05 4.9829248e-05 9.4285714 - 10300 0.0044651031 0 1.0578209e-05 1.1339471e-05 5.1024934e-05 9.4285714 - 10400 0.0041834162 0 6.5253227e-06 1.099852e-05 5.0813498e-05 9.4285714 - 10500 0.0043218845 0 7.2170142e-06 1.2622523e-05 5.0759877e-05 9.4285714 - 10600 0.0045795722 0 1.0140572e-05 2.1058806e-05 5.4332689e-05 9.4285714 - 10700 0.0053833569 0 1.2245942e-05 3.2705455e-05 5.5584298e-05 9.4285714 - 10800 0.0056805981 0 9.642689e-06 4.0045088e-05 5.6378884e-05 9.4285714 - 10900 0.0057157307 0 9.8421383e-06 3.9670248e-05 5.7196914e-05 9.4285714 - 11000 0.005696424 0 1.1871435e-05 3.7351501e-05 5.7130853e-05 9.4285714 - 11100 0.0052078884 0 9.5005747e-06 3.612037e-05 5.1606236e-05 9.4285714 - 11200 0.0052849159 0 1.433919e-05 3.596257e-05 4.8371986e-05 9.4285714 - 11300 0.0054074494 0 1.2828165e-05 3.7628808e-05 5.0495681e-05 9.4285714 - 11400 0.0055432168 0 1.1770167e-05 3.7223129e-05 5.4498301e-05 9.4285714 - 11500 0.0054679467 0 1.1215128e-05 3.5612418e-05 5.5880978e-05 9.4285714 - 11600 0.0052706441 0 1.0611988e-05 3.5785457e-05 5.8094083e-05 9.4285714 - 11700 0.0053724243 0 1.1867616e-05 3.484887e-05 5.7967416e-05 9.4285714 - 11800 0.0054759961 0 9.3774866e-06 3.3307362e-05 6.0256027e-05 9.4285714 - 11900 0.0051146604 0 9.5582838e-06 3.1092749e-05 5.4847298e-05 9.4285714 - 12000 0.0049723565 0 8.4734692e-06 3.1240602e-05 5.3118854e-05 9.4285714 - 12100 0.0046920113 0 8.8947651e-06 3.3402795e-05 5.6254952e-05 9.4285714 - 12200 0.0049570244 0 1.0006616e-05 3.306729e-05 6.1049649e-05 9.4285714 - 12300 0.0049181458 0 8.1394364e-06 3.2634327e-05 6.2527089e-05 9.4285714 - 12400 0.0049245342 0 8.1971979e-06 3.3145464e-05 6.2091332e-05 9.4285714 - 12500 0.0049753042 0 8.9911646e-06 3.4018861e-05 6.1487068e-05 9.4285714 - 12600 0.0048148791 0 8.560766e-06 2.9647432e-05 6.2929427e-05 9.4285714 - 12700 0.0043852178 0 7.5889296e-06 1.8576839e-05 6.5947945e-05 9.4285714 - 12800 0.0041967317 0 8.6473249e-06 1.3892779e-05 6.6599779e-05 9.4285714 - 12900 0.0041911278 0 9.3489002e-06 1.8180223e-05 6.3308096e-05 9.4285714 - 13000 0.0043107924 0 8.5274073e-06 2.2286145e-05 5.9964925e-05 9.4285714 - 13100 0.0043976521 0 8.2741734e-06 2.4530103e-05 5.9567889e-05 9.4285714 - 13200 0.0043474635 0 9.2173493e-06 2.7514155e-05 5.4579308e-05 9.4285714 - 13300 0.0044593969 0 9.3356325e-06 3.0558484e-05 5.3771437e-05 9.4285714 - 13400 0.0044814342 0 9.2387466e-06 2.8998024e-05 5.5887559e-05 9.4285714 - 13500 0.0043982498 0 9.4867492e-06 2.5493297e-05 5.7396094e-05 9.4285714 - 13600 0.0039378503 0 1.0789003e-05 1.9448677e-05 6.1667698e-05 9.4285714 - 13700 0.0036474735 0 1.0885233e-05 1.5729573e-05 5.8520214e-05 9.4285714 - 13800 0.0038236277 0 1.3819358e-05 2.0470733e-05 5.4960098e-05 9.4285714 - 13900 0.0040574402 0 1.6741444e-05 2.391221e-05 5.4045411e-05 9.4285714 - 14000 0.0046440817 0 2.2494809e-05 2.9264007e-05 5.6648145e-05 9.4285714 - 14100 0.0048045755 0 2.2568279e-05 3.260884e-05 5.6960992e-05 9.4285714 - 14200 0.004634799 0 2.2650329e-05 2.7912328e-05 5.7597129e-05 9.4285714 - 14300 0.0046822822 0 2.3142295e-05 2.8536673e-05 5.7795199e-05 9.4285714 - 14400 0.0048282958 0 2.2560586e-05 3.2744704e-05 5.8133575e-05 9.4285714 - 14500 0.004799276 0 2.1374014e-05 3.1342428e-05 6.0569089e-05 9.4285714 - 14600 0.0046554419 0 2.0804876e-05 2.8534311e-05 6.0800428e-05 9.4285714 - 14700 0.0045262414 0 2.1835372e-05 2.8168699e-05 6.2901651e-05 9.4285714 - 14800 0.0043347498 0 1.9615887e-05 3.1686326e-05 6.4194237e-05 9.4285714 - 14900 0.0040641791 0 1.8621801e-05 2.7440899e-05 6.4602045e-05 9.4285714 - 15000 0.0040014911 0 1.6461776e-05 2.5832508e-05 6.08965e-05 9.4285714 - 15100 0.0040015198 0 2.2331361e-05 2.6108777e-05 5.9319862e-05 9.4285714 - 15200 0.004656209 0 3.5268101e-05 3.0082568e-05 5.958373e-05 9.4285714 - 15300 0.0047390215 0 4.1830227e-05 2.7233725e-05 5.8274008e-05 9.4285714 - 15400 0.0047219857 0 4.2798722e-05 2.8282959e-05 5.786682e-05 9.4285714 - 15500 0.0049597215 0 4.5190515e-05 2.9504603e-05 6.2435065e-05 9.4285714 - 15600 0.0049081505 0 4.3186089e-05 2.9977425e-05 6.1726635e-05 9.4285714 - 15700 0.0047978977 0 4.1446883e-05 2.7814159e-05 5.7947919e-05 9.4285714 - 15800 0.0048176861 0 3.9941014e-05 2.6548461e-05 5.9246093e-05 9.4285714 - 15900 0.0049895331 0 4.0485733e-05 2.8703855e-05 6.3382653e-05 9.4285714 - 16000 0.0049288669 0 3.892315e-05 2.9191325e-05 6.2118616e-05 9.4285714 - 16100 0.0048010252 0 3.7199431e-05 2.7134167e-05 6.1752588e-05 9.4285714 - 16200 0.0047925554 0 3.5806262e-05 2.5024463e-05 6.3068301e-05 9.4285714 - 16300 0.0047652048 0 3.3940221e-05 2.6543134e-05 6.7111166e-05 9.4285714 - 16400 0.0043495894 0 3.4655351e-05 1.8892916e-05 6.5825804e-05 9.4285714 - 16500 0.0042677893 0 3.4188541e-05 1.7570016e-05 6.3850178e-05 9.4285714 - 16600 0.0039924053 0 3.2417741e-05 1.7848282e-05 6.5817879e-05 9.4285714 - 16700 0.004110225 0 3.3539186e-05 1.9943078e-05 6.4568545e-05 9.4285714 - 16800 0.0041003344 0 3.6503679e-05 2.0546394e-05 6.2227252e-05 9.4285714 - 16900 0.0040916821 0 3.7342085e-05 2.384663e-05 6.0859481e-05 9.4285714 - 17000 0.0039812122 0 3.671505e-05 2.4137888e-05 5.6933083e-05 9.4285714 - 17100 0.0042480582 0 3.9654732e-05 2.4691844e-05 5.8210554e-05 9.4285714 - 17200 0.0044450353 0 4.0933677e-05 3.019578e-05 5.5604765e-05 9.4285714 - 17300 0.0045016689 0 4.0563484e-05 3.4710888e-05 5.2933625e-05 9.4285714 - 17400 0.0044798864 0 4.0768397e-05 3.3076261e-05 5.2287655e-05 9.4285714 - 17500 0.0044624458 0 3.8361144e-05 3.4320802e-05 5.4620342e-05 9.4285714 - 17600 0.0044477024 0 3.6643486e-05 3.6449296e-05 5.4759028e-05 9.4285714 - 17700 0.0044103517 0 3.8319719e-05 3.7509764e-05 5.0738749e-05 9.4285714 - 17800 0.004341948 0 3.8052635e-05 3.6850602e-05 5.0481977e-05 9.4285714 - 17900 0.0042623319 0 3.5909432e-05 3.5619615e-05 5.2184073e-05 9.4285714 - 18000 0.003726239 0 1.8245827e-05 3.791319e-05 5.0575431e-05 9.4285714 - 18100 0.0034893305 0 1.7957847e-05 3.6788428e-05 5.281228e-05 9.4285714 - 18200 0.0035481187 0 2.2513253e-05 3.461697e-05 5.1791689e-05 9.4285714 - 18300 0.0036251402 0 2.5159661e-05 3.4782379e-05 5.0946509e-05 9.4285714 - 18400 0.0036369749 0 2.4150699e-05 3.6305943e-05 5.0273557e-05 9.4285714 - 18500 0.0034279849 0 2.050142e-05 3.3762641e-05 5.0772554e-05 9.4285714 - 18600 0.0033615572 0 1.8397654e-05 3.3183402e-05 5.2215005e-05 9.4285714 - 18700 0.003406225 0 1.9609619e-05 3.4353871e-05 5.1091792e-05 9.4285714 - 18800 0.0034922323 0 1.9330569e-05 3.4176016e-05 5.2688824e-05 9.4285714 - 18900 0.0034820625 0 1.9280274e-05 3.3807796e-05 5.372272e-05 9.4285714 - 19000 0.0033272524 0 1.6873326e-05 3.594881e-05 5.3862535e-05 9.4285714 - 19100 0.0034010912 0 1.8030816e-05 3.582088e-05 5.4236353e-05 9.4285714 - 19200 0.0030932535 0 1.4863995e-05 2.7793367e-05 5.3934101e-05 9.4285714 - 19300 0.002624051 0 1.210198e-05 1.6467088e-05 5.2583223e-05 9.4285714 - 19400 0.0027583806 0 1.2008108e-05 2.1017092e-05 5.309485e-05 9.4285714 - 19500 0.0029775174 0 1.3352592e-05 2.4636522e-05 5.4043107e-05 9.4285714 - 19600 0.0028689969 0 1.3488363e-05 2.4373881e-05 5.7585286e-05 9.4285714 - 19700 0.0026399127 0 1.4002066e-05 2.7370388e-05 5.4220539e-05 9.4285714 - 19800 0.0025439904 0 1.668679e-05 2.7178009e-05 5.3083248e-05 9.4285714 - 19900 0.0027074939 0 1.5155901e-05 2.5194957e-05 5.3757244e-05 9.4285714 - 20000 0.0027181793 0 1.2268581e-05 2.5236301e-05 5.1395997e-05 9.4285714 - 20100 0.0027315362 0 1.2532955e-05 2.4069296e-05 5.2648391e-05 9.4285714 - 20200 0.0027204191 0 1.2457637e-05 2.419839e-05 5.2229242e-05 9.4285714 - 20300 0.0026457344 0 1.3573924e-05 2.3628429e-05 4.9330286e-05 9.4285714 - 20400 0.0026592475 0 1.3439645e-05 2.4469429e-05 5.1570429e-05 9.4285714 - 20500 0.0026129298 0 1.3261647e-05 2.4468607e-05 5.1163936e-05 9.4285714 - 20600 0.0026532045 0 1.5275975e-05 2.3494207e-05 5.0569472e-05 9.4285714 - 20700 0.0026172433 0 1.4720887e-05 2.1839292e-05 5.0769214e-05 9.4285714 - 20800 0.0025282343 0 1.3852135e-05 2.0845003e-05 4.9690546e-05 9.4285714 - 20900 0.0025383322 0 1.353444e-05 2.2097076e-05 5.1303519e-05 9.4285714 - 21000 0.0024848857 0 1.4032657e-05 2.1964185e-05 5.3050324e-05 9.4285714 - 21100 0.0025091105 0 1.5334232e-05 2.1760041e-05 5.508965e-05 9.4285714 - 21200 0.0027229411 0 1.9418427e-05 2.2335523e-05 5.5657372e-05 9.4285714 - 21300 0.0028888226 0 2.3631969e-05 2.2967648e-05 5.5948438e-05 9.4285714 - 21400 0.0029336429 0 2.5044169e-05 2.2567194e-05 5.5413722e-05 9.4285714 - 21500 0.0029354446 0 2.4712642e-05 2.2624219e-05 5.5920832e-05 9.4285714 - 21600 0.0029270648 0 2.3842417e-05 2.3011885e-05 5.6087719e-05 9.4285714 - 21700 0.0029288781 0 2.3942959e-05 2.2810041e-05 5.7045772e-05 9.4285714 - 21800 0.002884005 0 2.4455829e-05 2.3081577e-05 5.6212968e-05 9.4285714 - 21900 0.0028362206 0 2.3350532e-05 2.49708e-05 5.3642917e-05 9.4285714 - 22000 0.0027784436 0 2.3311918e-05 2.3033334e-05 5.4359393e-05 9.4285714 - 22100 0.0027479829 0 2.4623514e-05 2.0287924e-05 5.3550114e-05 9.4285714 - 22200 0.0027598842 0 2.6073037e-05 2.1629185e-05 5.3119193e-05 9.4285714 - 22300 0.0026078138 0 2.6348246e-05 2.3093425e-05 5.4029431e-05 9.4285714 - 22400 0.0026057112 0 2.7316001e-05 2.4771567e-05 5.3484921e-05 9.4285714 - 22500 0.0026641722 0 2.6434166e-05 2.5849367e-05 5.2175653e-05 9.4285714 - 22600 0.0023728105 0 2.4436322e-05 2.4147316e-05 5.3971034e-05 9.4285714 - 22700 0.0021999097 0 2.4191892e-05 2.2725939e-05 5.3125105e-05 9.4285714 - 22800 0.002178124 0 2.4122577e-05 2.0194755e-05 5.3468522e-05 9.4285714 - 22900 0.0022903704 0 2.1332487e-05 1.8921598e-05 5.4657879e-05 9.4285714 - 23000 0.0022114595 0 1.930828e-05 1.4423335e-05 5.5387271e-05 9.4285714 - 23100 0.0022473179 0 2.0911663e-05 1.3467616e-05 5.4325686e-05 9.4285714 - 23200 0.0022787302 0 2.1538492e-05 1.5779872e-05 5.3591578e-05 9.4285714 - 23300 0.002254193 0 2.0552374e-05 1.7158208e-05 5.201196e-05 9.4285714 - 23400 0.0022032528 0 2.0514024e-05 1.6045426e-05 5.1691057e-05 9.4285714 - 23500 0.0022103262 0 2.2570839e-05 1.4990595e-05 5.0102702e-05 9.4285714 - 23600 0.0022767949 0 2.153875e-05 1.5934866e-05 4.9843486e-05 9.4285714 - 23700 0.002283034 0 2.0348727e-05 1.5852737e-05 4.9211887e-05 9.4285714 - 23800 0.0022293403 0 2.045052e-05 1.3951752e-05 4.9265994e-05 9.4285714 - 23900 0.0022421499 0 2.0541393e-05 1.3873188e-05 4.9783702e-05 9.4285714 - 24000 0.0022708179 0 2.0733448e-05 1.4464939e-05 5.0156761e-05 9.4285714 - 24100 0.0022311644 0 2.1753043e-05 1.4644732e-05 5.3630645e-05 9.4285714 - 24200 0.0022566051 0 2.3030277e-05 1.4212031e-05 5.3868685e-05 9.4285714 - 24300 0.0022547585 0 2.3946322e-05 1.331734e-05 5.2948407e-05 9.4285714 - 24400 0.0022901257 0 2.552016e-05 1.4594528e-05 5.3067402e-05 9.4285714 - 24500 0.0023537103 0 2.9369007e-05 1.5861923e-05 5.3200721e-05 9.4285714 - 24600 0.0023613708 0 2.9444021e-05 1.3691716e-05 5.4296289e-05 9.4285714 - 24700 0.0023237992 0 2.8805716e-05 1.1616027e-05 5.4142589e-05 9.4285714 - 24800 0.0024221927 0 3.1070958e-05 1.2059146e-05 5.406912e-05 9.4285714 - 24900 0.0025882547 0 3.7453428e-05 1.2082125e-05 5.4439426e-05 9.4285714 - 25000 0.0027152266 0 4.2549028e-05 1.1637136e-05 5.4292043e-05 9.4285714 - 25100 0.0028201154 0 4.6710609e-05 1.2903782e-05 5.3790595e-05 9.4285714 - 25200 0.0029086169 0 4.756645e-05 1.3260261e-05 5.7165687e-05 9.4285714 - 25300 0.0028528211 0 4.8705176e-05 1.1918164e-05 5.632163e-05 9.4285714 - 25400 0.0027655631 0 4.7538544e-05 1.186744e-05 5.3917832e-05 9.4285714 - 25500 0.0027631455 0 4.7296868e-05 1.2125391e-05 5.2651056e-05 9.4285714 - 25600 0.0027455338 0 4.8477007e-05 1.2403172e-05 5.7029384e-05 9.4285714 - 25700 0.0027314337 0 4.8377711e-05 1.254263e-05 5.7035789e-05 9.4285714 - 25800 0.0026789336 0 4.9232002e-05 1.1749936e-05 5.7580068e-05 9.4285714 - 25900 0.0026686904 0 5.0376929e-05 1.2811492e-05 5.9087927e-05 9.4285714 - 26000 0.0026703643 0 5.0974299e-05 1.3064292e-05 5.7801118e-05 9.4285714 - 26100 0.0026825353 0 4.9500137e-05 1.1676376e-05 5.695664e-05 9.4285714 - 26200 0.0026825174 0 4.972182e-05 1.0546822e-05 5.7622991e-05 9.4285714 - 26300 0.0025517718 0 4.36237e-05 1.082888e-05 5.8496458e-05 9.4285714 - 26400 0.002448155 0 3.6914303e-05 1.1208368e-05 6.0071981e-05 9.4285714 - 26500 0.0023334395 0 3.2968743e-05 1.0745176e-05 6.0011765e-05 9.4285714 - 26600 0.0023097701 0 3.0179184e-05 1.1497687e-05 5.9980393e-05 9.4285714 - 26700 0.0023614287 0 3.1929774e-05 1.4076482e-05 5.767606e-05 9.4285714 - 26800 0.0023955623 0 3.1551792e-05 1.7121208e-05 5.8187883e-05 9.4285714 - 26900 0.0019993736 0 1.8807723e-05 1.6770089e-05 5.7954922e-05 9.4285714 - 27000 0.0019497677 0 1.7354388e-05 1.6608976e-05 5.6225802e-05 9.4285714 - 27100 0.0020363076 0 2.1348268e-05 1.6918233e-05 5.7949239e-05 9.4285714 - 27200 0.0021974785 0 2.5205825e-05 2.0142198e-05 5.5376701e-05 9.4285714 - 27300 0.002350289 0 2.8900121e-05 2.3754068e-05 5.5263555e-05 9.4285714 - 27400 0.0026460053 0 3.2553147e-05 3.227333e-05 5.7954104e-05 9.4285714 - 27500 0.0027599044 0 3.2851254e-05 3.674649e-05 5.6341966e-05 9.4285714 - 27600 0.0026660556 0 3.2389038e-05 3.4626306e-05 5.5414375e-05 9.4285714 - 27700 0.0026060398 0 3.3223431e-05 3.2391399e-05 5.3340397e-05 9.4285714 - 27800 0.002724511 0 3.372415e-05 3.4485846e-05 5.4707128e-05 9.4285714 - 27900 0.0027318479 0 3.3234708e-05 3.5304313e-05 5.5589046e-05 9.4285714 - 28000 0.0026231478 0 3.2741313e-05 3.3225541e-05 5.398932e-05 9.4285714 - 28100 0.0025508556 0 3.3833477e-05 3.1513842e-05 5.4023598e-05 9.4285714 - 28200 0.0025807152 0 3.4548289e-05 3.3420009e-05 5.5627424e-05 9.4285714 - 28300 0.0024074206 0 3.0461599e-05 3.4140994e-05 5.6820341e-05 9.4285714 - 28400 0.0021292859 0 2.3624321e-05 3.4194604e-05 5.3656462e-05 9.4285714 - 28500 0.0022172558 0 1.8989998e-05 3.8241372e-05 5.0308571e-05 9.4285714 - 28600 0.0022653927 0 2.0006228e-05 4.1839298e-05 5.3834698e-05 9.4285714 - 28700 0.0025914898 0 2.4417865e-05 5.4161998e-05 5.2309701e-05 9.4285714 - 28800 0.0028276024 0 2.7173934e-05 5.9987722e-05 5.1277434e-05 9.4285714 - 28900 0.0029326653 0 2.9972273e-05 5.9404465e-05 5.3442041e-05 9.4285714 - 29000 0.002965493 0 3.0732118e-05 5.8813779e-05 5.4010354e-05 9.4285714 - 29100 0.0029096903 0 2.789911e-05 5.6948857e-05 5.3811328e-05 9.4285714 - 29200 0.0028604262 0 2.8541368e-05 5.5433392e-05 5.5266978e-05 9.4285714 - 29300 0.0028093312 0 3.1626568e-05 5.2793462e-05 5.9393321e-05 9.4285714 - 29400 0.0026786162 0 2.6580766e-05 4.1761109e-05 6.3731211e-05 9.4285714 - 29500 0.0025387867 0 2.4586262e-05 3.1439522e-05 6.5207101e-05 9.4285714 - 29600 0.0026569564 0 2.658665e-05 3.344894e-05 6.5578568e-05 9.4285714 - 29700 0.0027207144 0 2.4629031e-05 3.1640582e-05 7.3229358e-05 9.4285714 - 29800 0.0026892821 0 2.0092233e-05 2.9124688e-05 8.0756571e-05 9.4285714 - 29900 0.002643369 0 2.0481401e-05 3.0183662e-05 7.7273404e-05 9.4285714 - 30000 0.0026484998 0 1.9889243e-05 3.0560067e-05 7.7261634e-05 9.4285714 - 30100 0.0028058509 0 2.6399165e-05 3.004015e-05 8.3212623e-05 9.4285714 - 30200 0.0030353215 0 3.6921703e-05 3.4899864e-05 7.8543173e-05 9.4285714 - 30300 0.0030244988 0 4.0706399e-05 3.6091245e-05 7.4921988e-05 9.4285714 - 30400 0.0030855053 0 4.2502388e-05 3.8438853e-05 7.6268037e-05 9.4285714 - 30500 0.0031141819 0 4.3996743e-05 4.3726389e-05 6.8459715e-05 9.4285714 - 30600 0.0030115458 0 4.436657e-05 4.2288168e-05 6.5970726e-05 9.4285714 - 30700 0.0029700178 0 4.2448638e-05 4.1066034e-05 6.7905919e-05 9.4285714 - 30800 0.0029985358 0 4.3581039e-05 4.2782359e-05 6.616813e-05 9.4285714 - 30900 0.0029689517 0 4.3664983e-05 4.0341198e-05 6.6701993e-05 9.4285714 - 31000 0.0029622718 0 4.3233863e-05 3.8109114e-05 6.615517e-05 9.4285714 - 31100 0.0029693917 0 4.3443429e-05 3.6045147e-05 6.6807218e-05 9.4285714 - 31200 0.0027246348 0 3.8812502e-05 2.5969873e-05 6.9745525e-05 9.4285714 - 31300 0.0025368424 0 3.4331267e-05 2.1427734e-05 6.9565964e-05 9.4285714 - 31400 0.0023736698 0 3.2043786e-05 1.9880875e-05 6.6817156e-05 9.4285714 - 31500 0.0023946514 0 3.3170726e-05 1.9958211e-05 7.0242984e-05 9.4285714 - 31600 0.0025648037 0 3.5948214e-05 2.4022282e-05 7.8512704e-05 9.4285714 - 31700 0.0026956511 0 3.9195772e-05 3.3270216e-05 7.4223245e-05 9.4285714 - 31800 0.002677722 0 3.8651034e-05 3.4084086e-05 7.3747643e-05 9.4285714 - 31900 0.0026705496 0 3.8515991e-05 3.3258169e-05 7.4757118e-05 9.4285714 - 32000 0.0026466417 0 4.2241836e-05 3.449171e-05 7.0551161e-05 9.4285714 - 32100 0.0026464292 0 4.0974715e-05 3.6570061e-05 6.5387411e-05 9.4285714 - 32200 0.0023705665 0 2.951869e-05 3.011444e-05 6.6589524e-05 9.4285714 - 32300 0.0023183595 0 2.2729207e-05 3.0010044e-05 7.2706128e-05 9.4285714 - 32400 0.0023882969 0 2.372595e-05 3.1302357e-05 7.3782281e-05 9.4285714 - 32500 0.0023801754 0 2.2337455e-05 3.0476386e-05 7.5659736e-05 9.4285714 - 32600 0.0024127958 0 2.5510841e-05 3.0854572e-05 7.4410799e-05 9.4285714 - 32700 0.0024031675 0 2.7736693e-05 3.1958346e-05 7.1486437e-05 9.4285714 - 32800 0.0023770089 0 2.6385534e-05 3.3252416e-05 7.2822578e-05 9.4285714 - 32900 0.0023568819 0 2.8634678e-05 3.3258031e-05 6.7686839e-05 9.4285714 - 33000 0.0023407285 0 2.6769773e-05 3.2579304e-05 6.6690925e-05 9.4285714 - 33100 0.002327332 0 2.6645781e-05 3.4007498e-05 6.9628993e-05 9.4285714 - 33200 0.0023912585 0 2.3830565e-05 3.3441643e-05 7.4913813e-05 9.4285714 - 33300 0.0022984153 0 2.4483639e-05 3.2969557e-05 7.7726941e-05 9.4285714 - 33400 0.0022416368 0 2.3898793e-05 3.1031269e-05 7.686001e-05 9.4285714 - 33500 0.0022470637 0 2.0975902e-05 3.0084834e-05 7.570705e-05 9.4285714 - 33600 0.002256129 0 2.0520324e-05 2.8645032e-05 7.7384366e-05 9.4285714 - 33700 0.0022125246 0 1.9872713e-05 2.9850887e-05 7.5881174e-05 9.4285714 - 33800 0.0021842197 0 1.9711523e-05 2.983205e-05 7.3213854e-05 9.4285714 - 33900 0.0021690567 0 1.8055303e-05 2.828677e-05 7.3059722e-05 9.4285714 - 34000 0.0022206311 0 1.8792994e-05 2.8714121e-05 7.5766963e-05 9.4285714 - 34100 0.0022494061 0 2.1426406e-05 2.9683277e-05 7.5164305e-05 9.4285714 - 34200 0.0022085859 0 2.1896897e-05 2.8930132e-05 7.2805525e-05 9.4285714 - 34300 0.0021855633 0 2.0480867e-05 2.9992196e-05 7.2354191e-05 9.4285714 - 34400 0.0021798298 0 2.1236448e-05 3.2053048e-05 7.283282e-05 9.4285714 - 34500 0.0021267289 0 2.2129794e-05 2.8881701e-05 7.1551685e-05 9.4285714 - 34600 0.0020466804 0 2.3010184e-05 2.7531882e-05 7.2523946e-05 9.4285714 - 34700 0.0020969555 0 2.1337061e-05 3.0266865e-05 7.0863423e-05 9.4285714 - 34800 0.0022946237 0 2.2123517e-05 3.8911524e-05 7.2703415e-05 9.4285714 - 34900 0.0024490201 0 2.8420828e-05 5.0378173e-05 7.1772848e-05 9.4285714 - 35000 0.0023320217 0 2.8176618e-05 5.1789577e-05 6.8023074e-05 9.4285714 - 35100 0.0021890324 0 2.4442013e-05 5.2547725e-05 6.1661973e-05 9.4285714 - 35200 0.0022124553 0 2.4530724e-05 5.096875e-05 6.5186855e-05 9.4285714 - 35300 0.0022584165 0 2.7542443e-05 5.427333e-05 6.7536963e-05 9.4285714 - 35400 0.0022737238 0 2.504131e-05 5.4367041e-05 6.7123718e-05 9.4285714 - 35500 0.0021537481 0 2.1567488e-05 4.8699315e-05 6.7335416e-05 9.4285714 - 35600 0.0019831613 0 1.8746091e-05 4.3656184e-05 6.3180625e-05 9.4285714 - 35700 0.0019041909 0 1.9945089e-05 4.3868252e-05 5.8115913e-05 9.4285714 - 35800 0.0018216502 0 2.2392614e-05 4.2188069e-05 5.7629004e-05 9.4285714 - 35900 0.0018071574 0 2.1141753e-05 4.1327783e-05 5.630057e-05 9.4285714 - 36000 0.0018645267 0 2.2735521e-05 4.4296822e-05 5.4259075e-05 9.4285714 - 36100 0.0018474198 0 2.5295637e-05 4.6128849e-05 5.7469914e-05 9.4285714 - 36200 0.0017366166 0 2.6021589e-05 4.5563756e-05 5.5296808e-05 9.4285714 - 36300 0.0016630877 0 2.4135763e-05 4.58324e-05 5.2179718e-05 9.4285714 - 36400 0.0016809967 0 2.3427379e-05 4.7533202e-05 4.714932e-05 9.4285714 - 36500 0.0017478488 0 2.4021161e-05 4.6508842e-05 4.3949519e-05 9.4285714 - 36600 0.0017244649 0 2.3504871e-05 4.3628584e-05 4.3171518e-05 9.4285714 - 36700 0.001694793 0 2.2302323e-05 4.2349904e-05 4.396766e-05 9.4285714 - 36800 0.0016321204 0 2.1042421e-05 3.6396346e-05 4.4901304e-05 9.4285714 - 36900 0.0015208954 0 2.0456403e-05 2.7850556e-05 4.5155127e-05 9.4285714 - 37000 0.0014068755 0 2.0241724e-05 2.1785718e-05 4.5528636e-05 9.4285714 - 37100 0.0013361229 0 1.675977e-05 2.1314381e-05 4.6611487e-05 9.4285714 - 37200 0.001331474 0 1.6204509e-05 2.3621819e-05 5.0433204e-05 9.4285714 - 37300 0.0013895388 0 1.6721652e-05 3.0265014e-05 5.0091541e-05 9.4285714 - 37400 0.001407333 0 1.738976e-05 2.8850978e-05 5.1334019e-05 9.4285714 - 37500 0.0013815772 0 1.6241641e-05 3.0837468e-05 4.6825094e-05 9.4285714 - 37600 0.001367937 0 1.1983552e-05 2.9613642e-05 5.0754355e-05 9.4285714 - 37700 0.0013781896 0 1.1915379e-05 2.9242244e-05 4.8777649e-05 9.4285714 - 37800 0.0013938097 0 1.1529951e-05 3.1628776e-05 4.7715639e-05 9.4285714 - 37900 0.0013788852 0 1.2561324e-05 3.1951817e-05 4.7999073e-05 9.4285714 - 38000 0.0013409916 0 1.2473952e-05 3.1146722e-05 4.8401798e-05 9.4285714 - 38100 0.0013548793 0 1.1004651e-05 2.7320574e-05 4.9651495e-05 9.4285714 - 38200 0.0013619894 0 1.2229314e-05 2.574689e-05 4.9387883e-05 9.4285714 - 38300 0.0013593654 0 1.3392954e-05 2.427172e-05 5.1848635e-05 9.4285714 - 38400 0.0013488508 0 1.256534e-05 2.449982e-05 5.4623064e-05 9.4285714 - 38500 0.0013399961 0 1.2037162e-05 2.0814078e-05 5.6078474e-05 9.4285714 - 38600 0.0013473117 0 1.1744489e-05 1.6853428e-05 5.7231621e-05 9.4285714 - 38700 0.0013275262 0 1.093468e-05 1.4795508e-05 5.769577e-05 9.4285714 - 38800 0.001304838 0 1.1068283e-05 1.3115698e-05 6.0324982e-05 9.4285714 - 38900 0.0012981525 0 1.1709325e-05 1.3131645e-05 5.9760468e-05 9.4285714 - 39000 0.0013241474 0 1.261896e-05 1.4616086e-05 6.0256213e-05 9.4285714 - 39100 0.0013302715 0 1.1838509e-05 1.5600129e-05 6.432053e-05 9.4285714 - 39200 0.0013338793 0 1.2403697e-05 1.6279003e-05 6.2961888e-05 9.4285714 - 39300 0.001337749 0 1.3137034e-05 1.6207867e-05 6.0627848e-05 9.4285714 - 39400 0.0014184127 0 1.6180184e-05 1.8165982e-05 5.8887905e-05 9.4285714 - 39500 0.0015076229 0 1.9522159e-05 1.9795428e-05 5.910332e-05 9.4285714 - 39600 0.001584196 0 2.4027089e-05 2.0838917e-05 5.7603421e-05 9.4285714 - 39700 0.0016673141 0 2.9500045e-05 2.3045542e-05 5.5891462e-05 9.4285714 - 39800 0.0016983633 0 3.0305739e-05 2.4453535e-05 5.5981899e-05 9.4285714 - 39900 0.001721388 0 3.1340689e-05 2.4975831e-05 5.5548483e-05 9.4285714 - 40000 0.0016511866 0 3.370998e-05 2.6328206e-05 5.671433e-05 9.4285714 - 40100 0.0015902117 0 3.3681877e-05 2.5663116e-05 5.3013557e-05 9.4285714 - 40200 0.0016248457 0 3.0865269e-05 2.5397352e-05 5.1452424e-05 9.4285714 - 40300 0.001639017 0 3.1973896e-05 2.5525448e-05 5.4813301e-05 9.4285714 - 40400 0.0015947128 0 3.5965857e-05 2.5225505e-05 5.6385827e-05 9.4285714 - 40500 0.0014886812 0 3.7017265e-05 2.4882355e-05 5.2995469e-05 9.4285714 - 40600 0.001483951 0 3.4221499e-05 2.1479298e-05 5.4046331e-05 9.4285714 - 40700 0.0014877422 0 3.362595e-05 1.8839863e-05 5.5203171e-05 9.4285714 - 40800 0.0014974798 0 3.6392277e-05 1.7485578e-05 5.7247772e-05 9.4285714 - 40900 0.0014499802 0 3.3431089e-05 1.9674968e-05 5.6160238e-05 9.4285714 - 41000 0.001395913 0 2.9658496e-05 1.8273286e-05 5.6527772e-05 9.4285714 - 41100 0.0014079985 0 2.9771219e-05 1.6179289e-05 5.9153644e-05 9.4285714 - 41200 0.0014187083 0 2.7845336e-05 1.9035184e-05 5.7573549e-05 9.4285714 - 41300 0.0014072972 0 2.4886378e-05 2.0795562e-05 5.4986012e-05 9.4285714 - 41400 0.0014168981 0 2.358191e-05 2.1908287e-05 5.4674995e-05 9.4285714 - 41500 0.0014248439 0 2.3385735e-05 2.3170658e-05 5.3269277e-05 9.4285714 - 41600 0.0014225044 0 2.376616e-05 2.5694883e-05 5.2138491e-05 9.4285714 - 41700 0.0014075811 0 2.2374247e-05 2.7567814e-05 5.1299283e-05 9.4285714 - 41800 0.0012680617 0 2.2171263e-05 2.5019906e-05 5.4594068e-05 9.4285714 - 41900 0.0010587818 0 1.5440824e-05 2.093143e-05 5.3361822e-05 9.4285714 - 42000 0.0010007004 0 1.2044875e-05 1.7303459e-05 5.3021476e-05 9.4285714 - 42100 0.0011304402 0 1.2464466e-05 1.9304071e-05 5.5030158e-05 9.4285714 - 42200 0.0012833154 0 1.6978814e-05 2.4344322e-05 5.4664913e-05 9.4285714 - 42300 0.0013573853 0 1.8276863e-05 2.7764513e-05 5.4832226e-05 9.4285714 - 42400 0.0013330633 0 1.7445663e-05 2.5994427e-05 5.6219048e-05 9.4285714 - 42500 0.0012896373 0 1.7549999e-05 2.4461263e-05 5.5316804e-05 9.4285714 - 42600 0.001296775 0 1.7579818e-05 2.4729094e-05 5.4786174e-05 9.4285714 - 42700 0.0013193969 0 1.7589942e-05 2.6653321e-05 5.5601741e-05 9.4285714 - 42800 0.0013144903 0 1.7344148e-05 2.7396405e-05 5.6063261e-05 9.4285714 - 42900 0.0013053554 0 1.812017e-05 2.4357577e-05 5.5400672e-05 9.4285714 - 43000 0.0013061323 0 1.7976023e-05 2.5672617e-05 5.5591174e-05 9.4285714 - 43100 0.0013149372 0 1.8049252e-05 2.7694066e-05 5.7517507e-05 9.4285714 - 43200 0.0013063189 0 1.8000018e-05 2.5312637e-05 5.7758611e-05 9.4285714 - 43300 0.0012669853 0 1.7756679e-05 2.3718058e-05 5.7316755e-05 9.4285714 - 43400 0.0012238388 0 2.0194584e-05 2.1983277e-05 5.5573072e-05 9.4285714 - 43500 0.0012053096 0 2.0662764e-05 2.2371854e-05 5.3240833e-05 9.4285714 - 43600 0.001243323 0 2.3521544e-05 2.3272124e-05 5.4438848e-05 9.4285714 - 43700 0.001354992 0 2.8388806e-05 2.6835727e-05 5.1695181e-05 9.4285714 - 43800 0.0015252788 0 3.4452462e-05 3.2972955e-05 5.1148386e-05 9.4285714 - 43900 0.0016845587 0 3.7891883e-05 3.7259267e-05 5.3712665e-05 9.4285714 - 44000 0.0016987088 0 3.794299e-05 3.9188564e-05 5.22906e-05 9.4285714 - 44100 0.0016663634 0 3.6807094e-05 3.9253716e-05 5.2294244e-05 9.4285714 - 44200 0.0016642734 0 3.7043503e-05 3.9518624e-05 5.2702041e-05 9.4285714 - 44300 0.0016877933 0 3.8179716e-05 4.0630461e-05 5.3339506e-05 9.4285714 - 44400 0.0016937941 0 3.7131293e-05 4.1066259e-05 5.432841e-05 9.4285714 - 44500 0.001658184 0 3.5564842e-05 3.9986051e-05 5.4994687e-05 9.4285714 - 44600 0.0016202756 0 3.6182348e-05 4.0514972e-05 5.4343097e-05 9.4285714 - 44700 0.0012624519 0 3.6496068e-05 3.330838e-05 6.0193182e-05 9.4285714 - 44800 0.0012148648 0 3.7546572e-05 2.4531512e-05 6.0795743e-05 9.4285714 - 44900 0.0012565599 0 2.9767991e-05 2.3526786e-05 5.730112e-05 9.4285714 - 45000 0.0012298496 0 3.3326423e-05 2.2497973e-05 5.3986547e-05 9.4285714 - 45100 0.0012274205 0 3.310721e-05 2.2786466e-05 5.5167469e-05 9.4285714 - 45200 0.0012389066 0 3.4925053e-05 2.3497387e-05 5.4884661e-05 9.4285714 - 45300 0.0012251609 0 3.615161e-05 2.3152279e-05 5.3650078e-05 9.4285714 - 45400 0.0012814774 0 3.746516e-05 2.4153096e-05 5.1029288e-05 9.4285714 - 45500 0.0013450626 0 3.9489551e-05 2.6213973e-05 5.0267505e-05 9.4285714 - 45600 0.0013741472 0 4.2751714e-05 2.6741902e-05 4.9140966e-05 9.4285714 - 45700 0.0014351223 0 4.3930849e-05 2.6748326e-05 4.9411273e-05 9.4285714 - 45800 0.0015284371 0 4.6485067e-05 2.8704517e-05 4.9999511e-05 9.4285714 - 45900 0.001575355 0 4.5717321e-05 3.011393e-05 5.1143199e-05 9.4285714 - 46000 0.0015147792 0 4.1325851e-05 3.0384448e-05 5.1923e-05 9.4285714 - 46100 0.0014504182 0 3.9540594e-05 3.1635289e-05 5.0948968e-05 9.4285714 - 46200 0.0014410639 0 3.965176e-05 3.0362005e-05 4.8786102e-05 9.4285714 - 46300 0.0014810525 0 4.1568241e-05 3.0756475e-05 4.8680363e-05 9.4285714 - 46400 0.0014640215 0 4.309465e-05 2.985089e-05 4.9009517e-05 9.4285714 - 46500 0.0014424933 0 4.2309209e-05 2.9280621e-05 4.8629444e-05 9.4285714 - 46600 0.001441165 0 4.2539286e-05 3.0934085e-05 4.9784857e-05 9.4285714 - 46700 0.0015025344 0 4.4979228e-05 3.1000179e-05 4.8462809e-05 9.4285714 - 46800 0.0015582176 0 4.7282405e-05 3.2706414e-05 4.5724526e-05 9.4285714 - 46900 0.0015803324 0 4.7650091e-05 3.4907217e-05 4.4832148e-05 9.4285714 - 47000 0.001675143 0 5.1693701e-05 3.6882816e-05 4.6006875e-05 9.4285714 - 47100 0.0017769921 0 5.6400585e-05 3.9830957e-05 4.6950937e-05 9.4285714 - 47200 0.0018358006 0 5.9232345e-05 4.3665585e-05 4.6768506e-05 9.4285714 - 47300 0.0017951326 0 5.6422198e-05 4.3944608e-05 4.8336201e-05 9.4285714 - 47400 0.0017057371 0 5.4710398e-05 3.9941549e-05 4.7652027e-05 9.4285714 - 47500 0.0016744493 0 5.2852149e-05 3.7232824e-05 4.5384467e-05 9.4285714 - 47600 0.0014031951 0 4.1326626e-05 3.0025176e-05 4.3875657e-05 9.4285714 - 47700 0.0013373039 0 3.7514245e-05 2.9655038e-05 4.316088e-05 9.4285714 - 47800 0.0014704003 0 4.1417238e-05 3.4940895e-05 4.447442e-05 9.4285714 - 47900 0.0014934525 0 4.3132757e-05 3.7137359e-05 4.4062556e-05 9.4285714 - 48000 0.0014895856 0 4.6046202e-05 3.6927333e-05 4.3726122e-05 9.4285714 - 48100 0.00146967 0 4.6872982e-05 3.9649234e-05 4.597459e-05 9.4285714 - 48200 0.0015682986 0 4.8924923e-05 4.738992e-05 4.3767565e-05 9.4285714 - 48300 0.0017163505 0 5.2171663e-05 5.3787554e-05 4.4084292e-05 9.4285714 - 48400 0.0014261936 0 4.3093196e-05 5.6810791e-05 5.4178929e-05 9.4285714 - 48500 0.0014236361 0 3.9093573e-05 4.8266345e-05 5.346877e-05 9.4285714 - 48600 0.0014562257 0 4.0734834e-05 4.2323892e-05 4.8295024e-05 9.4285714 - 48700 0.0013758282 0 3.6847543e-05 3.5139344e-05 4.8073535e-05 9.4285714 - 48800 0.0014316476 0 3.7554019e-05 3.5556116e-05 4.7370089e-05 9.4285714 - 48900 0.0014805023 0 3.5226264e-05 3.3817592e-05 5.2499511e-05 9.4285714 - 49000 0.0013776549 0 3.2439848e-05 2.997493e-05 5.3101978e-05 9.4285714 - 49100 0.0013617488 0 3.2279492e-05 3.0772411e-05 5.1632538e-05 9.4285714 - 49200 0.0013342401 0 2.8600175e-05 3.2651245e-05 5.3349695e-05 9.4285714 - 49300 0.001276486 0 2.7777544e-05 2.96306e-05 5.4374435e-05 9.4285714 - 49400 0.0011795288 0 2.2827442e-05 2.8085944e-05 5.2012108e-05 9.4285714 - 49500 0.0011435859 0 2.2873378e-05 2.7199584e-05 4.8565744e-05 9.4285714 - 49600 0.001247689 0 2.5002038e-05 3.0378272e-05 5.4987332e-05 9.4285714 - 49700 0.0013371245 0 2.6349724e-05 3.4033827e-05 5.8350385e-05 9.4285714 - 49800 0.001301722 0 2.4983049e-05 3.3355962e-05 5.7259996e-05 9.4285714 - 49900 0.0012728363 0 2.4271773e-05 3.366383e-05 5.4969958e-05 9.4285714 - 50000 0.0013286836 0 2.4626397e-05 3.4888455e-05 5.6333036e-05 9.4285714 - 50100 0.0013460063 0 2.5626025e-05 3.4617082e-05 5.8834535e-05 9.4285714 - 50200 0.0012868089 0 2.3749355e-05 3.3262754e-05 5.7555068e-05 9.4285714 - 50300 0.0012765172 0 2.3286644e-05 3.285494e-05 5.6753429e-05 9.4285714 - 50400 0.0012703222 0 2.2664849e-05 3.2123476e-05 5.8001158e-05 9.4285714 - 50500 0.0011906512 0 1.8988144e-05 2.5734872e-05 6.0360828e-05 9.4285714 - 50600 0.0011537339 0 1.7108695e-05 2.2700119e-05 6.3433107e-05 9.4285714 - 50700 0.0011267336 0 1.7970895e-05 2.4672948e-05 5.8568632e-05 9.4285714 - 50800 0.0011753482 0 1.9468991e-05 2.5939765e-05 5.9862885e-05 9.4285714 - 50900 0.0011919232 0 2.0208188e-05 2.7321787e-05 5.9048906e-05 9.4285714 - 51000 0.0011838525 0 2.1827961e-05 2.9118892e-05 5.2803692e-05 9.4285714 - 51100 0.0011883954 0 2.2709257e-05 2.8506733e-05 5.4654615e-05 9.4285714 - 51200 0.0012349694 0 2.5890907e-05 2.8698467e-05 5.7896353e-05 9.4285714 - 51300 0.0012337432 0 2.7687089e-05 2.7653507e-05 5.9917212e-05 9.4285714 - 51400 0.0011577306 0 2.8378044e-05 2.3224364e-05 5.8057014e-05 9.4285714 - 51500 0.0011811724 0 2.8435714e-05 2.1929674e-05 5.9722575e-05 9.4285714 - 51600 0.0012159313 0 3.1521829e-05 2.2796335e-05 5.924849e-05 9.4285714 - 51700 0.0011936762 0 3.4012729e-05 2.3864808e-05 5.7265759e-05 9.4285714 - 51800 0.00119466 0 3.5158377e-05 2.5231988e-05 5.8412082e-05 9.4285714 - 51900 0.0012013641 0 3.3334001e-05 2.6816388e-05 5.861301e-05 9.4285714 - 52000 0.0011652185 0 3.0940041e-05 2.6655324e-05 5.7090011e-05 9.4285714 - 52100 0.0011222289 0 3.1077905e-05 2.4541748e-05 5.5666069e-05 9.4285714 - 52200 0.0011223637 0 3.2939544e-05 2.5096815e-05 5.6416173e-05 9.4285714 - 52300 0.00108781 0 3.4613486e-05 2.7303053e-05 5.6746437e-05 9.4285714 - 52400 0.0010329114 0 3.6196201e-05 2.8068523e-05 5.2439815e-05 9.4285714 - 52500 0.0010414794 0 3.673215e-05 2.7272718e-05 5.143023e-05 9.4285714 - 52600 0.0011160581 0 3.5468006e-05 2.7495373e-05 5.401667e-05 9.4285714 - 52700 0.0011365494 0 3.6522651e-05 2.8130517e-05 5.1952685e-05 9.4285714 - 52800 0.0011528486 0 3.8067909e-05 3.2231442e-05 4.9590134e-05 9.4285714 - 52900 0.001215765 0 4.2804899e-05 3.6927536e-05 5.1170177e-05 9.4285714 - 53000 0.0013368124 0 4.5592002e-05 4.1563931e-05 5.4427869e-05 9.4285714 - 53100 0.0013407312 0 4.5591201e-05 4.3600841e-05 4.9047373e-05 9.4285714 - 53200 0.0013326843 0 4.4821382e-05 4.1764227e-05 4.6186223e-05 9.4285714 - 53300 0.0013239729 0 4.3827862e-05 4.4020784e-05 4.3852213e-05 9.4285714 - 53400 0.0013217143 0 4.3572994e-05 4.7084118e-05 4.3149657e-05 9.4285714 - 53500 0.0012781803 0 4.460572e-05 4.8061498e-05 4.2708059e-05 9.4285714 - 53600 0.001268382 0 4.458824e-05 4.5673787e-05 4.1230488e-05 9.4285714 - 53700 0.0012069904 0 4.1562438e-05 4.2697726e-05 4.1986265e-05 9.4285714 - 53800 0.0011968988 0 4.5963049e-05 4.0317052e-05 4.3564542e-05 9.4285714 - 53900 0.0011731954 0 4.5626132e-05 3.9016561e-05 4.2699438e-05 9.4285714 - 54000 0.0011606061 0 4.2734103e-05 3.8922865e-05 4.2063758e-05 9.4285714 - 54100 0.0011658982 0 3.9764581e-05 3.672962e-05 4.7476053e-05 9.4285714 - 54200 0.0011195165 0 3.5569124e-05 3.3590873e-05 4.8421311e-05 9.4285714 - 54300 0.0010220393 0 3.2252593e-05 3.0968164e-05 4.987935e-05 9.4285714 - 54400 0.0010086172 0 3.6631232e-05 3.0359237e-05 5.1629214e-05 9.4285714 - 54500 0.0010183988 0 3.7406525e-05 2.632072e-05 5.1823266e-05 9.4285714 - 54600 0.0010068716 0 3.6673782e-05 2.3899354e-05 4.883163e-05 9.4285714 - 54700 0.00099012603 0 3.3975738e-05 2.2165277e-05 4.788027e-05 9.4285714 - 54800 0.0009683722 0 3.235553e-05 2.2982659e-05 5.0112286e-05 9.4285714 - 54900 0.00097629715 0 3.2268492e-05 2.5601046e-05 4.8627644e-05 9.4285714 - 55000 0.00095157382 0 3.1040046e-05 2.437472e-05 4.637034e-05 9.4285714 - 55100 0.00090688968 0 2.9340275e-05 2.1953227e-05 4.3141384e-05 9.4285714 - 55200 0.00088813057 0 2.8284065e-05 2.1733676e-05 4.2934237e-05 9.4285714 - 55300 0.00092557007 0 2.8620339e-05 2.3675426e-05 4.3885475e-05 9.4285714 - 55400 0.00091327263 0 2.762239e-05 2.641616e-05 4.4396082e-05 9.4285714 - 55500 0.00079921186 0 2.9224842e-05 2.5168399e-05 4.3290943e-05 9.4285714 - 55600 0.00081947901 0 2.8418244e-05 2.2268749e-05 4.9968371e-05 9.4285714 - 55700 0.00084804465 0 2.1646302e-05 2.3720621e-05 5.205521e-05 9.4285714 - 55800 0.00085118568 0 2.2504085e-05 2.2872302e-05 4.9963437e-05 9.4285714 - 55900 0.00079015144 0 2.1456661e-05 1.9796776e-05 4.8884464e-05 9.4285714 - 56000 0.00077424122 0 2.2875959e-05 1.721853e-05 4.7217244e-05 9.4285714 - 56100 0.00078729859 0 2.750101e-05 1.8189823e-05 4.7065369e-05 9.4285714 - 56200 0.00073803593 0 2.8848488e-05 1.8153302e-05 4.571796e-05 9.4285714 - 56300 0.00072042566 0 2.842146e-05 1.5690166e-05 4.4828579e-05 9.4285714 - 56400 0.00072618636 0 2.7559372e-05 1.5504007e-05 4.399204e-05 9.4285714 - 56500 0.00072889383 0 2.7924251e-05 1.6823511e-05 4.2305183e-05 9.4285714 - 56600 0.00071687768 0 2.9101443e-05 1.6332857e-05 4.2086891e-05 9.4285714 - 56700 0.00070767909 0 3.0080534e-05 1.532979e-05 4.2661404e-05 9.4285714 - 56800 0.0007079533 0 2.8817943e-05 1.6206535e-05 4.2253735e-05 9.4285714 - 56900 0.00068006672 0 2.7371942e-05 1.7051153e-05 3.9711699e-05 9.4285714 - 57000 0.000671041 0 2.6892964e-05 1.5542748e-05 3.8373488e-05 9.4285714 - 57100 0.00074371147 0 2.8066609e-05 1.8321889e-05 3.9806125e-05 9.4285714 - 57200 0.00081400221 0 2.8670502e-05 2.8899856e-05 4.0663376e-05 9.4285714 - 57300 0.000917037 0 2.7824502e-05 3.9014624e-05 4.2174406e-05 9.4285714 - 57400 0.00094626663 0 2.5794485e-05 4.1535293e-05 4.2086614e-05 9.4285714 - 57500 0.00093346301 0 2.5487117e-05 4.0862488e-05 4.1990151e-05 9.4285714 - 57600 0.00093999622 0 2.6720752e-05 4.0748175e-05 4.3650361e-05 9.4285714 - 57700 0.00094337314 0 2.639701e-05 4.0729782e-05 4.5121665e-05 9.4285714 - 57800 0.00092645123 0 2.6909739e-05 4.0150191e-05 4.3822005e-05 9.4285714 - 57900 0.00091253668 0 2.5642193e-05 3.6671075e-05 4.4028328e-05 9.4285714 - 58000 0.0009262852 0 2.4409205e-05 3.4409346e-05 4.4000636e-05 9.4285714 - 58100 0.00093298888 0 2.3677747e-05 3.2551966e-05 4.3694114e-05 9.4285714 - 58200 0.00093354721 0 2.2375814e-05 3.2117822e-05 4.4639312e-05 9.4285714 - 58300 0.00093283167 0 2.2884257e-05 3.090895e-05 4.5086768e-05 9.4285714 - 58400 0.00093485322 0 2.3712272e-05 3.0236548e-05 4.5930955e-05 9.4285714 - 58500 0.00092566721 0 2.405659e-05 2.87637e-05 4.8903625e-05 9.4285714 - 58600 0.00093205032 0 2.3525309e-05 2.8285934e-05 5.2291285e-05 9.4285714 - 58700 0.00094034992 0 2.4008311e-05 2.5804337e-05 5.3505489e-05 9.4285714 - 58800 0.00096489026 0 2.4355825e-05 2.8532919e-05 5.3761099e-05 9.4285714 - 58900 0.00097781296 0 2.6084526e-05 3.1039765e-05 5.2910774e-05 9.4285714 - 59000 0.00095088201 0 2.7035865e-05 3.1452129e-05 5.3165727e-05 9.4285714 - 59100 0.00092096092 0 2.6786706e-05 3.382956e-05 5.0768712e-05 9.4285714 - 59200 0.0009112309 0 2.5867113e-05 3.4359567e-05 4.9291183e-05 9.4285714 - 59300 0.00090372653 0 2.5622941e-05 3.7144276e-05 4.7289805e-05 9.4285714 - 59400 0.00086115007 0 2.2280155e-05 3.5823023e-05 4.6830658e-05 9.4285714 - 59500 0.00078451189 0 2.2220981e-05 2.6156784e-05 4.6914457e-05 9.4285714 - 59600 0.00078587175 0 2.3370931e-05 2.5032607e-05 4.9704371e-05 9.4285714 - 59700 0.00080103949 0 2.387346e-05 2.8536648e-05 4.7938414e-05 9.4285714 - 59800 0.00078782591 0 2.319423e-05 2.8210585e-05 4.7677072e-05 9.4285714 - 59900 0.00077243837 0 2.3631843e-05 2.8691006e-05 4.7228518e-05 9.4285714 - 60000 0.00075159859 0 2.3775193e-05 2.9335754e-05 4.5277107e-05 9.4285714 - 60100 0.00072169229 0 2.1979779e-05 3.0104074e-05 4.5923405e-05 9.4285714 - 60200 0.00067937954 0 2.0306575e-05 2.8735522e-05 4.5275658e-05 9.4285714 - 60300 0.00067260226 0 2.0810173e-05 2.6609433e-05 4.3648953e-05 9.4285714 - 60400 0.00069286984 0 2.4253823e-05 2.5126495e-05 4.258699e-05 9.4285714 - 60500 0.00069736312 0 2.7101459e-05 2.4283276e-05 4.2346847e-05 9.4285714 - 60600 0.00069858614 0 2.5781332e-05 2.4087945e-05 4.2183121e-05 9.4285714 - 60700 0.00069821214 0 2.4965653e-05 2.080958e-05 4.1576529e-05 9.4285714 - 60800 0.0007035508 0 2.5136105e-05 1.82106e-05 4.2416771e-05 9.4285714 - 60900 0.00070770846 0 2.4339709e-05 1.7024772e-05 4.3565509e-05 9.4285714 - 61000 0.00070195965 0 2.4160978e-05 1.561415e-05 4.4516846e-05 9.4285714 - 61100 0.00067865064 0 2.4754436e-05 1.6095324e-05 4.5917833e-05 9.4285714 - 61200 0.00063690893 0 2.2652857e-05 1.7060397e-05 4.715524e-05 9.4285714 - 61300 0.00064194236 0 2.2650362e-05 1.4267909e-05 4.3531168e-05 9.4285714 - 61400 0.00063121847 0 2.1529461e-05 1.2841701e-05 4.0585367e-05 9.4285714 - 61500 0.00065356029 0 2.3536414e-05 1.3344947e-05 4.1167487e-05 9.4285714 - 61600 0.00066743886 0 2.4866121e-05 1.3946269e-05 4.176316e-05 9.4285714 - 61700 0.00064876312 0 2.3723161e-05 1.3749913e-05 4.2058416e-05 9.4285714 - 61800 0.00063251553 0 2.3037843e-05 1.2308212e-05 4.1311007e-05 9.4285714 - 61900 0.00065196202 0 2.371008e-05 1.2119818e-05 4.1136972e-05 9.4285714 - 62000 0.00066211487 0 2.4305587e-05 1.3415536e-05 4.1013521e-05 9.4285714 - 62100 0.00063838911 0 2.3294318e-05 1.377487e-05 4.0954053e-05 9.4285714 - 62200 0.00062154839 0 2.1558175e-05 1.3359191e-05 4.1245046e-05 9.4285714 - 62300 0.00063042258 0 2.1018073e-05 1.3643859e-05 4.2295629e-05 9.4285714 - 62400 0.00064307282 0 2.2417944e-05 1.3691778e-05 4.3440168e-05 9.4285714 - 62500 0.00062261967 0 2.2993973e-05 1.3754566e-05 4.4100385e-05 9.4285714 - 62600 0.00053916399 0 1.5362019e-05 1.2502815e-05 4.4138039e-05 9.4285714 - 62700 0.00057010612 0 1.5796506e-05 1.2697622e-05 4.4452456e-05 9.4285714 - 62800 0.00057237373 0 1.5874305e-05 1.325341e-05 4.3827972e-05 9.4285714 - 62900 0.00056115858 0 1.6555148e-05 1.3080646e-05 4.434918e-05 9.4285714 - 63000 0.0005691916 0 1.7337274e-05 1.3018716e-05 4.5966666e-05 9.4285714 - 63100 0.00056814223 0 1.8372705e-05 1.3213928e-05 4.5013147e-05 9.4285714 - 63200 0.00055359969 0 1.7755667e-05 1.226889e-05 4.4263871e-05 9.4285714 - 63300 0.00053663894 0 1.6493197e-05 1.0859989e-05 4.3835591e-05 9.4285714 - 63400 0.00055318219 0 1.7265416e-05 1.2265785e-05 4.2879248e-05 9.4285714 - 63500 0.0005601025 0 1.7295499e-05 1.4239119e-05 4.3011721e-05 9.4285714 - 63600 0.00054583913 0 1.6525634e-05 1.4678843e-05 4.2469934e-05 9.4285714 - 63700 0.00053483868 0 1.6625875e-05 1.5078172e-05 4.2493824e-05 9.4285714 - 63800 0.00055522493 0 1.7480604e-05 1.5374684e-05 4.272595e-05 9.4285714 - 63900 0.00056121598 0 1.7772973e-05 1.5172133e-05 4.2798662e-05 9.4285714 - 64000 0.00054407633 0 1.6885044e-05 1.413276e-05 4.2546454e-05 9.4285714 - 64100 0.00053661653 0 1.6234338e-05 1.403684e-05 4.2825695e-05 9.4285714 - 64200 0.00055006192 0 1.6649951e-05 1.4056747e-05 4.3482046e-05 9.4285714 - 64300 0.00055163304 0 1.6461598e-05 1.3167903e-05 4.3726787e-05 9.4285714 - 64400 0.00053078787 0 1.6251525e-05 1.19464e-05 4.3358318e-05 9.4285714 - 64500 0.00052058058 0 1.6643557e-05 1.2630836e-05 4.3429169e-05 9.4285714 - 64600 0.00052834957 0 1.7353655e-05 1.364227e-05 4.2400392e-05 9.4285714 - 64700 0.00051311026 0 1.758087e-05 1.4884436e-05 4.228116e-05 9.4285714 - 64800 0.00048606856 0 1.8167314e-05 1.5185881e-05 4.1313198e-05 9.4285714 - 64900 0.00047345864 0 1.8776746e-05 1.5164217e-05 3.998748e-05 9.4285714 - 65000 0.00048454696 0 1.8995386e-05 1.4818088e-05 3.9244802e-05 9.4285714 - 65100 0.00048928041 0 1.8341025e-05 1.3978549e-05 3.9434274e-05 9.4285714 - 65200 0.00047037779 0 1.7440302e-05 1.2970355e-05 3.8631037e-05 9.4285714 - 65300 0.000474477 0 1.7730462e-05 1.2778417e-05 3.8374171e-05 9.4285714 - 65400 0.00047558993 0 1.8645893e-05 1.303845e-05 3.9299974e-05 9.4285714 - 65500 0.00046258212 0 1.8683635e-05 1.2737042e-05 3.99647e-05 9.4285714 - 65600 0.00044433429 0 1.6571796e-05 1.2754279e-05 3.8518715e-05 9.4285714 - 65700 0.00045238336 0 1.5273478e-05 1.2923777e-05 3.6940008e-05 9.4285714 - 65800 0.00045926142 0 1.5338149e-05 1.2009407e-05 3.6438821e-05 9.4285714 - 65900 0.00045814994 0 1.5980648e-05 1.1749036e-05 3.6297575e-05 9.4285714 - 66000 0.00045395179 0 1.7924167e-05 1.2624087e-05 3.7065746e-05 9.4285714 - 66100 0.00044097892 0 1.9034226e-05 1.356976e-05 3.8933851e-05 9.4285714 - 66200 0.00041508101 0 1.8402026e-05 1.4705713e-05 3.8748663e-05 9.4285714 - 66300 0.00041227685 0 1.908236e-05 1.6649716e-05 3.7753553e-05 9.4285714 - 66400 0.00039539458 0 1.8057048e-05 1.6143874e-05 3.7074006e-05 9.4285714 - 66500 0.00038647539 0 1.698015e-05 1.3801339e-05 3.5358951e-05 9.4285714 - 66600 0.00037432719 0 1.7509843e-05 1.4033428e-05 3.5206119e-05 9.4285714 - 66700 0.00035679642 0 1.8373478e-05 1.412795e-05 3.2664378e-05 9.4285714 - 66800 0.00034618795 0 1.9514845e-05 1.4608894e-05 3.2352472e-05 9.4285714 - 66900 0.00032906055 0 1.8736605e-05 1.523461e-05 3.3161408e-05 9.4285714 - 67000 0.00031945785 0 1.6984612e-05 1.4969242e-05 3.3142807e-05 9.4285714 - 67100 0.00031672216 0 1.7483062e-05 1.5927363e-05 3.3297451e-05 9.4285714 - 67200 0.00030445379 0 1.7092794e-05 1.5979956e-05 3.3953736e-05 9.4285714 - 67300 0.00028386109 0 1.6371034e-05 1.4946504e-05 3.3294272e-05 9.4285714 - 67400 0.00028463754 0 1.6562782e-05 1.522773e-05 3.3193414e-05 9.4285714 - 67500 0.00028212316 0 1.7000058e-05 1.688192e-05 3.0305767e-05 9.4285714 - 67600 0.00027447589 0 1.7252228e-05 1.7793217e-05 2.7940287e-05 9.4285714 - 67700 0.00026388856 0 1.788708e-05 1.7737963e-05 2.7767523e-05 9.4285714 - 67800 0.00024769801 0 1.7986182e-05 1.6911674e-05 2.6242072e-05 9.4285714 - 67900 0.00024192231 0 1.8117237e-05 1.6810584e-05 2.5489128e-05 9.4285714 - 68000 0.00023732277 0 1.7792025e-05 1.6237435e-05 2.3955138e-05 9.4285714 - 68100 0.0002230537 0 1.8040504e-05 1.509807e-05 2.4258324e-05 9.4285714 - 68200 0.00020295655 0 1.7396258e-05 1.432954e-05 2.2297953e-05 9.4285714 - 68300 0.0002040692 0 1.4709241e-05 1.3357816e-05 1.9379008e-05 9.4285714 - 68400 0.0001928169 0 1.3319281e-05 1.3285272e-05 1.9247674e-05 9.4285714 - 68500 0.00019326451 0 1.3554406e-05 1.3433023e-05 2.0649044e-05 9.4285714 - 68600 0.00019061041 0 1.3385102e-05 1.3584385e-05 1.9332432e-05 9.4285714 - 68700 0.00017904605 0 1.3288304e-05 1.3807963e-05 1.7099578e-05 9.4285714 - 68800 0.00017200167 0 1.4014515e-05 1.3305447e-05 1.6005157e-05 9.4285714 - 68900 0.00016728354 0 1.4358398e-05 1.4318143e-05 1.7530654e-05 9.4285714 - 69000 0.00015703321 0 1.5503927e-05 1.5119926e-05 1.7369909e-05 9.4285714 - 69100 0.00014835113 0 1.6646462e-05 1.3971022e-05 1.6344915e-05 9.4285714 - 69200 0.00014631648 0 1.5954987e-05 1.2795675e-05 1.6309035e-05 9.4285714 - 69300 0.00014587978 0 1.5293418e-05 1.2677732e-05 1.7233536e-05 9.4285714 - 69400 0.0001418924 0 1.5258493e-05 1.3019793e-05 1.7515483e-05 9.4285714 - 69500 0.00013332024 0 1.4812384e-05 1.303409e-05 1.7383204e-05 9.4285714 - 69600 0.00013320187 0 1.4156146e-05 1.3180657e-05 1.7662244e-05 9.4285714 - 69700 0.00013039836 0 1.3247552e-05 1.2811783e-05 1.6799406e-05 9.4285714 - 69800 0.00012003394 0 1.2945301e-05 1.2559804e-05 1.5746066e-05 9.4285714 - 69900 0.00011651147 0 1.2355239e-05 1.2393181e-05 1.4350427e-05 9.4285714 - 70000 0.00012197106 0 1.1842768e-05 1.3044816e-05 1.4170863e-05 9.4285714 - 70100 0.00011813389 0 1.1625743e-05 1.3313213e-05 1.5063448e-05 9.4285714 - 70200 0.00011097253 0 1.1590401e-05 1.2554923e-05 1.4597134e-05 9.4285714 - 70300 0.00010887364 0 1.1158154e-05 1.1895927e-05 1.31874e-05 9.4285714 - 70400 0.00010916786 0 1.0956876e-05 1.180273e-05 1.2846539e-05 9.4285714 - 70500 0.00010031774 0 1.0360778e-05 1.1514343e-05 1.2521203e-05 9.4285714 - 70600 9.1002834e-05 0 1.0300514e-05 1.117085e-05 1.1527003e-05 9.4285714 - 70700 8.9186179e-05 0 1.0609829e-05 1.0737094e-05 1.0837865e-05 9.4285714 - 70800 9.1206485e-05 0 1.0401734e-05 9.9843249e-06 1.0249157e-05 9.4285714 - 70900 9.2333335e-05 0 1.0193791e-05 9.0808065e-06 9.8992907e-06 9.4285714 - 71000 9.1646266e-05 0 1.0160677e-05 8.7435373e-06 9.7169582e-06 9.4285714 - 71100 8.9976882e-05 0 1.0153135e-05 9.1409494e-06 9.5718498e-06 9.4285714 - 71200 8.7702811e-05 0 9.8902233e-06 9.1879521e-06 9.8218671e-06 9.4285714 - 71300 8.6905185e-05 0 9.5383545e-06 8.7211783e-06 1.0499374e-05 9.4285714 - 71400 8.5684023e-05 0 9.253314e-06 8.3885129e-06 1.0606272e-05 9.4285714 - 71500 8.303695e-05 0 8.8819413e-06 8.3461936e-06 1.0273368e-05 9.4285714 - 71600 8.0199459e-05 0 8.9747038e-06 8.2066881e-06 9.9704252e-06 9.4285714 - 71700 7.8917712e-05 0 9.0271304e-06 7.7429742e-06 9.9361512e-06 9.4285714 - 71800 8.006745e-05 0 8.8187404e-06 7.4107567e-06 9.9020703e-06 9.4285714 - 71900 7.8740588e-05 0 8.5325535e-06 7.4640436e-06 9.6978695e-06 9.4285714 - 72000 7.758597e-05 0 8.4232259e-06 7.4096936e-06 1.0295265e-05 9.4285714 - 72100 7.7221401e-05 0 8.2221646e-06 7.0735469e-06 1.0729758e-05 9.4285714 - 72200 7.6375029e-05 0 7.8256335e-06 6.6839282e-06 1.0036496e-05 9.4285714 - 72300 7.2834947e-05 0 7.3129398e-06 6.5549375e-06 9.3647818e-06 9.4285714 - 72400 7.2648265e-05 0 7.1756961e-06 6.6155121e-06 9.9549307e-06 9.4285714 - 72500 7.3708292e-05 0 7.2472933e-06 6.3958474e-06 1.0123332e-05 9.4285714 - 72600 7.1153221e-05 0 7.3278587e-06 6.1367701e-06 9.7342661e-06 9.4285714 - 72700 6.9093949e-05 0 7.4363962e-06 5.9533119e-06 9.7560578e-06 9.4285714 - 72800 7.0003138e-05 0 7.5425112e-06 5.8275253e-06 1.0368232e-05 9.4285714 - 72900 7.097186e-05 0 7.4852771e-06 5.9091762e-06 1.0469988e-05 9.4285714 - 73000 6.9754446e-05 0 7.1428704e-06 6.0128613e-06 9.845617e-06 9.4285714 - 73100 6.8919462e-05 0 6.8577848e-06 6.0078752e-06 9.5062768e-06 9.4285714 - 73200 7.0813485e-05 0 6.915193e-06 5.8464766e-06 9.5542243e-06 9.4285714 - 73300 7.2448906e-05 0 7.202029e-06 5.9255145e-06 9.366303e-06 9.4285714 - 73400 7.1636811e-05 0 7.3658376e-06 6.0353436e-06 9.0035204e-06 9.4285714 - 73500 7.0735739e-05 0 7.3378932e-06 5.9233113e-06 9.2103137e-06 9.4285714 - 73600 7.103569e-05 0 7.4016369e-06 5.7191072e-06 9.590302e-06 9.4285714 - 73700 7.1516165e-05 0 7.5406525e-06 5.5544712e-06 9.2023549e-06 9.4285714 - 73800 7.0454708e-05 0 7.349261e-06 5.3580841e-06 8.44158e-06 9.4285714 - 73900 7.0921505e-05 0 7.0116409e-06 5.019628e-06 8.392926e-06 9.4285714 - 74000 7.3462894e-05 0 6.8708293e-06 4.6604305e-06 8.6159539e-06 9.4285714 - 74100 7.3200399e-05 0 6.760504e-06 4.5172181e-06 8.6590907e-06 9.4285714 - 74200 7.1848724e-05 0 6.598806e-06 4.5142909e-06 8.9015449e-06 9.4285714 - 74300 7.2382347e-05 0 6.4910604e-06 4.55638e-06 9.5190459e-06 9.4285714 - 74400 7.3931763e-05 0 6.5463337e-06 4.557173e-06 9.9812236e-06 9.4285714 - 74500 7.4402751e-05 0 6.7422317e-06 4.5967137e-06 9.9997382e-06 9.4285714 - 74600 7.3859362e-05 0 6.7302615e-06 4.5719524e-06 9.8667104e-06 9.4285714 - 74700 7.5361374e-05 0 6.6009004e-06 4.5572386e-06 9.8530775e-06 9.4285714 - 74800 7.7630509e-05 0 6.5656345e-06 4.6832234e-06 9.892975e-06 9.4285714 - 74900 7.7455142e-05 0 6.6195469e-06 4.8215952e-06 9.8988386e-06 9.4285714 - 75000 7.6480769e-05 0 6.6957621e-06 4.8937859e-06 1.0118373e-05 9.4285714 - 75100 7.7275693e-05 0 6.8416988e-06 5.0008953e-06 1.0508524e-05 9.4285714 - 75200 7.8822667e-05 0 7.0137661e-06 5.114046e-06 1.0681512e-05 9.4285714 - 75300 7.923137e-05 0 7.0852228e-06 5.2313082e-06 1.088256e-05 9.4285714 - 75400 7.9015035e-05 0 7.0293657e-06 5.2742411e-06 1.1348177e-05 9.4285714 - 75500 8.0621162e-05 0 6.8467092e-06 5.2679705e-06 1.1831246e-05 9.4285714 - 75600 8.2299447e-05 0 6.6752346e-06 5.2465333e-06 1.1929829e-05 9.4285714 - 75700 8.1993378e-05 0 6.6903556e-06 5.2647445e-06 1.1895978e-05 9.4285714 - 75800 8.1758987e-05 0 6.8566142e-06 5.3086877e-06 1.1919614e-05 9.4285714 - 75900 8.3084215e-05 0 7.0165672e-06 5.385502e-06 1.2070322e-05 9.4285714 - 76000 8.197148e-05 0 7.2302761e-06 5.8394738e-06 1.2278973e-05 9.4285714 - 76100 7.3534139e-05 0 7.7489979e-06 6.0492251e-06 1.2550083e-05 9.4285714 - 76200 6.8283079e-05 0 7.2365372e-06 6.0007678e-06 1.2602817e-05 9.4285714 - 76300 7.8227289e-05 0 6.526694e-06 6.0271465e-06 1.2329383e-05 9.4285714 - 76400 8.2994806e-05 0 6.1815571e-06 5.9430881e-06 1.1701935e-05 9.4285714 - 76500 8.3014892e-05 0 6.1364257e-06 5.9854633e-06 1.1722691e-05 9.4285714 - 76600 8.4226362e-05 0 6.1828506e-06 6.107284e-06 1.1920214e-05 9.4285714 - 76700 8.6131526e-05 0 6.3343928e-06 6.350283e-06 1.228658e-05 9.4285714 - 76800 8.5731394e-05 0 6.4776958e-06 6.4683255e-06 1.249724e-05 9.4285714 - 76900 8.5941781e-05 0 6.4853553e-06 6.4244197e-06 1.2593229e-05 9.4285714 - 77000 8.8001094e-05 0 6.5171523e-06 6.6329655e-06 1.2912514e-05 9.4285714 - 77100 8.7224729e-05 0 6.8494875e-06 7.3872568e-06 1.3297612e-05 9.4285714 - 77200 8.4102799e-05 0 7.0894804e-06 7.3299263e-06 1.367949e-05 9.4285714 - 77300 8.0313409e-05 0 7.4098021e-06 7.2858555e-06 1.3836101e-05 9.4285714 - 77400 7.9230413e-05 0 8.2603924e-06 7.7732932e-06 1.3810185e-05 9.4285714 - 77500 7.811033e-05 0 8.7674355e-06 7.5406409e-06 1.4227076e-05 9.4285714 - 77600 7.7683573e-05 0 9.0788292e-06 7.8133163e-06 1.471022e-05 9.4285714 - 77700 7.5680467e-05 0 8.9108768e-06 8.317342e-06 1.4999553e-05 9.4285714 - 77800 7.3449559e-05 0 8.9694781e-06 8.6900526e-06 1.5086204e-05 9.4285714 - 77900 7.3292429e-05 0 9.139058e-06 8.6084679e-06 1.492615e-05 9.4285714 - 78000 7.2392133e-05 0 9.6080208e-06 8.4852396e-06 1.4857893e-05 9.4285714 - 78100 7.0315679e-05 0 9.945291e-06 8.3218765e-06 1.4719636e-05 9.4285714 - 78200 7.1047062e-05 0 9.8105393e-06 8.1347429e-06 1.4828339e-05 9.4285714 - 78300 6.8370248e-05 0 9.9255038e-06 7.8989844e-06 1.558545e-05 9.4285714 - 78400 6.5550877e-05 0 1.0372272e-05 7.8133098e-06 1.6112e-05 9.4285714 - 78500 6.1683926e-05 0 1.0744202e-05 7.939033e-06 1.6539381e-05 9.4285714 - 78600 6.024047e-05 0 1.0791202e-05 7.9498532e-06 1.6361859e-05 9.4285714 - 78700 5.8543178e-05 0 1.0974316e-05 7.8193457e-06 1.5667857e-05 9.4285714 - 78800 5.5383435e-05 0 1.0534755e-05 7.6453258e-06 1.4396004e-05 9.4285714 - 78900 5.6871546e-05 0 1.0546809e-05 7.6401983e-06 1.380849e-05 9.4285714 - 79000 5.7192958e-05 0 1.0550826e-05 8.0833789e-06 1.3441933e-05 9.4285714 - 79100 4.9998926e-05 0 1.0683768e-05 7.9938172e-06 1.3882479e-05 9.4285714 - 79200 4.9597887e-05 0 1.0901088e-05 7.7919421e-06 1.273575e-05 9.4285714 - 79300 4.8603326e-05 0 1.0971813e-05 8.0875397e-06 1.2027443e-05 9.4285714 - 79400 4.7839304e-05 0 1.0874179e-05 8.144737e-06 1.1956832e-05 9.4285714 - 79500 4.5739018e-05 0 1.076245e-05 8.3910868e-06 1.1534616e-05 9.4285714 - 79600 4.2632104e-05 0 1.0609664e-05 8.6397142e-06 1.1473552e-05 9.4285714 - 79700 4.2716432e-05 0 1.0262604e-05 8.711707e-06 1.0969998e-05 9.4285714 - 79800 4.3345358e-05 0 9.9282847e-06 8.9481901e-06 1.0983222e-05 9.4285714 - 79900 4.2476967e-05 0 9.7375039e-06 9.2548149e-06 1.1285625e-05 9.4285714 - 80000 4.0478442e-05 0 9.558123e-06 8.9295053e-06 1.0784448e-05 9.4285714 - 80100 3.7842198e-05 0 9.0334781e-06 8.2704782e-06 1.0278932e-05 9.4285714 - 80200 2.8735215e-05 0 7.9350731e-06 7.8543447e-06 1.0121553e-05 9.4285714 - 80300 2.5008575e-05 0 7.4613405e-06 7.3076318e-06 9.699202e-06 9.4285714 - 80400 2.7560228e-05 0 7.839602e-06 7.0844901e-06 9.4586824e-06 9.4285714 - 80500 3.0888649e-05 0 8.1838091e-06 6.9204111e-06 9.2656765e-06 9.4285714 - 80600 3.2512804e-05 0 8.4973372e-06 6.7089195e-06 9.1713286e-06 9.4285714 - 80700 3.0635649e-05 0 8.6601613e-06 6.5637472e-06 8.8278453e-06 9.4285714 - 80800 2.7803874e-05 0 8.6135955e-06 6.4140616e-06 8.6556889e-06 9.4285714 - 80900 2.7488104e-05 0 8.7028796e-06 6.3379797e-06 8.3509842e-06 9.4285714 - 81000 2.5760367e-05 0 9.2034736e-06 6.7611736e-06 8.6536526e-06 9.4285714 - 81100 2.0516969e-05 0 9.0513498e-06 6.8144281e-06 9.1119465e-06 9.4285714 - 81200 1.7005384e-05 0 8.916831e-06 6.7768397e-06 9.5240286e-06 9.4285714 - 81300 1.8000969e-05 0 8.7376342e-06 6.8615088e-06 9.6206194e-06 9.4285714 - 81400 1.8404948e-05 0 8.2208204e-06 6.7371396e-06 9.0504462e-06 9.4285714 - 81500 1.7001638e-05 0 8.0003097e-06 6.7725682e-06 8.8647013e-06 9.4285714 - 81600 1.718853e-05 0 7.6914646e-06 6.9104324e-06 8.8869789e-06 9.4285714 - 81700 1.7653551e-05 0 7.3471225e-06 6.8867378e-06 8.8253446e-06 9.4285714 - 81800 1.60697e-05 0 7.0404737e-06 6.8479859e-06 8.5427076e-06 9.4285714 - 81900 1.5286837e-05 0 7.0172686e-06 6.9297068e-06 8.2722832e-06 9.4285714 - 82000 1.6023107e-05 0 7.0983015e-06 6.9736613e-06 8.1332821e-06 9.4285714 - 82100 1.5242285e-05 0 7.0688546e-06 6.8167975e-06 7.6908928e-06 9.4285714 - 82200 1.3697011e-05 0 7.0223727e-06 6.4952373e-06 7.3342404e-06 9.4285714 - 82300 1.3126258e-05 0 7.1571217e-06 6.3810604e-06 7.2195212e-06 9.4285714 - 82400 1.3101796e-05 0 7.2890863e-06 6.3506356e-06 6.9818415e-06 9.4285714 - 82500 1.2930812e-05 0 7.151416e-06 6.216239e-06 6.5772477e-06 9.4285714 - 82600 1.2105591e-05 0 6.7542664e-06 6.1120283e-06 6.3663068e-06 9.4285714 - 82700 1.1430058e-05 0 6.5788951e-06 6.0514089e-06 6.4433754e-06 9.4285714 - 82800 1.1220674e-05 0 6.5791612e-06 6.0531604e-06 6.6770698e-06 9.4285714 - 82900 1.0833337e-05 0 6.47818e-06 6.0122996e-06 6.8321143e-06 9.4285714 - 83000 9.6966107e-06 0 6.2531746e-06 5.9309876e-06 6.8402408e-06 9.4285714 - 83100 9.7912048e-06 0 6.1233799e-06 5.8467558e-06 6.8017122e-06 9.4285714 - 83200 1.0342776e-05 0 6.1812546e-06 5.7996644e-06 6.7456475e-06 9.4285714 - 83300 9.1053605e-06 0 6.2862234e-06 5.7715058e-06 6.6864541e-06 9.4285714 - 83400 8.1376574e-06 0 6.3534217e-06 5.8081229e-06 6.6544011e-06 9.4285714 - 83500 8.3013823e-06 0 6.4049353e-06 5.8627471e-06 6.6442675e-06 9.4285714 - 83600 7.5747246e-06 0 6.3101238e-06 5.9294619e-06 6.6505997e-06 9.4285714 - 83700 6.7051973e-06 0 6.1464953e-06 5.8827036e-06 6.6813364e-06 9.4285714 - 83800 6.7732855e-06 0 6.1039107e-06 5.7663207e-06 6.7463747e-06 9.4285714 - 83900 6.455146e-06 0 6.191176e-06 5.719103e-06 6.7193618e-06 9.4285714 - 84000 6.033363e-06 0 6.1987406e-06 5.6639744e-06 6.7404074e-06 9.4285714 - 84100 6.1544361e-06 0 6.1093662e-06 5.4981158e-06 6.9178146e-06 9.4285714 - 84200 5.8120515e-06 0 5.8682237e-06 5.4078594e-06 7.1748608e-06 9.4285714 - 84300 5.5925414e-06 0 5.8299675e-06 5.4425557e-06 7.3447739e-06 9.4285714 - 84400 5.9495987e-06 0 5.8440449e-06 5.5318695e-06 7.3677152e-06 9.4285714 - 84500 5.7713446e-06 0 5.8137185e-06 5.672038e-06 7.2420253e-06 9.4285714 - 84600 5.2346414e-06 0 5.7724697e-06 5.8135669e-06 7.089944e-06 9.4285714 - 84700 5.3677312e-06 0 5.7932199e-06 5.8900538e-06 6.986661e-06 9.4285714 - 84800 5.5545452e-06 0 5.8402198e-06 5.8520541e-06 6.892677e-06 9.4285714 - 84900 5.35857e-06 0 5.8265347e-06 5.8000233e-06 6.8516545e-06 9.4285714 - 85000 5.4081539e-06 0 5.783936e-06 5.7703706e-06 6.8630043e-06 9.4285714 - 85100 5.6686315e-06 0 5.7695537e-06 5.7106213e-06 6.8449127e-06 9.4285714 - 85200 5.6470622e-06 0 5.8250423e-06 5.6629171e-06 6.774264e-06 9.4285714 - 85300 5.4542991e-06 0 5.9016498e-06 5.6655349e-06 6.7281738e-06 9.4285714 - 85400 5.5974388e-06 0 5.9646597e-06 5.6947162e-06 6.6806947e-06 9.4285714 - 85500 5.9109345e-06 0 5.967179e-06 5.6810561e-06 6.6036521e-06 9.4285714 - 85600 5.8895141e-06 0 5.9638498e-06 5.6150965e-06 6.5709969e-06 9.4285714 - 85700 5.8470051e-06 0 6.0226793e-06 5.5476887e-06 6.650327e-06 9.4285714 - 85800 6.060997e-06 0 6.0805171e-06 5.5114717e-06 6.7408394e-06 9.4285714 - 85900 6.1217894e-06 0 6.1343577e-06 5.5394005e-06 6.8609753e-06 9.4285714 - 86000 5.7550467e-06 0 6.1710899e-06 5.6424943e-06 6.9634617e-06 9.4285714 - 86100 5.6513685e-06 0 6.1564873e-06 5.8517272e-06 6.9818339e-06 9.4285714 - 86200 5.7555479e-06 0 6.1071953e-06 5.9846538e-06 6.9607131e-06 9.4285714 - 86300 5.7587322e-06 0 6.1027542e-06 6.0234009e-06 6.969152e-06 9.4285714 - 86400 5.8389333e-06 0 6.1697397e-06 6.0477528e-06 7.0119472e-06 9.4285714 - 86500 5.9431034e-06 0 6.2597537e-06 6.0475988e-06 7.0667343e-06 9.4285714 - 86600 5.9655129e-06 0 6.2896528e-06 6.0010507e-06 7.0437962e-06 9.4285714 - 86700 6.042955e-06 0 6.2709737e-06 5.8440573e-06 6.9441762e-06 9.4285714 - 86800 6.2666413e-06 0 6.1964071e-06 5.6894309e-06 6.8811779e-06 9.4285714 - 86900 6.5118003e-06 0 6.1051139e-06 5.6557711e-06 6.8722493e-06 9.4285714 - 87000 6.7509257e-06 0 6.0291493e-06 5.6830661e-06 6.916898e-06 9.4285714 - 87100 6.9118143e-06 0 6.0183397e-06 5.6796551e-06 7.0011007e-06 9.4285714 - 87200 6.9983412e-06 0 6.040127e-06 5.6529434e-06 7.127229e-06 9.4285714 - 87300 7.2267392e-06 0 6.0286797e-06 5.6230076e-06 7.2573882e-06 9.4285714 - 87400 7.3928522e-06 0 6.0129878e-06 5.5947139e-06 7.4524445e-06 9.4285714 - 87500 7.1675783e-06 0 6.0469379e-06 5.7445703e-06 7.5694621e-06 9.4285714 - 87600 6.9310557e-06 0 6.1331355e-06 5.8982521e-06 7.5787155e-06 9.4285714 - 87700 6.8020949e-06 0 6.312632e-06 5.9646e-06 7.5159198e-06 9.4285714 - 87800 6.7871509e-06 0 6.4438446e-06 5.8625717e-06 7.4014079e-06 9.4285714 - 87900 7.1459737e-06 0 6.5483239e-06 5.7458287e-06 7.3742373e-06 9.4285714 - 88000 7.4791665e-06 0 6.6494489e-06 5.7733829e-06 7.5763999e-06 9.4285714 - 88100 7.4418527e-06 0 6.7353307e-06 5.903551e-06 7.7655167e-06 9.4285714 - 88200 6.8171325e-06 0 6.9359356e-06 6.0764899e-06 8.0003945e-06 9.4285714 - 88300 5.9535317e-06 0 7.0673476e-06 6.2127209e-06 8.2558166e-06 9.4285714 - 88400 5.8054385e-06 0 7.0393025e-06 6.295728e-06 8.3249618e-06 9.4285714 - 88500 5.7381974e-06 0 6.986322e-06 6.3150237e-06 8.3161166e-06 9.4285714 - 88600 5.8193958e-06 0 6.9610838e-06 6.2643723e-06 8.3456298e-06 9.4285714 - 88700 5.7843884e-06 0 7.025256e-06 6.1780449e-06 8.4360622e-06 9.4285714 - 88800 5.36122e-06 0 7.1886768e-06 6.1335975e-06 8.6566218e-06 9.4285714 - 88900 4.9662584e-06 0 7.2896286e-06 6.1156834e-06 8.7588271e-06 9.4285714 - 89000 5.0244565e-06 0 7.2730496e-06 6.083749e-06 8.7659659e-06 9.4285714 - 89100 5.2140172e-06 0 7.1617638e-06 6.0498839e-06 8.7631514e-06 9.4285714 - 89200 5.4241028e-06 0 7.0779466e-06 6.0064798e-06 8.7654482e-06 9.4285714 - 89300 5.354843e-06 0 7.0385405e-06 5.9746409e-06 8.8526601e-06 9.4285714 - 89400 4.9583346e-06 0 6.9725874e-06 5.9883731e-06 8.8784101e-06 9.4285714 - 89500 4.7804845e-06 0 6.8896169e-06 6.0555358e-06 8.7411283e-06 9.4285714 - 89600 4.5353969e-06 0 6.8441433e-06 6.1441445e-06 8.5998496e-06 9.4285714 - 89700 4.3528727e-06 0 6.9096594e-06 6.2696259e-06 8.4806368e-06 9.4285714 - 89800 4.0677397e-06 0 7.0681849e-06 6.3600745e-06 8.3821485e-06 9.4285714 - 89900 3.4743886e-06 0 7.208934e-06 6.2417154e-06 8.2590362e-06 9.4285714 - 90000 2.9448035e-06 0 7.2648444e-06 6.1025056e-06 8.1567217e-06 9.4285714 - 90100 2.8584378e-06 0 7.2361844e-06 6.0292519e-06 8.1323675e-06 9.4285714 - 90200 3.0154097e-06 0 7.1912833e-06 5.9880227e-06 8.1509776e-06 9.4285714 - 90300 3.0998012e-06 0 7.1621354e-06 5.9387681e-06 8.1447795e-06 9.4285714 - 90400 3.0622205e-06 0 7.1346468e-06 5.8551087e-06 8.0849875e-06 9.4285714 - 90500 2.8987354e-06 0 7.0808755e-06 5.7480505e-06 8.0655448e-06 9.4285714 - 90600 2.6710434e-06 0 7.0205199e-06 5.7165534e-06 8.0846444e-06 9.4285714 - 90700 2.4095074e-06 0 6.9439805e-06 5.7493599e-06 8.0259105e-06 9.4285714 - 90800 2.202904e-06 0 6.9317463e-06 5.8100449e-06 7.9027214e-06 9.4285714 - 90900 2.3181295e-06 0 7.0034101e-06 5.8778489e-06 7.7654197e-06 9.4285714 - 91000 2.3141951e-06 0 7.0766754e-06 5.9435646e-06 7.6679494e-06 9.4285714 - 91100 2.0683071e-06 0 7.0355929e-06 5.9830977e-06 7.5547272e-06 9.4285714 - 91200 1.8857219e-06 0 6.886975e-06 5.9803391e-06 7.3843659e-06 9.4285714 - 91300 1.8327584e-06 0 6.7232199e-06 5.8972482e-06 7.172749e-06 9.4285714 - 91400 1.804747e-06 0 6.6658239e-06 5.7775933e-06 6.9879557e-06 9.4285714 - 91500 1.6349771e-06 0 6.6744755e-06 5.6582742e-06 6.8615206e-06 9.4285714 - 91600 1.5216476e-06 0 6.6865456e-06 5.5795361e-06 6.7883528e-06 9.4285714 - 91700 1.6141413e-06 0 6.68539e-06 5.5586295e-06 6.7422583e-06 9.4285714 - 91800 1.6435107e-06 0 6.6317895e-06 5.6102143e-06 6.7060043e-06 9.4285714 - 91900 1.5649292e-06 0 6.5474777e-06 5.6787362e-06 6.6783459e-06 9.4285714 - 92000 1.5598003e-06 0 6.4984086e-06 5.7448839e-06 6.6563568e-06 9.4285714 - 92100 1.5645521e-06 0 6.502615e-06 5.7854556e-06 6.6299693e-06 9.4285714 - 92200 1.5384794e-06 0 6.5324855e-06 5.791917e-06 6.5998087e-06 9.4285714 - 92300 1.5428705e-06 0 6.5828146e-06 5.7573607e-06 6.564701e-06 9.4285714 - 92400 1.5481835e-06 0 6.6310796e-06 5.6780865e-06 6.551415e-06 9.4285714 - 92500 1.5193765e-06 0 6.6560684e-06 5.5916813e-06 6.568409e-06 9.4285714 - 92600 1.4779648e-06 0 6.6374647e-06 5.5138194e-06 6.605645e-06 9.4285714 - 92700 1.4401385e-06 0 6.5783557e-06 5.466179e-06 6.6343577e-06 9.4285714 - 92800 1.4263884e-06 0 6.5032532e-06 5.4548714e-06 6.6667781e-06 9.4285714 - 92900 1.4318392e-06 0 6.4100939e-06 5.475169e-06 6.7074201e-06 9.4285714 - 93000 1.4336111e-06 0 6.3386325e-06 5.5075916e-06 6.7333938e-06 9.4285714 - 93100 1.4541758e-06 0 6.3430387e-06 5.5366002e-06 6.7522163e-06 9.4285714 - 93200 1.4657669e-06 0 6.4329416e-06 5.581062e-06 6.8176723e-06 9.4285714 - 93300 1.4040886e-06 0 6.5434258e-06 5.6428482e-06 6.9238384e-06 9.4285714 - 93400 1.2988064e-06 0 6.6210628e-06 5.7043118e-06 7.0589134e-06 9.4285714 - 93500 1.2005872e-06 0 6.6510605e-06 5.7583138e-06 7.1470838e-06 9.4285714 - 93600 1.1148329e-06 0 6.6739621e-06 5.8031724e-06 7.198744e-06 9.4285714 - 93700 1.0710007e-06 0 6.7180944e-06 5.8357751e-06 7.2627754e-06 9.4285714 - 93800 1.0923979e-06 0 6.7838026e-06 5.857069e-06 7.3553254e-06 9.4285714 - 93900 1.1070785e-06 0 6.8474162e-06 5.8724205e-06 7.4260353e-06 9.4285714 - 94000 1.0836182e-06 0 6.9184593e-06 5.9063218e-06 7.4593908e-06 9.4285714 - 94100 1.0712532e-06 0 6.9659007e-06 5.9417663e-06 7.4976223e-06 9.4285714 - 94200 1.1089242e-06 0 6.9714436e-06 5.970624e-06 7.55674e-06 9.4285714 - 94300 1.1709624e-06 0 6.9375714e-06 5.9802014e-06 7.6084264e-06 9.4285714 - 94400 1.1698851e-06 0 6.8899943e-06 5.96701e-06 7.6232022e-06 9.4285714 - 94500 1.1331311e-06 0 6.8607818e-06 5.9576831e-06 7.6330828e-06 9.4285714 - 94600 1.1611176e-06 0 6.8775071e-06 5.9659895e-06 7.6539239e-06 9.4285714 - 94700 1.2014763e-06 0 6.9225704e-06 5.978896e-06 7.6602657e-06 9.4285714 - 94800 1.1833928e-06 0 6.9903173e-06 5.9981741e-06 7.6474584e-06 9.4285714 - 94900 1.1648449e-06 0 7.0650539e-06 6.0150496e-06 7.633387e-06 9.4285714 - 95000 1.1252279e-06 0 7.1072978e-06 6.0184786e-06 7.6094493e-06 9.4285714 - 95100 1.0516851e-06 0 7.1142631e-06 6.0065025e-06 7.5761571e-06 9.4285714 - 95200 1.0245214e-06 0 7.1018948e-06 5.993948e-06 7.5486922e-06 9.4285714 - 95300 1.0235812e-06 0 7.0867307e-06 6.0211446e-06 7.52964e-06 9.4285714 - 95400 9.6956254e-07 0 7.0870353e-06 6.072303e-06 7.5090138e-06 9.4285714 - 95500 8.9262312e-07 0 7.0987772e-06 6.1168082e-06 7.5033557e-06 9.4285714 - 95600 8.6064987e-07 0 7.1067297e-06 6.1317068e-06 7.4962696e-06 9.4285714 - 95700 8.7096432e-07 0 7.0919507e-06 6.1268237e-06 7.4461295e-06 9.4285714 - 95800 8.5278957e-07 0 7.0664924e-06 6.1151121e-06 7.3946799e-06 9.4285714 - 95900 7.9717781e-07 0 7.0485109e-06 6.0993542e-06 7.3743405e-06 9.4285714 - 96000 7.7875968e-07 0 7.0534076e-06 6.0721804e-06 7.38935e-06 9.4285714 - 96100 7.8525813e-07 0 7.0843748e-06 6.0420863e-06 7.4393684e-06 9.4285714 - 96200 7.7518366e-07 0 7.1238098e-06 6.028226e-06 7.5045929e-06 9.4285714 - 96300 7.6015915e-07 0 7.1481733e-06 6.0364027e-06 7.5368435e-06 9.4285714 - 96400 7.4067407e-07 0 7.1459565e-06 6.041338e-06 7.4989132e-06 9.4285714 - 96500 7.0061605e-07 0 7.1268071e-06 6.029068e-06 7.4151813e-06 9.4285714 - 96600 6.6164038e-07 0 7.098925e-06 6.0009667e-06 7.3139003e-06 9.4285714 - 96700 6.5255615e-07 0 7.0627067e-06 5.9576708e-06 7.2100844e-06 9.4285714 - 96800 6.5992528e-07 0 7.023092e-06 5.8964071e-06 7.1287006e-06 9.4285714 - 96900 6.618124e-07 0 6.9850613e-06 5.8360203e-06 7.0798167e-06 9.4285714 - 97000 6.7139818e-07 0 6.9588277e-06 5.8062928e-06 7.0552706e-06 9.4285714 - 97100 6.8703272e-07 0 6.9537175e-06 5.8222057e-06 7.0414456e-06 9.4285714 - 97200 6.9368757e-07 0 6.9628009e-06 5.8702813e-06 7.0384753e-06 9.4285714 - 97300 6.9652913e-07 0 6.9734824e-06 5.9290926e-06 7.0544858e-06 9.4285714 - 97400 6.9671901e-07 0 6.9846061e-06 6.0012529e-06 7.083092e-06 9.4285714 - 97500 6.891306e-07 0 6.9869142e-06 6.0395379e-06 7.0939696e-06 9.4285714 - 97600 6.76426e-07 0 6.9788679e-06 6.0215323e-06 7.0606545e-06 9.4285714 - 97700 6.5763751e-07 0 6.9653816e-06 5.9723094e-06 7.0096441e-06 9.4285714 - 97800 6.4854556e-07 0 6.9554426e-06 5.9303617e-06 6.9747745e-06 9.4285714 - 97900 6.5336861e-07 0 6.9405484e-06 5.9124736e-06 6.9578336e-06 9.4285714 - 98000 6.6394525e-07 0 6.9149722e-06 5.9089903e-06 6.9531064e-06 9.4285714 - 98100 6.8885885e-07 0 6.8891311e-06 5.9064849e-06 6.9546779e-06 9.4285714 - 98200 7.2201864e-07 0 6.8704207e-06 5.8899045e-06 6.9512899e-06 9.4285714 - 98300 7.3816538e-07 0 6.8523223e-06 5.8601846e-06 6.9459414e-06 9.4285714 - 98400 7.3631403e-07 0 6.8416192e-06 5.8365194e-06 6.9566027e-06 9.4285714 - 98500 7.2568853e-07 0 6.8359315e-06 5.8202579e-06 6.9826678e-06 9.4285714 - 98600 7.0490905e-07 0 6.8305302e-06 5.8023655e-06 7.0037387e-06 9.4285714 - 98700 6.8484202e-07 0 6.8328514e-06 5.7856688e-06 7.0152903e-06 9.4285714 - 98800 6.6994522e-07 0 6.8665586e-06 5.776709e-06 7.0248186e-06 9.4285714 - 98900 6.2867752e-07 0 6.922678e-06 5.7832988e-06 7.0496494e-06 9.4285714 - 99000 5.6999626e-07 0 6.9604759e-06 5.803298e-06 7.0910089e-06 9.4285714 - 99100 5.2675078e-07 0 6.9689516e-06 5.8313501e-06 7.1326482e-06 9.4285714 - 99200 4.9993032e-07 0 6.9639452e-06 5.8639097e-06 7.1679106e-06 9.4285714 - 99300 4.8034362e-07 0 6.9673566e-06 5.8886473e-06 7.2061899e-06 9.4285714 - 99400 4.633455e-07 0 6.9801545e-06 5.9075721e-06 7.2565116e-06 9.4285714 - 99500 4.423417e-07 0 6.9834282e-06 5.9253367e-06 7.3084834e-06 9.4285714 - 99600 4.2336865e-07 0 6.967599e-06 5.9390331e-06 7.3503483e-06 9.4285714 - 99700 4.0950396e-07 0 6.9366188e-06 5.9452518e-06 7.3763135e-06 9.4285714 - 99800 3.8946719e-07 0 6.9087461e-06 5.9409744e-06 7.3965059e-06 9.4285714 - 99900 3.5789226e-07 0 6.9005219e-06 5.9283255e-06 7.4220159e-06 9.4285714 - 100000 3.23165e-07 0 6.8942094e-06 5.9113196e-06 7.4570026e-06 9.4285714 -Loop time of 178.804 on 4 procs for 100000 steps with 2520 atoms - -Performance: 2416052.451 tau/day, 559.271 timesteps/s -99.5% 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.068905 | 1.0142 | 3.632 | 150.2 | 0.57 -Bond | 2.4179 | 45.255 | 152.45 | 922.4 | 25.31 -Neigh | 2.7318 | 2.7504 | 2.7587 | 0.7 | 1.54 -Comm | 2.2428 | 62.076 | 153.59 | 708.9 | 34.72 -Output | 0.14703 | 1.3253 | 2.7063 | 102.7 | 0.74 -Modify | 0.66661 | 4.887 | 15.428 | 276.1 | 2.73 -Other | | 61.5 | | | 34.39 - -Nlocal: 630 ave 2513 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Nghost: 39.25 ave 150 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Neighs: 2458 ave 9821 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 9832 -Ave neighs/atom = 3.9015873 -Ave special neighs/atom = 36.31746 -Neighbor list builds = 5178 -Dangerous builds = 314 -Total wall time: 0:02:58 diff --git a/examples/bpm/pour/log.4May2022.pour.g++.4 b/examples/bpm/pour/log.4May2022.pour.g++.4 new file mode 100644 index 0000000000..5fc31df976 --- /dev/null +++ b/examples/bpm/pour/log.4May2022.pour.g++.4 @@ -0,0 +1,1096 @@ +LAMMPS (4 May 2022) +units lj +dimension 3 +boundary m m m +atom_style bpm/sphere +special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 +newton on off +comm_modify vel yes cutoff 3.3 +region box block -15 15 -15 15 0 60.0 +create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 +Created orthogonal box = (-15 -15 0) to (15 15 60) + 1 by 1 by 4 MPI processor grid + +molecule my_mol "rect.mol" +Read molecule template my_mol: + 1 molecules + 0 fragments + 63 atoms with max type 1 + 297 bonds with max type 1 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in +region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in + +pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 +bond_style bpm/rotational +pair_coeff 1 1 +bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 + +compute nbond all nbond/atom +compute tbond all reduce sum c_nbond +compute bond_ids all property/local batom1 batom2 +compute bond_properties all bond/local dist b1 + +compute_modify thermo_temp dynamic/dof yes + +fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL +fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl +fix 3 all gravity 1e-4 vector 0 0 -1 +fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 +fix 5 all nve/bpm/sphere + +timestep 0.05 +thermo_style custom step ke pe pxx pyy pzz c_tbond +thermo 100 +#dump 1 all custom 500 atomDump id radius x y z c_nbond mol +#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] +#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" + +run 100000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 3.3 + binsize = 0.65, bins = 47 47 93 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair gran/hertz/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes + Step KinEng PotEng Pxx Pyy Pzz c_tbond + 0 -0 0 0 0 0 0 + 100 0.0018331948 0 1.2795343e-05 1.3162764e-05 6.0889226e-06 9.4285714 + 200 0.0025933558 0 -9.7246963e-07 4.2628093e-07 2.254606e-06 9.4285714 + 300 0.0036964813 0 -5.214277e-06 9.6942542e-06 8.1928448e-07 9.4285714 + 400 0.0060104433 0 2.3353405e-05 1.8273171e-05 1.2647691e-05 9.4285714 + 500 0.0074435972 0 -1.7839575e-05 3.8686256e-06 -5.120219e-06 9.4285714 + 600 0.0077862298 0 3.8676586e-06 1.3499487e-05 4.1914953e-06 9.4285714 + 700 0.0075577591 0 2.995232e-06 1.2051677e-05 4.8789862e-06 9.4285714 + 800 0.0073958844 0 -1.4258432e-05 1.2272397e-05 -6.8630878e-06 9.4285714 + 900 0.007553697 0 9.9219152e-06 1.2918228e-05 8.8713909e-06 9.4285714 + 1000 0.0075815901 0 -6.1095276e-06 1.2607282e-05 -2.1917025e-06 9.4285714 + 1100 0.0075277384 0 -5.4044191e-06 1.0815313e-05 -3.3464998e-06 9.4285714 + 1200 0.0075026507 0 6.9770766e-06 1.3988236e-05 8.5114688e-06 9.4285714 + 1300 0.0075665473 0 -4.6433628e-06 8.6190703e-06 -3.8381153e-06 9.4285714 + 1400 0.0076224701 0 1.1589382e-06 7.9617716e-06 1.1941326e-06 9.4285714 + 1500 0.007603467 0 3.5774148e-06 1.3039063e-05 5.2641947e-06 9.4285714 + 1600 0.0059810407 0 4.8299936e-06 1.5343107e-05 4.8809408e-06 9.4285714 + 1700 0.0080230318 0 7.7953676e-06 2.5215962e-05 1.2492975e-05 9.4285714 + 1800 0.0087482398 0 4.7318071e-06 1.9559769e-05 4.2711986e-07 9.4285714 + 1900 0.0086877574 0 4.8038566e-06 1.8020212e-05 2.1297032e-06 9.4285714 + 2000 0.0086771118 0 6.1316671e-06 2.6348435e-05 8.9167408e-06 9.4285714 + 2100 0.0084670091 0 5.0586292e-06 1.9876458e-05 4.6539619e-06 9.4285714 + 2200 0.0083650907 0 9.4046949e-06 1.9264472e-05 1.0344742e-05 9.4285714 + 2300 0.0083549595 0 6.3002517e-06 2.0954839e-05 3.9631836e-06 9.4285714 + 2400 0.0083151535 0 4.9801292e-06 1.2138211e-05 6.2493867e-06 9.4285714 + 2500 0.0083898757 0 6.8667997e-06 1.9182698e-05 9.8363046e-06 9.4285714 + 2600 0.0084145705 0 4.1851e-06 1.8890376e-05 5.497773e-06 9.4285714 + 2700 0.0082712696 0 4.9701934e-06 1.7886474e-05 8.3184582e-06 9.4285714 + 2800 0.0073688706 0 1.144302e-05 1.3902577e-05 9.8542094e-06 9.4285714 + 2900 0.0072732669 0 8.2228374e-06 1.2550063e-05 8.7486939e-06 9.4285714 + 3000 0.0072225948 0 1.1788696e-05 1.6856873e-05 1.0219519e-05 9.4285714 + 3100 0.0048244969 0 2.6913622e-05 2.6037751e-05 1.5435674e-05 9.4285714 + 3200 0.0045717035 0 2.3464139e-05 2.1215606e-05 1.7659066e-05 9.4285714 + 3300 0.0047679567 0 6.5564192e-06 1.2866169e-05 1.4234937e-05 9.4285714 + 3400 0.0048448212 0 2.6268527e-06 9.1565649e-06 1.2387928e-05 9.4285714 + 3500 0.0048364711 0 2.8817245e-06 1.0066061e-05 1.1158512e-05 9.4285714 + 3600 0.0047125947 0 4.936496e-06 1.4195118e-05 1.5418285e-05 9.4285714 + 3700 0.0045641049 0 5.9769788e-06 9.8945153e-06 2.0158644e-05 9.4285714 + 3800 0.0045540235 0 6.1868269e-06 9.9425305e-06 1.6312008e-05 9.4285714 + 3900 0.0047271202 0 4.6825739e-06 1.3424496e-05 1.3234307e-05 9.4285714 + 4000 0.0049115261 0 5.5722312e-06 9.2060522e-06 1.6284048e-05 9.4285714 + 4100 0.0046819157 0 7.2200038e-06 1.0870694e-05 1.0519325e-05 9.4285714 + 4200 0.0035133816 0 3.6321041e-05 4.1100939e-05 1.8321255e-05 9.4285714 + 4300 0.0031933917 0 2.4951011e-05 2.5521457e-05 2.588421e-05 9.4285714 + 4400 0.0033515272 0 -5.6220845e-06 -2.4430502e-06 1.0942893e-05 9.4285714 + 4500 0.0034928951 0 6.2053481e-06 4.7764245e-06 1.991749e-05 9.4285714 + 4600 0.0029992338 0 2.369557e-06 4.59349e-06 2.0911379e-05 9.4285714 + 4700 0.0030650658 0 -2.7066449e-06 1.83391e-06 6.7096837e-06 9.4285714 + 4800 0.0031180382 0 3.4620044e-06 3.3494935e-06 1.7175961e-05 9.4285714 + 4900 0.0030365003 0 3.6295178e-06 6.2514468e-06 1.3401316e-05 9.4285714 + 5000 0.0030259714 0 5.1566588e-06 1.3494605e-05 9.7456367e-06 9.4285714 + 5100 0.0030499975 0 6.7608769e-06 1.9415863e-05 1.2078691e-05 9.4285714 + 5200 0.003005436 0 6.7275739e-06 2.0656574e-05 5.906659e-06 9.4285714 + 5300 0.0030000941 0 6.9641454e-06 1.54531e-05 1.7021736e-05 9.4285714 + 5400 0.0031465827 0 6.540246e-06 1.0837198e-05 1.0192016e-05 9.4285714 + 5500 0.0031981585 0 4.9292412e-06 4.6915838e-06 3.029257e-06 9.4285714 + 5600 0.0031525115 0 4.3125052e-06 2.8841432e-06 1.9324111e-05 9.4285714 + 5700 0.0032128781 0 5.1973159e-06 4.7261232e-06 1.5155154e-05 9.4285714 + 5800 0.0030092855 0 5.1574375e-06 1.3330205e-06 1.6470501e-05 9.4285714 + 5900 0.0025015767 0 9.468608e-06 6.3045435e-06 3.0961055e-05 9.4285714 + 6000 0.0024438438 0 8.0212466e-06 1.0032087e-05 2.8378471e-05 9.4285714 + 6100 0.0023816456 0 3.7802286e-06 -3.8999559e-06 1.8398107e-05 9.4285714 + 6200 0.0024459343 0 5.9964052e-07 8.2000754e-07 1.6404949e-05 9.4285714 + 6300 0.0025205884 0 4.7129599e-06 8.6972388e-06 2.9892106e-05 9.4285714 + 6400 0.0033754198 0 6.5856871e-06 2.3744673e-05 2.4721217e-05 9.4285714 + 6500 0.0037812296 0 1.376462e-07 2.0230253e-05 1.9719688e-05 9.4285714 + 6600 0.0038043567 0 -2.2279638e-06 1.4780176e-05 2.3799652e-05 9.4285714 + 6700 0.0038213959 0 1.1073632e-05 2.2516034e-05 2.5410459e-05 9.4285714 + 6800 0.0036977776 0 -1.0765937e-05 1.3667142e-05 1.7835133e-05 9.4285714 + 6900 0.0034769765 0 6.7509492e-06 2.840882e-05 2.435267e-05 9.4285714 + 7000 0.0031526409 0 1.4168552e-05 4.4965769e-05 4.5646226e-05 9.4285714 + 7100 0.00317737 0 -5.4803238e-06 3.1967885e-05 2.9211214e-05 9.4285714 + 7200 0.0034448361 0 4.8507597e-06 2.1591795e-05 2.3816498e-05 9.4285714 + 7300 0.0036147362 0 -2.791278e-06 2.9367843e-05 2.072129e-05 9.4285714 + 7400 0.0035651675 0 -1.6177129e-06 7.9033092e-06 2.3377855e-05 9.4285714 + 7500 0.0036394064 0 5.7414518e-06 1.246586e-05 2.8461253e-05 9.4285714 + 7600 0.0033086177 0 -3.6547872e-06 1.9730955e-05 2.8892436e-05 9.4285714 + 7700 0.0033410425 0 6.9618203e-06 6.4576188e-06 3.1766455e-05 9.4285714 + 7800 0.0035764747 0 1.2110077e-05 6.3850506e-06 3.5436107e-05 9.4285714 + 7900 0.0039500913 0 1.1250888e-05 5.2728547e-06 3.4972007e-05 9.4285714 + 8000 0.0042963353 0 1.8776503e-05 4.2083124e-06 3.5010281e-05 9.4285714 + 8100 0.0048297614 0 2.5603506e-05 3.3748362e-06 4.0838382e-05 9.4285714 + 8200 0.0052301447 0 2.2727386e-05 4.8879987e-06 3.4821083e-05 9.4285714 + 8300 0.005169511 0 2.5022891e-05 1.0062389e-05 3.3976429e-05 9.4285714 + 8400 0.005224324 0 2.4238943e-05 7.0296204e-06 4.2543264e-05 9.4285714 + 8500 0.0053049309 0 2.6217015e-05 1.0282354e-06 2.6559275e-05 9.4285714 + 8600 0.0052459952 0 3.0123571e-05 -5.4843616e-07 3.3857424e-05 9.4285714 + 8700 0.0052955657 0 2.3843911e-05 -3.117634e-06 3.9683886e-05 9.4285714 + 8800 0.0053972257 0 2.6944951e-05 -1.9297854e-06 2.1931602e-05 9.4285714 + 8900 0.0053679679 0 3.1169997e-05 -9.4576351e-07 3.1987255e-05 9.4285714 + 9000 0.0053793586 0 2.6261243e-05 -3.1509839e-07 3.3111749e-05 9.4285714 + 9100 0.0048447626 0 2.5562708e-05 9.5708437e-07 3.1370618e-05 9.4285714 + 9200 0.0048688926 0 2.8696471e-05 1.7677464e-06 3.5234397e-05 9.4285714 + 9300 0.0048538957 0 2.9337564e-05 6.1059713e-06 2.8008268e-05 9.4285714 + 9400 0.0046986454 0 3.0831262e-05 4.6561014e-06 3.5247122e-05 9.4285714 + 9500 0.0046145139 0 2.6082124e-05 4.2214681e-06 3.2773769e-05 9.4285714 + 9600 0.0045277961 0 1.2434258e-05 8.6375534e-06 2.284049e-05 9.4285714 + 9700 0.0043935298 0 2.5929984e-05 1.409283e-05 4.9159861e-05 9.4285714 + 9800 0.0045363488 0 1.9700734e-05 7.7797381e-06 4.4404362e-05 9.4285714 + 9900 0.0046509978 0 4.052959e-07 1.0265502e-06 3.1360974e-05 9.4285714 + 10000 0.0046493894 0 1.6553229e-05 1.0076346e-05 5.1789914e-05 9.4285714 + 10100 0.0046514856 0 1.8327939e-05 9.8302174e-06 3.7624599e-05 9.4285714 + 10200 0.0046209533 0 2.4256813e-05 1.3730576e-05 3.1575089e-05 9.4285714 + 10300 0.0044651031 0 3.3601226e-05 2.3983568e-05 5.6565625e-05 9.4285714 + 10400 0.0041834162 0 4.805126e-05 7.6642091e-06 4.2641571e-05 9.4285714 + 10500 0.0043218845 0 4.6826294e-05 1.9078519e-05 3.6250139e-05 9.4285714 + 10600 0.0045795722 0 8.2629139e-06 1.6451196e-05 5.4195508e-05 9.4285714 + 10700 0.0053833569 0 5.3717062e-06 6.8337125e-06 4.9804395e-05 9.4285714 + 10800 0.0056805981 0 1.0439371e-05 6.3964706e-05 5.0857116e-05 9.4285714 + 10900 0.0057157307 0 8.6953546e-06 6.7276441e-05 3.9725389e-05 9.4285714 + 11000 0.005696424 0 8.1149094e-06 2.2104406e-05 5.1852506e-05 9.4285714 + 11100 0.0052078884 0 1.5579258e-05 5.0215785e-05 9.2364613e-05 9.4285714 + 11200 0.0052849159 0 2.443959e-05 6.5869489e-05 5.1237777e-05 9.4285714 + 11300 0.0054074494 0 -2.0510258e-05 2.0196205e-05 2.5051885e-05 9.4285714 + 11400 0.0055432168 0 1.5343164e-05 2.5482368e-05 5.4336948e-05 9.4285714 + 11500 0.0054679467 0 -8.3474301e-06 3.553783e-05 5.2027159e-05 9.4285714 + 11600 0.0052706441 0 -1.5151807e-05 3.9562266e-05 5.7900102e-05 9.4285714 + 11700 0.0053724243 0 2.9852987e-05 4.4807737e-05 5.5405662e-05 9.4285714 + 11800 0.0054759961 0 -2.4309686e-05 3.0092677e-06 5.4742672e-05 9.4285714 + 11900 0.0051146604 0 5.1194747e-06 2.8620342e-05 6.4679345e-05 9.4285714 + 12000 0.0049723565 0 2.675912e-05 4.6202817e-05 4.7309269e-05 9.4285714 + 12100 0.0046920113 0 8.7155181e-06 1.0297631e-05 5.3185103e-05 9.4285714 + 12200 0.0049570244 0 1.6383054e-05 2.2699433e-05 6.347138e-05 9.4285714 + 12300 0.0049181458 0 -2.6116723e-05 3.300058e-05 5.177444e-05 9.4285714 + 12400 0.0049245342 0 1.7614092e-05 2.1986541e-05 6.3820521e-05 9.4285714 + 12500 0.0049753042 0 1.7024231e-05 2.7328487e-05 4.8334342e-05 9.4285714 + 12600 0.0048148791 0 -1.7042812e-05 3.3512772e-05 5.9422643e-05 9.4285714 + 12700 0.0043852178 0 1.1418683e-05 6.3690455e-05 7.8362127e-05 9.4285714 + 12800 0.0041967317 0 6.1295424e-06 2.691552e-05 5.3900077e-05 9.4285714 + 12900 0.0041911278 0 1.1373508e-05 -9.9114041e-06 5.6629663e-05 9.4285714 + 13000 0.0043107924 0 8.5398832e-06 1.2632925e-05 5.6578871e-05 9.4285714 + 13100 0.0043976521 0 -1.9373679e-05 2.745136e-05 5.4632008e-05 9.4285714 + 13200 0.0043474635 0 2.0343582e-05 1.7768236e-05 1.1895158e-05 9.4285714 + 13300 0.0044593969 0 1.0895451e-05 2.1880107e-05 3.4032783e-05 9.4285714 + 13400 0.0044814342 0 -1.3547218e-05 1.9974451e-05 4.4513918e-05 9.4285714 + 13500 0.0043982498 0 1.0722877e-05 2.3728571e-05 2.7665112e-05 9.4285714 + 13600 0.0039378503 0 1.2229889e-05 3.0770266e-05 5.2614428e-05 9.4285714 + 13700 0.0036474735 0 9.5048999e-06 1.6734153e-05 7.4271827e-05 9.4285714 + 13800 0.0038236277 0 1.6680429e-05 4.7691782e-05 9.2160112e-05 9.4285714 + 13900 0.0040574402 0 6.7570974e-06 3.6492091e-05 5.2053836e-05 9.4285714 + 14000 0.0046440817 0 2.7735053e-05 6.6227204e-06 3.9436561e-05 9.4285714 + 14100 0.0048045755 0 2.0601942e-05 2.959681e-05 4.9880076e-05 9.4285714 + 14200 0.004634799 0 8.0658747e-06 5.2774385e-06 5.2189551e-05 9.4285714 + 14300 0.0046822822 0 2.1714615e-05 3.0364731e-05 5.2132518e-05 9.4285714 + 14400 0.0048282958 0 2.0587615e-05 2.530458e-05 4.4110535e-05 9.4285714 + 14500 0.004799276 0 1.0813724e-05 2.2458541e-06 4.4546542e-05 9.4285714 + 14600 0.0046554419 0 1.859323e-05 4.5863598e-05 5.9021103e-05 9.4285714 + 14700 0.0045262414 0 2.0625232e-05 3.9707287e-05 6.1007118e-05 9.4285714 + 14800 0.0043347498 0 1.6697069e-05 3.1666259e-05 4.7172267e-05 9.4285714 + 14900 0.0040641791 0 1.3497064e-05 5.9866835e-05 6.6917505e-05 9.4285714 + 15000 0.0040014911 0 7.1453431e-06 2.5483385e-05 6.7987038e-05 9.4285714 + 15100 0.0040015198 0 4.2135705e-05 2.0671772e-05 6.4280017e-05 9.4285714 + 15200 0.004656209 0 2.6684328e-05 4.474018e-05 5.916807e-05 9.4285714 + 15300 0.0047390215 0 3.3127952e-05 4.6355585e-06 5.6740658e-05 9.4285714 + 15400 0.0047219857 0 5.6866539e-05 4.8092122e-05 6.3199152e-05 9.4285714 + 15500 0.0049597215 0 3.4278993e-05 2.5111668e-05 6.5359107e-05 9.4285714 + 15600 0.0049081505 0 1.2068327e-05 6.9210759e-06 6.2272418e-05 9.4285714 + 15700 0.0047978977 0 4.7482116e-05 5.8014048e-05 5.5647569e-05 9.4285714 + 15800 0.0048176861 0 5.0196994e-05 5.8789855e-06 4.5752404e-05 9.4285714 + 15900 0.0049895331 0 2.0966545e-05 1.4091817e-05 4.9992598e-05 9.4285714 + 16000 0.0049288669 0 2.268795e-05 3.980733e-05 5.1840856e-05 9.4285714 + 16100 0.0048010252 0 2.6781521e-05 1.2145851e-05 5.6545128e-05 9.4285714 + 16200 0.0047925554 0 4.0057978e-05 3.9037828e-05 5.8580861e-05 9.4285714 + 16300 0.0047652048 0 2.9783669e-05 4.8617786e-05 5.7899464e-05 9.4285714 + 16400 0.0043495894 0 4.1024094e-05 2.2097063e-05 7.9895344e-05 9.4285714 + 16500 0.0042677893 0 4.9740295e-05 3.3483257e-05 7.2860145e-05 9.4285714 + 16600 0.0039924053 0 1.7513538e-05 4.3222405e-05 6.2148808e-05 9.4285714 + 16700 0.004110225 0 4.4412384e-05 9.35409e-06 6.8831113e-05 9.4285714 + 16800 0.0041003344 0 2.4419982e-05 2.7202073e-05 6.5806688e-05 9.4285714 + 16900 0.0040916821 0 1.4965068e-05 3.6816647e-05 7.2328503e-05 9.4285714 + 17000 0.0039812122 0 4.3173586e-05 4.3996263e-05 7.7949852e-05 9.4285714 + 17100 0.0042480582 0 4.1959057e-05 6.6432813e-05 6.3893449e-05 9.4285714 + 17200 0.0044450353 0 3.1558002e-05 4.6146848e-05 5.5409103e-05 9.4285714 + 17300 0.0045016689 0 3.8307434e-05 3.6423601e-05 4.6361333e-05 9.4285714 + 17400 0.0044798864 0 3.6969292e-05 3.0041841e-05 5.013181e-05 9.4285714 + 17500 0.0044624458 0 4.5965488e-05 2.640968e-05 6.3999899e-05 9.4285714 + 17600 0.0044477024 0 2.0966517e-05 1.8953464e-05 4.7160807e-05 9.4285714 + 17700 0.0044103517 0 2.7440925e-05 3.0023335e-05 2.6847111e-05 9.4285714 + 17800 0.004341948 0 3.7548931e-05 2.7684114e-05 5.1464098e-05 9.4285714 + 17900 0.0042623319 0 3.2079768e-05 2.0530818e-05 3.5314593e-05 9.4285714 + 18000 0.003726239 0 2.5075988e-05 3.3133097e-05 4.1995217e-05 9.4285714 + 18100 0.0034893305 0 1.3220245e-05 3.020125e-05 7.1713105e-05 9.4285714 + 18200 0.0035481187 0 3.2523043e-05 2.7387192e-05 3.6749668e-05 9.4285714 + 18300 0.0036251402 0 4.5667311e-05 2.9230799e-05 7.1782706e-05 9.4285714 + 18400 0.0036369749 0 -1.014622e-06 3.5201729e-05 3.9709522e-05 9.4285714 + 18500 0.0034279849 0 2.1947889e-05 3.9001906e-05 3.3701879e-05 9.4285714 + 18600 0.0033615572 0 5.3790038e-05 3.9573549e-05 8.1596316e-05 9.4285714 + 18700 0.003406225 0 7.3625431e-06 3.4584743e-05 4.8640801e-05 9.4285714 + 18800 0.0034922323 0 2.6182422e-05 3.1791119e-05 4.170957e-05 9.4285714 + 18900 0.0034820625 0 2.9857402e-05 2.5799449e-05 5.5291228e-05 9.4285714 + 19000 0.0033272524 0 1.844591e-05 4.0826323e-05 6.2101661e-05 9.4285714 + 19100 0.0034010912 0 3.0145616e-05 3.644045e-05 6.0246878e-05 9.4285714 + 19200 0.0030932535 0 8.7227973e-06 2.9814304e-05 4.6597247e-05 9.4285714 + 19300 0.002624051 0 6.3914236e-05 2.9323041e-05 6.0029293e-05 9.4285714 + 19400 0.0027583806 0 4.2039411e-05 2.7933876e-05 4.8958797e-05 9.4285714 + 19500 0.0029775174 0 -2.6335479e-05 2.2879667e-05 4.4610482e-05 9.4285714 + 19600 0.0028689969 0 3.5884554e-05 2.1352512e-05 6.0208946e-05 9.4285714 + 19700 0.0026399127 0 1.8473989e-05 2.2707825e-05 6.171175e-05 9.4285714 + 19800 0.0025439904 0 -1.2073435e-06 2.0399124e-05 6.9687415e-05 9.4285714 + 19900 0.0027074939 0 3.0062292e-05 3.2667714e-05 5.1372476e-05 9.4285714 + 20000 0.0027181793 0 -1.7035119e-06 1.177054e-05 4.0159702e-05 9.4285714 + 20100 0.0027315362 0 -1.3742365e-06 2.3564155e-05 5.7172718e-05 9.4285714 + 20200 0.0027204191 0 2.0041145e-05 2.052408e-05 4.7725285e-05 9.4285714 + 20300 0.0026457344 0 3.3984829e-06 4.8524174e-06 5.3280292e-05 9.4285714 + 20400 0.0026592475 0 5.1173158e-06 3.9458314e-05 5.5560611e-05 9.4285714 + 20500 0.0026129298 0 2.419217e-05 2.7154017e-05 5.5129038e-05 9.4285714 + 20600 0.0026532045 0 1.9753712e-05 1.46246e-05 4.9293256e-05 9.4285714 + 20700 0.0026172433 0 1.0984198e-06 3.1572908e-05 4.2775817e-05 9.4285714 + 20800 0.0025282343 0 1.9683388e-05 2.2901129e-05 5.64033e-05 9.4285714 + 20900 0.0025383322 0 2.2352257e-05 2.534911e-05 6.380687e-05 9.4285714 + 21000 0.0024848857 0 1.4023463e-05 2.6731904e-05 5.2051725e-05 9.4285714 + 21100 0.0025091105 0 2.7673099e-05 2.9475402e-05 7.684648e-05 9.4285714 + 21200 0.0027229411 0 6.1574133e-06 2.5611393e-05 5.6801847e-05 9.4285714 + 21300 0.0028888226 0 1.9686043e-05 1.033069e-05 3.656491e-05 9.4285714 + 21400 0.0029336429 0 2.3706857e-05 1.5440041e-05 6.4192795e-05 9.4285714 + 21500 0.0029354446 0 4.443655e-06 1.8094788e-05 3.797507e-05 9.4285714 + 21600 0.0029270648 0 2.4289752e-05 1.6933392e-05 3.9618516e-05 9.4285714 + 21700 0.0029288781 0 2.2403205e-05 1.3655312e-05 6.3273854e-05 9.4285714 + 21800 0.002884005 0 9.5665801e-06 1.2718071e-05 5.613979e-05 9.4285714 + 21900 0.0028362206 0 1.6764675e-05 2.2612976e-05 5.3866016e-05 9.4285714 + 22000 0.0027784436 0 2.0373617e-05 2.134133e-05 5.6687534e-05 9.4285714 + 22100 0.0027479829 0 3.1605707e-05 2.9016826e-05 5.0412111e-05 9.4285714 + 22200 0.0027598842 0 3.1818095e-05 1.898738e-05 6.5167547e-05 9.4285714 + 22300 0.0026078138 0 1.4200853e-05 2.8283323e-05 6.7071904e-05 9.4285714 + 22400 0.0026057112 0 2.7502142e-05 4.1407395e-05 8.4619483e-05 9.4285714 + 22500 0.0026641722 0 9.9423891e-06 1.4635552e-05 6.8501238e-05 9.4285714 + 22600 0.0023728105 0 6.7736501e-06 3.0299151e-05 5.894177e-05 9.4285714 + 22700 0.0021999097 0 3.4516939e-05 4.5285607e-05 8.996035e-05 9.4285714 + 22800 0.002178124 0 2.9545388e-05 1.9567086e-05 9.6343476e-05 9.4285714 + 22900 0.0022903704 0 4.8666623e-06 1.5551535e-05 5.8697755e-05 9.4285714 + 23000 0.0022114595 0 3.9089014e-05 1.3185973e-05 7.0843777e-05 9.4285714 + 23100 0.0022473179 0 3.0609778e-05 1.6190628e-05 7.2843834e-05 9.4285714 + 23200 0.0022787302 0 1.3694799e-05 2.8211464e-06 3.8403815e-05 9.4285714 + 23300 0.002254193 0 1.0608785e-05 2.087358e-05 6.337886e-05 9.4285714 + 23400 0.0022032528 0 2.914759e-05 2.8493674e-05 6.0474318e-05 9.4285714 + 23500 0.0022103262 0 2.9804777e-05 1.2383546e-05 4.0491877e-05 9.4285714 + 23600 0.0022767949 0 1.8461506e-05 2.3591158e-05 5.2725816e-05 9.4285714 + 23700 0.002283034 0 1.9374068e-05 2.570172e-05 4.622802e-05 9.4285714 + 23800 0.0022293403 0 3.3214067e-05 1.0752104e-05 4.2971028e-05 9.4285714 + 23900 0.0022421499 0 3.3973428e-05 1.4548851e-05 4.8022214e-05 9.4285714 + 24000 0.0022708179 0 1.3175798e-05 1.5539147e-05 4.5563964e-05 9.4285714 + 24100 0.0022311644 0 1.320215e-05 1.3317185e-05 5.7572825e-05 9.4285714 + 24200 0.0022566051 0 2.3442037e-05 7.9298663e-06 5.2246081e-05 9.4285714 + 24300 0.0022547585 0 2.1667142e-05 6.4075914e-06 5.1028376e-05 9.4285714 + 24400 0.0022901257 0 3.8132396e-05 1.5652454e-05 7.8308938e-05 9.4285714 + 24500 0.0023537103 0 1.7910524e-05 1.573637e-05 6.9737249e-05 9.4285714 + 24600 0.0023613708 0 4.9912312e-05 1.9777052e-05 4.9415062e-05 9.4285714 + 24700 0.0023237992 0 5.4833746e-05 2.9532114e-05 7.4218996e-05 9.4285714 + 24800 0.0024221927 0 4.0966596e-05 6.3998314e-06 5.9553095e-05 9.4285714 + 24900 0.0025882547 0 6.045015e-05 6.220892e-06 5.4328816e-05 9.4285714 + 25000 0.0027152266 0 5.4969197e-05 2.6430135e-05 4.603937e-05 9.4285714 + 25100 0.0028201154 0 4.3938431e-05 3.0418239e-06 5.8688084e-05 9.4285714 + 25200 0.0029086169 0 3.9184289e-05 -1.53382e-06 4.5684354e-05 9.4285714 + 25300 0.0028528211 0 4.4996759e-05 2.6609485e-06 4.2673517e-05 9.4285714 + 25400 0.0027655631 0 4.2432926e-05 2.1473821e-05 6.8108741e-05 9.4285714 + 25500 0.0027631455 0 5.0514226e-05 2.7797928e-05 5.8437613e-05 9.4285714 + 25600 0.0027455338 0 4.3507582e-05 -1.0456464e-05 5.1578934e-05 9.4285714 + 25700 0.0027314337 0 3.7998608e-05 2.5300155e-05 5.954794e-05 9.4285714 + 25800 0.0026789336 0 5.6853762e-05 2.33174e-05 5.8401995e-05 9.4285714 + 25900 0.0026686904 0 6.7084502e-05 -1.1954024e-05 5.9379012e-05 9.4285714 + 26000 0.0026703643 0 5.6882192e-05 2.5357526e-05 5.608238e-05 9.4285714 + 26100 0.0026825353 0 5.3411638e-05 2.2603349e-05 5.7143751e-05 9.4285714 + 26200 0.0026825174 0 4.4889326e-05 6.9889785e-06 5.8696773e-05 9.4285714 + 26300 0.0025517718 0 5.0976225e-05 2.6619688e-05 6.2081286e-05 9.4285714 + 26400 0.002448155 0 4.6795755e-05 2.6745973e-05 6.9058563e-05 9.4285714 + 26500 0.0023334395 0 3.6329495e-05 2.1444416e-05 6.3642539e-05 9.4285714 + 26600 0.0023097701 0 1.4550567e-05 2.0382944e-05 7.4206161e-05 9.4285714 + 26700 0.0023614287 0 3.6837945e-05 7.9340854e-06 4.7722434e-05 9.4285714 + 26800 0.0023955623 0 3.3758906e-05 1.7850933e-05 5.5370197e-05 9.4285714 + 26900 0.0019993736 0 2.401514e-05 7.8783626e-06 6.8777068e-05 9.4285714 + 27000 0.0019497677 0 3.4976669e-05 2.0510247e-05 8.2493412e-05 9.4285714 + 27100 0.0020363076 0 3.0367221e-05 2.8074655e-05 6.8056692e-05 9.4285714 + 27200 0.0021974785 0 2.8659262e-05 1.6294524e-05 5.6354701e-05 9.4285714 + 27300 0.002350289 0 4.0543677e-05 3.479231e-05 9.0764702e-05 9.4285714 + 27400 0.0026460053 0 3.662854e-05 3.4426146e-05 5.8695061e-05 9.4285714 + 27500 0.0027599044 0 2.6446889e-05 2.899965e-05 3.1521376e-05 9.4285714 + 27600 0.0026660556 0 3.9779618e-05 4.4458176e-05 6.7754246e-05 9.4285714 + 27700 0.0026060398 0 4.7271306e-05 3.8365324e-05 8.0132483e-05 9.4285714 + 27800 0.002724511 0 3.2724273e-05 3.0569502e-05 3.8076705e-05 9.4285714 + 27900 0.0027318479 0 3.2565575e-05 4.4661949e-05 3.5502056e-05 9.4285714 + 28000 0.0026231478 0 3.0921183e-05 6.0356667e-05 6.119464e-05 9.4285714 + 28100 0.0025508556 0 3.8236605e-05 7.3664001e-05 6.7713451e-05 9.4285714 + 28200 0.0025807152 0 2.9349952e-05 7.4140709e-05 6.1882214e-05 9.4285714 + 28300 0.0024074206 0 4.7886113e-05 5.3408061e-05 7.1587209e-05 9.4285714 + 28400 0.0021292859 0 3.9661978e-05 4.0501829e-05 8.4104354e-05 9.4285714 + 28500 0.0022172558 0 9.263267e-06 3.0058013e-05 6.6166187e-05 9.4285714 + 28600 0.0022653927 0 1.0971373e-05 3.0295081e-05 5.9537447e-05 9.4285714 + 28700 0.0025914898 0 3.6755792e-05 6.2489978e-05 7.3424188e-05 9.4285714 + 28800 0.0028276024 0 3.411427e-05 6.1657699e-05 5.2554821e-05 9.4285714 + 28900 0.0029326653 0 2.9451988e-05 5.2815959e-05 4.9287892e-05 9.4285714 + 29000 0.002965493 0 4.3028891e-05 5.075017e-05 4.0608877e-05 9.4285714 + 29100 0.0029096903 0 2.3691422e-05 5.351833e-05 5.2666702e-05 9.4285714 + 29200 0.0028604262 0 2.3683149e-05 7.0673759e-05 5.6222633e-05 9.4285714 + 29300 0.0028093312 0 2.7695636e-05 3.7456562e-05 5.2008785e-05 9.4285714 + 29400 0.0026786162 0 1.7501321e-05 4.5402961e-05 3.9525304e-05 9.4285714 + 29500 0.0025387867 0 2.6252438e-05 0.00011675762 5.4076857e-05 9.4285714 + 29600 0.0026569564 0 2.0179873e-05 3.5543954e-05 5.8794028e-05 9.4285714 + 29700 0.0027207144 0 1.4132151e-05 -1.0930379e-05 4.9793098e-05 9.4285714 + 29800 0.0026892821 0 1.5975512e-05 3.2195344e-05 7.7929499e-05 9.4285714 + 29900 0.002643369 0 9.7678707e-06 1.514329e-05 6.9299393e-05 9.4285714 + 30000 0.0026484998 0 1.8316171e-05 2.1415077e-05 7.6825888e-05 9.4285714 + 30100 0.0028058509 0 2.8010974e-05 3.0588454e-05 8.9088871e-05 9.4285714 + 30200 0.0030353215 0 3.0063085e-05 2.9104606e-05 5.9605817e-05 9.4285714 + 30300 0.0030244988 0 5.9349189e-05 5.3259974e-05 8.9481653e-05 9.4285714 + 30400 0.0030855053 0 3.9650015e-05 3.414212e-05 7.0405413e-05 9.4285714 + 30500 0.0031141819 0 1.5522675e-05 3.9813856e-05 3.5114379e-05 9.4285714 + 30600 0.0030115458 0 6.207961e-05 6.9753316e-05 7.8366207e-05 9.4285714 + 30700 0.0029700178 0 5.3239082e-05 6.3389177e-05 5.4097351e-05 9.4285714 + 30800 0.0029985358 0 5.2375856e-05 5.1058091e-05 3.3422572e-05 9.4285714 + 30900 0.0029689517 0 7.9332461e-05 4.3886728e-05 5.4365146e-05 9.4285714 + 31000 0.0029622718 0 4.1523447e-05 3.6825764e-05 4.5694556e-05 9.4285714 + 31100 0.0029693917 0 3.9693868e-05 3.1903074e-05 5.8747157e-05 9.4285714 + 31200 0.0027246348 0 4.7276494e-05 2.7079375e-05 7.6416899e-05 9.4285714 + 31300 0.0025368424 0 2.0106344e-05 1.9267294e-05 6.5804133e-05 9.4285714 + 31400 0.0023736698 0 3.4928557e-05 2.8361754e-05 7.2137201e-05 9.4285714 + 31500 0.0023946514 0 4.2754557e-05 3.7950211e-05 8.8735068e-05 9.4285714 + 31600 0.0025648037 0 3.7965284e-05 3.50089e-05 8.1900334e-05 9.4285714 + 31700 0.0026956511 0 4.4264259e-05 3.1634807e-05 7.4263237e-05 9.4285714 + 31800 0.002677722 0 4.2244917e-05 3.2173533e-05 8.3389862e-05 9.4285714 + 31900 0.0026705496 0 3.6129898e-05 4.4926239e-05 0.00010110824 9.4285714 + 32000 0.0026466417 0 2.9725035e-05 2.3414537e-05 7.220946e-05 9.4285714 + 32100 0.0026464292 0 5.4134116e-05 3.4177457e-05 6.0288821e-05 9.4285714 + 32200 0.0023705665 0 8.9404512e-05 4.9292654e-05 7.4340835e-05 9.4285714 + 32300 0.0023183595 0 3.1106601e-05 1.969535e-05 7.2988393e-05 9.4285714 + 32400 0.0023882969 0 3.0033e-05 3.3991058e-05 7.1203923e-05 9.4285714 + 32500 0.0023801754 0 2.0067694e-05 3.609562e-05 7.429963e-05 9.4285714 + 32600 0.0024127958 0 1.860145e-05 1.673518e-05 6.100357e-05 9.4285714 + 32700 0.0024031675 0 1.6548008e-05 3.1315194e-05 8.701554e-05 9.4285714 + 32800 0.0023770089 0 3.1288811e-05 3.9427918e-05 5.6604914e-05 9.4285714 + 32900 0.0023568819 0 2.1325065e-05 3.2192459e-05 4.8319222e-05 9.4285714 + 33000 0.0023407285 0 2.2054448e-05 2.8803406e-05 5.5905315e-05 9.4285714 + 33100 0.002327332 0 4.0361707e-05 3.7589399e-05 4.2886312e-05 9.4285714 + 33200 0.0023912585 0 -9.7229548e-07 2.5787094e-05 6.5015833e-05 9.4285714 + 33300 0.0022984153 0 3.2373497e-05 2.5040091e-05 6.9835525e-05 9.4285714 + 33400 0.0022416368 0 2.669143e-05 3.3965765e-05 6.2323403e-05 9.4285714 + 33500 0.0022470637 0 2.3937493e-05 3.2027546e-05 6.683839e-05 9.4285714 + 33600 0.002256129 0 5.0952751e-05 1.2468902e-05 8.4446592e-05 9.4285714 + 33700 0.0022125246 0 3.093841e-05 2.8287747e-05 6.9499172e-05 9.4285714 + 33800 0.0021842197 0 3.5838423e-05 4.2090475e-05 6.9350286e-05 9.4285714 + 33900 0.0021690567 0 2.1933016e-05 2.3178404e-05 6.7082352e-05 9.4285714 + 34000 0.0022206311 0 1.6269784e-05 1.1538009e-05 6.9266998e-05 9.4285714 + 34100 0.0022494061 0 9.1490397e-06 2.3350968e-05 6.8389039e-05 9.4285714 + 34200 0.0022085859 0 1.1855555e-05 3.1674183e-05 7.1002559e-05 9.4285714 + 34300 0.0021855633 0 3.6129131e-05 3.1747187e-05 7.3965145e-05 9.4285714 + 34400 0.0021798298 0 2.9737106e-05 3.3328648e-05 6.9329253e-05 9.4285714 + 34500 0.0021267289 0 3.0875724e-05 3.9773694e-05 7.6428461e-05 9.4285714 + 34600 0.0020466804 0 4.5953975e-05 3.604981e-05 9.1419852e-05 9.4285714 + 34700 0.0020969555 0 2.1591871e-05 2.7684452e-05 7.3703867e-05 9.4285714 + 34800 0.0022946237 0 2.5522835e-05 5.2438515e-05 7.4505556e-05 9.4285714 + 34900 0.0024490201 0 3.0917851e-05 4.7710261e-05 6.8019936e-05 9.4285714 + 35000 0.0023320217 0 1.3576325e-05 2.3430256e-05 9.5266861e-05 9.4285714 + 35100 0.0021890324 0 3.4077104e-05 7.0143939e-05 0.00014586007 9.4285714 + 35200 0.0022124553 0 3.9202113e-05 6.7232341e-05 0.00011830019 9.4285714 + 35300 0.0022584165 0 3.2352745e-05 3.4532597e-05 0.00010884414 9.4285714 + 35400 0.0022737238 0 2.6169969e-05 5.4509206e-05 0.00013180587 9.4285714 + 35500 0.0021537481 0 1.3607191e-05 6.4837671e-05 0.00010851886 9.4285714 + 35600 0.0019831613 0 3.7737426e-05 3.5351631e-05 0.00011069142 9.4285714 + 35700 0.0019041909 0 5.8970853e-05 4.7427627e-05 8.3590155e-05 9.4285714 + 35800 0.0018216502 0 2.0975612e-05 6.7395457e-05 8.6545139e-05 9.4285714 + 35900 0.0018071574 0 4.9077297e-05 5.6297007e-05 8.6311389e-05 9.4285714 + 36000 0.0018645267 0 4.3766063e-05 6.3882304e-05 7.7447784e-05 9.4285714 + 36100 0.0018474198 0 2.7934971e-05 4.1953568e-05 7.3607852e-05 9.4285714 + 36200 0.0017366166 0 6.3710459e-05 5.0034173e-05 8.7289442e-05 9.4285714 + 36300 0.0016630877 0 7.6673753e-05 7.2721043e-05 6.987444e-05 9.4285714 + 36400 0.0016809967 0 7.7155302e-05 5.3898957e-05 5.1930662e-05 9.4285714 + 36500 0.0017478488 0 4.3901858e-05 4.0429824e-05 5.2253472e-05 9.4285714 + 36600 0.0017244649 0 2.428819e-05 4.6012488e-05 3.7569881e-05 9.4285714 + 36700 0.001694793 0 4.1551489e-05 5.7262857e-05 5.4986708e-05 9.4285714 + 36800 0.0016321204 0 2.4522843e-05 6.8176422e-05 5.0512524e-05 9.4285714 + 36900 0.0015208954 0 2.4066113e-05 6.9956589e-05 3.100353e-05 9.4285714 + 37000 0.0014068755 0 3.7418687e-05 3.3424302e-05 4.5889741e-05 9.4285714 + 37100 0.0013361229 0 2.3700045e-05 5.9655032e-05 5.8355744e-05 9.4285714 + 37200 0.001331474 0 2.4647885e-05 2.9564413e-05 6.151617e-05 9.4285714 + 37300 0.0013895388 0 3.1218344e-05 5.3264584e-05 5.4150714e-05 9.4285714 + 37400 0.001407333 0 2.9698504e-05 3.9474095e-05 6.2202002e-05 9.4285714 + 37500 0.0013815772 0 1.8291183e-05 3.6964703e-05 4.5117987e-05 9.4285714 + 37600 0.001367937 0 7.4389408e-06 4.5115277e-05 6.3566279e-05 9.4285714 + 37700 0.0013781896 0 1.1284658e-05 3.3828999e-05 3.0356852e-05 9.4285714 + 37800 0.0013938097 0 7.4598099e-06 2.7777999e-05 4.0234563e-05 9.4285714 + 37900 0.0013788852 0 1.5446137e-05 3.4929786e-05 5.4102572e-05 9.4285714 + 38000 0.0013409916 0 1.4441923e-05 3.3307632e-05 3.9082488e-05 9.4285714 + 38100 0.0013548793 0 6.7717499e-06 2.1259364e-05 6.6745044e-05 9.4285714 + 38200 0.0013619894 0 6.5554231e-06 2.8685491e-05 5.3680355e-05 9.4285714 + 38300 0.0013593654 0 1.056312e-05 2.2266742e-05 4.345309e-05 9.4285714 + 38400 0.0013488508 0 1.557872e-05 2.3814902e-05 6.6112512e-05 9.4285714 + 38500 0.0013399961 0 1.5993586e-05 2.3166151e-05 6.6558579e-05 9.4285714 + 38600 0.0013473117 0 1.5515364e-05 1.4310057e-05 5.3828044e-05 9.4285714 + 38700 0.0013275262 0 1.3467545e-05 3.6691606e-05 5.4651816e-05 9.4285714 + 38800 0.001304838 0 1.2622031e-05 1.8240819e-05 6.8478029e-05 9.4285714 + 38900 0.0012981525 0 1.5965351e-05 7.301553e-07 6.0493525e-05 9.4285714 + 39000 0.0013241474 0 1.090791e-05 1.3786425e-05 5.8612758e-05 9.4285714 + 39100 0.0013302715 0 1.3962184e-05 7.7290833e-06 7.2626585e-05 9.4285714 + 39200 0.0013338793 0 1.9124677e-05 1.2103012e-05 6.4272665e-05 9.4285714 + 39300 0.001337749 0 1.2034083e-05 2.0304797e-05 5.5832191e-05 9.4285714 + 39400 0.0014184127 0 2.3587723e-05 2.6667391e-05 6.1393117e-05 9.4285714 + 39500 0.0015076229 0 3.3529982e-05 2.8742772e-05 5.1854875e-05 9.4285714 + 39600 0.001584196 0 3.329731e-05 3.2142836e-05 5.5667568e-05 9.4285714 + 39700 0.0016673141 0 4.3874089e-05 3.911096e-05 6.1078216e-05 9.4285714 + 39800 0.0016983633 0 3.5412377e-05 3.3834797e-05 4.7630906e-05 9.4285714 + 39900 0.001721388 0 3.933382e-05 3.2179967e-05 4.124963e-05 9.4285714 + 40000 0.0016511866 0 4.0224006e-05 3.6540739e-05 6.1229941e-05 9.4285714 + 40100 0.0015902117 0 3.6395621e-05 3.46428e-05 5.5755476e-05 9.4285714 + 40200 0.0016248457 0 3.4583893e-05 3.816918e-05 4.6174117e-05 9.4285714 + 40300 0.001639017 0 3.2218286e-05 2.1195869e-05 5.094444e-05 9.4285714 + 40400 0.0015947128 0 3.6248764e-05 2.1295273e-05 6.3147523e-05 9.4285714 + 40500 0.0014886812 0 4.7131763e-05 2.4191444e-05 7.2883457e-05 9.4285714 + 40600 0.001483951 0 3.6448135e-05 2.6739025e-05 5.5832321e-05 9.4285714 + 40700 0.0014877422 0 3.5828172e-05 1.4229622e-05 5.437453e-05 9.4285714 + 40800 0.0014974798 0 3.9713792e-05 5.9573135e-06 7.8424652e-05 9.4285714 + 40900 0.0014499802 0 3.0640365e-05 1.6594208e-05 5.5042674e-05 9.4285714 + 41000 0.001395913 0 4.4086797e-05 2.1374448e-05 6.842533e-05 9.4285714 + 41100 0.0014079985 0 3.4018478e-05 4.769345e-06 8.7786364e-05 9.4285714 + 41200 0.0014187083 0 2.5282617e-05 1.068147e-05 4.998439e-05 9.4285714 + 41300 0.0014072972 0 3.8324312e-05 2.7053184e-05 7.2652898e-05 9.4285714 + 41400 0.0014168981 0 2.2198923e-05 2.385181e-05 5.9696044e-05 9.4285714 + 41500 0.0014248439 0 2.2507889e-05 2.4943991e-05 4.8133783e-05 9.4285714 + 41600 0.0014225044 0 1.7477309e-05 2.4821833e-05 7.3031953e-05 9.4285714 + 41700 0.0014075811 0 6.0477226e-06 3.3082497e-05 4.6074646e-05 9.4285714 + 41800 0.0012680617 0 4.0229918e-05 4.5845799e-05 4.7760436e-05 9.4285714 + 41900 0.0010587818 0 8.7500075e-05 2.7520625e-05 8.5329729e-05 9.4285714 + 42000 0.0010007004 0 7.957049e-05 2.7796479e-05 7.179911e-05 9.4285714 + 42100 0.0011304402 0 6.7932609e-05 3.0223682e-05 8.4046251e-05 9.4285714 + 42200 0.0012833154 0 4.4695908e-05 3.1025337e-05 8.6333525e-05 9.4285714 + 42300 0.0013573853 0 3.7885389e-06 3.242561e-05 4.6636393e-05 9.4285714 + 42400 0.0013330633 0 2.5305413e-05 3.6210128e-05 7.9624924e-05 9.4285714 + 42500 0.0012896373 0 4.4892704e-05 4.5307645e-05 8.8376567e-05 9.4285714 + 42600 0.001296775 0 1.2123487e-05 3.1329317e-05 4.689266e-05 9.4285714 + 42700 0.0013193969 0 2.5015346e-05 3.7644129e-05 6.9158547e-05 9.4285714 + 42800 0.0013144903 0 2.7945886e-05 4.3976185e-05 7.2258209e-05 9.4285714 + 42900 0.0013053554 0 2.4932516e-05 2.56847e-05 5.5060153e-05 9.4285714 + 43000 0.0013061323 0 3.505508e-05 3.6703149e-05 6.4102162e-05 9.4285714 + 43100 0.0013149372 0 2.038307e-05 3.6535953e-05 7.001205e-05 9.4285714 + 43200 0.0013063189 0 2.268783e-05 3.1284363e-05 7.1489703e-05 9.4285714 + 43300 0.0012669853 0 4.2151966e-05 3.9616841e-05 8.600203e-05 9.4285714 + 43400 0.0012238388 0 5.3831605e-05 3.1663968e-05 0.00010748716 9.4285714 + 43500 0.0012053096 0 4.8917941e-05 4.1146437e-05 8.2504846e-05 9.4285714 + 43600 0.001243323 0 5.6671957e-05 4.1809653e-05 6.8354881e-05 9.4285714 + 43700 0.001354992 0 6.1374672e-05 3.8833483e-05 7.767147e-05 9.4285714 + 43800 0.0015252788 0 5.8329091e-05 4.5092041e-05 6.9458926e-05 9.4285714 + 43900 0.0016845587 0 5.2409784e-05 4.1549162e-05 6.3318187e-05 9.4285714 + 44000 0.0016987088 0 4.7336939e-05 3.8434001e-05 3.9736647e-05 9.4285714 + 44100 0.0016663634 0 5.3015191e-05 4.4114496e-05 6.0593021e-05 9.4285714 + 44200 0.0016642734 0 5.214706e-05 4.2354707e-05 7.5907264e-05 9.4285714 + 44300 0.0016877933 0 5.0208545e-05 4.4720314e-05 4.2475579e-05 9.4285714 + 44400 0.0016937941 0 5.5355055e-05 4.3854147e-05 5.5002022e-05 9.4285714 + 44500 0.001658184 0 3.9777309e-05 4.0596489e-05 7.2900309e-05 9.4285714 + 44600 0.0016202756 0 2.9046764e-05 4.4611362e-05 8.4216927e-05 9.4285714 + 44700 0.0012624519 0 5.8118979e-05 5.1336615e-05 8.5097154e-05 9.4285714 + 44800 0.0012148648 0 4.7990064e-05 4.5865246e-05 0.00010159441 9.4285714 + 44900 0.0012565599 0 2.0587612e-05 1.8054993e-05 7.9471736e-05 9.4285714 + 45000 0.0012298496 0 5.4851152e-05 4.3491138e-05 8.0059008e-05 9.4285714 + 45100 0.0012274205 0 5.2324153e-05 3.6704358e-05 8.9721391e-05 9.4285714 + 45200 0.0012389066 0 3.7648091e-05 4.0944545e-05 9.5234226e-05 9.4285714 + 45300 0.0012251609 0 6.0261206e-05 5.1852752e-05 9.0949936e-05 9.4285714 + 45400 0.0012814774 0 6.4393391e-05 3.7667283e-05 7.6665383e-05 9.4285714 + 45500 0.0013450626 0 5.3955889e-05 3.333518e-05 6.2323361e-05 9.4285714 + 45600 0.0013741472 0 7.6840597e-05 4.8885582e-05 7.5101429e-05 9.4285714 + 45700 0.0014351223 0 6.9926667e-05 4.095132e-05 6.4348005e-05 9.4285714 + 45800 0.0015284371 0 6.5168141e-05 5.0243258e-05 5.8089422e-05 9.4285714 + 45900 0.001575355 0 6.7430051e-05 6.1147022e-05 7.5616361e-05 9.4285714 + 46000 0.0015147792 0 5.974587e-05 5.4339958e-05 6.89933e-05 9.4285714 + 46100 0.0014504182 0 5.7541539e-05 5.0006578e-05 7.0543678e-05 9.4285714 + 46200 0.0014410639 0 5.8653588e-05 5.2586065e-05 8.1219081e-05 9.4285714 + 46300 0.0014810525 0 4.7027763e-05 3.957261e-05 4.9542345e-05 9.4285714 + 46400 0.0014640215 0 4.979541e-05 1.7965262e-05 6.0180114e-05 9.4285714 + 46500 0.0014424933 0 5.8745985e-05 5.7017286e-05 6.8960391e-05 9.4285714 + 46600 0.001441165 0 6.0140939e-05 4.6475918e-05 5.6358378e-05 9.4285714 + 46700 0.0015025344 0 5.7998976e-05 1.9007372e-05 6.9395672e-05 9.4285714 + 46800 0.0015582176 0 5.9436654e-05 4.8677122e-05 5.618251e-05 9.4285714 + 46900 0.0015803324 0 5.4329951e-05 4.4548088e-05 4.6224761e-05 9.4285714 + 47000 0.001675143 0 6.7118862e-05 5.1584703e-05 6.351515e-05 9.4285714 + 47100 0.0017769921 0 6.6842957e-05 5.3736059e-05 5.062399e-05 9.4285714 + 47200 0.0018358006 0 7.1689975e-05 5.6118418e-05 4.7990149e-05 9.4285714 + 47300 0.0017951326 0 7.4127289e-05 7.3816363e-05 5.0104237e-05 9.4285714 + 47400 0.0017057371 0 7.2774664e-05 4.7651294e-05 3.5218695e-05 9.4285714 + 47500 0.0016744493 0 6.6367496e-05 5.9365352e-05 5.0217044e-05 9.4285714 + 47600 0.0014031951 0 7.8136546e-05 6.6155937e-05 6.7384693e-05 9.4285714 + 47700 0.0013373039 0 7.0639329e-05 2.511137e-05 3.9534806e-05 9.4285714 + 47800 0.0014704003 0 6.5287146e-05 6.1682091e-05 5.2105143e-05 9.4285714 + 47900 0.0014934525 0 5.7380229e-05 6.0784906e-05 5.1933873e-05 9.4285714 + 48000 0.0014895856 0 5.7777082e-05 3.2566077e-05 5.6885486e-05 9.4285714 + 48100 0.00146967 0 6.2296437e-05 5.9058125e-05 8.2342951e-05 9.4285714 + 48200 0.0015682986 0 5.6963813e-05 6.9617445e-05 5.2534658e-05 9.4285714 + 48300 0.0017163505 0 6.1379044e-05 7.1818241e-05 5.7325956e-05 9.4285714 + 48400 0.0014261936 0 7.3161005e-05 6.1824088e-05 8.2548349e-05 9.4285714 + 48500 0.0014236361 0 6.1449743e-05 4.8278985e-05 4.0124971e-05 9.4285714 + 48600 0.0014562257 0 4.5352973e-05 6.5203729e-05 2.9114173e-05 9.4285714 + 48700 0.0013758282 0 5.142512e-05 5.5645429e-05 5.0808976e-05 9.4285714 + 48800 0.0014316476 0 4.7089175e-05 2.3932718e-05 6.2491645e-05 9.4285714 + 48900 0.0014805023 0 3.202017e-05 2.5779532e-05 2.4693407e-05 9.4285714 + 49000 0.0013776549 0 4.5921287e-05 3.5365771e-05 4.1227618e-05 9.4285714 + 49100 0.0013617488 0 3.9474501e-05 4.6966656e-05 9.1036599e-05 9.4285714 + 49200 0.0013342401 0 7.8714486e-05 3.901494e-05 4.6082427e-05 9.4285714 + 49300 0.001276486 0 8.5308627e-05 4.9747481e-05 6.6920379e-05 9.4285714 + 49400 0.0011795288 0 5.385526e-05 7.1565933e-05 7.5941735e-05 9.4285714 + 49500 0.0011435859 0 6.7438968e-05 5.252065e-05 4.4969603e-05 9.4285714 + 49600 0.001247689 0 4.8189516e-05 5.606737e-05 7.5562669e-05 9.4285714 + 49700 0.0013371245 0 3.0586887e-05 3.3461339e-05 5.7168685e-05 9.4285714 + 49800 0.001301722 0 3.5961521e-05 4.0225086e-05 5.5419691e-05 9.4285714 + 49900 0.0012728363 0 3.781088e-05 6.7681947e-05 7.3469228e-05 9.4285714 + 50000 0.0013286836 0 2.0747917e-05 3.2920899e-05 5.6036366e-05 9.4285714 + 50100 0.0013460063 0 2.2076031e-05 3.3652205e-05 6.008755e-05 9.4285714 + 50200 0.0012868089 0 2.9384106e-05 5.6767755e-05 7.0843856e-05 9.4285714 + 50300 0.0012765172 0 3.4521368e-05 4.9418831e-05 7.0177943e-05 9.4285714 + 50400 0.0012703222 0 3.6291462e-05 6.8474511e-05 7.0682948e-05 9.4285714 + 50500 0.0011906512 0 4.1093781e-05 7.1478191e-05 7.2068398e-05 9.4285714 + 50600 0.0011537339 0 3.1556882e-05 4.1722061e-05 7.9155785e-05 9.4285714 + 50700 0.0011267336 0 2.9306562e-05 5.3537978e-05 0.00010138475 9.4285714 + 50800 0.0011753482 0 4.1295435e-05 4.117216e-05 0.00010940627 9.4285714 + 50900 0.0011919232 0 3.5291826e-05 2.7690085e-05 6.4859546e-05 9.4285714 + 51000 0.0011838525 0 3.7804427e-05 4.3372281e-05 7.4969581e-05 9.4285714 + 51100 0.0011883954 0 6.1459693e-05 4.6697285e-05 7.7009321e-05 9.4285714 + 51200 0.0012349694 0 4.8996624e-05 3.1792466e-05 4.2980098e-05 9.4285714 + 51300 0.0012337432 0 3.0225925e-05 3.3059018e-05 6.4590344e-05 9.4285714 + 51400 0.0011577306 0 8.2698384e-05 3.8030266e-05 9.1759993e-05 9.4285714 + 51500 0.0011811724 0 5.9469946e-05 3.0730225e-05 9.4515804e-05 9.4285714 + 51600 0.0012159313 0 4.752115e-05 2.2092938e-05 8.3450965e-05 9.4285714 + 51700 0.0011936762 0 5.9485961e-05 3.9926221e-05 9.155953e-05 9.4285714 + 51800 0.00119466 0 3.5951585e-05 4.0938525e-05 8.2492561e-05 9.4285714 + 51900 0.0012013641 0 3.9985087e-05 3.1268943e-05 6.9196585e-05 9.4285714 + 52000 0.0011652185 0 4.7598806e-05 4.0944772e-05 8.152202e-05 9.4285714 + 52100 0.0011222289 0 3.739268e-05 4.0163882e-05 7.9877837e-05 9.4285714 + 52200 0.0011223637 0 4.1767012e-05 4.3238615e-05 8.1620009e-05 9.4285714 + 52300 0.00108781 0 4.2621468e-05 4.8449175e-05 8.8351917e-05 9.4285714 + 52400 0.0010329114 0 4.2272037e-05 4.6831094e-05 9.0371289e-05 9.4285714 + 52500 0.0010414794 0 5.8841141e-05 4.2908938e-05 9.7364103e-05 9.4285714 + 52600 0.0011160581 0 5.0413342e-05 4.0018307e-05 8.1832238e-05 9.4285714 + 52700 0.0011365494 0 5.4799404e-05 3.9990197e-05 6.8582155e-05 9.4285714 + 52800 0.0011528486 0 5.9449422e-05 4.4180114e-05 7.8135764e-05 9.4285714 + 52900 0.001215765 0 7.724582e-05 6.6093449e-05 0.0001064278 9.4285714 + 53000 0.0013368124 0 7.3703922e-05 5.0858461e-05 7.6836114e-05 9.4285714 + 53100 0.0013407312 0 6.2171068e-05 5.3889729e-05 6.880048e-05 9.4285714 + 53200 0.0013326843 0 6.4548253e-05 6.224984e-05 8.4641195e-05 9.4285714 + 53300 0.0013239729 0 6.0319543e-05 5.8209843e-05 6.5588436e-05 9.4285714 + 53400 0.0013217143 0 5.3952234e-05 6.2188072e-05 5.7866618e-05 9.4285714 + 53500 0.0012781803 0 6.1927188e-05 7.8771424e-05 6.5769719e-05 9.4285714 + 53600 0.001268382 0 6.6769939e-05 6.7552155e-05 7.9292264e-05 9.4285714 + 53700 0.0012069904 0 6.3035353e-05 7.6839293e-05 6.4761494e-05 9.4285714 + 53800 0.0011968988 0 7.7775234e-05 8.0850068e-05 6.4073986e-05 9.4285714 + 53900 0.0011731954 0 7.8942799e-05 6.415663e-05 6.8798682e-05 9.4285714 + 54000 0.0011606061 0 7.0843597e-05 6.4421097e-05 5.9264639e-05 9.4285714 + 54100 0.0011658982 0 7.3791408e-05 5.9714351e-05 5.9388294e-05 9.4285714 + 54200 0.0011195165 0 7.5062867e-05 5.1967479e-05 6.6867658e-05 9.4285714 + 54300 0.0010220393 0 7.1628947e-05 5.5455247e-05 7.5330768e-05 9.4285714 + 54400 0.0010086172 0 7.5800982e-05 4.2581182e-05 9.7752447e-05 9.4285714 + 54500 0.0010183988 0 6.9462298e-05 2.7534816e-05 9.3677455e-05 9.4285714 + 54600 0.0010068716 0 6.3307701e-05 4.0044863e-05 6.4661139e-05 9.4285714 + 54700 0.00099012603 0 6.054033e-05 3.7788592e-05 7.4230926e-05 9.4285714 + 54800 0.0009683722 0 7.7618706e-05 3.4929403e-05 8.2615118e-05 9.4285714 + 54900 0.00097629715 0 6.0748376e-05 4.7953003e-05 6.5727568e-05 9.4285714 + 55000 0.00095157382 0 5.7032086e-05 3.6371601e-05 6.1479859e-05 9.4285714 + 55100 0.00090688968 0 6.6813633e-05 3.8068449e-05 6.0136453e-05 9.4285714 + 55200 0.00088813057 0 5.4468645e-05 4.2209266e-05 5.6362466e-05 9.4285714 + 55300 0.00092557007 0 4.5622928e-05 3.7235869e-05 5.519561e-05 9.4285714 + 55400 0.00091327263 0 3.1184159e-05 4.7698311e-05 4.1473986e-05 9.4285714 + 55500 0.00079921186 0 4.2037172e-05 5.9276972e-05 5.152938e-05 9.4285714 + 55600 0.00081947901 0 5.355572e-05 6.752627e-05 7.3883049e-05 9.4285714 + 55700 0.00084804465 0 1.9648479e-05 2.4946587e-05 7.3095049e-05 9.4285714 + 55800 0.00085118568 0 2.6490199e-05 4.8069956e-05 5.690315e-05 9.4285714 + 55900 0.00079015144 0 5.1906966e-05 3.7090677e-05 6.8990067e-05 9.4285714 + 56000 0.00077424122 0 5.5619324e-05 2.6584622e-05 7.9553055e-05 9.4285714 + 56100 0.00078729859 0 5.7527201e-05 5.8252464e-05 5.5596022e-05 9.4285714 + 56200 0.00073803593 0 6.0864638e-05 2.5528312e-05 6.7041285e-05 9.4285714 + 56300 0.00072042566 0 6.6197657e-05 2.6713058e-05 8.9317267e-05 9.4285714 + 56400 0.00072618636 0 7.0243805e-05 4.6306853e-05 6.6723713e-05 9.4285714 + 56500 0.00072889383 0 6.1503242e-05 3.1283082e-05 5.6818079e-05 9.4285714 + 56600 0.00071687768 0 6.0574003e-05 3.8132065e-05 7.2674723e-05 9.4285714 + 56700 0.00070767909 0 6.2668821e-05 3.182732e-05 6.6720519e-05 9.4285714 + 56800 0.0007079533 0 5.0107283e-05 2.8951951e-05 7.3466661e-05 9.4285714 + 56900 0.00068006672 0 6.2013944e-05 5.565292e-05 6.162706e-05 9.4285714 + 57000 0.000671041 0 6.7800283e-05 4.9108988e-05 5.0514824e-05 9.4285714 + 57100 0.00074371147 0 6.0778783e-05 4.6623614e-05 7.0016036e-05 9.4285714 + 57200 0.00081400221 0 6.6854831e-05 5.6455913e-05 4.7909892e-05 9.4285714 + 57300 0.000917037 0 6.037679e-05 5.831922e-05 3.0276201e-05 9.4285714 + 57400 0.00094626663 0 3.6929202e-05 5.5118126e-05 6.3066718e-05 9.4285714 + 57500 0.00093346301 0 4.2929284e-05 6.1155376e-05 5.975267e-05 9.4285714 + 57600 0.00093999622 0 5.4774372e-05 5.4704358e-05 6.248684e-05 9.4285714 + 57700 0.00094337314 0 5.1052798e-05 5.8541842e-05 7.5050098e-05 9.4285714 + 57800 0.00092645123 0 5.4055981e-05 6.1848007e-05 6.7174441e-05 9.4285714 + 57900 0.00091253668 0 4.336952e-05 5.0710047e-05 6.1963165e-05 9.4285714 + 58000 0.0009262852 0 4.2890115e-05 4.3909161e-05 6.5498785e-05 9.4285714 + 58100 0.00093298888 0 3.4648981e-05 3.9769303e-05 4.8809176e-05 9.4285714 + 58200 0.00093354721 0 2.9625295e-05 3.8316918e-05 4.9736312e-05 9.4285714 + 58300 0.00093283167 0 3.7120772e-05 3.3230543e-05 5.9892908e-05 9.4285714 + 58400 0.00093485322 0 3.2158058e-05 3.1324318e-05 4.9175918e-05 9.4285714 + 58500 0.00092566721 0 3.7365351e-05 2.89221e-05 5.5349063e-05 9.4285714 + 58600 0.00093205032 0 5.0065939e-05 5.3559803e-05 6.3571654e-05 9.4285714 + 58700 0.00094034992 0 3.8592173e-05 3.491305e-05 6.5379756e-05 9.4285714 + 58800 0.00096489026 0 4.1216942e-05 2.6009902e-05 7.102403e-05 9.4285714 + 58900 0.00097781296 0 6.3787952e-05 5.0445974e-05 6.6836738e-05 9.4285714 + 59000 0.00095088201 0 3.1388682e-05 2.6786636e-05 7.0766736e-05 9.4285714 + 59100 0.00092096092 0 4.7421629e-05 4.3182864e-05 7.2537665e-05 9.4285714 + 59200 0.0009112309 0 5.9256553e-05 5.4527325e-05 6.2965257e-05 9.4285714 + 59300 0.00090372653 0 3.3360205e-05 4.1028509e-05 6.9712928e-05 9.4285714 + 59400 0.00086115007 0 5.1420253e-05 8.2036947e-05 6.6038419e-05 9.4285714 + 59500 0.00078451189 0 7.66347e-05 7.591886e-05 6.2707873e-05 9.4285714 + 59600 0.00078587175 0 3.7807167e-05 3.6366682e-05 6.7965056e-05 9.4285714 + 59700 0.00080103949 0 5.7673906e-05 4.7966293e-05 7.051971e-05 9.4285714 + 59800 0.00078782591 0 4.4966944e-05 4.2368336e-05 6.5414206e-05 9.4285714 + 59900 0.00077243837 0 2.4721291e-05 4.6742391e-05 6.6324623e-05 9.4285714 + 60000 0.00075159859 0 5.8959702e-05 5.3911659e-05 7.3517042e-05 9.4285714 + 60100 0.00072169229 0 5.5959875e-05 5.9933611e-05 7.0405063e-05 9.4285714 + 60200 0.00067937954 0 8.4634924e-05 6.6869788e-05 7.3608653e-05 9.4285714 + 60300 0.00067260226 0 0.0001081277 4.7614083e-05 7.0175997e-05 9.4285714 + 60400 0.00069286984 0 5.9196097e-05 4.3191533e-05 5.2139603e-05 9.4285714 + 60500 0.00069736312 0 5.085609e-05 5.5875528e-05 6.6887124e-05 9.4285714 + 60600 0.00069858614 0 4.9289319e-05 4.5459761e-05 7.1668508e-05 9.4285714 + 60700 0.00069821214 0 3.1823553e-05 3.3716244e-05 5.5201529e-05 9.4285714 + 60800 0.0007035508 0 5.1159207e-05 3.5328208e-05 6.3688313e-05 9.4285714 + 60900 0.00070770846 0 4.0687682e-05 2.1755707e-05 6.6080801e-05 9.4285714 + 61000 0.00070195965 0 3.7971557e-05 2.1957987e-05 6.0082676e-05 9.4285714 + 61100 0.00067865064 0 5.7377129e-05 2.5987671e-05 6.872458e-05 9.4285714 + 61200 0.00063690893 0 3.9606468e-05 2.5848129e-05 6.6201193e-05 9.4285714 + 61300 0.00064194236 0 5.2441034e-05 3.4655185e-05 5.8671505e-05 9.4285714 + 61400 0.00063121847 0 4.7935018e-05 2.2491486e-05 5.8084377e-05 9.4285714 + 61500 0.00065356029 0 3.7527612e-05 2.0937477e-05 4.887051e-05 9.4285714 + 61600 0.00066743886 0 3.8559623e-05 2.5014056e-05 4.3951677e-05 9.4285714 + 61700 0.00064876312 0 3.2600293e-05 2.2241219e-05 5.700072e-05 9.4285714 + 61800 0.00063251553 0 3.7962233e-05 2.4996757e-05 6.3827843e-05 9.4285714 + 61900 0.00065196202 0 4.1125532e-05 2.1960645e-05 5.3369952e-05 9.4285714 + 62000 0.00066211487 0 3.5477887e-05 2.2798208e-05 4.6798579e-05 9.4285714 + 62100 0.00063838911 0 4.2783526e-05 3.0011478e-05 5.2953097e-05 9.4285714 + 62200 0.00062154839 0 4.2874196e-05 2.533148e-05 6.0806919e-05 9.4285714 + 62300 0.00063042258 0 3.7398998e-05 2.3748859e-05 5.50952e-05 9.4285714 + 62400 0.00064307282 0 4.2219258e-05 2.4395739e-05 4.2906023e-05 9.4285714 + 62500 0.00062261967 0 4.3025073e-05 2.0264778e-05 4.8658599e-05 9.4285714 + 62600 0.00053916399 0 3.5096062e-05 2.6627415e-05 6.589849e-05 9.4285714 + 62700 0.00057010612 0 3.1052104e-05 2.4098754e-05 5.5807999e-05 9.4285714 + 62800 0.00057237373 0 2.4705173e-05 2.7289243e-05 5.0697954e-05 9.4285714 + 62900 0.00056115858 0 3.4438793e-05 2.5529621e-05 6.6910453e-05 9.4285714 + 63000 0.0005691916 0 3.2831951e-05 3.4373261e-05 6.7414973e-05 9.4285714 + 63100 0.00056814223 0 3.0683193e-05 4.0598453e-05 6.0776437e-05 9.4285714 + 63200 0.00055359969 0 3.3021543e-05 2.205701e-05 6.6701949e-05 9.4285714 + 63300 0.00053663894 0 2.9793234e-05 2.4124459e-05 6.7366363e-05 9.4285714 + 63400 0.00055318219 0 3.5076151e-05 3.7492408e-05 6.7248496e-05 9.4285714 + 63500 0.0005601025 0 3.1596017e-05 2.838392e-05 5.758537e-05 9.4285714 + 63600 0.00054583913 0 3.1887335e-05 3.3258333e-05 6.4545104e-05 9.4285714 + 63700 0.00053483868 0 4.1596672e-05 3.1294263e-05 7.517425e-05 9.4285714 + 63800 0.00055522493 0 3.672744e-05 2.2703198e-05 5.6489688e-05 9.4285714 + 63900 0.00056121598 0 3.7366567e-05 3.3134619e-05 5.2202899e-05 9.4285714 + 64000 0.00054407633 0 4.3628447e-05 2.8715277e-05 6.6320822e-05 9.4285714 + 64100 0.00053661653 0 3.9455768e-05 2.7513024e-05 6.5322037e-05 9.4285714 + 64200 0.00055006192 0 3.8096257e-05 3.5652328e-05 5.7299498e-05 9.4285714 + 64300 0.00055163304 0 3.6955416e-05 3.1648454e-05 5.7391176e-05 9.4285714 + 64400 0.00053078787 0 3.7098375e-05 3.3595793e-05 6.6463932e-05 9.4285714 + 64500 0.00052058058 0 4.6628247e-05 3.4753784e-05 7.0892035e-05 9.4285714 + 64600 0.00052834957 0 4.414476e-05 3.6395151e-05 6.316293e-05 9.4285714 + 64700 0.00051311026 0 3.5727083e-05 3.8183336e-05 6.671273e-05 9.4285714 + 64800 0.00048606856 0 4.2559508e-05 4.0103891e-05 8.1477875e-05 9.4285714 + 64900 0.00047345864 0 5.0985821e-05 4.0731547e-05 7.1758651e-05 9.4285714 + 65000 0.00048454696 0 4.7098363e-05 4.2424083e-05 5.9782966e-05 9.4285714 + 65100 0.00048928041 0 3.8488893e-05 3.3069689e-05 6.763104e-05 9.4285714 + 65200 0.00047037779 0 3.7164979e-05 2.9130535e-05 6.7155792e-05 9.4285714 + 65300 0.000474477 0 3.9218249e-05 4.196618e-05 6.8795241e-05 9.4285714 + 65400 0.00047558993 0 3.8521073e-05 3.1043813e-05 7.1815292e-05 9.4285714 + 65500 0.00046258212 0 4.1593649e-05 3.414273e-05 7.5432256e-05 9.4285714 + 65600 0.00044433429 0 3.5579651e-05 5.4040477e-05 7.7356068e-05 9.4285714 + 65700 0.00045238336 0 3.9273267e-05 4.3267794e-05 6.3398702e-05 9.4285714 + 65800 0.00045926142 0 3.9114883e-05 4.3180432e-05 5.1925433e-05 9.4285714 + 65900 0.00045814994 0 3.5346175e-05 4.9168887e-05 5.5917302e-05 9.4285714 + 66000 0.00045395179 0 4.1802785e-05 4.1841434e-05 5.4654623e-05 9.4285714 + 66100 0.00044097892 0 4.303704e-05 4.8028086e-05 5.8818816e-05 9.4285714 + 66200 0.00041508101 0 4.8543666e-05 3.9621607e-05 7.3522108e-05 9.4285714 + 66300 0.00041227685 0 5.2084505e-05 4.5979245e-05 6.8430336e-05 9.4285714 + 66400 0.00039539458 0 4.6843181e-05 6.5667377e-05 6.7548286e-05 9.4285714 + 66500 0.00038647539 0 4.608784e-05 4.6277662e-05 6.9495307e-05 9.4285714 + 66600 0.00037432719 0 4.3913456e-05 3.8070862e-05 6.6935341e-05 9.4285714 + 66700 0.00035679642 0 5.5360539e-05 5.3483363e-05 7.063512e-05 9.4285714 + 66800 0.00034618795 0 5.847549e-05 4.4325179e-05 7.0488097e-05 9.4285714 + 66900 0.00032906055 0 5.8213474e-05 3.75252e-05 6.6649118e-05 9.4285714 + 67000 0.00031945785 0 6.3298441e-05 5.2701267e-05 7.7167191e-05 9.4285714 + 67100 0.00031672216 0 4.489739e-05 3.7559519e-05 7.3281523e-05 9.4285714 + 67200 0.00030445379 0 4.5513665e-05 4.0230046e-05 7.5439548e-05 9.4285714 + 67300 0.00028386109 0 5.0694754e-05 5.3700723e-05 8.5557097e-05 9.4285714 + 67400 0.00028463754 0 3.8391205e-05 3.3590941e-05 7.797623e-05 9.4285714 + 67500 0.00028212316 0 4.2863805e-05 4.5202441e-05 7.749573e-05 9.4285714 + 67600 0.00027447589 0 5.543118e-05 5.8396501e-05 7.4714483e-05 9.4285714 + 67700 0.00026388856 0 5.0592736e-05 4.4055104e-05 6.9911544e-05 9.4285714 + 67800 0.00024769801 0 6.5177148e-05 4.5745739e-05 6.5602599e-05 9.4285714 + 67900 0.00024192231 0 6.9377263e-05 4.6139865e-05 5.8414044e-05 9.4285714 + 68000 0.00023732277 0 5.0197197e-05 3.9809922e-05 5.4178627e-05 9.4285714 + 68100 0.0002230537 0 5.4643625e-05 4.3410202e-05 5.8363052e-05 9.4285714 + 68200 0.00020295655 0 5.7973425e-05 4.2934462e-05 5.3811509e-05 9.4285714 + 68300 0.0002040692 0 5.3065138e-05 3.4839799e-05 4.2275493e-05 9.4285714 + 68400 0.0001928169 0 6.1792781e-05 3.7412012e-05 4.3570824e-05 9.4285714 + 68500 0.00019326451 0 5.2340518e-05 3.8984277e-05 4.7626124e-05 9.4285714 + 68600 0.00019061041 0 3.3931824e-05 3.7677933e-05 4.0928013e-05 9.4285714 + 68700 0.00017904605 0 4.0673445e-05 4.3141559e-05 3.9727826e-05 9.4285714 + 68800 0.00017200167 0 3.8350528e-05 4.2946416e-05 3.8465748e-05 9.4285714 + 68900 0.00016728354 0 3.1344975e-05 4.3170379e-05 3.887812e-05 9.4285714 + 69000 0.00015703321 0 3.5673797e-05 4.8001887e-05 3.8324617e-05 9.4285714 + 69100 0.00014835113 0 4.4420071e-05 4.5039258e-05 3.7284097e-05 9.4285714 + 69200 0.00014631648 0 4.5177892e-05 3.9830143e-05 4.212271e-05 9.4285714 + 69300 0.00014587978 0 4.3274932e-05 3.563871e-05 4.1406359e-05 9.4285714 + 69400 0.0001418924 0 4.1983462e-05 3.3903645e-05 3.9133291e-05 9.4285714 + 69500 0.00013332024 0 4.1111435e-05 3.5405818e-05 4.5389867e-05 9.4285714 + 69600 0.00013320187 0 4.3136478e-05 3.8499769e-05 4.2978866e-05 9.4285714 + 69700 0.00013039836 0 3.9889343e-05 3.984009e-05 3.8089701e-05 9.4285714 + 69800 0.00012003394 0 4.0502669e-05 3.8418635e-05 4.4259944e-05 9.4285714 + 69900 0.00011651147 0 4.3215219e-05 3.6715848e-05 3.8146062e-05 9.4285714 + 70000 0.00012197106 0 3.5974329e-05 3.7263458e-05 3.1823087e-05 9.4285714 + 70100 0.00011813389 0 3.3261682e-05 3.922066e-05 3.7223065e-05 9.4285714 + 70200 0.00011097253 0 4.3507998e-05 4.1005238e-05 3.6828442e-05 9.4285714 + 70300 0.00010887364 0 4.2691098e-05 4.1645364e-05 3.1923473e-05 9.4285714 + 70400 0.00010916786 0 3.8897532e-05 3.8882274e-05 3.0505603e-05 9.4285714 + 70500 0.00010031774 0 4.4471407e-05 3.8144163e-05 3.4373186e-05 9.4285714 + 70600 9.1002834e-05 0 4.7098547e-05 3.649462e-05 3.426412e-05 9.4285714 + 70700 8.9186179e-05 0 4.3097819e-05 3.3856047e-05 2.6847974e-05 9.4285714 + 70800 9.1206485e-05 0 3.7704331e-05 3.2681829e-05 2.5848378e-05 9.4285714 + 70900 9.2333335e-05 0 3.5465377e-05 2.9981706e-05 2.5583227e-05 9.4285714 + 71000 9.1646266e-05 0 3.5132909e-05 2.8584216e-05 1.9282618e-05 9.4285714 + 71100 8.9976882e-05 0 3.1203655e-05 2.8088468e-05 2.108987e-05 9.4285714 + 71200 8.7702811e-05 0 2.9776889e-05 2.7094367e-05 2.4903607e-05 9.4285714 + 71300 8.6905185e-05 0 3.0520731e-05 2.732226e-05 2.3630509e-05 9.4285714 + 71400 8.5684023e-05 0 3.1640955e-05 2.8295849e-05 2.5514683e-05 9.4285714 + 71500 8.303695e-05 0 3.1906051e-05 2.8942238e-05 2.6131204e-05 9.4285714 + 71600 8.0199459e-05 0 3.0761704e-05 2.9470436e-05 2.487383e-05 9.4285714 + 71700 7.8917712e-05 0 3.2914973e-05 2.7677434e-05 2.5055145e-05 9.4285714 + 71800 8.006745e-05 0 3.1497824e-05 2.5000482e-05 2.4489101e-05 9.4285714 + 71900 7.8740588e-05 0 2.6991222e-05 2.460004e-05 2.3419712e-05 9.4285714 + 72000 7.758597e-05 0 2.8819401e-05 2.2478384e-05 2.4645592e-05 9.4285714 + 72100 7.7221401e-05 0 2.5009767e-05 1.991734e-05 2.4408972e-05 9.4285714 + 72200 7.6375029e-05 0 2.2842085e-05 2.1163227e-05 2.2915187e-05 9.4285714 + 72300 7.2834947e-05 0 2.6583555e-05 2.3097898e-05 2.3018668e-05 9.4285714 + 72400 7.2648265e-05 0 2.236431e-05 2.2607332e-05 2.3603044e-05 9.4285714 + 72500 7.3708292e-05 0 2.0776311e-05 2.25305e-05 2.4103466e-05 9.4285714 + 72600 7.1153221e-05 0 2.4306783e-05 2.313245e-05 2.3536247e-05 9.4285714 + 72700 6.9093949e-05 0 2.3601182e-05 2.178735e-05 2.3525837e-05 9.4285714 + 72800 7.0003138e-05 0 2.575131e-05 2.0944617e-05 2.5430066e-05 9.4285714 + 72900 7.097186e-05 0 2.6452603e-05 2.1328369e-05 2.53877e-05 9.4285714 + 73000 6.9754446e-05 0 2.213547e-05 2.0988145e-05 2.4646738e-05 9.4285714 + 73100 6.8919462e-05 0 2.2747069e-05 2.1416306e-05 2.4400352e-05 9.4285714 + 73200 7.0813485e-05 0 2.2484425e-05 2.0251199e-05 2.3243164e-05 9.4285714 + 73300 7.2448906e-05 0 1.9804724e-05 1.9246194e-05 2.1950811e-05 9.4285714 + 73400 7.1636811e-05 0 2.1255199e-05 2.0486399e-05 2.1055118e-05 9.4285714 + 73500 7.0735739e-05 0 2.0995952e-05 2.0423027e-05 2.0958957e-05 9.4285714 + 73600 7.103569e-05 0 2.0353207e-05 1.8013285e-05 2.1741465e-05 9.4285714 + 73700 7.1516165e-05 0 2.2806996e-05 1.7981222e-05 2.0668719e-05 9.4285714 + 73800 7.0454708e-05 0 2.2580346e-05 2.035185e-05 1.8435762e-05 9.4285714 + 73900 7.0921505e-05 0 2.1137284e-05 1.954202e-05 1.8049504e-05 9.4285714 + 74000 7.3462894e-05 0 2.0796149e-05 1.672734e-05 1.7886189e-05 9.4285714 + 74100 7.3200399e-05 0 1.9484009e-05 1.6171253e-05 1.7946802e-05 9.4285714 + 74200 7.1848724e-05 0 1.9770963e-05 1.743579e-05 1.9028311e-05 9.4285714 + 74300 7.2382347e-05 0 2.0879182e-05 1.7718467e-05 2.0981856e-05 9.4285714 + 74400 7.3931763e-05 0 2.0659065e-05 1.6936936e-05 2.2013677e-05 9.4285714 + 74500 7.4402751e-05 0 2.1252227e-05 1.8306621e-05 2.2140434e-05 9.4285714 + 74600 7.3859362e-05 0 2.1524301e-05 1.984441e-05 2.2433352e-05 9.4285714 + 74700 7.5361374e-05 0 2.0479515e-05 1.8257955e-05 2.2346749e-05 9.4285714 + 74800 7.7630509e-05 0 1.9658252e-05 1.7440486e-05 2.2082059e-05 9.4285714 + 74900 7.7455142e-05 0 1.9321421e-05 1.8948852e-05 2.2192267e-05 9.4285714 + 75000 7.6480769e-05 0 1.9864233e-05 1.958709e-05 2.2733891e-05 9.4285714 + 75100 7.7275693e-05 0 2.0777179e-05 1.8582778e-05 2.3848355e-05 9.4285714 + 75200 7.8822667e-05 0 2.0204804e-05 1.83074e-05 2.4082458e-05 9.4285714 + 75300 7.923137e-05 0 2.0681311e-05 2.0382671e-05 2.5228862e-05 9.4285714 + 75400 7.9015035e-05 0 2.1545898e-05 2.0989157e-05 2.7089143e-05 9.4285714 + 75500 8.0621162e-05 0 2.0520236e-05 1.9823266e-05 2.7897725e-05 9.4285714 + 75600 8.2299447e-05 0 1.9866765e-05 2.0164834e-05 2.7806735e-05 9.4285714 + 75700 8.1993378e-05 0 1.969152e-05 2.0690749e-05 2.7317517e-05 9.4285714 + 75800 8.1758987e-05 0 2.1884472e-05 2.0805882e-05 2.7195769e-05 9.4285714 + 75900 8.3084215e-05 0 2.4065485e-05 2.0289009e-05 2.8137854e-05 9.4285714 + 76000 8.197148e-05 0 2.3344459e-05 2.1043448e-05 2.9166608e-05 9.4285714 + 76100 7.3534139e-05 0 2.3656353e-05 2.1820885e-05 3.1715958e-05 9.4285714 + 76200 6.8283079e-05 0 1.8356974e-05 2.3351418e-05 3.3215539e-05 9.4285714 + 76300 7.8227289e-05 0 1.7533203e-05 2.0633655e-05 2.9627901e-05 9.4285714 + 76400 8.2994806e-05 0 2.2219758e-05 1.9318399e-05 2.6222999e-05 9.4285714 + 76500 8.3014892e-05 0 2.0667316e-05 2.3535727e-05 2.7388901e-05 9.4285714 + 76600 8.4226362e-05 0 1.8578669e-05 1.9657192e-05 2.6838122e-05 9.4285714 + 76700 8.6131526e-05 0 2.1318346e-05 1.9704283e-05 2.730706e-05 9.4285714 + 76800 8.5731394e-05 0 2.1580982e-05 2.4368187e-05 2.8520608e-05 9.4285714 + 76900 8.5941781e-05 0 2.0964064e-05 2.1327147e-05 2.8452609e-05 9.4285714 + 77000 8.8001094e-05 0 2.1055465e-05 2.1153136e-05 2.9261736e-05 9.4285714 + 77100 8.7224729e-05 0 2.157166e-05 2.54706e-05 3.1080633e-05 9.4285714 + 77200 8.4102799e-05 0 2.3215324e-05 2.4317882e-05 3.2166454e-05 9.4285714 + 77300 8.0313409e-05 0 2.3799728e-05 2.6151429e-05 3.549803e-05 9.4285714 + 77400 7.9230413e-05 0 2.5607704e-05 2.6668597e-05 3.4909306e-05 9.4285714 + 77500 7.811033e-05 0 2.7044141e-05 2.3924967e-05 3.6517465e-05 9.4285714 + 77600 7.7683573e-05 0 2.8108404e-05 2.590653e-05 4.0314953e-05 9.4285714 + 77700 7.5680467e-05 0 2.7599437e-05 2.6044761e-05 4.0283563e-05 9.4285714 + 77800 7.3449559e-05 0 2.8230675e-05 2.6304803e-05 4.0873298e-05 9.4285714 + 77900 7.3292429e-05 0 2.9736972e-05 2.7258167e-05 4.1876044e-05 9.4285714 + 78000 7.2392133e-05 0 3.1088456e-05 2.6772279e-05 4.2237468e-05 9.4285714 + 78100 7.0315679e-05 0 3.2315727e-05 2.629787e-05 4.2149426e-05 9.4285714 + 78200 7.1047062e-05 0 3.1623093e-05 2.447182e-05 4.0466876e-05 9.4285714 + 78300 6.8370248e-05 0 3.0139466e-05 2.3241895e-05 4.2084152e-05 9.4285714 + 78400 6.5550877e-05 0 3.5775791e-05 2.5111452e-05 4.5314214e-05 9.4285714 + 78500 6.1683926e-05 0 3.8020582e-05 2.4959462e-05 4.6453459e-05 9.4285714 + 78600 6.024047e-05 0 3.2986067e-05 2.5137808e-05 4.5563449e-05 9.4285714 + 78700 5.8543178e-05 0 3.3264031e-05 2.7364741e-05 4.56211e-05 9.4285714 + 78800 5.5383435e-05 0 3.3858442e-05 2.688989e-05 4.3178362e-05 9.4285714 + 78900 5.6871546e-05 0 3.3719755e-05 2.876403e-05 4.0383023e-05 9.4285714 + 79000 5.7192958e-05 0 3.419205e-05 3.2389045e-05 3.7915888e-05 9.4285714 + 79100 4.9998926e-05 0 3.9072498e-05 3.2982953e-05 4.5441877e-05 9.4285714 + 79200 4.9597887e-05 0 3.9993615e-05 3.3651972e-05 4.2214811e-05 9.4285714 + 79300 4.8603326e-05 0 3.4873095e-05 2.8101438e-05 2.9613495e-05 9.4285714 + 79400 4.7839304e-05 0 3.7935926e-05 2.6994548e-05 3.9174337e-05 9.4285714 + 79500 4.5739018e-05 0 3.7706927e-05 2.8505307e-05 3.9904116e-05 9.4285714 + 79600 4.2632104e-05 0 3.6880213e-05 3.0862386e-05 3.7417378e-05 9.4285714 + 79700 4.2716432e-05 0 3.862769e-05 3.295245e-05 4.4025915e-05 9.4285714 + 79800 4.3345358e-05 0 3.3850977e-05 2.8351966e-05 3.6271267e-05 9.4285714 + 79900 4.2476967e-05 0 3.1294363e-05 3.0560471e-05 3.5478598e-05 9.4285714 + 80000 4.0478442e-05 0 3.266321e-05 3.0397886e-05 3.74445e-05 9.4285714 + 80100 3.7842198e-05 0 3.3319254e-05 2.6553639e-05 3.0532809e-05 9.4285714 + 80200 2.8735215e-05 0 3.5014894e-05 3.2176514e-05 3.410418e-05 9.4285714 + 80300 2.5008575e-05 0 3.4679934e-05 3.3840734e-05 3.4314525e-05 9.4285714 + 80400 2.7560228e-05 0 3.2852873e-05 2.8962633e-05 3.0394406e-05 9.4285714 + 80500 3.0888649e-05 0 3.1507484e-05 2.597095e-05 3.271808e-05 9.4285714 + 80600 3.2512804e-05 0 3.0931277e-05 2.304269e-05 3.0253759e-05 9.4285714 + 80700 3.0635649e-05 0 3.1660238e-05 2.2282821e-05 2.8199016e-05 9.4285714 + 80800 2.7803874e-05 0 3.1776181e-05 2.4038027e-05 2.845472e-05 9.4285714 + 80900 2.7488104e-05 0 3.1599213e-05 2.3316746e-05 2.5212454e-05 9.4285714 + 81000 2.5760367e-05 0 3.5293658e-05 2.354429e-05 2.7532559e-05 9.4285714 + 81100 2.0516969e-05 0 3.67195e-05 2.8706508e-05 2.9782185e-05 9.4285714 + 81200 1.7005384e-05 0 3.5049273e-05 2.3159655e-05 2.8465517e-05 9.4285714 + 81300 1.8000969e-05 0 3.3259531e-05 2.0532469e-05 3.0967269e-05 9.4285714 + 81400 1.8404948e-05 0 2.8386836e-05 2.4730451e-05 2.8965301e-05 9.4285714 + 81500 1.7001638e-05 0 2.6431741e-05 2.1156098e-05 2.5679646e-05 9.4285714 + 81600 1.718853e-05 0 2.6737455e-05 2.2477484e-05 2.9190604e-05 9.4285714 + 81700 1.7653551e-05 0 2.5412396e-05 2.4251603e-05 2.8969143e-05 9.4285714 + 81800 1.60697e-05 0 2.5869197e-05 2.308932e-05 2.7379341e-05 9.4285714 + 81900 1.5286837e-05 0 2.6529612e-05 2.5419771e-05 2.8440593e-05 9.4285714 + 82000 1.6023107e-05 0 2.5756598e-05 2.4387052e-05 2.6106537e-05 9.4285714 + 82100 1.5242285e-05 0 2.7061408e-05 2.3032818e-05 2.4388599e-05 9.4285714 + 82200 1.3697011e-05 0 2.8635719e-05 2.3780226e-05 2.4906811e-05 9.4285714 + 82300 1.3126258e-05 0 2.9891427e-05 2.2014465e-05 2.4307976e-05 9.4285714 + 82400 1.3101796e-05 0 2.974623e-05 2.1196997e-05 2.3335031e-05 9.4285714 + 82500 1.2930812e-05 0 2.776572e-05 2.1405191e-05 2.1856013e-05 9.4285714 + 82600 1.2105591e-05 0 2.677033e-05 2.1158183e-05 2.1053083e-05 9.4285714 + 82700 1.1430058e-05 0 2.6491101e-05 2.2185095e-05 2.1741395e-05 9.4285714 + 82800 1.1220674e-05 0 2.5798118e-05 2.2107127e-05 2.2026313e-05 9.4285714 + 82900 1.0833337e-05 0 2.6248963e-05 2.2128181e-05 2.2633178e-05 9.4285714 + 83000 9.6966107e-06 0 2.6264061e-05 2.2728458e-05 2.4189433e-05 9.4285714 + 83100 9.7912048e-06 0 2.5500083e-05 2.1832923e-05 2.4004267e-05 9.4285714 + 83200 1.0342776e-05 0 2.5894996e-05 2.1114752e-05 2.2781046e-05 9.4285714 + 83300 9.1053605e-06 0 2.6844449e-05 2.1683135e-05 2.3018942e-05 9.4285714 + 83400 8.1376574e-06 0 2.7698506e-05 2.1715141e-05 2.3249723e-05 9.4285714 + 83500 8.3013823e-06 0 2.7841933e-05 2.1301843e-05 2.2608819e-05 9.4285714 + 83600 7.5747246e-06 0 2.7285945e-05 2.1917666e-05 2.1940362e-05 9.4285714 + 83700 6.7051973e-06 0 2.6570578e-05 2.2457872e-05 2.1768e-05 9.4285714 + 83800 6.7732855e-06 0 2.5876203e-05 2.1870094e-05 2.1810098e-05 9.4285714 + 83900 6.455146e-06 0 2.613284e-05 2.1133229e-05 2.141307e-05 9.4285714 + 84000 6.033363e-06 0 2.5796758e-05 2.0740854e-05 2.1789962e-05 9.4285714 + 84100 6.1544361e-06 0 2.4880893e-05 2.034968e-05 2.2632001e-05 9.4285714 + 84200 5.8120515e-06 0 2.4372967e-05 2.0939262e-05 2.3739495e-05 9.4285714 + 84300 5.5925414e-06 0 2.5190413e-05 2.2054067e-05 2.5134858e-05 9.4285714 + 84400 5.9495987e-06 0 2.5163487e-05 2.2235018e-05 2.5089027e-05 9.4285714 + 84500 5.7713446e-06 0 2.5203284e-05 2.2008136e-05 2.4683255e-05 9.4285714 + 84600 5.2346414e-06 0 2.5750616e-05 2.2385286e-05 2.5060127e-05 9.4285714 + 84700 5.3677312e-06 0 2.5671418e-05 2.2504517e-05 2.477615e-05 9.4285714 + 84800 5.5545452e-06 0 2.5270776e-05 2.203669e-05 2.4371077e-05 9.4285714 + 84900 5.35857e-06 0 2.4990364e-05 2.1994432e-05 2.4434211e-05 9.4285714 + 85000 5.4081539e-06 0 2.4614554e-05 2.1826659e-05 2.4080584e-05 9.4285714 + 85100 5.6686315e-06 0 2.4255405e-05 2.1348341e-05 2.3692087e-05 9.4285714 + 85200 5.6470622e-06 0 2.4490625e-05 2.1444906e-05 2.3461274e-05 9.4285714 + 85300 5.4542991e-06 0 2.5038089e-05 2.159186e-05 2.3411228e-05 9.4285714 + 85400 5.5974388e-06 0 2.5208624e-05 2.1456353e-05 2.3090313e-05 9.4285714 + 85500 5.9109345e-06 0 2.5019187e-05 2.1326993e-05 2.2631876e-05 9.4285714 + 85600 5.8895141e-06 0 2.4816097e-05 2.1032266e-05 2.2641694e-05 9.4285714 + 85700 5.8470051e-06 0 2.4753057e-05 2.1011299e-05 2.2893303e-05 9.4285714 + 85800 6.060997e-06 0 2.4718385e-05 2.1024683e-05 2.3160395e-05 9.4285714 + 85900 6.1217894e-06 0 2.4939406e-05 2.0910983e-05 2.3606002e-05 9.4285714 + 86000 5.7550467e-06 0 2.5292227e-05 2.1210494e-05 2.3980265e-05 9.4285714 + 86100 5.6513685e-06 0 2.5336254e-05 2.1695151e-05 2.4295958e-05 9.4285714 + 86200 5.7555479e-06 0 2.5214702e-05 2.2162992e-05 2.4153262e-05 9.4285714 + 86300 5.7587322e-06 0 2.5471626e-05 2.2752108e-05 2.4566282e-05 9.4285714 + 86400 5.8389333e-06 0 2.5581374e-05 2.2866696e-05 2.5080456e-05 9.4285714 + 86500 5.9431034e-06 0 2.5603078e-05 2.2611552e-05 2.557061e-05 9.4285714 + 86600 5.9655129e-06 0 2.5809196e-05 2.2505729e-05 2.5920358e-05 9.4285714 + 86700 6.042955e-06 0 2.5516399e-05 2.207345e-05 2.4941272e-05 9.4285714 + 86800 6.2666413e-06 0 2.5017309e-05 2.1757271e-05 2.4325659e-05 9.4285714 + 86900 6.5118003e-06 0 2.4709906e-05 2.1733726e-05 2.4359289e-05 9.4285714 + 87000 6.7509257e-06 0 2.424948e-05 2.1511123e-05 2.4005052e-05 9.4285714 + 87100 6.9118143e-06 0 2.4403465e-05 2.1411555e-05 2.4138929e-05 9.4285714 + 87200 6.9983412e-06 0 2.4855429e-05 2.1301042e-05 2.4635518e-05 9.4285714 + 87300 7.2267392e-06 0 2.4726242e-05 2.1200486e-05 2.4816636e-05 9.4285714 + 87400 7.3928522e-06 0 2.4568177e-05 2.1782095e-05 2.546145e-05 9.4285714 + 87500 7.1675783e-06 0 2.4583963e-05 2.2927936e-05 2.610685e-05 9.4285714 + 87600 6.9310557e-06 0 2.4419972e-05 2.3641933e-05 2.674206e-05 9.4285714 + 87700 6.8020949e-06 0 2.4799319e-05 2.3877016e-05 2.686282e-05 9.4285714 + 87800 6.7871509e-06 0 2.5501599e-05 2.3391832e-05 2.6476337e-05 9.4285714 + 87900 7.1459737e-06 0 2.5746275e-05 2.2468174e-05 2.6106668e-05 9.4285714 + 88000 7.4791665e-06 0 2.6452673e-05 2.2371733e-05 2.6426643e-05 9.4285714 + 88100 7.4418527e-06 0 2.7237517e-05 2.2696988e-05 2.6866222e-05 9.4285714 + 88200 6.8171325e-06 0 2.835739e-05 2.2805248e-05 2.7767937e-05 9.4285714 + 88300 5.9535317e-06 0 3.0022892e-05 2.3162212e-05 2.9121854e-05 9.4285714 + 88400 5.8054385e-06 0 3.0267499e-05 2.4036541e-05 2.9451731e-05 9.4285714 + 88500 5.7381974e-06 0 2.987853e-05 2.4412659e-05 2.9022854e-05 9.4285714 + 88600 5.8193958e-06 0 2.9306631e-05 2.4291387e-05 2.9042278e-05 9.4285714 + 88700 5.7843884e-06 0 2.8474902e-05 2.407517e-05 2.9342631e-05 9.4285714 + 88800 5.36122e-06 0 2.9228687e-05 2.4074387e-05 3.0069005e-05 9.4285714 + 88900 4.9662584e-06 0 2.9640221e-05 2.4381438e-05 3.0842974e-05 9.4285714 + 89000 5.0244565e-06 0 2.9242167e-05 2.3718494e-05 3.0959647e-05 9.4285714 + 89100 5.2140172e-06 0 2.9460854e-05 2.2966219e-05 3.0745899e-05 9.4285714 + 89200 5.4241028e-06 0 2.8931798e-05 2.2787347e-05 3.0505146e-05 9.4285714 + 89300 5.354843e-06 0 2.8226483e-05 2.2430309e-05 3.0543304e-05 9.4285714 + 89400 4.9583346e-06 0 2.8529104e-05 2.2510089e-05 3.0744349e-05 9.4285714 + 89500 4.7804845e-06 0 2.8283425e-05 2.3168387e-05 3.0368794e-05 9.4285714 + 89600 4.5353969e-06 0 2.8369715e-05 2.3890917e-05 2.9944272e-05 9.4285714 + 89700 4.3528727e-06 0 2.916536e-05 2.4717547e-05 2.9897586e-05 9.4285714 + 89800 4.0677397e-06 0 2.9671051e-05 2.5069631e-05 2.9727134e-05 9.4285714 + 89900 3.4743886e-06 0 3.0546148e-05 2.5204424e-05 2.9429413e-05 9.4285714 + 90000 2.9448035e-06 0 3.1386975e-05 2.504163e-05 2.8941476e-05 9.4285714 + 90100 2.8584378e-06 0 3.0989836e-05 2.426512e-05 2.8680422e-05 9.4285714 + 90200 3.0154097e-06 0 3.0109363e-05 2.3659678e-05 2.879077e-05 9.4285714 + 90300 3.0998012e-06 0 2.9214408e-05 2.3299406e-05 2.8821376e-05 9.4285714 + 90400 3.0622205e-06 0 2.866651e-05 2.2666679e-05 2.8865145e-05 9.4285714 + 90500 2.8987354e-06 0 2.8403824e-05 2.1925714e-05 2.8481892e-05 9.4285714 + 90600 2.6710434e-06 0 2.8143313e-05 2.1522559e-05 2.8171438e-05 9.4285714 + 90700 2.4095074e-06 0 2.8048981e-05 2.1523007e-05 2.8016792e-05 9.4285714 + 90800 2.202904e-06 0 2.8166412e-05 2.1813639e-05 2.7412255e-05 9.4285714 + 90900 2.3181295e-06 0 2.8435465e-05 2.2251451e-05 2.6819024e-05 9.4285714 + 91000 2.3141951e-06 0 2.8538853e-05 2.2733208e-05 2.6507917e-05 9.4285714 + 91100 2.0683071e-06 0 2.8191515e-05 2.3157829e-05 2.609377e-05 9.4285714 + 91200 1.8857219e-06 0 2.7771042e-05 2.3580857e-05 2.55034e-05 9.4285714 + 91300 1.8327584e-06 0 2.7428616e-05 2.360497e-05 2.4609829e-05 9.4285714 + 91400 1.804747e-06 0 2.713938e-05 2.3052505e-05 2.3890628e-05 9.4285714 + 91500 1.6349771e-06 0 2.7072497e-05 2.2465059e-05 2.3592759e-05 9.4285714 + 91600 1.5216476e-06 0 2.6887207e-05 2.1845019e-05 2.327018e-05 9.4285714 + 91700 1.6141413e-06 0 2.6727574e-05 2.134873e-05 2.3175757e-05 9.4285714 + 91800 1.6435107e-06 0 2.6837186e-05 2.1372811e-05 2.3272056e-05 9.4285714 + 91900 1.5649292e-06 0 2.6814814e-05 2.149563e-05 2.3262763e-05 9.4285714 + 92000 1.5598003e-06 0 2.6894688e-05 2.1612813e-05 2.3333181e-05 9.4285714 + 92100 1.5645521e-06 0 2.7093666e-05 2.1677323e-05 2.3393885e-05 9.4285714 + 92200 1.5384794e-06 0 2.725352e-05 2.1871439e-05 2.3309607e-05 9.4285714 + 92300 1.5428705e-06 0 2.7534493e-05 2.2028165e-05 2.3281919e-05 9.4285714 + 92400 1.5481835e-06 0 2.7738128e-05 2.1877013e-05 2.3365103e-05 9.4285714 + 92500 1.5193765e-06 0 2.7807402e-05 2.1697756e-05 2.3422801e-05 9.4285714 + 92600 1.4779648e-06 0 2.7822075e-05 2.1595936e-05 2.3653604e-05 9.4285714 + 92700 1.4401385e-06 0 2.7498575e-05 2.1565328e-05 2.3855716e-05 9.4285714 + 92800 1.4263884e-06 0 2.7219859e-05 2.1753979e-05 2.3901241e-05 9.4285714 + 92900 1.4318392e-06 0 2.696367e-05 2.202186e-05 2.4060393e-05 9.4285714 + 93000 1.4336111e-06 0 2.6591513e-05 2.2195157e-05 2.4122065e-05 9.4285714 + 93100 1.4541758e-06 0 2.6692487e-05 2.2344968e-05 2.4065021e-05 9.4285714 + 93200 1.4657669e-06 0 2.7168313e-05 2.2538418e-05 2.4214674e-05 9.4285714 + 93300 1.4040886e-06 0 2.7561907e-05 2.2761637e-05 2.4475223e-05 9.4285714 + 93400 1.2988064e-06 0 2.7861831e-05 2.2852224e-05 2.4956596e-05 9.4285714 + 93500 1.2005872e-06 0 2.7794033e-05 2.2910857e-05 2.5291935e-05 9.4285714 + 93600 1.1148329e-06 0 2.7652398e-05 2.3024188e-05 2.5433821e-05 9.4285714 + 93700 1.0710007e-06 0 2.7712404e-05 2.3143904e-05 2.5669435e-05 9.4285714 + 93800 1.0923979e-06 0 2.7720612e-05 2.3112739e-05 2.5821686e-05 9.4285714 + 93900 1.1070785e-06 0 2.7887865e-05 2.3159397e-05 2.5903855e-05 9.4285714 + 94000 1.0836182e-06 0 2.8174509e-05 2.3354232e-05 2.6074704e-05 9.4285714 + 94100 1.0712532e-06 0 2.8077928e-05 2.3330714e-05 2.6150142e-05 9.4285714 + 94200 1.1089242e-06 0 2.802336e-05 2.3220275e-05 2.6308674e-05 9.4285714 + 94300 1.1709624e-06 0 2.7885676e-05 2.3027073e-05 2.647883e-05 9.4285714 + 94400 1.1698851e-06 0 2.7597204e-05 2.2765961e-05 2.6575165e-05 9.4285714 + 94500 1.1331311e-06 0 2.7664548e-05 2.2696186e-05 2.6782703e-05 9.4285714 + 94600 1.1611176e-06 0 2.7821396e-05 2.2709988e-05 2.6961488e-05 9.4285714 + 94700 1.2014763e-06 0 2.8024363e-05 2.2788622e-05 2.7146644e-05 9.4285714 + 94800 1.1833928e-06 0 2.8490371e-05 2.3037146e-05 2.7316537e-05 9.4285714 + 94900 1.1648449e-06 0 2.8748715e-05 2.3166372e-05 2.7288373e-05 9.4285714 + 95000 1.1252279e-06 0 2.8777487e-05 2.3105996e-05 2.7264426e-05 9.4285714 + 95100 1.0516851e-06 0 2.8696839e-05 2.2985372e-05 2.7310067e-05 9.4285714 + 95200 1.0245214e-06 0 2.8641497e-05 2.2873e-05 2.7310438e-05 9.4285714 + 95300 1.0235812e-06 0 2.8690066e-05 2.3000448e-05 2.7335977e-05 9.4285714 + 95400 9.6956254e-07 0 2.8724738e-05 2.3259027e-05 2.7322308e-05 9.4285714 + 95500 8.9262312e-07 0 2.8843131e-05 2.3531751e-05 2.7254991e-05 9.4285714 + 95600 8.6064987e-07 0 2.8996711e-05 2.3635882e-05 2.7093251e-05 9.4285714 + 95700 8.7096432e-07 0 2.8878604e-05 2.3473478e-05 2.6743784e-05 9.4285714 + 95800 8.5278957e-07 0 2.8703214e-05 2.3266697e-05 2.6409822e-05 9.4285714 + 95900 7.9717781e-07 0 2.8645528e-05 2.3062215e-05 2.6251555e-05 9.4285714 + 96000 7.7875968e-07 0 2.8643986e-05 2.2987641e-05 2.6323848e-05 9.4285714 + 96100 7.8525813e-07 0 2.8773044e-05 2.3055913e-05 2.6556088e-05 9.4285714 + 96200 7.7518366e-07 0 2.8878871e-05 2.3101151e-05 2.6812081e-05 9.4285714 + 96300 7.6015915e-07 0 2.8820245e-05 2.3136672e-05 2.6915584e-05 9.4285714 + 96400 7.4067407e-07 0 2.8661992e-05 2.3169734e-05 2.6801804e-05 9.4285714 + 96500 7.0061605e-07 0 2.8400346e-05 2.3121121e-05 2.6529198e-05 9.4285714 + 96600 6.6164038e-07 0 2.8306211e-05 2.3011655e-05 2.6142152e-05 9.4285714 + 96700 6.5255615e-07 0 2.8340108e-05 2.2886154e-05 2.5768282e-05 9.4285714 + 96800 6.5992528e-07 0 2.8315654e-05 2.2712955e-05 2.5506907e-05 9.4285714 + 96900 6.618124e-07 0 2.8440952e-05 2.2580367e-05 2.5361502e-05 9.4285714 + 97000 6.7139818e-07 0 2.8508432e-05 2.253211e-05 2.5304698e-05 9.4285714 + 97100 6.8703272e-07 0 2.8403291e-05 2.25734e-05 2.5272649e-05 9.4285714 + 97200 6.9368757e-07 0 2.8254045e-05 2.2793415e-05 2.5257036e-05 9.4285714 + 97300 6.9652913e-07 0 2.8016561e-05 2.3040992e-05 2.5228068e-05 9.4285714 + 97400 6.9671901e-07 0 2.7837036e-05 2.330333e-05 2.5157239e-05 9.4285714 + 97500 6.891306e-07 0 2.7789433e-05 2.3471237e-05 2.5141846e-05 9.4285714 + 97600 6.76426e-07 0 2.7838847e-05 2.3472664e-05 2.518892e-05 9.4285714 + 97700 6.5763751e-07 0 2.794167e-05 2.3370888e-05 2.5139127e-05 9.4285714 + 97800 6.4854556e-07 0 2.7951511e-05 2.3224106e-05 2.5036326e-05 9.4285714 + 97900 6.5336861e-07 0 2.7923239e-05 2.3092342e-05 2.4920514e-05 9.4285714 + 98000 6.6394525e-07 0 2.7871431e-05 2.2947013e-05 2.480383e-05 9.4285714 + 98100 6.8885885e-07 0 2.7765273e-05 2.2790639e-05 2.4801777e-05 9.4285714 + 98200 7.2201864e-07 0 2.7755504e-05 2.2661812e-05 2.4861739e-05 9.4285714 + 98300 7.3816538e-07 0 2.7765573e-05 2.258486e-05 2.4844206e-05 9.4285714 + 98400 7.3631403e-07 0 2.7757701e-05 2.2578908e-05 2.4841191e-05 9.4285714 + 98500 7.2568853e-07 0 2.7848802e-05 2.2595958e-05 2.4892777e-05 9.4285714 + 98600 7.0490905e-07 0 2.7912207e-05 2.2591875e-05 2.4898698e-05 9.4285714 + 98700 6.8484202e-07 0 2.8009272e-05 2.2597685e-05 2.4985899e-05 9.4285714 + 98800 6.6994522e-07 0 2.8202402e-05 2.2643734e-05 2.5127513e-05 9.4285714 + 98900 6.2867752e-07 0 2.8292405e-05 2.2674349e-05 2.5309578e-05 9.4285714 + 99000 5.6999626e-07 0 2.8348569e-05 2.2698075e-05 2.5569326e-05 9.4285714 + 99100 5.2675078e-07 0 2.838436e-05 2.2796837e-05 2.5828965e-05 9.4285714 + 99200 4.9993032e-07 0 2.8326221e-05 2.2925652e-05 2.6095918e-05 9.4285714 + 99300 4.8034362e-07 0 2.8358043e-05 2.3048697e-05 2.6357518e-05 9.4285714 + 99400 4.633455e-07 0 2.8395008e-05 2.3187019e-05 2.6590148e-05 9.4285714 + 99500 4.423417e-07 0 2.840813e-05 2.3327273e-05 2.679518e-05 9.4285714 + 99600 4.2336865e-07 0 2.8409328e-05 2.3446846e-05 2.6875881e-05 9.4285714 + 99700 4.0950396e-07 0 2.831088e-05 2.347619e-05 2.6867125e-05 9.4285714 + 99800 3.8946719e-07 0 2.8187415e-05 2.3361958e-05 2.6862163e-05 9.4285714 + 99900 3.5789226e-07 0 2.8087326e-05 2.3222723e-05 2.6889683e-05 9.4285714 + 100000 3.23165e-07 0 2.7995448e-05 2.3145322e-05 2.7024051e-05 9.4285714 +Loop time of 205.426 on 4 procs for 100000 steps with 2520 atoms + +Performance: 2102947.143 tau/day, 486.793 timesteps/s +98.8% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.17838 | 1.2371 | 4.1955 | 153.6 | 0.60 +Bond | 3.018 | 52.249 | 174.87 | 982.2 | 25.43 +Neigh | 3.0057 | 3.0272 | 3.0411 | 0.8 | 1.47 +Comm | 2.8631 | 70.899 | 175.73 | 758.8 | 34.51 +Output | 0.1676 | 1.5052 | 3.0742 | 109.6 | 0.73 +Modify | 1.0679 | 5.7589 | 17.359 | 279.9 | 2.80 +Other | | 70.75 | | | 34.44 + +Nlocal: 630 ave 2513 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 39.25 ave 150 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Neighs: 2458 ave 9821 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 9832 +Ave neighs/atom = 3.9015873 +Ave special neighs/atom = 36.31746 +Neighbor list builds = 5178 +Dangerous builds = 314 +Total wall time: 0:03:25 diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index b019815cfa..90aebccc9d 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -14,6 +14,7 @@ #include "bond_bpm.h" #include "atom.h" +#include "comm.h" #include "domain.h" #include "error.h" #include "fix_bond_history.h" @@ -286,6 +287,33 @@ double BondBPM::equilibrium_distance(int /*i*/) return max_stretch * r0_max_estimate / 1.5; } +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void BondBPM::write_restart(FILE *fp) +{ + fwrite(&max_stretch, sizeof(double), 1, fp); + fwrite(&r0_max_estimate, sizeof(double), 1, fp); + fwrite(&overlay_flag, sizeof(int), 1, fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void BondBPM::read_restart(FILE *fp) +{ + if (comm->me == 0) { + utils::sfread(FLERR, &max_stretch, sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &r0_max_estimate, sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &overlay_flag, sizeof(int), 1, fp, nullptr, error); + } + MPI_Bcast(&max_stretch, 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&r0_max_estimate, 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&overlay_flag, 1, MPI_INT, 0, world); +} + /* ---------------------------------------------------------------------- */ void BondBPM::process_broken(int i, int j) diff --git a/src/BPM/bond_bpm.h b/src/BPM/bond_bpm.h index 914e91ff82..7a32ec2d0d 100644 --- a/src/BPM/bond_bpm.h +++ b/src/BPM/bond_bpm.h @@ -29,9 +29,8 @@ class BondBPM : public Bond { void init_style() override; void settings(int, char **) override; double equilibrium_distance(int) override; - void write_restart(FILE *) override{}; - void read_restart(FILE *) override{}; - void write_data(FILE *) override{}; + void write_restart(FILE *) override; + void read_restart(FILE *) override; double single(int, double, int, int, double &) override = 0; protected: diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index f885dead28..fe1071e127 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -35,18 +35,6 @@ using namespace LAMMPS_NS; BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) : BondBPM(_lmp) { - Kr = nullptr; - Ks = nullptr; - Kt = nullptr; - Kb = nullptr; - Fcr = nullptr; - Fcs = nullptr; - Tct = nullptr; - Tcb = nullptr; - gnorm = nullptr; - gslide = nullptr; - groll = nullptr; - gtwist = nullptr; partial_flag = 1; smooth_flag = 1; @@ -195,7 +183,7 @@ void BondBPMRotational::store_data() 2) P. Mora & Y. Wang Advances in Geomcomputing 2009 ---------------------------------------------------------------------- */ -double BondBPMRotational::elastic_forces(int i1, int i2, int type, double &Fr, double r_mag, +double BondBPMRotational::elastic_forces(int i1, int i2, int type, double r_mag, double r0_mag, double r_mag_inv, double * /*rhat*/, double *r, double *r0, double *force1on2, double *torque1on2, double *torque2on1) @@ -208,7 +196,7 @@ double BondBPMRotational::elastic_forces(int i1, int i2, int type, double &Fr, d double q1[4], q2[4]; double q2inv[4], mq[4], mqinv[4], qp21[4], q21[4], qtmp[4]; double rb[3], rb_x_r0[3], s[3], t[3]; - double Fs[3], Fsp[3], F_rot[3], Ftmp[3]; + double Fr, Fs[3], Fsp[3], F_rot[3], Ftmp[3]; double Ts[3], Tb[3], Tt[3], Tbp[3], Ttp[3], Tsp[3], T_rot[3], Ttmp[3]; double **quat = atom->quat; @@ -377,7 +365,7 @@ double BondBPMRotational::elastic_forces(int i1, int i2, int type, double &Fr, d Note: n points towards 1 vs pointing towards 2 ---------------------------------------------------------------------- */ -void BondBPMRotational::damping_forces(int i1, int i2, int type, double &Fr, double *rhat, +void BondBPMRotational::damping_forces(int i1, int i2, int type, double *rhat, double *r, double *force1on2, double *torque1on2, double *torque2on1) { @@ -398,7 +386,6 @@ void BondBPMRotational::damping_forces(int i1, int i2, int type, double &Fr, dou MathExtra::sub3(vn1, vn2, tmp); MathExtra::scale3(gnorm[type], tmp); - Fr = MathExtra::lensq3(tmp); MathExtra::add3(force1on2, tmp, force1on2); // Damp tangential objective velocities @@ -464,7 +451,7 @@ void BondBPMRotational::compute(int eflag, int vflag) int i1, i2, itmp, n, type; double r[3], r0[3], rhat[3]; double rsq, r0_mag, r_mag, r_mag_inv; - double Fr, breaking, smooth; + double breaking, smooth; double force1on2[3], torque1on2[3], torque2on1[3]; ev_init(eflag, vflag); @@ -520,7 +507,7 @@ void BondBPMRotational::compute(int eflag, int vflag) // Calculate forces, check if bond breaks // ------------------------------------------------------// - breaking = elastic_forces(i1, i2, type, Fr, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, + breaking = elastic_forces(i1, i2, type, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, torque1on2, torque2on1); if (breaking >= 1.0) { @@ -529,7 +516,7 @@ void BondBPMRotational::compute(int eflag, int vflag) continue; } - damping_forces(i1, i2, type, Fr, rhat, r, force1on2, torque1on2, torque2on1); + damping_forces(i1, i2, type, rhat, r, force1on2, torque1on2, torque2on1); if (smooth_flag) { smooth = breaking * breaking; @@ -562,7 +549,7 @@ void BondBPMRotational::compute(int eflag, int vflag) torque[i2][2] += torque1on2[2] * smooth; } - if (evflag) ev_tally(i1, i2, nlocal, newton_bond, 0.0, Fr * smooth, r[0], r[1], r[2]); + if (evflag) ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth, -force1on2[2] * smooth, r[0], r[1], r[2]); } } @@ -688,6 +675,9 @@ void BondBPMRotational::settings(int narg, char **arg) void BondBPMRotational::write_restart(FILE *fp) { + BondBPM::write_restart(fp); + write_restart_settings(fp); + fwrite(&Kr[1], sizeof(double), atom->nbondtypes, fp); fwrite(&Ks[1], sizeof(double), atom->nbondtypes, fp); fwrite(&Kt[1], sizeof(double), atom->nbondtypes, fp); @@ -708,6 +698,8 @@ void BondBPMRotational::write_restart(FILE *fp) void BondBPMRotational::read_restart(FILE *fp) { + BondBPM::read_restart(fp); + read_restart_settings(fp); allocate(); if (comm->me == 0) { @@ -740,6 +732,26 @@ void BondBPMRotational::read_restart(FILE *fp) for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1; } +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void BondBPMRotational::write_restart_settings(FILE *fp) +{ + fwrite(&smooth_flag, sizeof(int), 1, fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void BondBPMRotational::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) + utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); +} + /* ---------------------------------------------------------------------- proc 0 writes to data file ------------------------------------------------------------------------- */ @@ -785,14 +797,13 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo r_mag_inv = 1.0 / r_mag; MathExtra::scale3(r_mag_inv, r, rhat); - double breaking, smooth, Fr; double force1on2[3], torque1on2[3], torque2on1[3]; - breaking = elastic_forces(i, j, type, Fr, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, + double breaking = elastic_forces(i, j, type, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, torque1on2, torque2on1); - fforce = Fr; - damping_forces(i, j, type, Fr, rhat, r, force1on2, torque1on2, torque2on1); - fforce += Fr; + damping_forces(i, j, type, rhat, r, force1on2, torque1on2, torque2on1); + fforce = MathExtra::len3(force1on2); + double smooth = 1.0; if (smooth_flag) { smooth = breaking * breaking; smooth = 1.0 - smooth * smooth; @@ -806,16 +817,16 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo svector[1] = -r0[0]; svector[2] = -r0[1]; svector[3] = -r0[2]; - svector[4] = force1on2[0]; - svector[5] = force1on2[1]; - svector[6] = force1on2[2]; + svector[4] = force1on2[0] * smooth; + svector[5] = force1on2[1] * smooth; + svector[6] = force1on2[2] * smooth; } else { svector[1] = r0[0]; svector[2] = r0[1]; svector[3] = r0[2]; - svector[4] = -force1on2[0]; - svector[5] = -force1on2[1]; - svector[6] = -force1on2[2]; + svector[4] = -force1on2[0] * smooth; + svector[5] = -force1on2[1] * smooth; + svector[6] = -force1on2[2] * smooth; } diff --git a/src/BPM/bond_bpm_rotational.h b/src/BPM/bond_bpm_rotational.h index 952995e949..050b766880 100644 --- a/src/BPM/bond_bpm_rotational.h +++ b/src/BPM/bond_bpm_rotational.h @@ -34,6 +34,8 @@ class BondBPMRotational : public BondBPM { void settings(int, char **) override; void write_restart(FILE *) override; void read_restart(FILE *) override; + void write_restart_settings(FILE *) override; + void read_restart_settings(FILE *) override; void write_data(FILE *) override; double single(int, double, int, int, double &) override; @@ -44,9 +46,9 @@ class BondBPMRotational : public BondBPM { double acos_limit(double); - double elastic_forces(int, int, int, double &, double, double, double, double *, double *, + double elastic_forces(int, int, int, double, double, double, double *, double *, double *, double *, double *, double *); - void damping_forces(int, int, int, double &, double *, double *, double *, double *, double *); + void damping_forces(int, int, int, double *, double *, double *, double *, double *); void allocate(); void store_data(); diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index 855080d28e..8172a596cf 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -311,6 +311,8 @@ void BondBPMSpring::settings(int narg, char **arg) void BondBPMSpring::write_restart(FILE *fp) { + write_restart_settings(fp); + fwrite(&k[1], sizeof(double), atom->nbondtypes, fp); fwrite(&ecrit[1], sizeof(double), atom->nbondtypes, fp); fwrite(&gamma[1], sizeof(double), atom->nbondtypes, fp); @@ -322,6 +324,7 @@ void BondBPMSpring::write_restart(FILE *fp) void BondBPMSpring::read_restart(FILE *fp) { + read_restart_settings(fp); allocate(); if (comm->me == 0) { @@ -336,6 +339,28 @@ void BondBPMSpring::read_restart(FILE *fp) for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1; } +/* ---------------------------------------------------------------------- + proc 0 writes to restart file + ------------------------------------------------------------------------- */ + +void BondBPMSpring::write_restart_settings(FILE *fp) +{ + BondBPM::write_restart_settings(fp); + fwrite(&smooth_flag, sizeof(int), 1, fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts + ------------------------------------------------------------------------- */ + +void BondBPMSpring::read_restart_settings(FILE *fp) +{ + BondBPM::read_restart_settings(fp); + if (comm->me == 0) + utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); +} + /* ---------------------------------------------------------------------- proc 0 writes to data file ------------------------------------------------------------------------- */ diff --git a/src/BPM/bond_bpm_spring.h b/src/BPM/bond_bpm_spring.h index 1528dbcd07..9be014e8dc 100644 --- a/src/BPM/bond_bpm_spring.h +++ b/src/BPM/bond_bpm_spring.h @@ -34,6 +34,8 @@ class BondBPMSpring : public BondBPM { void settings(int, char **) override; void write_restart(FILE *) override; void read_restart(FILE *) override; + void write_restart_settings(FILE *) override; + void read_restart_settings(FILE *) override; void write_data(FILE *) override; double single(int, double, int, int, double &) override; diff --git a/src/bond.cpp b/src/bond.cpp index 363385ff48..1a184e1ed1 100644 --- a/src/bond.cpp +++ b/src/bond.cpp @@ -250,6 +250,91 @@ void Bond::ev_tally(int i, int j, int nlocal, int newton_bond, double ebond, dou } } +/* ---------------------------------------------------------------------- + tally energy and virial into global or per-atom accumulators + for virial, have delx,dely,delz and fx,fy,fz +------------------------------------------------------------------------- */ + +void Bond::ev_tally_xyz(int i, int j, int nlocal, int newton_bond, + double ebond, double fx, double fy, double fz, + double delx, double dely, double delz) +{ + double ebondhalf,v[6]; + + if (eflag_either) { + if (eflag_global) { + if (newton_bond) { + energy += ebond; + } else { + ebondhalf = 0.5 * ebond; + if (i < nlocal) energy += ebondhalf; + if (j < nlocal) energy += ebondhalf; + } + } + if (eflag_atom) { + ebondhalf = 0.5 * ebond; + if (newton_bond || i < nlocal) eatom[i] += ebondhalf; + if (newton_bond || j < nlocal) eatom[j] += ebondhalf; + } + } + + if (vflag_either) { + v[0] = delx * fx; + v[1] = dely * fy; + v[2] = delz * fz; + v[3] = delx * fy; + v[4] = delx * fz; + v[5] = dely * fz; + + if (vflag_global) { + if (newton_bond) { + virial[0] += v[0]; + virial[1] += v[1]; + virial[2] += v[2]; + virial[3] += v[3]; + virial[4] += v[4]; + virial[5] += v[5]; + } else { + if (i < nlocal) { + virial[0] += 0.5 * v[0]; + virial[1] += 0.5 * v[1]; + virial[2] += 0.5 * v[2]; + virial[3] += 0.5 * v[3]; + virial[4] += 0.5 * v[4]; + virial[5] += 0.5 * v[5]; + } + if (j < nlocal) { + virial[0] += 0.5 * v[0]; + virial[1] += 0.5 * v[1]; + virial[2] += 0.5 * v[2]; + virial[3] += 0.5 * v[3]; + virial[4] += 0.5 * v[4]; + virial[5] += 0.5 * v[5]; + } + } + } + + if (vflag_atom) { + if (newton_bond || i < nlocal) { + vatom[i][0] += 0.5 * v[0]; + vatom[i][1] += 0.5 * v[1]; + vatom[i][2] += 0.5 * v[2]; + vatom[i][3] += 0.5 * v[3]; + vatom[i][4] += 0.5 * v[4]; + vatom[i][5] += 0.5 * v[5]; + } + if (newton_bond || j < nlocal) { + vatom[j][0] += 0.5 * v[0]; + vatom[j][1] += 0.5 * v[1]; + vatom[j][2] += 0.5 * v[2]; + vatom[j][3] += 0.5 * v[3]; + vatom[j][4] += 0.5 * v[4]; + vatom[j][5] += 0.5 * v[5]; + } + } + } +} + /* ---------------------------------------------------------------------- write a table of bond potential energy/force vs distance to a file ------------------------------------------------------------------------- */ diff --git a/src/bond.h b/src/bond.h index dc64e40ae8..3bae8f48b9 100644 --- a/src/bond.h +++ b/src/bond.h @@ -102,6 +102,7 @@ class Bond : protected Pointers { } void ev_setup(int, int, int alloc = 1); void ev_tally(int, int, int, int, double, double, double, double, double); + void ev_tally_xyz(int, int, int, int, double, double, double, double, double, double, double); }; } // namespace LAMMPS_NS diff --git a/src/fix_update_special_bonds.cpp b/src/fix_update_special_bonds.cpp index f2715beebc..719eafceb8 100644 --- a/src/fix_update_special_bonds.cpp +++ b/src/fix_update_special_bonds.cpp @@ -17,6 +17,7 @@ #include "atom_vec.h" #include "error.h" #include "force.h" +#include "modify.h" #include "neigh_list.h" #include "neighbor.h" #include "pair.h" @@ -50,6 +51,11 @@ int FixUpdateSpecialBonds::setmask() void FixUpdateSpecialBonds::setup(int /*vflag*/) { + // error if more than one fix update/special/bonds + + if (modify->get_fix_by_style("UPDATE_SPECIAL_BONDS").size() > 1) + error->all(FLERR,"More than one fix update/special/bonds"); + // Require atoms know about all of their bonds and if they break if (force->newton_bond) error->all(FLERR, "Fix update/special/bonds requires Newton bond off"); From 4d062f70cef07cb1608540fea7b486af019cf233 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 31 Aug 2022 10:09:59 -0600 Subject: [PATCH 073/364] bug fix for per-atom vector output of fix pair --- src/fix_pair.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index bc918c468c..68d05fdd57 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -124,7 +124,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : int nlocal = atom->nlocal; - if (ncols == 0) { + if (ncols == 1) { for (int i = 0; i < nlocal; i++) vector[i] = 0.0; } else { @@ -153,7 +153,7 @@ FixPair::~FixPair() delete [] triggername; delete [] triggerptr; - if (ncols == 0) memory->destroy(vector); + if (ncols == 1) memory->destroy(vector); else memory->destroy(array); } @@ -228,7 +228,7 @@ void FixPair::post_force(int /*vflag*/) if (columns == 0) { double *pvector = (double *) pvoid; - if (ncols == 0) { + if (ncols == 1) { for (int i = 0; i < nlocal; i++) vector[i] = pvector[i]; } else { @@ -259,7 +259,7 @@ void FixPair::post_force(int /*vflag*/) void FixPair::grow_arrays(int nmax) { - if (ncols == 0) { + if (ncols == 1) { memory->grow(vector,nmax,"store/state:vector"); vector_atom = vector; } else { @@ -275,7 +275,7 @@ void FixPair::grow_arrays(int nmax) double FixPair::memory_usage() { double bytes = 0.0; - if (ncols == 0) bytes += (double)atom->nmax * sizeof(double); + if (ncols == 1) bytes += (double)atom->nmax * sizeof(double); else bytes += (double)atom->nmax*ncols * sizeof(double); return bytes; } From 7867c5b3d3441e026e75cb0fc02d9f2e7c3b1777 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 1 Sep 2022 02:42:06 -0600 Subject: [PATCH 074/364] Remove pickle file --- examples/mliap/mliap_unified_lj_Ar.pkl | Bin 192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/mliap/mliap_unified_lj_Ar.pkl diff --git a/examples/mliap/mliap_unified_lj_Ar.pkl b/examples/mliap/mliap_unified_lj_Ar.pkl deleted file mode 100644 index 9558d4204fcf8f4783d5e147e396347c40b3b334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmZo*nYxt$0(xX~5_5A4iuH1HG7}3RWPE8}W?E)yN_6_+*ObXq zG#jVXPSNP$%*-oEElNvFPMzY{!<(9unwy$e5?@kTkXk$?c1jPEW6_kv9-h3E)Z*l# z%z~2qqT(suj6Ljm1&Kw8xj;5^4|`E^X$jDPDem@Ppsrz0Ehx^+$ Date: Thu, 1 Sep 2022 02:42:35 -0600 Subject: [PATCH 075/364] Change ghostneigh pairstyle to toggle --- examples/mliap/in.mliap.unified.hippynn.Al | 4 +--- .../mliap/in.mliap.unified.hippynn.Al.ghostneigh | 4 +--- examples/mliap/in.mliap.unified.hippynn.InP | 5 +---- examples/mliap/in.mliap.unified.lj.Ar | 2 +- src/ML-IAP/pair_mliap.cpp | 15 +++++++-------- 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al index e92de9bb00..18729e2154 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al +++ b/examples/mliap/in.mliap.unified.hippynn.Al @@ -20,11 +20,9 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 1 box create_atoms 1 box -mass 1 26.981 - # choose potential -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pt +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pt 0 pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index b6322d9e7d..69ac8f199c 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -20,11 +20,9 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 1 box create_atoms 1 box -mass 1 26.981 - # choose potential -pair_style mliap unified ghostneigh ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pt +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pt 1 pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP index c4cafbcae3..b58c1b99cd 100644 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -20,13 +20,10 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 2 box create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 -mass 1 114.76 -mass 2 30.98 - # choose potential # Specify MLIAP Unified pair style -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pt +pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pt 0 pair_coeff * * In P #dump 4 all custom 1 forces.xyz fx fy fz diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 9ec447a812..167f101fc6 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -11,7 +11,7 @@ mass 1 1.0 velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 pair_coeff * * Ar neighbor 0.3 bin diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index af161a63d8..199c8abdd9 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -182,17 +182,16 @@ void PairMLIAP::settings(int narg, char ** arg) #ifdef MLIAP_PYTHON } else if (strcmp(arg[iarg], "unified") == 0) { MLIAPBuildUnified_t build; - if (iarg+1 > narg) error->all(FLERR,"Illegal pair_style mliap command"); - if (strcmp(arg[iarg+1],"ghostneigh") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); - build = build_unified(arg[iarg+2], data, lmp); + if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + build = build_unified(arg[iarg+1], data, lmp); + if (strcmp(arg[iarg+2],"0") == 0) { + ghostneigh = 0; + } else if (strcmp(arg[iarg+2],"1") == 0) { ghostneigh = 1; - iarg += 3; } else { - if (iarg+1 > narg) error->all(FLERR,"Illegal pair_style mliap command"); - build = build_unified(arg[iarg+1], data, lmp); - iarg += 2; + error->all(FLERR,"Illegal pair_style mliap command"); } + iarg += 3; model = build.model; descriptor = build.descriptor; modelflag = 1; From a17e3e2350e34212213d7b417a59a87da4d151f9 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 1 Sep 2022 02:43:16 -0600 Subject: [PATCH 076/364] Add init parameters to Unified LJ example --- examples/mliap/mliap_unified_lj_Ar.py | 2 +- examples/mliap/pickle_mliap_unified_lj_Ar.py | 2 +- python/lammps/mliap/mliap_unified_lj.py | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/mliap/mliap_unified_lj_Ar.py b/examples/mliap/mliap_unified_lj_Ar.py index 9b1c11be7d..2b404bd98e 100644 --- a/examples/mliap/mliap_unified_lj_Ar.py +++ b/examples/mliap/mliap_unified_lj_Ar.py @@ -49,7 +49,7 @@ lmp.commands_string(before_loading) # Define the model however you like. In this example # we simply import the unified L-J example from mliap from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ -unified = MLIAPUnifiedLJ() +unified = MLIAPUnifiedLJ(["Ar"]) # You can also load the model from a pickle file. # import pickle diff --git a/examples/mliap/pickle_mliap_unified_lj_Ar.py b/examples/mliap/pickle_mliap_unified_lj_Ar.py index 4421c61fe4..f44c283f5a 100644 --- a/examples/mliap/pickle_mliap_unified_lj_Ar.py +++ b/examples/mliap/pickle_mliap_unified_lj_Ar.py @@ -5,5 +5,5 @@ from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ if __name__ == '__main__': - unified = MLIAPUnifiedLJ() + unified = MLIAPUnifiedLJ(["Ar"]) unified.pickle('mliap_unified_lj_Ar.pkl') diff --git a/python/lammps/mliap/mliap_unified_lj.py b/python/lammps/mliap/mliap_unified_lj.py index 8794ba64c5..87925e1e39 100644 --- a/python/lammps/mliap/mliap_unified_lj.py +++ b/python/lammps/mliap/mliap_unified_lj.py @@ -5,17 +5,17 @@ import numpy as np class MLIAPUnifiedLJ(MLIAPUnified): """Test implementation for MLIAPUnified.""" - def __init__(self): + def __init__(self, element_types, epsilon=1.0, sigma=1.0, rcutfac=1.25): super().__init__() - self.element_types = ["Ar"] + self.element_types = element_types self.ndescriptors = 1 self.nparams = 3 # Mimicking the LJ pair-style: # pair_style lj/cut 2.5 # pair_coeff * * 1 1 - self.epsilon = 1.0 - self.sigma = 1.0 - self.rcutfac = 1.25 + self.epsilon = epsilon + self.sigma = sigma + self.rcutfac = rcutfac def compute_gradients(self, data): """Test compute_gradients.""" From d5ae116a8928a96e25a081dd73e2216154e6b66e Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 1 Sep 2022 02:57:48 -0600 Subject: [PATCH 077/364] Rename mliap_unifiedpy.pyx to mliap_unified_couple.pyx, fix references --- python/lammps/mliap/loader.py | 6 +++--- src/ML-IAP/mliap_unified.cpp | 4 ++-- .../{mliap_unifiedpy.pyx => mliap_unified_couple.pyx} | 0 src/PYTHON/python_impl.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename src/ML-IAP/{mliap_unifiedpy.pyx => mliap_unified_couple.pyx} (100%) diff --git a/python/lammps/mliap/loader.py b/python/lammps/mliap/loader.py index 284af01b05..b2d0079220 100644 --- a/python/lammps/mliap/loader.py +++ b/python/lammps/mliap/loader.py @@ -57,7 +57,7 @@ class DynamicLoader(importlib.abc.Loader): def activate_mliappy(lmp): try: library = lmp.lib - module_names = ["mliap_model_python_couple", "mliap_unifiedpy"] + module_names = ["mliap_model_python_couple", "mliap_unified_couple"] api_version = library.lammps_PYTHON_API_VERSION() for module_name in module_names: @@ -83,9 +83,9 @@ def load_model(model): def load_unified(model): try: - import mliap_unifiedpy + import mliap_unified_couple except ImportError as ie: raise ImportError("ML-IAP python module must be activated before loading\n" "the pair style. Call lammps.mliap.activate_mliappy(lmp)." ) from ie - mliap_unifiedpy.load_from_python(model) + mliap_unified_couple.load_from_python(model) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index f4f1501675..c31cdd2c81 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -23,7 +23,7 @@ #include "memory.h" #include "lmppython.h" #include "mliap_data.h" -#include "mliap_unifiedpy.h" +#include "mliap_unified_couple.h" #include "pair_mliap.h" #include "python_compat.h" #include "utils.h" @@ -169,7 +169,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat lmp->error->all(FLERR, "Could not initialize embedded Python"); } - PyObject *unified_module = PyImport_ImportModule("mliap_unifiedpy"); + PyObject *unified_module = PyImport_ImportModule("mliap_unified_couple"); if (PyErr_Occurred()) { PyErr_Print(); diff --git a/src/ML-IAP/mliap_unifiedpy.pyx b/src/ML-IAP/mliap_unified_couple.pyx similarity index 100% rename from src/ML-IAP/mliap_unifiedpy.pyx rename to src/ML-IAP/mliap_unified_couple.pyx diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 58919de977..aba8e88e10 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -34,7 +34,7 @@ // We could get around this with cython --capi-reexport-cincludes // However, that exposes -too many- headers. #include "mliap_model_python_couple.h" -#include "mliap_unifiedpy.h" +#include "mliap_unified_couple.h" #endif using namespace LAMMPS_NS; @@ -69,7 +69,7 @@ PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) int err = PyImport_AppendInittab("mliap_model_python_couple", PyInit_mliap_model_python_couple); if (err) error->all(FLERR, "Could not register MLIAPPY embedded python module."); - err = PyImport_AppendInittab("mliap_unifiedpy", PyInit_mliap_unifiedpy); + err = PyImport_AppendInittab("mliap_unified_couple", PyInit_mliap_unified_couple); if (err) error->all(FLERR, "Could not register MLIAPPY unified embedded python module."); #endif From c63df4ac875d29898ad76b8805b736b71a230d22 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 1 Sep 2022 11:00:20 +0200 Subject: [PATCH 078/364] PairPACEExtrapolation: rely on usage "fix pair" --- src/ML-PACE/compute_pace_extrapolation.cpp | 90 --- src/ML-PACE/compute_pace_extrapolation.h | 47 -- src/ML-PACE/dump_pace_extrapolation.cpp | 56 -- src/ML-PACE/dump_pace_extrapolation.h | 43 -- src/ML-PACE/pair_pace_extrapolation.cpp | 662 +++++++++++---------- src/ML-PACE/pair_pace_extrapolation.h | 18 +- 6 files changed, 343 insertions(+), 573 deletions(-) delete mode 100644 src/ML-PACE/compute_pace_extrapolation.cpp delete mode 100644 src/ML-PACE/compute_pace_extrapolation.h delete mode 100644 src/ML-PACE/dump_pace_extrapolation.cpp delete mode 100644 src/ML-PACE/dump_pace_extrapolation.h diff --git a/src/ML-PACE/compute_pace_extrapolation.cpp b/src/ML-PACE/compute_pace_extrapolation.cpp deleted file mode 100644 index ebbb7ccd19..0000000000 --- a/src/ML-PACE/compute_pace_extrapolation.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -// -// Created by Yury Lysogorskiy on 23.06.22. -// - -#include "compute_pace_extrapolation.h" - -#include "pair_pace_extrapolation.h" - -#include "comm.h" -#include "error.h" -#include "force.h" -#include "modify.h" -#include "update.h" - -using namespace LAMMPS_NS; - -ComputePACEExtrapolation::ComputePACEExtrapolation(class LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), pair_pace_extrapolation(nullptr) -{ - peratom_flag = 1; - size_peratom_cols = 0; - scalar_flag = 1; // get next timestep where gamma is available -} - -void ComputePACEExtrapolation::init() -{ - if (force->pair) - pair_pace_extrapolation = (PairPACEExtrapolation *) force->pair_match("pace/extrapolation", 1); - if (!pair_pace_extrapolation) - error->all(FLERR, "Compute pace/extrapolation requires a `pace/extrapolation` pair style"); - - if ((modify->get_compute_by_style("pace/extrapolation").size() > 1) && (comm->me == 0)) - error->warning(FLERR, "More than one instance of compute pace/atom"); -} - -void ComputePACEExtrapolation::invoke_compute_extrapolation_grades() -{ - bigint current_timestep = update->ntimestep; - pair_pace_extrapolation->bevaluator_timestep_shift = current_timestep; - int old_vflag_fdotr = pair_pace_extrapolation->vflag_fdotr; - pair_pace_extrapolation->vflag_fdotr = 0; - pair_pace_extrapolation->is_set_energies_forces = false; - - pair_pace_extrapolation->compute(0, 0); - - pair_pace_extrapolation->is_set_energies_forces = true; - pair_pace_extrapolation->vflag_fdotr = old_vflag_fdotr; -} - -double ComputePACEExtrapolation::compute_scalar() -{ - invoked_scalar = update->ntimestep; - - // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep - // if not coherent, change pair->bevaluator_timestep_shift to current timestep - // and call invoke_compute_extrapolation_grades without updating energies and forces - if (invoked_scalar != pair_pace_extrapolation->bevaluator_timestep) { - invoke_compute_extrapolation_grades(); - } - - scalar = pair_pace_extrapolation->max_gamma_grade_per_structure; - return scalar; -} - -void ComputePACEExtrapolation::compute_peratom() -{ - invoked_peratom = update->ntimestep; - - // check the coherence of bevaluator_timestep (when extrapolation grades are computed) and actual timestep - // if not coherent, change pair->bevaluator_timestep_shift to current timestep - // and call invoke_compute_extrapolation_grades without updating energies and forces - if (invoked_peratom != pair_pace_extrapolation->bevaluator_timestep) { - invoke_compute_extrapolation_grades(); - } - - vector_atom = pair_pace_extrapolation->extrapolation_grade_gamma; -} diff --git a/src/ML-PACE/compute_pace_extrapolation.h b/src/ML-PACE/compute_pace_extrapolation.h deleted file mode 100644 index 0329379c45..0000000000 --- a/src/ML-PACE/compute_pace_extrapolation.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -// -// Created by Yury Lysogorskiy on 23.06.22. -// - -#ifdef COMPUTE_CLASS -// clang-format off -ComputeStyle(pace/extrapolation,ComputePACEExtrapolation); -// clang-format on -#else - -#ifndef COMPUTE_PACE_H -#define COMPUTE_PACE_H - -#include "compute.h" -#include "pair_pace_extrapolation.h" - -namespace LAMMPS_NS { -class PairPACEExtrapolation; - -class ComputePACEExtrapolation : public Compute { - public: - ComputePACEExtrapolation(class LAMMPS *, int, char **); - void init() override; - double compute_scalar() override; - void compute_peratom() override; - - private: - PairPACEExtrapolation *pair_pace_extrapolation; - void invoke_compute_extrapolation_grades(); -}; - -} // namespace LAMMPS_NS -#endif //COMPUTE_PACE_H -#endif diff --git a/src/ML-PACE/dump_pace_extrapolation.cpp b/src/ML-PACE/dump_pace_extrapolation.cpp deleted file mode 100644 index f2cda0b85b..0000000000 --- a/src/ML-PACE/dump_pace_extrapolation.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// clang-format off -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include "dump_pace_extrapolation.h" -#include "atom.h" -#include "force.h" -#include "comm.h" -#include "memory.h" -#include "error.h" -#include "update.h" -#include "modify.h" - - -using namespace LAMMPS_NS; - -/* ---------------------------------------------------------------------- */ - -DumpPACEExtrapolation::DumpPACEExtrapolation(struct LAMMPS *lmp, int nargs, char **argv) : DumpCustom(lmp, nargs, - argv) { - pairPaceExtrapolation = (PairPACEExtrapolation *) force->pair_match("pace/extrapolation", 1); - if (!pairPaceExtrapolation) - error->all(FLERR, "Dump pace/extrapolation requires a `pace/extrapolation` pair style"); - - // Save atomtypes to elements mapping into SPECIES_TYPE_FNAME to be used later in Python for loading extrapolative structures - FILE *species_type_file = fopen(SPECIES_TYPE_FNAME.c_str(), "w"); - const int n = atom->ntypes; - for (int i = 0; i < n; i++) { - auto elemname = pairPaceExtrapolation->element_names[i].c_str(); - fprintf(species_type_file, "%s ", elemname); - } - fclose(species_type_file); -} - -void DumpPACEExtrapolation::write() { - int current_time_step = update->ntimestep; - // dump only if - // 1) extrapolation grades were computed on current timestep AND - // 2) max extrapolation grade > gamma_lower_bound - if (current_time_step == pairPaceExtrapolation->bevaluator_timestep) { - if (pairPaceExtrapolation->max_gamma_grade_per_structure > pairPaceExtrapolation->gamma_lower_bound) { - DumpCustom::write(); - MPI_Barrier(world); - } - } -} diff --git a/src/ML-PACE/dump_pace_extrapolation.h b/src/ML-PACE/dump_pace_extrapolation.h deleted file mode 100644 index 6ba48d784d..0000000000 --- a/src/ML-PACE/dump_pace_extrapolation.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef DUMP_CLASS -// clang-format off -DumpStyle(pace/extrapolation,DumpPACEExtrapolation); -// clang-format on -#else - -#ifndef LMP_DUMP_PACE_AL_H -#define LMP_DUMP_PACE_AL_H - -#include "pair.h" -#include "dump_custom.h" -#include "pair_pace_extrapolation.h" - -namespace LAMMPS_NS { - // forward declaration - class PairPACEExtrapolation; - - class DumpPACEExtrapolation : public DumpCustom { - const std::string SPECIES_TYPE_FNAME = "species_types.dat"; - PairPACEExtrapolation *pairPaceExtrapolation; - public: - DumpPACEExtrapolation(class LAMMPS *lmp, int nargs, char **argv); - - void write() override; - }; - -} // namespace LAMMPS_NS - -#endif -#endif diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 3e0d665288..51139775b6 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -44,437 +44,449 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "ace_b_evaluator.h" #include "ace_recursive.h" #include "ace_version.h" -#include "compute_pace_extrapolation.h" +//#include "compute_pace_extrapolation.h" namespace LAMMPS_NS { -struct ACEALImpl { - ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} + struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} - ~ACEALImpl() - { - delete basis_set; - delete ace; - } + ~ACEALImpl() { + delete basis_set; + delete ace; + } - ACEBBasisSet *basis_set; - ACEBEvaluator *ace; - ACECTildeBasisSet *ctilde_basis_set; - ACERecursiveEvaluator *rec_ace; -}; + ACEBBasisSet *basis_set; + ACEBEvaluator *ace; + ACECTildeBasisSet *ctilde_basis_set; + ACERecursiveEvaluator *rec_ace; + }; } // namespace LAMMPS_NS using namespace LAMMPS_NS; using namespace MathConst; static char const *const elements_pace_al[] = { - "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", - "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", - "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", - "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", - "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", - "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", - "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", + "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", + "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", + "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", + "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", + "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", + "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; static constexpr int elements_num_pace_al = sizeof(elements_pace_al) / sizeof(const char *); -int AtomicNumberByName_pace_al(char *elname) -{ - for (int i = 1; i < elements_num_pace_al; i++) - if (strcmp(elname, elements_pace_al[i]) == 0) return i; - return -1; +int AtomicNumberByName_pace_al(char *elname) { + for (int i = 1; i < elements_num_pace_al; i++) + if (strcmp(elname, elements_pace_al[i]) == 0) return i; + return -1; } /* ---------------------------------------------------------------------- */ -PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) -{ - single_enable = 0; - restartinfo = 0; - one_coeff = 1; - manybody_flag = 1; +PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) { + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; - nmax = 0; + nmax = 0; - aceimpl = new ACEALImpl; - scale = nullptr; - extrapolation_grade_gamma = nullptr; + aceimpl = new ACEALImpl; + scale = nullptr; + extrapolation_grade_gamma = nullptr; } /* ---------------------------------------------------------------------- check if allocated, since class can be destructed when incomplete ------------------------------------------------------------------------- */ -PairPACEExtrapolation::~PairPACEExtrapolation() -{ - if (copymode) return; +PairPACEExtrapolation::~PairPACEExtrapolation() { + if (copymode) return; - delete aceimpl; + delete aceimpl; - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(scale); - memory->destroy(map); - memory->destroy(extrapolation_grade_gamma); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(scale); + memory->destroy(map); + memory->destroy(extrapolation_grade_gamma); + } } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::compute(int eflag, int vflag) -{ - int i, j, ii, jj, inum, jnum; - double delx, dely, delz, evdwl; - double fij[3]; - int *ilist, *jlist, *numneigh, **firstneigh; - double max_gamma_grade = 0; - max_gamma_grade_per_structure = 0; - ev_init(eflag, vflag); +void PairPACEExtrapolation::compute(int eflag, int vflag) { + int i, j, ii, jj, inum, jnum; + double delx, dely, delz, evdwl; + double fij[3]; + int *ilist, *jlist, *numneigh, **firstneigh; + double max_gamma_grade = 0; + max_gamma_grade_per_structure = 0; + ev_init(eflag, vflag); - // downwards modified by YL + // downwards modified by YL - double **x = atom->x; - double **f = atom->f; - tagint *tag = atom->tag; - int *type = atom->type; - // number of atoms in cell - int nlocal = atom->nlocal; + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + // number of atoms in cell + int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; + int newton_pair = force->newton_pair; - // number of atoms including ghost atoms - int nall = nlocal + atom->nghost; + // number of atoms including ghost atoms + int nall = nlocal + atom->nghost; - // inum: length of the neighborlists list - inum = list->inum; + // inum: length of the neighborlists list + inum = list->inum; - // ilist: list of "i" atoms for which neighbor lists exist - ilist = list->ilist; + // ilist: list of "i" atoms for which neighbor lists exist + ilist = list->ilist; - //numneigh: the length of each these neigbor list - numneigh = list->numneigh; + //numneigh: the length of each these neigbor list + numneigh = list->numneigh; - // the pointer to the list of neighbors of "i" - firstneigh = list->firstneigh; + // the pointer to the list of neighbors of "i" + firstneigh = list->firstneigh; - // this happens when used as substyle in pair style hybrid. - // So this check and error effectively disallows use with pair style hybrid. - if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } + // this happens when used as substyle in pair style hybrid. + // So this check and error effectively disallows use with pair style hybrid. + if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } - //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades - if (atom->nlocal > nmax) { - memory->destroy(extrapolation_grade_gamma); - nmax = atom->nlocal; - memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); - } - - //determine the maximum number of neighbours - int max_jnum = 0; - int nei = 0; - for (ii = 0; ii < list->inum; ii++) { - i = ilist[ii]; - jnum = numneigh[i]; - nei = nei + jnum; - if (jnum > max_jnum) max_jnum = jnum; - } - - bigint current_timestep = update->ntimestep; - bool is_bevaluator = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; - - if (is_bevaluator) - aceimpl->ace->resize_neighbours_cache(max_jnum); - else - aceimpl->rec_ace->resize_neighbours_cache(max_jnum); - - //loop over atoms - for (ii = 0; ii < list->inum; ii++) { - i = list->ilist[ii]; - const int itype = type[i]; - - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // checking if neighbours are actually within cutoff range is done inside compute_atom - // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom - // by using 'ace->element_type_mapping' array - // x: [r0 ,r1, r2, ..., r100] - // i = 0 ,1 - // jnum(0) = 50 - // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] - try { - if (is_bevaluator) - aceimpl->ace->compute_atom(i, x, type, jnum, jlist); - else - aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); - } catch (std::exception &e) { - error->one(FLERR, e.what()); - } - // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade - - if (is_bevaluator) { - double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; - if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; - bevaluator_timestep = current_timestep; - extrapolation_grade_gamma[i] = current_atom_gamma_grade; + //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades + if (atom->nlocal > nmax) { + memory->destroy(extrapolation_grade_gamma); + nmax = atom->nlocal; + memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); } - Array2D &neighbours_forces = - (is_bevaluator ? aceimpl->ace->neighbours_forces : aceimpl->rec_ace->neighbours_forces); - //optionally assign global forces arrays - if (is_set_energies_forces) { - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - const int jtype = type[j]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - - fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); - fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); - fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); - - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - if (vflag) - ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, - -delz); - } + //determine the maximum number of neighbours + int max_jnum = 0; + int nei = 0; + for (ii = 0; ii < list->inum; ii++) { + i = ilist[ii]; + jnum = numneigh[i]; + nei = nei + jnum; + if (jnum > max_jnum) max_jnum = jnum; } - // tally energy contribution - if (eflag && is_set_energies_forces) { - // evdwl = energy of atom I - DOUBLE_TYPE e_atom; - if (is_bevaluator) - e_atom = aceimpl->ace->e_atom; - else - e_atom = aceimpl->rec_ace->e_atom; - evdwl = scale[itype][itype] * e_atom; - ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); + bigint current_timestep = update->ntimestep; +// flag_compute_extrapolation_grade = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; + + if (flag_compute_extrapolation_grade) + aceimpl->ace->resize_neighbours_cache(max_jnum); + else + aceimpl->rec_ace->resize_neighbours_cache(max_jnum); + + //loop over atoms + for (ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // checking if neighbours are actually within cutoff range is done inside compute_atom + // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom + // by using 'ace->element_type_mapping' array + // x: [r0 ,r1, r2, ..., r100] + // i = 0 ,1 + // jnum(0) = 50 + // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] + try { + if (flag_compute_extrapolation_grade) + aceimpl->ace->compute_atom(i, x, type, jnum, jlist); + else + aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); + } catch (std::exception &e) { + error->one(FLERR, e.what()); + } + // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade + + if (flag_compute_extrapolation_grade) { + double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; + if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; +// bevaluator_timestep = current_timestep; + extrapolation_grade_gamma[i] = current_atom_gamma_grade; + } + + Array2D &neighbours_forces = + (flag_compute_extrapolation_grade ? aceimpl->ace->neighbours_forces + : aceimpl->rec_ace->neighbours_forces); + //optionally assign global forces arrays + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + const int jtype = type[j]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + + fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); + fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); + fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); + + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + if (vflag) + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, + -delz); + } + + + // tally energy contribution + if (eflag) { + // evdwl = energy of atom I + DOUBLE_TYPE e_atom; + if (flag_compute_extrapolation_grade) + e_atom = aceimpl->ace->e_atom; + else + e_atom = aceimpl->rec_ace->e_atom; + evdwl = scale[itype][itype] * e_atom; + ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); + } } - } - if (vflag_fdotr) virial_fdotr_compute(); + if (vflag_fdotr) virial_fdotr_compute(); - if (is_bevaluator) { - //gather together max_gamma_grade_per_structure - MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); + if (flag_compute_extrapolation_grade) { + //gather together max_gamma_grade_per_structure + MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); - // check if gamma_upper_bound is exceeded - if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (comm->me == 0) - error->all(FLERR, - "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " - "timestep={}), stopping...\n", - max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); + // TODO: check, whether to stop here or externally in LAMMPS + // check if gamma_upper_bound is exceeded + if (max_gamma_grade_per_structure > gamma_upper_bound) { + if (comm->me == 0) + error->all(FLERR, + "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " + "timestep={}), stopping...\n", + max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); - MPI_Barrier(world); - MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes - exit(EXIT_FAILURE); + MPI_Barrier(world); + MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes + exit(EXIT_FAILURE); + } } - } - // end modifications YL + // end modifications YL } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::allocate() -{ - allocated = 1; - int n = atom->ntypes; +void PairPACEExtrapolation::allocate() { + allocated = 1; + int n = atom->ntypes; - memory->create(setflag, n + 1, n + 1, "pair:setflag"); - memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(map, n + 1, "pair:map"); - memory->create(scale, n + 1, n + 1, "pair:scale"); + memory->create(setflag, n + 1, n + 1, "pair:setflag"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(map, n + 1, "pair:map"); + memory->create(scale, n + 1, n + 1, "pair:scale"); } /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::settings(int narg, char **arg) -{ - if (narg > 3) { - error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/al " - "[gamma_lower_bound] [gamma_upper_bound] [freq]"); - } +void PairPACEExtrapolation::settings(int narg, char **arg) { + if (narg > 3) { + error->all(FLERR, + "Illegal pair_style command. Correct form:\n\tpair_style pace/al " + "[gamma_lower_bound] [gamma_upper_bound] [freq]"); + } - if (narg > 0) { - double glb = atof(arg[0]); // gamma lower bound - if (glb < 1.0) - error->all(FLERR, "Illegal gamma_lower_bound value: it should be real number >= 1.0"); - else - gamma_lower_bound = glb; - } + if (narg > 0) { + double glb = atof(arg[0]); // gamma lower bound + if (glb < 1.0) + error->all(FLERR, "Illegal gamma_lower_bound value: it should be real number >= 1.0"); + else + gamma_lower_bound = glb; + } - if (narg > 1) { - double gub = atof(arg[1]); // gamma upper bound - if (gub < gamma_lower_bound) - error->all( - FLERR, - "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); - else - gamma_upper_bound = gub; - } + if (narg > 1) { + double gub = atof(arg[1]); // gamma upper bound + if (gub < gamma_lower_bound) + error->all( + FLERR, + "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); + else + gamma_upper_bound = gub; + } - if (narg > 2) { - gamma_grade_eval_freq = atoi(arg[2]); - if (gamma_grade_eval_freq < 1) - error->all(FLERR, "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); - } +// if (narg > 2) { +// gamma_grade_eval_freq = atoi(arg[2]); +// if (gamma_grade_eval_freq < 1) +// error->all(FLERR, "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); +// } - if (comm->me == 0) { - utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, - gamma_upper_bound); - utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); - } + if (comm->me == 0) { + utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, + gamma_upper_bound); +// utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); + } } /* ---------------------------------------------------------------------- set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::coeff(int narg, char **arg) -{ +void PairPACEExtrapolation::coeff(int narg, char **arg) { - if (narg < 5) - error->all(FLERR, - "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " - " elem1 elem2 ..."); + if (narg < 5) + error->all(FLERR, + "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " + " elem1 elem2 ..."); - if (!allocated) allocate(); + if (!allocated) allocate(); - map_element2type(narg - 4, arg + 4); + map_element2type(narg - 4, arg + 4); - auto potential_file_name = utils::get_potential_file_path(arg[2]); - auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); - char **elemtypes = &arg[4]; + auto potential_file_name = utils::get_potential_file_path(arg[2]); + auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); + char **elemtypes = &arg[4]; - delete aceimpl->basis_set; - delete aceimpl->ctilde_basis_set; + delete aceimpl->basis_set; + delete aceimpl->ctilde_basis_set; - //load potential file - aceimpl->basis_set = new ACEBBasisSet(); - if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); - aceimpl->basis_set->load(potential_file_name); + //load potential file + aceimpl->basis_set = new ACEBBasisSet(); + if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); + aceimpl->basis_set->load(potential_file_name); - //convert the basis set to CTilde format - aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); - *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); + //convert the basis set to CTilde format + aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); + *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); - if (comm->me == 0) { - utils::logmesg(lmp, "Total number of basis functions\n"); + if (comm->me == 0) { + utils::logmesg(lmp, "Total number of basis functions\n"); - for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { - int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; - int n = aceimpl->basis_set->total_basis_size[mu]; - utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, - n); + for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { + int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; + int n = aceimpl->basis_set->total_basis_size[mu]; + utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, + n); + } } - } - // read args that map atom types to PACE elements - // map[i] = which element the Ith atom type is, -1 if not mapped - // map[0] is not used - delete aceimpl->ace; - delete aceimpl->rec_ace; + // read args that map atom types to PACE elements + // map[i] = which element the Ith atom type is, -1 if not mapped + // map[0] is not used + delete aceimpl->ace; + delete aceimpl->rec_ace; - aceimpl->ace = new ACEBEvaluator(); - aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->ace = new ACEBEvaluator(); + aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->rec_ace = new ACERecursiveEvaluator(); - aceimpl->rec_ace->set_recursive(true); - aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential + aceimpl->rec_ace = new ACERecursiveEvaluator(); + aceimpl->rec_ace->set_recursive(true); + aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential - FILE *species_type_file = nullptr; + FILE *species_type_file = nullptr; - const int n = atom->ntypes; - element_names.resize(n); - for (int i = 1; i <= n; i++) { - char *elemname = elemtypes[i - 1]; - element_names[i - 1] = elemname; - if (strcmp(elemname, "NULL") == 0) { - // species_type=-1 value will not reach ACE Evaluator::compute_atom, - // but if it will ,then error will be thrown there - aceimpl->ace->element_type_mapping(i) = -1; - map[i] = -1; - if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); - } else { - // dump species types for reconstruction of atomic configurations - int atomic_number = AtomicNumberByName_pace_al(elemname); - if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); - SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); - if (mu != -1) { - if (comm->me == 0) - utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, - elemname, mu); - map[i] = mu; - // set up LAMMPS atom type to ACE species mapping for ace evaluators - aceimpl->ace->element_type_mapping(i) = mu; - aceimpl->rec_ace->element_type_mapping(i) = mu; - } else { - error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, - potential_file_name); - } + const int n = atom->ntypes; + element_names.resize(n); + for (int i = 1; i <= n; i++) { + char *elemname = elemtypes[i - 1]; + element_names[i - 1] = elemname; + if (strcmp(elemname, "NULL") == 0) { + // species_type=-1 value will not reach ACE Evaluator::compute_atom, + // but if it will ,then error will be thrown there + aceimpl->ace->element_type_mapping(i) = -1; + map[i] = -1; + if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); + } else { + // dump species types for reconstruction of atomic configurations + int atomic_number = AtomicNumberByName_pace_al(elemname); + if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); + SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); + if (mu != -1) { + if (comm->me == 0) + utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, + elemname, mu); + map[i] = mu; + // set up LAMMPS atom type to ACE species mapping for ace evaluators + aceimpl->ace->element_type_mapping(i) = mu; + aceimpl->rec_ace->element_type_mapping(i) = mu; + } else { + error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, + potential_file_name); + } + } } - } - aceimpl->ace->set_basis(*aceimpl->basis_set); - aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); + aceimpl->ace->set_basis(*aceimpl->basis_set); + aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); - if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); - aceimpl->ace->load_active_set(active_set_inv_filename); + if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); + aceimpl->ace->load_active_set(active_set_inv_filename); - // clear setflag since coeff() called once with I,J = * * - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) scale[i][j] = 1.0; + // clear setflag since coeff() called once with I,J = * * + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) scale[i][j] = 1.0; } /* ---------------------------------------------------------------------- init specific to this pair style ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::init_style() -{ - if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); - if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); +void PairPACEExtrapolation::init_style() { + if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); - // request a full neighbor list - neighbor->add_request(this, NeighConst::REQ_FULL); + // request a full neighbor list + neighbor->add_request(this, NeighConst::REQ_FULL); } /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairPACEExtrapolation::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - //cutoff from the basis set's radial functions settings - scale[j][i] = scale[i][j]; - return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); +double PairPACEExtrapolation::init_one(int i, int j) { + if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + //cutoff from the basis set's radial functions settings + scale[j][i] = scale[i][j]; + return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); } /* ---------------------------------------------------------------------- extract method for extracting value of scale variable ---------------------------------------------------------------------- */ -void *PairPACEExtrapolation::extract(const char *str, int &dim) -{ - dim = 2; - if (strcmp(str, "scale") == 0) return (void *) scale; - return nullptr; +void *PairPACEExtrapolation::extract(const char *str, int &dim) { + //check if str=="gamma_flag" then compute extrapolation grades on this iteration + dim = 0; + if (strcmp(str, "gamma_flag")) return (void *) &flag_compute_extrapolation_grade; + + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return nullptr; } + +/* ---------------------------------------------------------------------- + peratom requests from FixPair + return ptr to requested data + also return ncol = # of quantites per atom + 0 = per-atom vector + 1 or more = # of columns in per-atom array + return NULL if str is not recognized +---------------------------------------------------------------------- */ +void *PairPACEExtrapolation::extract_peratom(const char *str, int &ncol) { + if (strcmp(str, "gamma") == 0) { + ncol = 0; + return (void *) extrapolation_grade_gamma; + } + + return nullptr; +} \ No newline at end of file diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index 1a403802bb..3cacf1dc27 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -20,7 +20,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #ifdef PAIR_CLASS // clang-format off -PairStyle(pace/extrapolation,PairPACEExtrapolation); +PairStyle(pace/extrapolation,PairPACEExtrapolation) // clang-format on #else @@ -32,14 +32,7 @@ PairStyle(pace/extrapolation,PairPACEExtrapolation); namespace LAMMPS_NS { -//forward declaration -class ComputePACEExtrapolation; -class DumpPACEExtrapolation; - class PairPACEExtrapolation : public Pair { - friend class ComputePACEExtrapolation; - friend class DumpPACEExtrapolation; - public: PairPACEExtrapolation(class LAMMPS *); ~PairPACEExtrapolation() override; @@ -50,11 +43,12 @@ class PairPACEExtrapolation : public Pair { void init_style() override; double init_one(int, int) override; void *extract(const char *, int &) override; + void *extract_peratom(const char *, int &) override; protected: struct ACEALImpl *aceimpl; - bigint gamma_grade_eval_freq = 1; - bool is_set_energies_forces = true; // if set, then update forces and energies +// bigint gamma_grade_eval_freq = 1; +// bool is_set_energies_forces = true; // if set, then update forces and energies int nmax; double gamma_lower_bound = 1.5; @@ -65,10 +59,10 @@ class PairPACEExtrapolation : public Pair { std::vector element_names; // list of elements (used by dump pace/extrapolation) double rcutmax; // max cutoff for all elements int nelements; // # of unique elements - bigint bevaluator_timestep; // timestep, on which gamma grade were computed - bigint bevaluator_timestep_shift = 0; // double *extrapolation_grade_gamma; //per-atom gamma value + int flag_compute_extrapolation_grade; + double **scale; }; From 4616715e77cc60474fe3384b5f34e21f63410fa1 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 1 Sep 2022 11:01:13 +0200 Subject: [PATCH 079/364] bugfix in fix_pair.cpp: usage of fmt::format("{}") --- src/fix_pair.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index bc918c468c..59a1985284 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -71,7 +71,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { if (trigger[ifield] == 0) triggername[ifield] = nullptr; else { - auto str = fmt::format("%s_flag", fieldname[ifield]); + auto str = fmt::format("{}_flag", fieldname[ifield]); triggername[nfield] = utils::strdup(str); } } @@ -107,7 +107,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : // which this fix outputs whenever it wants peratom_flag = 1; - if (ncols == 1) size_peratom_cols = 0; + if (ncols == 1) size_peratom_cols = 0; // MODIFIED else size_peratom_cols = ncols; peratom_freq = nevery; From 8e5da55ff5b18da593a26bcb22dd78491eebd65b Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 1 Sep 2022 03:37:04 -0600 Subject: [PATCH 080/364] Check for multiple model/descriptor definitions --- src/ML-IAP/pair_mliap.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 199c8abdd9..e3a5c90492 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -146,6 +146,7 @@ void PairMLIAP::settings(int narg, char ** arg) while (iarg < narg) { if (strcmp(arg[iarg],"model") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); if (strcmp(arg[iarg+1],"linear") == 0) { if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); model = new MLIAPModelLinear(lmp,arg[iarg+2]); @@ -168,6 +169,7 @@ void PairMLIAP::settings(int narg, char ** arg) modelflag = 1; } else if (strcmp(arg[iarg],"descriptor") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); if (strcmp(arg[iarg+1],"sna") == 0) { if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); descriptor = new MLIAPDescriptorSNAP(lmp,arg[iarg+2]); @@ -181,9 +183,10 @@ void PairMLIAP::settings(int narg, char ** arg) descriptorflag = 1; #ifdef MLIAP_PYTHON } else if (strcmp(arg[iarg], "unified") == 0) { - MLIAPBuildUnified_t build; + if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); + if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); - build = build_unified(arg[iarg+1], data, lmp); + MLIAPBuildUnified_t build = build_unified(arg[iarg+1], data, lmp); if (strcmp(arg[iarg+2],"0") == 0) { ghostneigh = 0; } else if (strcmp(arg[iarg+2],"1") == 0) { From e12e008d550daf8a46232947f7243dadb1ceb7c9 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 1 Sep 2022 12:52:58 +0200 Subject: [PATCH 081/364] bugfix in fix_pair.cpp: usage of triggername[ifield] instead of triggername[nfield] --- src/fix_pair.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 62095a9dd5..36d6372876 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -72,7 +72,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : if (trigger[ifield] == 0) triggername[ifield] = nullptr; else { auto str = fmt::format("{}_flag", fieldname[ifield]); - triggername[nfield] = utils::strdup(str); + triggername[ifield] = utils::strdup(str); } } From 93ade04269d58832ad7306fae8dae82fa41109a1 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 1 Sep 2022 12:58:15 +0200 Subject: [PATCH 082/364] pair_pace_extrapolation.cpp: - bugfix with extracting "gamma_flag" - ACEALImpl: delete all pointers (both Ctilde and B-basis) --- src/ML-PACE/pair_pace_extrapolation.cpp | 52 +++++++++++++------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 51139775b6..c17671d02b 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -53,6 +53,9 @@ namespace LAMMPS_NS { ~ACEALImpl() { delete basis_set; delete ace; + + delete ctilde_basis_set; + delete rec_ace; } ACEBBasisSet *basis_set; @@ -154,11 +157,14 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { // So this check and error effectively disallows use with pair style hybrid. if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } - //grow extrapolation_grade_gamma array, that store per-atom extrapolation grades - if (atom->nlocal > nmax) { + //if flag_compute_extrapolation_grade at this iteration then + // grow extrapolation_grade_gamma array, that store per-atom extrapolation grades + if (flag_compute_extrapolation_grade && atom->nlocal > nmax) { memory->destroy(extrapolation_grade_gamma); nmax = atom->nlocal; memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); + //zeroify array + memset(extrapolation_grade_gamma, 0, nmax * sizeof(*extrapolation_grade_gamma)); } //determine the maximum number of neighbours @@ -171,8 +177,6 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { if (jnum > max_jnum) max_jnum = jnum; } - bigint current_timestep = update->ntimestep; -// flag_compute_extrapolation_grade = (current_timestep - bevaluator_timestep_shift) % gamma_grade_eval_freq == 0; if (flag_compute_extrapolation_grade) aceimpl->ace->resize_neighbours_cache(max_jnum); @@ -211,7 +215,6 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { if (flag_compute_extrapolation_grade) { double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; -// bevaluator_timestep = current_timestep; extrapolation_grade_gamma[i] = current_atom_gamma_grade; } @@ -261,24 +264,24 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { if (vflag_fdotr) virial_fdotr_compute(); - if (flag_compute_extrapolation_grade) { - //gather together max_gamma_grade_per_structure - MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); - - // TODO: check, whether to stop here or externally in LAMMPS - // check if gamma_upper_bound is exceeded - if (max_gamma_grade_per_structure > gamma_upper_bound) { - if (comm->me == 0) - error->all(FLERR, - "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " - "timestep={}), stopping...\n", - max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); - - MPI_Barrier(world); - MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes - exit(EXIT_FAILURE); - } - } +// if (flag_compute_extrapolation_grade) { +// //gather together max_gamma_grade_per_structure +// MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); +// +// // TODO: check, whether to stop here or externally in LAMMPS +// // check if gamma_upper_bound is exceeded +// if (max_gamma_grade_per_structure > gamma_upper_bound) { +// if (comm->me == 0) +// error->all(FLERR, +// "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " +// "timestep={}), stopping...\n", +// max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); +// +// MPI_Barrier(world); +// MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes +// exit(EXIT_FAILURE); +// } +// } // end modifications YL } @@ -467,7 +470,8 @@ double PairPACEExtrapolation::init_one(int i, int j) { void *PairPACEExtrapolation::extract(const char *str, int &dim) { //check if str=="gamma_flag" then compute extrapolation grades on this iteration dim = 0; - if (strcmp(str, "gamma_flag")) return (void *) &flag_compute_extrapolation_grade; + if (strcmp(str, "gamma_flag")==0) + return (void *) &flag_compute_extrapolation_grade; dim = 2; if (strcmp(str, "scale") == 0) return (void *) scale; From 0783a0564f7416f63ec9facb87f2f5a661f4419d Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Fri, 2 Sep 2022 14:49:04 +0200 Subject: [PATCH 083/364] pair_pace_extrapolation.cpp: - remove unused variables (gamma lo/up bounds) fix_pair.h/cpp: add modify_param method for "fix_modify pair Nevery" that updates "nevery" variable --- src/ML-PACE/pair_pace_extrapolation.cpp | 57 ++----------------------- src/ML-PACE/pair_pace_extrapolation.h | 7 --- src/fix_pair.cpp | 8 ++++ src/fix_pair.h | 2 + 4 files changed, 13 insertions(+), 61 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index c17671d02b..053918ee82 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -123,8 +123,6 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { double delx, dely, delz, evdwl; double fij[3]; int *ilist, *jlist, *numneigh, **firstneigh; - double max_gamma_grade = 0; - max_gamma_grade_per_structure = 0; ev_init(eflag, vflag); // downwards modified by YL @@ -213,9 +211,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade if (flag_compute_extrapolation_grade) { - double current_atom_gamma_grade = aceimpl->ace->max_gamma_grade; - if (max_gamma_grade < current_atom_gamma_grade) max_gamma_grade = current_atom_gamma_grade; - extrapolation_grade_gamma[i] = current_atom_gamma_grade; + extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade;; } Array2D &neighbours_forces = @@ -264,25 +260,6 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) { if (vflag_fdotr) virial_fdotr_compute(); -// if (flag_compute_extrapolation_grade) { -// //gather together max_gamma_grade_per_structure -// MPI_Allreduce(&max_gamma_grade, &max_gamma_grade_per_structure, 1, MPI_DOUBLE, MPI_MAX, world); -// -// // TODO: check, whether to stop here or externally in LAMMPS -// // check if gamma_upper_bound is exceeded -// if (max_gamma_grade_per_structure > gamma_upper_bound) { -// if (comm->me == 0) -// error->all(FLERR, -// "Extrapolation grade is too large (gamma={:.3f} > gamma_upper_bound={:.3f}, " -// "timestep={}), stopping...\n", -// max_gamma_grade_per_structure, gamma_upper_bound, current_timestep); -// -// MPI_Barrier(world); -// MPI_Abort(world, 1); //abort properly with error code '1' if not using many processes -// exit(EXIT_FAILURE); -// } -// } - // end modifications YL } @@ -303,41 +280,13 @@ void PairPACEExtrapolation::allocate() { ------------------------------------------------------------------------- */ void PairPACEExtrapolation::settings(int narg, char **arg) { - if (narg > 3) { - error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/al " - "[gamma_lower_bound] [gamma_upper_bound] [freq]"); - } - if (narg > 0) { - double glb = atof(arg[0]); // gamma lower bound - if (glb < 1.0) - error->all(FLERR, "Illegal gamma_lower_bound value: it should be real number >= 1.0"); - else - gamma_lower_bound = glb; + error->all(FLERR, + "Illegal pair_style command. Correct form:\n\tpair_style pace/extrapolation "); } - if (narg > 1) { - double gub = atof(arg[1]); // gamma upper bound - if (gub < gamma_lower_bound) - error->all( - FLERR, - "Illegal gamma_upper_bound value: it should be real number >= gamma_lower_bound >= 1.0"); - else - gamma_upper_bound = gub; - } - -// if (narg > 2) { -// gamma_grade_eval_freq = atoi(arg[2]); -// if (gamma_grade_eval_freq < 1) -// error->all(FLERR, "Illegal gamma_grade_eval_freq value: it should be integer number >= 1"); -// } - if (comm->me == 0) { utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - utils::logmesg(lmp, "Extrapolation grade thresholds (lower/upper): {}/{}\n", gamma_lower_bound, - gamma_upper_bound); -// utils::logmesg(lmp, "Extrapolation grade evaluation frequency: {}\n", gamma_grade_eval_freq); } } diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index 3cacf1dc27..6e4eb53965 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -47,17 +47,10 @@ class PairPACEExtrapolation : public Pair { protected: struct ACEALImpl *aceimpl; -// bigint gamma_grade_eval_freq = 1; -// bool is_set_energies_forces = true; // if set, then update forces and energies int nmax; - double gamma_lower_bound = 1.5; - double gamma_upper_bound = 10; - double max_gamma_grade_per_structure = 0; - void allocate(); std::vector element_names; // list of elements (used by dump pace/extrapolation) - double rcutmax; // max cutoff for all elements int nelements; // # of unique elements double *extrapolation_grade_gamma; //per-atom gamma value diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 36d6372876..93e76f0c74 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -279,3 +279,11 @@ double FixPair::memory_usage() else bytes += (double)atom->nmax*ncols * sizeof(double); return bytes; } + +int FixPair::modify_param(int narg, char **arg) +{ + nevery = utils::inumeric(FLERR,arg[0],false,lmp); + if (nevery < 1) error->all(FLERR,"Illegal fix_modify pair command"); + + return 1; // how many arguments were processed +} \ No newline at end of file diff --git a/src/fix_pair.h b/src/fix_pair.h index a9927cf477..7686adff66 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -38,6 +38,8 @@ class FixPair : public Fix { void grow_arrays(int) override; double memory_usage() override; + int modify_param(int, char **) override; + private: int nevery,nfield,ncols; char *pairname; From f9c49620b3327fcc239b2956dc257cbd3f4acfd3 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 2 Sep 2022 09:38:24 -0600 Subject: [PATCH 084/364] add minimization support --- src/fix_pair.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++---- src/fix_pair.h | 6 ++++ 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 68d05fdd57..cb2ccf9ef2 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -101,15 +101,18 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : } } - // settings - // freq = 1 since vector/array always have values - // allows user to specify nevery = 0 for a dump - // which this fix outputs whenever it wants + // if set peratom_freq = Nevery, then cannot access the per-atom + // values as part of thermo output during minimiziation + // at different frequency or on last step of minimization + // instead set peratom_freq = 1 + // ok, since vector/array always have values + // but requires the vector/array be persisted between Nevery steps + // since it may be accessed peratom_flag = 1; if (ncols == 1) size_peratom_cols = 0; else size_peratom_cols = ncols; - peratom_freq = nevery; + peratom_freq = 1; // perform initial allocation of atom-based array // register with Atom class @@ -163,7 +166,9 @@ int FixPair::setmask() { int mask = 0; mask |= PRE_FORCE; + mask |= MIN_PRE_FORCE; mask |= POST_FORCE; + mask |= MIN_POST_FORCE; return mask; } @@ -205,6 +210,13 @@ void FixPair::pre_force(int /*vflag*/) if (trigger[ifield]) *(triggerptr[ifield]) = 1; } +/* ---------------------------------------------------------------------- */ + +void FixPair::min_pre_force(int vflag) +{ + pre_force(vflag); +} + /* ---------------------------------------------------------------------- extract results from pair style ------------------------------------------------------------------------- */ @@ -253,6 +265,13 @@ void FixPair::post_force(int /*vflag*/) if (trigger[ifield]) *(triggerptr[ifield]) = 0; } +/* ---------------------------------------------------------------------- */ + +void FixPair::min_post_force(int vflag) +{ + post_force(vflag); +} + /* ---------------------------------------------------------------------- allocate atom-based vector or array ------------------------------------------------------------------------- */ @@ -268,6 +287,52 @@ void FixPair::grow_arrays(int nmax) } } +/* ---------------------------------------------------------------------- + copy values within local atom-based array +------------------------------------------------------------------------- */ + +void FixPair::copy_arrays(int i, int j, int /*delflag*/) +{ + if (ncols == 1) { + vector[j] = vector[i]; + } else { + for (int m = 0; m < ncols; m++) + array[j][m] = array[i][m]; + } +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixPair::pack_exchange(int i, double *buf) +{ + if (ncols == 1) { + buf[0] = vector[i]; + } else { + for (int m = 0; m < ncols; m++) + buf[m] = array[i][m]; + } + + return ncols; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixPair::unpack_exchange(int nlocal, double *buf) +{ + if (ncols == 1) { + vector[nlocal] = buf[0]; + } else { + for (int m = 0; m < ncols; m++) + array[nlocal][m] = buf[m]; + } + + return ncols; +} + /* ---------------------------------------------------------------------- memory usage of local atom-based vector or array ------------------------------------------------------------------------- */ diff --git a/src/fix_pair.h b/src/fix_pair.h index a9927cf477..c4d0bb593c 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -33,9 +33,15 @@ class FixPair : public Fix { void setup(int) override; void setup_pre_force(int) override; void pre_force(int) override; + void min_pre_force(int) override; void post_force(int) override; + void min_post_force(int) override; void grow_arrays(int) override; + void copy_arrays(int, int, int) override; + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + double memory_usage() override; private: From edfac129a1313096d4b0d5bb6628df49f9f03faf Mon Sep 17 00:00:00 2001 From: jtclemm Date: Sat, 3 Sep 2022 15:33:29 -0600 Subject: [PATCH 085/364] Fixing estimated r0 on restart, other small edits --- src/BPM/bond_bpm.cpp | 58 ++++++++++++++++++++------------- src/BPM/bond_bpm_rotational.cpp | 3 +- src/BPM/bond_bpm_spring.cpp | 4 +-- src/dump_local.cpp | 13 -------- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index 124e7cac16..55c3a11028 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -257,24 +257,43 @@ double BondBPM::equilibrium_distance(int /*i*/) { // Ghost atoms may not yet be communicated, this may only be an estimate if (r0_max_estimate == 0) { - int type, j; - double delx, dely, delz, r; - double **x = atom->x; - for (int i = 0; i < atom->nlocal; i++) { - for (int m = 0; m < atom->num_bond[i]; m++) { - type = atom->bond_type[i][m]; - if (type == 0) continue; + if (!fix_bond_history->restart_reset) { + int type, j; + double delx, dely, delz, r; + double **x = atom->x; + for (int i = 0; i < atom->nlocal; i++) { + for (int m = 0; m < atom->num_bond[i]; m++) { + type = atom->bond_type[i][m]; + if (type == 0) continue; - j = atom->map(atom->bond_atom[i][m]); - if (j == -1) continue; + j = atom->map(atom->bond_atom[i][m]); + if (j == -1) continue; - delx = x[i][0] - x[j][0]; - dely = x[i][1] - x[j][1]; - delz = x[i][2] - x[j][2]; - domain->minimum_image(delx, dely, delz); + delx = x[i][0] - x[j][0]; + dely = x[i][1] - x[j][1]; + delz = x[i][2] - x[j][2]; + domain->minimum_image(delx, dely, delz); - r = sqrt(delx * delx + dely * dely + delz * delz); - if (r > r0_max_estimate) r0_max_estimate = r; + r = sqrt(delx * delx + dely * dely + delz * delz); + if (r > r0_max_estimate) r0_max_estimate = r; + } + } + } else { + int type, j; + double delx, dely, delz, r; + double **x = atom->x; + for (int i = 0; i < atom->nlocal; i++) { + for (int m = 0; m < atom->num_bond[i]; m++) { + type = atom->bond_type[i][m]; + if (type == 0) continue; + + j = atom->map(atom->bond_atom[i][m]); + if (j == -1) continue; + + // First value must always be reference length + r = fix_bond_history->get_atom_value(i, m, 0); + if (r > r0_max_estimate) r0_max_estimate = r; + } } } @@ -293,8 +312,6 @@ double BondBPM::equilibrium_distance(int /*i*/) void BondBPM::write_restart(FILE *fp) { - fwrite(&max_stretch, sizeof(double), 1, fp); - fwrite(&r0_max_estimate, sizeof(double), 1, fp); fwrite(&overlay_flag, sizeof(int), 1, fp); } @@ -304,13 +321,8 @@ void BondBPM::write_restart(FILE *fp) void BondBPM::read_restart(FILE *fp) { - if (comm->me == 0) { - utils::sfread(FLERR, &max_stretch, sizeof(double), 1, fp, nullptr, error); - utils::sfread(FLERR, &r0_max_estimate, sizeof(double), 1, fp, nullptr, error); + if (comm->me == 0) utils::sfread(FLERR, &overlay_flag, sizeof(int), 1, fp, nullptr, error); - } - MPI_Bcast(&max_stretch, 1, MPI_DOUBLE, 0, world); - MPI_Bcast(&r0_max_estimate, 1, MPI_DOUBLE, 0, world); MPI_Bcast(&overlay_flag, 1, MPI_INT, 0, world); } diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index fe1071e127..986adce4cb 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -801,7 +801,8 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo double breaking = elastic_forces(i, j, type, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, torque1on2, torque2on1); damping_forces(i, j, type, rhat, r, force1on2, torque1on2, torque2on1); - fforce = MathExtra::len3(force1on2); + fforce = MathExtra::dot3(force1on2, r); + fforce *= -1; double smooth = 1.0; if (smooth_flag) { diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index 8172a596cf..cb49639010 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -311,6 +311,7 @@ void BondBPMSpring::settings(int narg, char **arg) void BondBPMSpring::write_restart(FILE *fp) { + BondBPM::write_restart(fp); write_restart_settings(fp); fwrite(&k[1], sizeof(double), atom->nbondtypes, fp); @@ -324,6 +325,7 @@ void BondBPMSpring::write_restart(FILE *fp) void BondBPMSpring::read_restart(FILE *fp) { + BondBPM::read_restart(fp); read_restart_settings(fp); allocate(); @@ -345,7 +347,6 @@ void BondBPMSpring::read_restart(FILE *fp) void BondBPMSpring::write_restart_settings(FILE *fp) { - BondBPM::write_restart_settings(fp); fwrite(&smooth_flag, sizeof(int), 1, fp); } @@ -355,7 +356,6 @@ void BondBPMSpring::write_restart_settings(FILE *fp) void BondBPMSpring::read_restart_settings(FILE *fp) { - BondBPM::read_restart_settings(fp); if (comm->me == 0) utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); diff --git a/src/dump_local.cpp b/src/dump_local.cpp index 63a1822c20..bf26890b05 100644 --- a/src/dump_local.cpp +++ b/src/dump_local.cpp @@ -172,19 +172,6 @@ void DumpLocal::init_style() if (sort_flag && sortcol == 0) error->all(FLERR,"Dump local cannot sort by atom ID"); - // assemble ITEMS: column string from defaults and user values - - delete[] columns; - std::string combined; - int icol = 0; - for (auto item : utils::split_words(columns_default)) { - if (combined.size()) combined += " "; - if (keyword_user[icol].size()) combined += keyword_user[icol]; - else combined += item; - ++icol; - } - columns = utils::strdup(combined); - // format = copy of default or user-specified line format delete[] format; From 71970858cf3e5b5a386b68546bd775f40448ade8 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Sat, 3 Sep 2022 16:44:21 -0600 Subject: [PATCH 086/364] Updating error messages, small changes to doc --- src/BPM/bond_bpm_rotational.cpp | 4 ++-- src/BPM/bond_bpm_spring.cpp | 4 ++-- src/BPM/compute_nbond_atom.cpp | 2 +- src/compute_bond_local.cpp | 2 +- src/fix_update_special_bonds.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index 986adce4cb..49b66a77a7 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -660,11 +660,11 @@ void BondBPMRotational::settings(int narg, char **arg) for (std::size_t i = 0; i < leftover_iarg.size(); i++) { iarg = leftover_iarg[i]; if (strcmp(arg[iarg], "smooth") == 0) { - if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command"); + if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command, missing option for smooth"); smooth_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); i += 1; } else { - error->all(FLERR, "Illegal bond_style command"); + error->all(FLERR, "Illegal bond bpm command, invalid argument {}", arg[iarg]); } } } diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index cb49639010..a4c824db29 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -296,11 +296,11 @@ void BondBPMSpring::settings(int narg, char **arg) for (std::size_t i = 0; i < leftover_iarg.size(); i++) { iarg = leftover_iarg[i]; if (strcmp(arg[iarg], "smooth") == 0) { - if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command"); + if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command, missing option for smooth"); smooth_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); i += 1; } else { - error->all(FLERR, "Illegal bond_style command"); + error->all(FLERR, "Illegal bond bpm command, invalid argument {}", arg[iarg]); } } } diff --git a/src/BPM/compute_nbond_atom.cpp b/src/BPM/compute_nbond_atom.cpp index 9947c9b09e..5cec50b587 100644 --- a/src/BPM/compute_nbond_atom.cpp +++ b/src/BPM/compute_nbond_atom.cpp @@ -38,7 +38,7 @@ ComputeNBondAtom::ComputeNBondAtom(LAMMPS *_lmp, int narg, char **arg) : if (narg == 4) { if (utils::strmatch(arg[3], "forward")) comm_forward = 1; - else error->all(FLERR, "Illegal compute nbond/atom command"); + else error->all(FLERR, "Illegal compute nbond/atom argument {}", arg[3]); } nmax = 0; diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index 3eceb9af91..19561cc6bf 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -83,7 +83,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : nvar++; } else if (arg[iarg][0] == 'b') { int n = atoi(&arg[iarg][1]); - if (n <= 0) error->all(FLERR, "Invalid keyword in compute bond/local command"); + if (n <= 0) error->all(FLERR, "Invalid keyword {} in compute bond/local command", arg[iarg]); bstyle[nvalues] = BN; bindex[nvalues++] = n - 1; } else break; diff --git a/src/fix_update_special_bonds.cpp b/src/fix_update_special_bonds.cpp index 719eafceb8..2eb24ff726 100644 --- a/src/fix_update_special_bonds.cpp +++ b/src/fix_update_special_bonds.cpp @@ -246,4 +246,4 @@ void FixUpdateSpecialBonds::add_created_bond(int i, int j) auto tag_pair = std::make_pair(atom->tag[i], atom->tag[j]); new_created_pairs.push_back(tag_pair); created_pairs.push_back(tag_pair); -} \ No newline at end of file +} From 8b3c1a20a8f7f65ccbe462ca9f4a28592c9675f8 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Tue, 6 Sep 2022 10:13:59 -0600 Subject: [PATCH 087/364] Removing unneeded feature --- doc/src/Howto_bpm.rst | 13 +++++++----- doc/src/bond_bpm_rotational.rst | 13 ++++++------ doc/src/bond_bpm_spring.rst | 2 +- doc/src/pair_bpm_spring.rst | 2 +- src/BPM/compute_nbond_atom.cpp | 36 +-------------------------------- src/BPM/compute_nbond_atom.h | 2 -- 6 files changed, 18 insertions(+), 50 deletions(-) diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 7147401182..9dc043a7e1 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -65,9 +65,9 @@ Various properties of bonds can be computed using the :doc:`compute property/bond ` command. This command allows one to access data saved to the bond's history such as the reference length of the bond. More information on -historical data can be found on the documentation pages for the specific -BPM bond styles. Finally, this data can be output using `dump local `. -As one may output many columns from the same compute, the +bond history data can be found on the documentation pages for the specific +BPM bond styles. Finally, this data can be output using a :doc:`dump local ` +command. As one may output many columns from the same compute, the :doc:`dump modify ` *colname* option may be used to provide more helpful column names. An example of this procedure is found in /examples/bpm/pour/. External software, such as OVITO, can read these dump @@ -80,13 +80,16 @@ As bonds can be broken between neighbor list builds, the bond styles. There are two possible settings which determine how pair interactions work between bonded particles. First, one can overlay pair forces with bond forces such that all bonded particles also -feel pair interactions. This can be accomplished by using the *overlay/pair* keyword present in all bpm bond styles and by using the following special bond settings +feel pair interactions. This can be accomplished by using the *overlay/pair* +keyword present in all bpm bond styles and by using the following special +bond settings .. code-block:: LAMMPS special_bonds lj/coul 1 1 1 -Alternatively, one can turn off all pair interactions between bonded particles. Unlike :doc:`bond quartic `, this is not done +Alternatively, one can turn off all pair interactions between bonded +particles. Unlike :doc:`bond quartic `, this is not done by subtracting pair forces during the bond computation but rather by dynamically updating the special bond list. This is the default behavior of BPM bond styles and is done by updating the 1-2 special bond list as diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index b25d5d9af2..e665de466f 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -179,7 +179,7 @@ This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart file will properly resume bonds. However, the reference state is NOT written to data files. Therefore reading a data file will not -restore bonds which will recalculate their reference state. +restore bonds and will cause their reference states to be redefined. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these @@ -207,11 +207,12 @@ of a bonded interaction, since energy is not conserved in these dissipative potentials. It also returns only the normal component of the bonded interaction force. However, the single() function also calculates 7 extra bond quantities. The first 4 are data from the -reference state of the bond including the magnitude :math:`r_0` -followed by the :math:`x`, :math:`y`, and :math:`z` components of the -initial unit vector pointing to particle I from particle J. The next 3 -(5-7) are the components of the total force, including normal and -tangential contributions, acting on particle I. +reference state of the bond including the initial distance between particles +:math:`r_0` followed by the :math:`x`, :math:`y`, and :math:`z` components +of the initial unit vector pointing to particle I from particle J. The next 3 +quantities (5-7) are the :math:`x`, :math:`y`, and :math:`z` components +of the total force, including normal and tangential contributions, acting +on particle I. These extra quantities can be accessed by the :doc:`compute bond/local ` command, as *b1*, *b2*, ..., *b7*\ . diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 8297e5b147..7f781e4657 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -143,7 +143,7 @@ This bond style writes the reference state of each bond to :doc:`binary restart files `. Loading a restart file will properly restore bonds. However, the reference state is NOT written to data files. Therefore reading a data file will not -restore bonds which will recalculate their reference state. +restore bonds and will cause their reference states to be redefined. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these diff --git a/doc/src/pair_bpm_spring.rst b/doc/src/pair_bpm_spring.rst index 8235b1c624..a9a4bbee70 100644 --- a/doc/src/pair_bpm_spring.rst +++ b/doc/src/pair_bpm_spring.rst @@ -59,7 +59,7 @@ include this pair interaction and overlay the pair force over the bond force or to exclude this pair interaction such that the two particles only interact via the bond force. See discussion of the *overlay/pair* option for BPM bond styles and the :doc:`special_bonds ` -command in the `:doc: how to ` page on BPMs for more details. +command in the :doc:`how to ` page on BPMs for more details. The following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples diff --git a/src/BPM/compute_nbond_atom.cpp b/src/BPM/compute_nbond_atom.cpp index 5cec50b587..b0fbacf038 100644 --- a/src/BPM/compute_nbond_atom.cpp +++ b/src/BPM/compute_nbond_atom.cpp @@ -29,17 +29,11 @@ using namespace LAMMPS_NS; ComputeNBondAtom::ComputeNBondAtom(LAMMPS *_lmp, int narg, char **arg) : Compute(_lmp, narg, arg), nbond(nullptr) { - if ((narg < 3) || (narg > 4)) error->all(FLERR, "Illegal compute nbond/atom command"); + if (narg < 3) error->all(FLERR, "Illegal compute nbond/atom command"); peratom_flag = 1; size_peratom_cols = 0; comm_reverse = 1; - comm_forward = 0; - - if (narg == 4) { - if (utils::strmatch(arg[3], "forward")) comm_forward = 1; - else error->all(FLERR, "Illegal compute nbond/atom argument {}", arg[3]); - } nmax = 0; } @@ -106,9 +100,6 @@ void ComputeNBondAtom::compute_peratom() for (i = 0; i < nlocal; i++) if (!(mask[i] & groupbit)) nbond[i] = 0.0; - - // forward to ghosts if requested - if (comm_forward != 0) comm->forward_comm(this); } /* ---------------------------------------------------------------------- */ @@ -135,31 +126,6 @@ void ComputeNBondAtom::unpack_reverse_comm(int n, int *list, double *buf) nbond[j] += buf[m++]; } } -/* ---------------------------------------------------------------------- */ - -int ComputeNBondAtom::pack_forward_comm(int n, int *list, double *buf, - int /*pbc_flag*/, int * /*pbc*/) -{ - int i,j,m; - - m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = nbond[j]; - } - return m; -} - -/* ---------------------------------------------------------------------- */ - -void ComputeNBondAtom::unpack_forward_comm(int n, int first, double *buf) -{ - int i,m,last; - - m = 0; - last = first + n; - for (i = first; i < last; i++) nbond[i] = buf[m++]; -} /* ---------------------------------------------------------------------- memory usage of local atom-based array diff --git a/src/BPM/compute_nbond_atom.h b/src/BPM/compute_nbond_atom.h index fe793cc05f..32d4ca2462 100644 --- a/src/BPM/compute_nbond_atom.h +++ b/src/BPM/compute_nbond_atom.h @@ -32,8 +32,6 @@ class ComputeNBondAtom : public Compute { void compute_peratom() override; int pack_reverse_comm(int, int, double *) override; void unpack_reverse_comm(int, int *, double *) override; - int pack_forward_comm(int, int *, double *, int, int *) override; - void unpack_forward_comm(int, int, double *) override; double memory_usage() override; private: From d8f211c05d6f4e70d380dc16bf34d424f94132d5 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 8 Sep 2022 17:15:23 -0600 Subject: [PATCH 088/364] allow fix latte to exclude atoms in a group --- src/LATTE/fix_latte.cpp | 179 +++++++++++++++++++++++++++++++--------- src/LATTE/fix_latte.h | 6 ++ 2 files changed, 147 insertions(+), 38 deletions(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 71df0d0c8b..b72deb6f08 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -24,6 +24,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "group.h" #include "memory.h" #include "modify.h" #include "update.h" @@ -63,8 +64,6 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : if (LATTE_ABIVERSION != latte_abiversion()) error->all(FLERR,"LAMMPS is linked against incompatible LATTE library"); - if (narg != 4) error->all(FLERR,"Illegal fix latte command"); - scalar_flag = 1; global_freq = 1; extscalar = 1; @@ -72,21 +71,40 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : virial_global_flag = 1; thermo_energy = thermo_virial = 1; - // store ID of compute pe/atom used to generate Coulomb potential for LATTE - // null pointer means LATTE will compute Coulombic potential - + // process optional args + coulomb = 0; id_pe = nullptr; + exclude = 0; - if (strcmp(arg[3],"NULL") != 0) { - coulomb = 1; - error->all(FLERR,"Fix latte does not yet support a LAMMPS calculation of a Coulomb potential"); + int iarg = 3; + while (iarg < narg) { + if (strcmp(arg[iarg],"coulomb") == 0) { + if (iarg+2 > narg) + utils::missing_cmd_args(FLERR, "fix latte coulomb", error); + coulomb = 1; + error->all(FLERR,"Fix latte does not yet support a " + "LAMMPS calculation of a Coulomb potential"); + id_pe = utils::strdup(arg[3]); + c_pe = modify->get_compute_by_id(id_pe); + if (!c_pe) error->all(FLERR,"Could not find fix latte compute ID {}", id_pe); + if (c_pe->peatomflag == 0) + error->all(FLERR,"Fix latte compute ID does not compute pe/atom"); + iarg += 2; - id_pe = utils::strdup(arg[3]); - c_pe = modify->get_compute_by_id(id_pe); - if (!c_pe) error->all(FLERR,"Could not find fix latte compute ID {}", id_pe); - if (c_pe->peatomflag == 0) - error->all(FLERR,"Fix latte compute ID does not compute pe/atom"); + } else if (strcmp(arg[iarg],"exclude") == 0) { + if (iarg+2 > narg) + utils::missing_cmd_args(FLERR, "fix latte exclude", error); + exclude = 1; + int excludegroup = group->find(arg[iarg+1]); + if (excludegroup == -1) + error->all(FLERR, "Fix latte couldd not find exclude group ID: {}", + arg[iarg+1]); + excludebit = group->bitmask[excludegroup]; + iarg += 2; + + } else + error->all(FLERR, "Unknown fix latte keyword: {}", arg[iarg]); } // initializations @@ -234,37 +252,32 @@ void FixLatte::post_force(int vflag) neighflag = 0; // set flags used by LATTE - // NOTE: LATTE does not compute per-atom energies or virials + // note that LATTE does not compute per-atom energies or virials - int flags[6]; + flags_latte[0] = pbcflag; // 1 for fully periodic, 0 for fully non-periodic + flags_latte[1] = coulombflag; // 1 for LAMMPS computes Coulombics, 0 for LATTE + flags_latte[2] = eflag_atom; // 1 to return per-atom energies, 0 for no + flags_latte[3] = vflag_global && thermo_virial; // 1 to return global/per-atom + flags_latte[4] = vflag_atom && thermo_virial; // virial, 0 for no + flags_latte[5] = neighflag; // 1 to pass neighbor list to LATTE, 0 for no - flags[0] = pbcflag; // 1 for fully periodic, 0 for fully non-periodic - flags[1] = coulombflag; // 1 for LAMMPS computes Coulombics, 0 for LATTE - flags[2] = eflag_atom; // 1 to return per-atom energies, 0 for no - flags[3] = vflag_global && thermo_virial; // 1 to return global/per-atom - flags[4] = vflag_atom && thermo_virial; // virial, 0 for no - flags[5] = neighflag; // 1 to pass neighbor list to LATTE, 0 for no + // setup arguments for latte() function within LATTE lib and invoke it + // either for all atoms or excluding some atoms + // in latter case, need to construct reduced-size per-atom vectors/arrays - // setup LATTE arguments + if (!exclude) latte_wrapper_all(); + else { + int *mask = atom->mask; + int nlocal = atom->nlocal; - int natoms = atom->nlocal; - double *coords = &atom->x[0][0]; - int *type = atom->type; - int ntypes = atom->ntypes; - double *mass = &atom->mass[1]; - double *boxlo = domain->boxlo; - double *boxhi = domain->boxhi; - double *forces; - bool latteerror = false; - if (coulomb) forces = &flatte[0][0]; - else forces = &atom->f[0][0]; - int maxiter = -1; + int anyexclude = 0; + for (int i = 0; i < nlocal; i++) + if (mask[i] & excludebit) anyexclude = 1; - latte(flags,&natoms,coords,type,&ntypes,mass,boxlo,boxhi,&domain->xy, - &domain->xz,&domain->yz,forces,&maxiter,&latte_energy, - &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); + if (!anyexclude) latte_wrapper_all(); + else latte_wrapper_exclude(); + } - if (latteerror) error->all(FLERR,"Internal LATTE problem"); // sum LATTE forces to LAMMPS forces // e.g. LAMMPS may compute Coulombics at some point @@ -280,6 +293,96 @@ void FixLatte::post_force(int vflag) } } +/* ---------------------------------------------------------------------- + invoke LATTE on all LAMMPS atoms +------------------------------------------------------------------------- */ + +void FixLatte::latte_wrapper_all() +{ + int natoms = atom->nlocal; + double *coords = &atom->x[0][0]; + int *types = atom->type; + int ntypes = atom->ntypes; + double *mass = &atom->mass[1]; + double *boxlo = domain->boxlo; + double *boxhi = domain->boxhi; + double *forces; + bool latteerror = false; + if (coulomb) forces = &flatte[0][0]; + else forces = &atom->f[0][0]; + int maxiter = -1; + + latte(flags_latte,&natoms,coords,types,&ntypes,mass,boxlo,boxhi, + &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, + &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); + + if (latteerror) error->all(FLERR,"Internal LATTE problem"); +} + +/* ---------------------------------------------------------------------- + invoke LATTE on only LAMMPS atoms not in exclude group +------------------------------------------------------------------------- */ + +void FixLatte::latte_wrapper_exclude() +{ + int *mask = atom->mask; + int nlocal = atom->nlocal; + + int nlatte = 0; + for (int i = 0; i < nlocal; i++) + if (!(mask[i] & excludebit)) nlatte++; + + // created compressed type vectory and coords array + + int *typeinclude; + double **xinclude,**finclude; + memory->create(typeinclude,nlatte,"latte:typeinclude"); + memory->create(xinclude,nlatte,3,"latte:xinclude"); + memory->create(finclude,nlatte,3,"latte:finclude"); + + double **x = atom->x; + int *type = atom->type; + + nlatte = 0; + for (int i = 0; i < nlocal; i++) { + if (mask[i] & excludebit) continue; + typeinclude[nlatte] = type[i]; + x[nlatte][0] = x[i][0]; + x[nlatte][1] = x[i][1]; + x[nlatte][2] = x[i][2]; + nlatte++; + } + + double *coords = &xinclude[0][0]; + int *types = typeinclude; + int ntypes = atom->ntypes; + double *mass = &atom->mass[1]; + double *boxlo = domain->boxlo; + double *boxhi = domain->boxhi; + double *forces = &finclude[0][0]; + bool latteerror = false; + int maxiter = -1; + + latte(flags_latte,&nlatte,coords,types,&ntypes,mass,boxlo,boxhi, + &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, + &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); + + if (latteerror) error->all(FLERR,"Internal LATTE problem"); + + // expand compressed forces array + + double **f = atom->f; + + int m = 0; + for (int i = 0; i < nlocal; i++) { + if (mask[i] & excludebit) continue; + f[i][0] = forces[m+0]; + f[i][1] = forces[m+1]; + f[i][2] = forces[m+2]; + m += 3; + } +} + /* ---------------------------------------------------------------------- */ void FixLatte::min_post_force(int vflag) diff --git a/src/LATTE/fix_latte.h b/src/LATTE/fix_latte.h index 894940e1e2..fdc3fdee40 100644 --- a/src/LATTE/fix_latte.h +++ b/src/LATTE/fix_latte.h @@ -46,8 +46,11 @@ class FixLatte : public Fix { protected: char *id_pe; int coulomb, pbcflag, pe_peratom, virial_global, virial_peratom, neighflag; + int exclude, excludebit; int eflag_caller; + int flags_latte[6]; + int nmax, newsystem; double *qpotential; double **flatte; @@ -55,6 +58,9 @@ class FixLatte : public Fix { class NeighList *list; class Compute *c_pe; + + void latte_wrapper_all(); + void latte_wrapper_exclude(); }; } // namespace LAMMPS_NS From ad05300d25fc9650ed15b04063f2ccd6ddea7d50 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 8 Sep 2022 17:27:53 -0600 Subject: [PATCH 089/364] free memory --- src/LATTE/fix_latte.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index b72deb6f08..1095b9ab9a 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -328,11 +328,13 @@ void FixLatte::latte_wrapper_exclude() int *mask = atom->mask; int nlocal = atom->nlocal; + // nlatte = number of non-excluded atoms to pass to LATTE + int nlatte = 0; for (int i = 0; i < nlocal; i++) if (!(mask[i] & excludebit)) nlatte++; - // created compressed type vectory and coords array + // created compressed type vector and coords array int *typeinclude; double **xinclude,**finclude; @@ -381,6 +383,10 @@ void FixLatte::latte_wrapper_exclude() f[i][2] = forces[m+2]; m += 3; } + + memory->destroy(typeinclude); + memory->destroy(xinclude); + memory->destroy(finclude); } /* ---------------------------------------------------------------------- */ From 97f8a600e798aeca6d61397b0c40d173444ab4fa Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 8 Sep 2022 17:44:15 -0600 Subject: [PATCH 090/364] initial doc page edits --- doc/src/fix_latte.rst | 47 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index 8a6315fa48..6ce84f9d52 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -8,18 +8,27 @@ Syntax .. parsed-literal:: - fix ID group-ID latte peID + fix ID group-ID latte keyword value ... * ID, group-ID are documented in :doc:`fix ` command * latte = style name of this fix command -* peID = NULL or ID of compute used to calculate per-atom energy +* zero or more keyword/value pairs may be appended + + .. parsed-literal:: + + keyword = *coulomb* or *exclude* + *coulomb* value = peID + peID = ID of compute used to calculate per-atom energy + *exclude* value = groupID + groupID = ID of group of atoms to exclude before calling LATTE Examples """""""" .. code-block:: LAMMPS - fix dftb all latte NULL + fix dftb all latte + fix dftb all exclude GCMCmol Description """"""""""" @@ -48,10 +57,34 @@ found in examples/latte. A step-by-step tutorial can be followed at: `LAMMPS-LATTE tutorial `_ -The *peID* argument is not yet supported by fix latte, so it must be -specified as NULL. Eventually it will be used to enable LAMMPS to -calculate a Coulomb potential as an alternative to LATTE performing -the calculation. +---------- + +The *coulomb* argument is not yet supported by fix latte (as of Sept +2022). Eventually it will be used to enable LAMMPS to calculate a +Coulomb potential as an alternative to LATTE performing the +calculation. + +NOTE: after intitial debugging, change the exclude arg to +be the ID of another fix (GCMC in this case), and extract() +the exclusion group ID from fix gcmc. + +The *exclude argument allows this fix to work in tandem with the +:doc:`fix gcmc ` command which may decide to delete an atom +or molecule as one of its Monte Carlo events. In this case, LAMMPS +needs to pass LATTE the atoms for the system with the atom/molecule +removed. Fix gcmc does not actually remove the atom/molecule until +after the new energy is computed (in this case by LATTE), and a Monte +Carlo accept/reject decision is made for the event. + +The specified groupID must match the group ID which the :doc:`fix gcmc +` command assigns to atoms flagged for possible deletion. +It should be either its default exclusion group ID or group ID used +with its "exclude" keyword option. + +.. note:: + + The fix gcmc command must appear in the input script prior + to the fix latte command for this to work. ---------- From 19604575a4f841b8d77dc9e34fe4cf5d0fa0f6f5 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 9 Sep 2022 00:53:18 -0600 Subject: [PATCH 091/364] Update mliap docs for unified --- doc/src/pair_mliap.rst | 55 +++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 900a2c2e6a..b6f65a9525 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -11,7 +11,7 @@ Syntax pair_style mliap ... keyword values ... * two keyword/value pairs must be appended -* keyword = *model* or *descriptor* +* keyword = *model* or *descriptor* or *unified* .. parsed-literal:: @@ -21,6 +21,9 @@ Syntax *descriptor* values = style filename style = *sna* or *so3* filename = name of file containing descriptor definitions + *unified* values = filename ghostneigh_flag + filename = name of file containing serialized unified Python object + ghostneigh_flag = 0/1 to turn off/on inclusion of ghost neighbors in neighbors list Examples """""""" @@ -30,6 +33,7 @@ Examples pair_style mliap model linear InP.mliap.model descriptor sna InP.mliap.descriptor pair_style mliap model quadratic W.mliap.model descriptor sna W.mliap.descriptor pair_style mliap model nn Si.nn.mliap.model descriptor so3 Si.nn.mliap.descriptor + pair_style mliap unified mliap_unified_lj_Ar.pkl 0 pair_coeff * * In P Description @@ -42,8 +46,9 @@ quantities that characterize the atomic positions (*descriptor*). By defining *model* and *descriptor* separately, it is possible to use many different models with a given descriptor, or many different descriptors with a given model. The pair style currently supports only *sna* and *so3* -descriptor styles, but it is is straightforward to add new descriptor -styles. +descriptor styles, but it is straightforward to add new descriptor +styles. By using the *unified* pair style, it is possible to define a +Python model that combines functionalities of both *model* and *descriptor*. The SNAP descriptor style *sna* is the same as that used by :doc:`pair_style snap `, including the linear, quadratic, and @@ -61,11 +66,11 @@ basis :ref:`(Bartok) ` and :ref:`(Zagaceta) `. The available models are *linear* and *nn*. The pair_style *mliap* command must be followed by two keywords *model* -and *descriptor* in either order. A single *pair_coeff* command is also -required. The first 2 arguments must be \* \* so as to span all LAMMPS -atom types. This is followed by a list of N arguments that specify the -mapping of MLIAP element names to LAMMPS atom types, where N is the -number of LAMMPS atom types. +and *descriptor* in either order, or the one keyword *unified*. A single +*pair_coeff* command is also required. The first 2 arguments must be +\* \* so as to span all LAMMPS atom types. This is followed by a list +of N arguments that specify the mapping of MLIAP element names to LAMMPS +atom types, where N is the number of LAMMPS atom types. The *model* keyword is followed by the model style. This is followed by a single argument specifying the model filename containing the @@ -113,9 +118,9 @@ The detail of *nn* module implementation can be found at :ref:`(Yanxon) ` +cutoff manually, such as in the following example. + + +.. code-block:: LAMMPS + + variable ninteractions equal 2 + variable cutdist equal 7.5 + variable skin equal 1.0 + variable commcut equal (${ninteractions}*${cutdist})+${skin} + neighbor ${skin} bin + comm_modify cutoff ${commcut} + + +.. note:: + + To load a model from memory + (i.e. an existing python object), call `lammps.mliap.load_unified(unified)` + from python, and then specify the filename as "EXISTS". When using lammps via + the library mode, you will need to call `lammps.mliappy.activate_mliappy(lmp)` + on the active lammps object before the pair style is defined. This call locates + and loads the mliap-specific python module that is built into lammps. Mixing, shift, table, tail correction, restart, rRESPA info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" From 09a1c6f0430792c845f79ee3107c7147bc815a66 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 9 Sep 2022 01:04:19 -0600 Subject: [PATCH 092/364] Fix import path for make --- src/ML-IAP/mliap_unified_couple.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 4a488e3eb2..6ec2de42f9 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -10,7 +10,7 @@ from cpython.ref cimport PyObject from libc.stdlib cimport malloc, free -cdef extern from "../lammps.h" namespace "LAMMPS_NS": +cdef extern from "lammps.h" namespace "LAMMPS_NS": cdef cppclass LAMMPS: pass From 079975fa03206d0a6fcf5d929289893af3e746d1 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 9 Sep 2022 01:05:20 -0600 Subject: [PATCH 093/364] Add mliap_unified_couple.pyx to cythonize --- src/ML-IAP/Install.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ML-IAP/Install.sh b/src/ML-IAP/Install.sh index 3a1a7493aa..27c9b19b01 100755 --- a/src/ML-IAP/Install.sh +++ b/src/ML-IAP/Install.sh @@ -42,6 +42,7 @@ done # Install cython pyx file only if also Python is available action mliap_model_python_couple.pyx python_impl.cpp +action mliap_unified_couple.pyx python_impl.cpp # edit 2 Makefile.package files to include/exclude package info @@ -57,7 +58,7 @@ if (test $1 = 1) then include ..\/..\/lib\/python\/Makefile.mliap_python ' ../Makefile.package.settings fi - cythonize -3 ../mliap_model_python_couple.pyx + cythonize -3 ../mliap_model_python_couple.pyx ../mliap_unified_couple.pyx fi elif (test $1 = 0) then @@ -65,7 +66,8 @@ elif (test $1 = 0) then if (test -e ../Makefile.package) then sed -i -e 's/[^ \t]*-DMLIAP_PYTHON[^ \t]* //g' ../Makefile.package fi - rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h + rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h \ + ../mliap_unified_couple.cpp ../mliap_unified_couple.h sed -i -e '/^include.*python.*mliap_python.*$/d' ../Makefile.package.settings elif (test $1 = 2) then @@ -73,7 +75,8 @@ elif (test $1 = 2) then if (test -e ../Makefile.package) then sed -i -e 's/[^ \t]*-DMLIAP_PYTHON[^ \t]* //g' ../Makefile.package fi - rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h + rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h \ + ../mliap_unified_couple.cpp ../mliap_unified_couple.h sed -i -e '/^include.*python.*mliap_python.*$/d' ../Makefile.package.settings if (test -e ../Makefile.package) then sed -i -e 's|^PKG_INC =[ \t]*|&-DMLIAP_PYTHON |' ../Makefile.package @@ -85,8 +88,9 @@ elif (test $1 = 2) then include ..\/..\/lib\/python\/Makefile.mliap_python ' ../Makefile.package.settings fi - cythonize -3 ../mliap_model_python_couple.pyx + cythonize -3 ../mliap_model_python_couple.pyx ../mliap_unified_couple.pyx else - rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h + rm -f ../mliap_model_python_couple.cpp ../mliap_model_python_couple.h \ + ../mliap_unified_couple.cpp ../mliap_unified_couple.h fi fi From 1216188d4828cf2f09ba64441c000fd3c90fbabf Mon Sep 17 00:00:00 2001 From: Evan Weinberg Date: Fri, 9 Sep 2022 09:34:22 -0700 Subject: [PATCH 094/364] Implementation of an int4-packed Clebsch-Gordon look-up table for SNAP --- src/KOKKOS/pair_snap_kokkos.h | 4 +- src/KOKKOS/sna_kokkos.h | 64 ++++++++++++++++++++++++++++++- src/KOKKOS/sna_kokkos_impl.h | 72 ++++++++++------------------------- 3 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h index b8160c318b..86b9f0d492 100644 --- a/src/KOKKOS/pair_snap_kokkos.h +++ b/src/KOKKOS/pair_snap_kokkos.h @@ -103,10 +103,10 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int tile_size_pre_ui = 4; static constexpr int team_size_compute_ui = sizeof(real_type) == 4 ? 8 : 4; static constexpr int tile_size_transform_ui = 4; - static constexpr int tile_size_compute_zi = 8; + static constexpr int tile_size_compute_zi = 4; static constexpr int tile_size_compute_bi = 4; static constexpr int tile_size_transform_bi = 4; - static constexpr int tile_size_compute_yi = 8; + static constexpr int tile_size_compute_yi = 4; static constexpr int team_size_compute_fused_deidrj = sizeof(real_type) == 4 ? 4 : 2; #endif diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h index fe70129660..62567c71a7 100644 --- a/src/KOKKOS/sna_kokkos.h +++ b/src/KOKKOS/sna_kokkos.h @@ -61,6 +61,68 @@ struct alignas(8) FullHalfMapper { int flip_sign; // 0 -> isn't flipped, 1 -> conj, -1 -> -conj }; +// Packed types for Zi, Yi lookup tables +// This is abstracted into a stand-alone struct so different implementations +// could be used for different architectures via various `ifdef` guards. +struct alignas(16) idxz_struct { + reax_int4 j1_j2_j_jjuhalf; + reax_int4 mabminmax; + reax_int4 nanb; + + idxz_struct() = default; + + KOKKOS_INLINE_FUNCTION + idxz_struct(int j1, int j2, int j, int ma1min, int ma2max, int mb1min, int mb2max, int na, int nb, int jju_half) + : j1_j2_j_jjuhalf{j1, j2, j, jju_half}, + mabminmax{ma1min, ma2max, mb1min, mb2max}, + nanb{na, nb, 0, 0} + { } + + KOKKOS_INLINE_FUNCTION + void get_zi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb) { + reax_int4 pack1 = this->j1_j2_j_jjuhalf; + j1 = pack1.i0; + j2 = pack1.i1; + j = pack1.i2; + reax_int4 pack2 = this->mabminmax; + ma1min = pack2.i0; + ma2max = pack2.i1; + mb1min = pack2.i2; + mb2max = pack2.i3; + reax_int4 pack3 = this->nanb; + na = pack3.i0; + nb = pack3.i1; + } + + KOKKOS_INLINE_FUNCTION + void get_yi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb, int& jju_half) { + reax_int4 pack1 = this->j1_j2_j_jjuhalf; + j1 = pack1.i0; + j2 = pack1.i1; + j = pack1.i2; + jju_half = pack1.i3; + reax_int4 pack2 = this->mabminmax; + ma1min = pack2.i0; + ma2max = pack2.i1; + mb1min = pack2.i2; + mb2max = pack2.i3; + reax_int4 pack3 = this->nanb; + na = pack3.i0; + nb = pack3.i1; + } + + KOKKOS_INLINE_FUNCTION + void get_yi_with_zlist(int &j1, int &j2, int &j, int &jju_half) { + reax_int4 pack1 = this->j1_j2_j_jjuhalf; + j1 = pack1.i0; + j2 = pack1.i1; + j = pack1.i2; + jju_half = pack1.i3; + } + +}; + + template class SNAKokkos { @@ -263,7 +325,7 @@ class SNAKokkos { //use indexlist instead of loops, constructor generates these // Same across all SNAKokkos - Kokkos::View idxz; + Kokkos::View idxz; Kokkos::View idxb; Kokkos::View idxcg_block; diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h index 8d81a4a65b..ee2237d31d 100644 --- a/src/KOKKOS/sna_kokkos_impl.h +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -253,21 +253,20 @@ void SNAKokkos::build_indexlist() for (int mb = 0; 2*mb <= j; mb++) for (int ma = 0; ma <= j; ma++) { - h_idxz(idxz_count,0) = j1; - h_idxz(idxz_count,1) = j2; - h_idxz(idxz_count,2) = j; - h_idxz(idxz_count,3) = MAX(0, (2 * ma - j - j2 + j1) / 2); - h_idxz(idxz_count,4) = (2 * ma - j - (2 * h_idxz(idxz_count,3) - j1) + j2) / 2; - h_idxz(idxz_count,5) = MAX(0, (2 * mb - j - j2 + j1) / 2); - h_idxz(idxz_count,6) = (2 * mb - j - (2 * h_idxz(idxz_count,5) - j1) + j2) / 2; - h_idxz(idxz_count,7) = MIN(j1, (2 * ma - j + j2 + j1) / 2) - h_idxz(idxz_count,3) + 1; - h_idxz(idxz_count,8) = MIN(j1, (2 * mb - j + j2 + j1) / 2) - h_idxz(idxz_count,5) + 1; + int ma1min = MAX(0, (2 * ma - j - j2 + j1) / 2); + int ma2max = (2 * ma - j - (2 * ma1min - j1) + j2) / 2; + int mb1min = MAX(0, (2 * mb - j - j2 + j1) / 2); + int mb2max = (2 * mb - j - (2 * mb1min - j1) + j2) / 2; + int na = MIN(j1, (2 * ma - j + j2 + j1) / 2) - ma1min + 1; + int nb = MIN(j1, (2 * mb - j + j2 + j1) / 2) - mb1min + 1; // apply to z(j1,j2,j,ma,mb) to unique element of y(j) // ylist is "compressed" via symmetry in its // contraction with dulist const int jju_half = h_idxu_half_block[j] + (j+1)*mb + ma; - h_idxz(idxz_count,9) = jju_half; + + // idxz_struct's constructor handles all of the data packing + h_idxz(idxz_count) = idxz_struct(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); idxz_count++; } @@ -663,15 +662,8 @@ KOKKOS_INLINE_FUNCTION void SNAKokkos::compute_zi(const int& iatom_mod, const int& jjz, const int& iatom_div) { - const int j1 = idxz(jjz, 0); - const int j2 = idxz(jjz, 1); - const int j = idxz(jjz, 2); - const int ma1min = idxz(jjz, 3); - const int ma2max = idxz(jjz, 4); - const int mb1min = idxz(jjz, 5); - const int mb2max = idxz(jjz, 6); - const int na = idxz(jjz, 7); - const int nb = idxz(jjz, 8); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb; + idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb); const real_type* cgblock = cglist.data() + idxcg_block(j1, j2, j); @@ -792,16 +784,8 @@ void SNAKokkos::compute_yi(int iatom_mod, const Kokkos::View &beta_pack) { - const int j1 = idxz(jjz, 0); - const int j2 = idxz(jjz, 1); - const int j = idxz(jjz, 2); - const int ma1min = idxz(jjz, 3); - const int ma2max = idxz(jjz, 4); - const int mb1min = idxz(jjz, 5); - const int mb2max = idxz(jjz, 6); - const int na = idxz(jjz, 7); - const int nb = idxz(jjz, 8); - const int jju_half = idxz(jjz, 9); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half; + idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; @@ -840,10 +824,9 @@ KOKKOS_INLINE_FUNCTION void SNAKokkos::compute_yi_with_zlist(int iatom_mod, int jjz, int iatom_div, const Kokkos::View &beta_pack) { - const int j1 = idxz(jjz, 0); - const int j2 = idxz(jjz, 1); - const int j = idxz(jjz, 2); - const int jju_half = idxz(jjz, 9); + int j1, j2, j, jju_half; + idxz(jjz).get_yi_with_zlist(j1, j2, j, jju_half); + int idouble = 0; for (int elem1 = 0; elem1 < nelements; elem1++) { for (int elem2 = 0; elem2 < nelements; elem2++) { @@ -1259,15 +1242,8 @@ void SNAKokkos::compute_zi_cpu(const int& const int iatom = iter / idxz_max; const int jjz = iter % idxz_max; - const int j1 = idxz(jjz, 0); - const int j2 = idxz(jjz, 1); - const int j = idxz(jjz, 2); - const int ma1min = idxz(jjz, 3); - const int ma2max = idxz(jjz, 4); - const int mb1min = idxz(jjz, 5); - const int mb2max = idxz(jjz, 6); - const int na = idxz(jjz, 7); - const int nb = idxz(jjz, 8); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb; + idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb); const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); @@ -1429,16 +1405,8 @@ void SNAKokkos::compute_yi_cpu(int iter, const int iatom = iter / idxz_max; const int jjz = iter % idxz_max; - const int j1 = idxz(jjz, 0); - const int j2 = idxz(jjz, 1); - const int j = idxz(jjz, 2); - const int ma1min = idxz(jjz, 3); - const int ma2max = idxz(jjz, 4); - const int mb1min = idxz(jjz, 5); - const int mb2max = idxz(jjz, 6); - const int na = idxz(jjz, 7); - const int nb = idxz(jjz, 8); - const int jju_half = idxz(jjz, 9); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half; + idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; From 04bdfb151b808d2c4ef081044129a52060fc78a6 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 9 Sep 2022 12:22:50 -0600 Subject: [PATCH 095/364] refactor how fix latte connects to fix gcmc --- doc/src/fix_latte.rst | 36 ++++++++------------ src/LATTE/fix_latte.cpp | 74 +++++++++++++++++++++++++++++------------ src/LATTE/fix_latte.h | 3 +- src/MC/fix_gcmc.cpp | 14 ++++++++ src/MC/fix_gcmc.h | 51 ++++++++++++++++------------ 5 files changed, 111 insertions(+), 67 deletions(-) diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index 6ce84f9d52..df23027238 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -19,8 +19,8 @@ Syntax keyword = *coulomb* or *exclude* *coulomb* value = peID peID = ID of compute used to calculate per-atom energy - *exclude* value = groupID - groupID = ID of group of atoms to exclude before calling LATTE + *exclude* value = fixID + fixID = ID of fix which potentially excludes atoms before calling LATTE Examples """""""" @@ -28,7 +28,7 @@ Examples .. code-block:: LAMMPS fix dftb all latte - fix dftb all exclude GCMCmol + fix dftb all exclude GCMC Description """"""""""" @@ -64,27 +64,17 @@ The *coulomb* argument is not yet supported by fix latte (as of Sept Coulomb potential as an alternative to LATTE performing the calculation. -NOTE: after intitial debugging, change the exclude arg to -be the ID of another fix (GCMC in this case), and extract() -the exclusion group ID from fix gcmc. +The *exclude argument allows this fix to work in tandem with another +fix which may decide to delete one or more atoms of molecules. The +specified fixID is the ID of the other fix. -The *exclude argument allows this fix to work in tandem with the -:doc:`fix gcmc ` command which may decide to delete an atom -or molecule as one of its Monte Carlo events. In this case, LAMMPS -needs to pass LATTE the atoms for the system with the atom/molecule -removed. Fix gcmc does not actually remove the atom/molecule until -after the new energy is computed (in this case by LATTE), and a Monte -Carlo accept/reject decision is made for the event. - -The specified groupID must match the group ID which the :doc:`fix gcmc -` command assigns to atoms flagged for possible deletion. -It should be either its default exclusion group ID or group ID used -with its "exclude" keyword option. - -.. note:: - - The fix gcmc command must appear in the input script prior - to the fix latte command for this to work. +The one current example of such a fix is the :doc:`fix gcmc +` command which performs Monte Carlo insertions and +deletions. If a trial deletion is performed, then LAMMPS needs to +only pass LATTE the atoms which remain. Fix gcmc does not actually +remove any atoms until after the new energy is computed (in this case +by LATTE), and a Monte Carlo accept/reject decision is made for the +trial deletion. ---------- diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 1095b9ab9a..0ba16a9c61 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -76,6 +76,7 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : coulomb = 0; id_pe = nullptr; exclude = 0; + id_exclude = nullptr; int iarg = 3; while (iarg < narg) { @@ -85,7 +86,7 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : coulomb = 1; error->all(FLERR,"Fix latte does not yet support a " "LAMMPS calculation of a Coulomb potential"); - id_pe = utils::strdup(arg[3]); + id_pe = utils::strdup(arg[iarg+1]); c_pe = modify->get_compute_by_id(id_pe); if (!c_pe) error->all(FLERR,"Could not find fix latte compute ID {}", id_pe); if (c_pe->peatomflag == 0) @@ -96,11 +97,7 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix latte exclude", error); exclude = 1; - int excludegroup = group->find(arg[iarg+1]); - if (excludegroup == -1) - error->all(FLERR, "Fix latte couldd not find exclude group ID: {}", - arg[iarg+1]); - excludebit = group->bitmask[excludegroup]; + id_exclude = utils::strdup(arg[iarg+1]); iarg += 2; } else @@ -121,6 +118,7 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : FixLatte::~FixLatte() { delete[] id_pe; + delete[] id_exclude; memory->destroy(qpotential); memory->destroy(flatte); } @@ -148,9 +146,9 @@ void FixLatte::init() if (coulomb) { if (atom->q_flag == 0 || force->pair == nullptr || force->kspace == nullptr) error->all(FLERR,"Fix latte cannot compute Coulomb potential"); - c_pe = modify->get_compute_by_id(id_pe); - if (!c_pe) error->all(FLERR,"Could not find fix latte compute ID {}", id_pe); + if (!c_pe) + error->all(FLERR,"Fix latte could not find Coulomb compute ID {}",id_pe); } // must be fully periodic or fully non-periodic @@ -167,6 +165,20 @@ void FixLatte::init() memory->create(qpotential,atom->nlocal,"latte:qpotential"); memory->create(flatte,atom->nlocal,3,"latte:flatte"); } + + // extract pointer to exclusion_group variable from id_exclude + // exclusion_group is index of a group the Fix defines + + if (exclude) { + Fix *f_exclude = modify->get_fix_by_id(id_exclude); + if (!f_exclude) + error->all(FLERR,"Fix latte could not find exclude fix ID {}", id_exclude); + int exclude_group_index,dim; + exclusion_group_ptr = (int *) f_exclude->extract("exclusion_group",dim); + if (!exclusion_group_ptr || dim != 0) + error->all(FLERR,"Fix latte could not query exclude_group of fix ID {}", + id_exclude); + } } /* ---------------------------------------------------------------------- */ @@ -267,12 +279,18 @@ void FixLatte::post_force(int vflag) if (!exclude) latte_wrapper_all(); else { - int *mask = atom->mask; - int nlocal = atom->nlocal; - int anyexclude = 0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & excludebit) anyexclude = 1; + + int exclusion_group = *exclusion_group_ptr; + if (exclusion_group) { + int excludebit = group->bitmask[exclusion_group]; + + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) + if (mask[i] & excludebit) anyexclude = 1; + } if (!anyexclude) latte_wrapper_all(); else latte_wrapper_exclude(); @@ -316,6 +334,9 @@ void FixLatte::latte_wrapper_all() &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); + printf("LATTE ALL: step %ld, natoms %d, LATTE eng %g\n", + update->ntimestep, natoms, latte_energy); + if (latteerror) error->all(FLERR,"Internal LATTE problem"); } @@ -325,6 +346,11 @@ void FixLatte::latte_wrapper_all() void FixLatte::latte_wrapper_exclude() { + int m; + + int exclusion_group = *exclusion_group_ptr; + int excludebit = group->bitmask[exclusion_group]; + int *mask = atom->mask; int nlocal = atom->nlocal; @@ -342,26 +368,29 @@ void FixLatte::latte_wrapper_exclude() memory->create(xinclude,nlatte,3,"latte:xinclude"); memory->create(finclude,nlatte,3,"latte:finclude"); + double *coords = &xinclude[0][0]; + int *types = typeinclude; + double *forces = &finclude[0][0]; + double **x = atom->x; int *type = atom->type; nlatte = 0; + m = 0; for (int i = 0; i < nlocal; i++) { if (mask[i] & excludebit) continue; - typeinclude[nlatte] = type[i]; - x[nlatte][0] = x[i][0]; - x[nlatte][1] = x[i][1]; - x[nlatte][2] = x[i][2]; + types[nlatte] = type[i]; nlatte++; + coords[m+0] = x[i][0]; + coords[m+1] = x[i][1]; + coords[m+2] = x[i][2]; + m += 3; } - double *coords = &xinclude[0][0]; - int *types = typeinclude; int ntypes = atom->ntypes; double *mass = &atom->mass[1]; double *boxlo = domain->boxlo; double *boxhi = domain->boxhi; - double *forces = &finclude[0][0]; bool latteerror = false; int maxiter = -1; @@ -369,13 +398,16 @@ void FixLatte::latte_wrapper_exclude() &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); + printf("LATTE EXCLUDE: step %ld, natoms %d, LATTE eng %g\n", + update->ntimestep, nlatte, latte_energy); + if (latteerror) error->all(FLERR,"Internal LATTE problem"); // expand compressed forces array double **f = atom->f; - int m = 0; + m = 0; for (int i = 0; i < nlocal; i++) { if (mask[i] & excludebit) continue; f[i][0] = forces[m+0]; diff --git a/src/LATTE/fix_latte.h b/src/LATTE/fix_latte.h index fdc3fdee40..0ce6e0f4ce 100644 --- a/src/LATTE/fix_latte.h +++ b/src/LATTE/fix_latte.h @@ -44,10 +44,11 @@ class FixLatte : public Fix { double memory_usage() override; protected: - char *id_pe; int coulomb, pbcflag, pe_peratom, virial_global, virial_peratom, neighflag; int exclude, excludebit; int eflag_caller; + char *id_pe,*id_exclude; + int *exclusion_group_ptr; int flags_latte[6]; diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 0cc6590d5a..ef1ad324b0 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -2573,3 +2573,17 @@ void FixGCMC::grow_molecule_arrays(int nmolatoms) { molq = memory->grow(molq,nmaxmolatoms,"gcmc:molq"); molimage = memory->grow(molimage,nmaxmolatoms,"gcmc:molimage"); } + + +/* ---------------------------------------------------------------------- + extract variable which stores index of exclusion group +------------------------------------------------------------------------- */ + +void *FixGCMC::extract(const char *name, int &dim) +{ + if (strcmp(name,"exclusion_group") == 0) { + dim = 0; + return (void *) &exclusion_group; + } + return nullptr; +} diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index d945b82346..2bdd9eb461 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -31,32 +31,11 @@ class FixGCMC : public Fix { int setmask() override; void init() override; void pre_exchange() override; - void attempt_atomic_translation(); - void attempt_atomic_deletion(); - void attempt_atomic_insertion(); - void attempt_molecule_translation(); - void attempt_molecule_rotation(); - void attempt_molecule_deletion(); - void attempt_molecule_insertion(); - void attempt_atomic_translation_full(); - void attempt_atomic_deletion_full(); - void attempt_atomic_insertion_full(); - void attempt_molecule_translation_full(); - void attempt_molecule_rotation_full(); - void attempt_molecule_deletion_full(); - void attempt_molecule_insertion_full(); - double energy(int, int, tagint, double *); - double molecule_energy(tagint); - double energy_full(); - int pick_random_gas_atom(); - tagint pick_random_gas_molecule(); - void toggle_intramolecular(int); - void update_gas_atoms_list(); double compute_vector(int) override; double memory_usage() override; void write_restart(FILE *) override; void restart(char *) override; - void grow_molecule_arrays(int); + void *extract(const char *, int &); private: int molecule_group, molecule_group_bit; @@ -139,7 +118,35 @@ class FixGCMC : public Fix { class Compute *c_pe; + // private methods + void options(int, char **); + + void attempt_atomic_translation(); + void attempt_atomic_deletion(); + void attempt_atomic_insertion(); + void attempt_molecule_translation(); + void attempt_molecule_rotation(); + void attempt_molecule_deletion(); + void attempt_molecule_insertion(); + void attempt_atomic_translation_full(); + void attempt_atomic_deletion_full(); + void attempt_atomic_insertion_full(); + void attempt_molecule_translation_full(); + void attempt_molecule_rotation_full(); + void attempt_molecule_deletion_full(); + void attempt_molecule_insertion_full(); + + double energy(int, int, tagint, double *); + double energy_full(); + double molecule_energy(tagint); + + int pick_random_gas_atom(); + tagint pick_random_gas_molecule(); + void toggle_intramolecular(int); + void update_gas_atoms_list(); + + void grow_molecule_arrays(int); }; } // namespace LAMMPS_NS From 7f4fe0d3ad9bd44a78b979f1e7aaf5ee82a5b007 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 17:29:11 -0400 Subject: [PATCH 096/364] whitespace --- src/dump.cpp | 2 +- src/fix_pair.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 0acbe3025a..91833d017f 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -310,7 +310,7 @@ void Dump::init() if (skipflag) { skipindex = input->variable->find(skipvar); if (skipindex < 0) error->all(FLERR,"Dump skip variable not found"); - if (!input->variable->equalstyle(skipindex)) + if (!input->variable->equalstyle(skipindex)) error->all(FLERR,"Variable for dump skip is invalid style"); } diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index cb2ccf9ef2..3c967e2cfa 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -93,7 +93,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : if (trigger[ifield]) { int dim; triggerptr[ifield] = (int *) pstyle->extract(triggername[ifield],dim); - if (!triggerptr[ifield]) + if (!triggerptr[ifield]) error->all(FLERR,"Fix pair pair style cannot extract {}", triggername[ifield]); if (dim) error->all(FLERR,"Fix pair pair style {} is not a scalar", @@ -102,7 +102,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : } // if set peratom_freq = Nevery, then cannot access the per-atom - // values as part of thermo output during minimiziation + // values as part of thermo output during minimiziation // at different frequency or on last step of minimization // instead set peratom_freq = 1 // ok, since vector/array always have values @@ -155,7 +155,7 @@ FixPair::~FixPair() delete [] trigger; delete [] triggername; delete [] triggerptr; - + if (ncols == 1) memory->destroy(vector); else memory->destroy(array); } @@ -225,7 +225,7 @@ void FixPair::post_force(int /*vflag*/) { if (update->ntimestep % nevery) return; - // extract pair style fields one by one + // extract pair style fields one by one // store their values in this fix int nlocal = atom->nlocal; @@ -235,12 +235,12 @@ void FixPair::post_force(int /*vflag*/) for (int ifield = 0; ifield < nfield; ifield++) { void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); - if (pvoid == nullptr) + if (pvoid == nullptr) error->all(FLERR,"Fix pair pair style cannot extract {}",fieldname[ifield]); if (columns == 0) { double *pvector = (double *) pvoid; - if (ncols == 1) { + if (ncols == 1) { for (int i = 0; i < nlocal; i++) vector[i] = pvector[i]; } else { From 610848599ca0ffe38d9b6bbb91b6c41c2ba90c2a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:42:32 -0400 Subject: [PATCH 097/364] reappy bugfix that was lost from moving the "colname" section --- src/dump.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dump.cpp b/src/dump.cpp index 91833d017f..7769d0e0d4 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -1085,7 +1085,7 @@ void Dump::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"colname") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); if (strcmp(arg[iarg+1],"default") == 0) { - for (auto item : keyword_user) item.clear(); + for (auto &item : keyword_user) item.clear(); iarg += 2; } else { if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); From 6898ead5b762388464fce7da3e6c034d315c0a2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:43:20 -0400 Subject: [PATCH 098/364] remove redundant code created by merge --- src/dump.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 7769d0e0d4..c8768c5fb6 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -1190,32 +1190,6 @@ void Dump::modify_params(int narg, char **arg) flush_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; - } else if (strcmp(arg[iarg],"colname") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify colname", error); - if (strcmp(arg[iarg+1],"default") == 0) { - for (auto &item : keyword_user) item.clear(); - iarg += 2; - } else { - if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "dump_modify colname", error); - int icol = -1; - if (utils::is_integer(arg[iarg + 1])) { - icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); - if (icol < 0) icol = keyword_user.size() + icol + 1; - icol--; - } else { - try { - icol = key2col.at(arg[iarg + 1]); - } catch (std::out_of_range &) { - icol = -1; - } - } - if ((icol < 0) || (icol >= (int)keyword_user.size())) - error->all(FLERR, "Incorrect dump_modify arguments: {} {} {}", - arg[iarg], arg[iarg+1], arg[iarg+2]); - keyword_user[icol] = arg[iarg+2]; - iarg += 3; - } - } else if (strcmp(arg[iarg],"format") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify format", error); From 9e7df0f8e1694d6159c57c1a96c01e3cb4679fa9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:44:07 -0400 Subject: [PATCH 099/364] correctly compute communication buffers also for the case that size_one changes --- src/dump.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index c8768c5fb6..0f93c7a1c6 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -398,12 +398,12 @@ void Dump::write() // use nmax to insure filewriter proc can receive info from others // limit nmax*size_one to int since used as arg in MPI calls - if (nmax > maxbuf) { + if (nmax*size_one > maxbuf) { if ((bigint) nmax * size_one > MAXSMALLINT) error->all(FLERR,"Too much per-proc info for dump"); - maxbuf = nmax; + maxbuf = nmax * size_one; memory->destroy(buf); - memory->create(buf,maxbuf*size_one,"dump:buf"); + memory->create(buf,maxbuf,"dump:buf"); } // insure ids buffer is sized for sorting @@ -492,7 +492,7 @@ void Dump::write() if (filewriter) { for (int iproc = 0; iproc < nclusterprocs; iproc++) { if (iproc) { - MPI_Irecv(buf,maxbuf*size_one,MPI_DOUBLE,me+iproc,0,world,&request); + MPI_Irecv(buf,maxbuf,MPI_DOUBLE,me+iproc,0,world,&request); MPI_Send(&tmp,0,MPI_INT,me+iproc,0,world); MPI_Wait(&request,&status); MPI_Get_count(&status,MPI_DOUBLE,&nlines); @@ -774,10 +774,10 @@ void Dump::sort() int nmax; MPI_Allreduce(&nme,&nmax,1,MPI_INT,MPI_MAX,world); - if (nmax > maxbuf) { - maxbuf = nmax; + if (nmax*size_one > maxbuf) { + maxbuf = nmax * size_one; memory->destroy(buf); - memory->create(buf,maxbuf*size_one,"dump:buf"); + memory->create(buf,maxbuf,"dump:buf"); } // copy data from bufsort to buf using index @@ -958,12 +958,12 @@ void Dump::balance() int nmax; MPI_Allreduce(&nme_balance,&nmax,1,MPI_INT,MPI_MAX,world); - if (nmax > maxbuf) maxbuf = nmax; + if (nmax*size_one > maxbuf) maxbuf = nmax*size_one; // allocate a second buffer for balanced data double* buf_balance; - memory->create(buf_balance,maxbuf*size_one,"dump:buf_balance"); + memory->create(buf_balance,maxbuf,"dump:buf_balance"); // compute from which procs I am receiving atoms // post recvs first @@ -1370,7 +1370,7 @@ void Dump::pbc_allocate() double Dump::memory_usage() { - double bytes = memory->usage(buf,size_one*maxbuf); + double bytes = memory->usage(buf,maxbuf); bytes += memory->usage(sbuf,maxsbuf); if (sort_flag) { if (sortcol == 0) bytes += memory->usage(ids,maxids); From aad464275d055e885847a80b2d65d073d2070af5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:44:28 -0400 Subject: [PATCH 100/364] changing scale or image keywords resets user keywords --- src/dump_atom.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dump_atom.cpp b/src/dump_atom.cpp index ef567abdb2..8daf2d1d0a 100644 --- a/src/dump_atom.cpp +++ b/src/dump_atom.cpp @@ -131,10 +131,12 @@ int DumpAtom::modify_param(int narg, char **arg) if (strcmp(arg[0],"scale") == 0) { if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); scale_flag = utils::logical(FLERR,arg[1],false,lmp); + for (auto &item : keyword_user) item.clear(); return 2; } else if (strcmp(arg[0],"image") == 0) { if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); image_flag = utils::logical(FLERR,arg[1],false,lmp); + for (auto &item : keyword_user) item.clear(); return 2; } return 0; From 41f28f783f832e630191218113f9118b3cca4ebd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:44:42 -0400 Subject: [PATCH 101/364] more tests --- unittest/formats/test_dump_atom.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/unittest/formats/test_dump_atom.cpp b/unittest/formats/test_dump_atom.cpp index 6fe4d0e1ae..683578d04f 100644 --- a/unittest/formats/test_dump_atom.cpp +++ b/unittest/formats/test_dump_atom.cpp @@ -794,6 +794,13 @@ TEST_F(DumpAtomTest, colname) command("run 10 post no"); command("dump_modify id colname default"); command("run 10 post no"); + command("dump_modify id colname id AtomID colname 3 x-scaled colname -4 z-scaled"); + command("dump_modify id scale no image yes"); + command("run 10 post no"); + command("dump_modify id colname id AtomID colname 3 X colname -4 Z colname ix img_x"); + command("run 10 post no"); + command("dump_modify id colname default"); + command("run 10 post no"); command("undump id"); END_HIDE_OUTPUT(); @@ -810,6 +817,18 @@ TEST_F(DumpAtomTest, colname) for (int i = 0; i < expected.size(); ++i) ASSERT_THAT(values[i], Eq(expected[i])); + values = extract_items(dump_file, "ATOMS id type x y z ix iy iz"); + expected = {"1 1 0 0 0 0 0 0", "1 1 0 0 0 0 0 0"}; + ASSERT_EQ(values.size(), expected.size()); + for (int i = 0; i < expected.size(); ++i) + ASSERT_THAT(values[i], Eq(expected[i])); + + values = extract_items(dump_file, "ATOMS AtomID type X y Z img_x iy iz"); + expected = {"1 1 0 0 0 0 0 0"}; + ASSERT_EQ(values.size(), expected.size()); + for (int i = 0; i < expected.size(); ++i) + ASSERT_THAT(values[i], Eq(expected[i])); + delete_file(dump_file); } From 74fea2bc704e3890e1612865d00a1471ba51b3d5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Sep 2022 18:48:30 -0400 Subject: [PATCH 102/364] update docs --- doc/src/dump_modify.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index ce6b336f02..a827cc8a91 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -432,7 +432,8 @@ flags are enabled or not. For dump style *cfg* only changes to the The *colname* keyword can be used multiple times. If multiple *colname* settings refer to the same keyword, the last setting has precedence. A setting of *default* clears all previous settings, reverting all values -to their default names. +to their default names. Using the *scale* or *image* keyword will also +reset all header keywords to their default values. ---------- @@ -522,6 +523,8 @@ boundary twice and is really two box lengths to the left of its current coordinate. Note that for dump style *custom* these various values can be printed in the dump file by using the appropriate atom attributes in the dump command itself. +Using this keyword will reset all custom header names set with +*dump_modify colname*. ---------- @@ -695,6 +698,8 @@ value of *yes* means atom coords are written in normalized units from (tilted), then all atom coords will still be between 0.0 and 1.0. A value of *no* means they are written in absolute distance units (e.g., :math:`\mathrm{\mathring A}` or :math:`\sigma`). +Using this keyword will reset all custom header names set with +*dump_modify colname*. ---------- From f700da5ac3f7b0dc37425b3094398aa9aa4ff746 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 10 Sep 2022 04:24:40 -0400 Subject: [PATCH 103/364] remove redundant section --- doc/src/dump_modify.rst | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index a827cc8a91..55af43f54c 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -178,6 +178,9 @@ extra buffering. ---------- + +.. versionadded:: 4May2022 + The *colname* keyword can be used to change the default header keyword for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, and MPIIO variants. The setting for *ID string* replaces the default @@ -412,31 +415,6 @@ performed with dump style *xtc*\ . ---------- -.. versionadded:: 4May2022 - -The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, -and MPIIO variants. The setting for *ID string* replaces the default -text with the provided string. *ID* can be a positive integer when it -represents the column number counting from the left, a negative integer -when it represents the column number from the right (i.e. -1 is the last -column/keyword), or a custom dump keyword (or compute, fix, property, or -variable reference) and then it replaces the string for that specific -keyword. For *atom* dump styles only the keywords "id", "type", "x", -"y", "z", "ix", "iy", "iz" can be accessed via string regardless of -whether scaled or unwrapped coordinates were enabled or disabled, and -it always assumes 8 columns for indexing regardless of whether image -flags are enabled or not. For dump style *cfg* only changes to the -"auxiliary" keywords (6th or later keyword) will become visible. - -The *colname* keyword can be used multiple times. If multiple *colname* -settings refer to the same keyword, the last setting has precedence. A -setting of *default* clears all previous settings, reverting all values -to their default names. Using the *scale* or *image* keyword will also -reset all header keywords to their default values. - ----------- - 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* From 4cca198adf68356aa86dac09f0dcfc63e2d547ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 10 Sep 2022 04:35:13 -0400 Subject: [PATCH 104/364] fix issues from moving code and incorrect merge conflict resolution --- src/dump.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/dump.cpp b/src/dump.cpp index 0f93c7a1c6..36b2763d88 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -169,7 +169,6 @@ Dump::~Dump() delete[] format_bigint_user; delete[] refresh; - delete[] skipvar; // format_column_user is deallocated by child classes that use it @@ -1070,7 +1069,7 @@ void Dump::modify_params(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"balance") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify balance", error); if (nprocs > 1) balance_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; @@ -1083,12 +1082,12 @@ void Dump::modify_params(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"colname") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify colname", error); if (strcmp(arg[iarg+1],"default") == 0) { for (auto &item : keyword_user) item.clear(); iarg += 2; } else { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "dump_modify colname", error); int icol = -1; if (utils::is_integer(arg[iarg + 1])) { icol = utils::inumeric(FLERR,arg[iarg + 1],false,lmp); @@ -1318,12 +1317,6 @@ void Dump::modify_params(int narg, char **arg) } iarg += 2; - } else if (strcmp(arg[iarg],"balance") == 0) { - if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify blance", error); - if (nprocs > 1) - balance_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); - iarg += 2; - } else if (strcmp(arg[iarg],"time") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify time", error); time_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); From 73b44c3b18543e1d612420d4d7d76b1dac108d24 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 10 Sep 2022 04:35:39 -0400 Subject: [PATCH 105/364] add some versionadded markers --- doc/src/dump_modify.rst | 5 ++++- doc/src/fix_pair.rst | 4 +++- doc/src/pair_amoeba.rst | 2 ++ doc/src/pair_eam.rst | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 55af43f54c..7c98492893 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -199,7 +199,8 @@ flags are enabled or not. For dump style *cfg* only changes to the The *colname* keyword can be used multiple times. If multiple *colname* settings refer to the same keyword, the last setting has precedence. A setting of *default* clears all previous settings, reverting all values -to their default names. +to their default names. Using the *scale* or *image* keyword will also +reset all header keywords to their default values. ---------- @@ -696,6 +697,8 @@ most effective when the typical magnitude of position data is between ---------- +.. versionadded:: TBD + The *skip* keyword can be used with all dump styles. It allows a dump snapshot to be skipped (not written to the dump file), if a condition is met. The condition is computed by an :doc:`equal-style variable diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index 19a57ca48e..b1d3010be0 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -30,6 +30,8 @@ Examples Description """"""""""" +.. versionadded:: TBD + Extract per-atom quantities from a pair style and store them in this fix so they can be accessed by other LAMMPS commands, e.g. by a :doc:`dump ` command or by another :doc:`fix `, @@ -40,7 +42,7 @@ These are example use cases: * extract per-atom density from :doc:`pair_style eam ` to a dump file * extract induced dipoles from :doc:`pair_style amoeba ` to a dump file * extract accuracy metrics from a machine-learned potential to trigger output when -a condition is met (see the :doc:`dump_modify skip ` command) + a condition is met (see the :doc:`dump_modify skip ` command) The *N* argument determines how often the fix is invoked. diff --git a/doc/src/pair_amoeba.rst b/doc/src/pair_amoeba.rst index b41cb9815b..22ec2281dd 100644 --- a/doc/src/pair_amoeba.rst +++ b/doc/src/pair_amoeba.rst @@ -156,6 +156,8 @@ settings. ---------- +.. versionadded:: TBD + The *amoeba* and *hippo* pair styles support extraction of two per-atom quantities by the :doc:`fix pair ` command. This allows the quantities to be output to files by the :doc:`dump ` diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index 7e3b1b3a3f..bb8433f101 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -444,6 +444,8 @@ identical to the FS EAM files (see above). ---------- +.. versionadded:: TBD + The *eam*, *eam/alloy*, *eam/fs*, and *eam/he* pair styles support extraction of two per-atom quantities by the :doc:`fix pair ` command. This allows the quantities to be output to files From 572e8cc399f1103a4660eff211da0a1302d1209e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 12 Sep 2022 09:18:06 -0600 Subject: [PATCH 106/364] random permulations of both I and J atoms in double loop --- src/MC/fix_bond_swap.cpp | 44 +++++++++------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 99a5640119..ea31270b92 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -244,6 +244,15 @@ void FixBondSwap::post_integrate() memory->create(alist,nmax,"bondswap:alist"); } + // use randomized permulation of both I and J atoms in double loop below + // this is to avoid any bias in accepted MC swaps based on + // ordering LAMMPS creates on a processor for atoms or their neighbors + + // create a random permutation of list of Neligible atoms + // uses one-pass Fisher-Yates shuffle on an initial identity permutation + // output: randomized alist[] vector, used in outer loop to select an I atom + // similar randomized permulation is created for neighbors of each I atom + int neligible = 0; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; @@ -262,6 +271,7 @@ void FixBondSwap::post_integrate() // examine ntest of my eligible atoms for potential swaps // atom I is randomly selected via atom list // look at all J neighbors of atom I + // done in a randomized permutation, via neighbor_permutation() // J must be on-processor (J < nlocal) // I,J must be in fix group // I,J must have same molecule IDs @@ -283,31 +293,6 @@ void FixBondSwap::post_integrate() neighbor_permutation(jnum); - // DEBUG - - int picked[4]; - int count = 0; - printf("BSWAP CANDIDATES nstep %ld itag %d jnum %d jtags", - update->ntimestep,atom->tag[i],jnum); - for (jj = 0; jj < jnum; jj++) { - j = jlist[permute[jj]]; - j &= NEIGHMASK; - printf(" %d",atom->tag[j]); - if (j >= nlocal) continue; - if ((mask[j] & groupbit) == 0) continue; - if (molecule[i] != molecule[j]) continue; - picked[count++] = atom->tag[j]; - } - if (count) { - printf(" picked %d",count); - for (jj = 0; jj < count; jj++) { - printf(" %d",picked[jj]); - } - } - printf("\n"); - - // END DEBUG - for (jj = 0; jj < jnum; jj++) { j = jlist[permute[jj]]; j &= NEIGHMASK; @@ -328,8 +313,6 @@ void FixBondSwap::post_integrate() // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff - printf(" SWAP candidate ijtag %d %d\n",atom->tag[i],atom->tag[j]); - for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); if (inext >= nlocal || inext < 0) continue; @@ -349,10 +332,6 @@ void FixBondSwap::post_integrate() if (dist_rsq(i,jnext) >= cutsq) continue; if (dist_rsq(j,inext) >= cutsq) continue; - printf(" BOND nstep %ld ijtag %d %d ibondtag %d jbondtag %d\n", - update->ntimestep, - atom->tag[i],atom->tag[j],atom->tag[inext],atom->tag[jnext]); - // if angles are enabled: // find other atoms i,inext,j,jnext are in angles with // and angletypes: i/j angletype, i/j nextangletype @@ -471,9 +450,6 @@ void FixBondSwap::post_integrate() if (random->uniform() < factor) accept = 1; } - printf(" MC result jtag %d delta %g accept %d\n", - atom->tag[j],delta,accept); - goto done; } } From 58d6e0d440e5e8b81e7b2220b781a68cf509110f Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 12 Sep 2022 09:41:29 -0600 Subject: [PATCH 107/364] add note to doc page about sticker site model --- doc/src/fix_bond_swap.rst | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 0a237bbf78..2c15664c09 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -71,6 +71,15 @@ the polymer chains all become interconnected. For this use case, if angles are defined they should not include bonds between sticker sites. +.. note:: + + For the sticker site model, you should set the newton flag for + bonds to "off", via the :doc:`newton on off` command ("on" + is the default for the 2nd argument). This is to ensure + appropriate randomness in bond selection because the I,J bond will + be stored by both atom I and atom J. LAMMPS cannot check for this, + because it is not aware that a sticker site model is being used. + ---------- The bond swapping operation is invoked once every *Nevery* timesteps. @@ -114,11 +123,11 @@ Boltzmann constant, and T is the current temperature of the system. .. note:: - IMPORTANT: Whether the swap is accepted or rejected, no other swaps - are attempted by this processor on this timestep. No other - eligible 4-tuples of atoms are considered. This means that each - processor will perform either a single swap or none on timesteps - this fix is invoked. + Whether the swap is accepted or rejected, no other swaps are + attempted by this processor on this timestep. No other eligible + 4-tuples of atoms are considered. This means that each processor + will perform either a single swap or none on timesteps this fix is + invoked. ---------- From 5e3adfa71046dd4f5cc9b2f289747b9a62907102 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 12 Sep 2022 14:40:10 -0600 Subject: [PATCH 108/364] trigger newsystem in LATTE if atom count changes - e.g. fix gcmc --- src/LATTE/fix_latte.cpp | 30 ++++++++++++++++++------------ src/LATTE/fix_latte.h | 4 +++- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 0ba16a9c61..4daaf9d40a 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -192,18 +192,20 @@ void FixLatte::init_list(int /*id*/, NeighList * /*ptr*/) void FixLatte::setup(int vflag) { - newsystem = 1; + natoms_last = -1; + setupflag = 1; post_force(vflag); - newsystem = 0; + setupflag = 0; } /* ---------------------------------------------------------------------- */ void FixLatte::min_setup(int vflag) { - newsystem = 1; + natoms_last = -1; + setupflag = 1; post_force(vflag); - newsystem = 0; + setupflag = 0; } /* ---------------------------------------------------------------------- */ @@ -273,7 +275,15 @@ void FixLatte::post_force(int vflag) flags_latte[4] = vflag_atom && thermo_virial; // virial, 0 for no flags_latte[5] = neighflag; // 1 to pass neighbor list to LATTE, 0 for no - // setup arguments for latte() function within LATTE lib and invoke it + // newsystem flag determines whether LATTE treats snapshot + // as new system (more work) or increment to last system + // if setup or atom count changed then newsystem = 1 + // else newsystem = 0 + + if (setupflag || atom->natoms != natoms_last) newsystem = 1; + else newsystem = 0; + + // setup arguments for latte() function and invoke it // either for all atoms or excluding some atoms // in latter case, need to construct reduced-size per-atom vectors/arrays @@ -296,7 +306,9 @@ void FixLatte::post_force(int vflag) else latte_wrapper_exclude(); } - + newsystem = 0; + natoms_last = atom->natoms; + // sum LATTE forces to LAMMPS forces // e.g. LAMMPS may compute Coulombics at some point @@ -334,9 +346,6 @@ void FixLatte::latte_wrapper_all() &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); - printf("LATTE ALL: step %ld, natoms %d, LATTE eng %g\n", - update->ntimestep, natoms, latte_energy); - if (latteerror) error->all(FLERR,"Internal LATTE problem"); } @@ -398,9 +407,6 @@ void FixLatte::latte_wrapper_exclude() &domain->xy,&domain->xz,&domain->yz,forces,&maxiter,&latte_energy, &atom->v[0][0],&update->dt,virial,&newsystem,&latteerror); - printf("LATTE EXCLUDE: step %ld, natoms %d, LATTE eng %g\n", - update->ntimestep, nlatte, latte_energy); - if (latteerror) error->all(FLERR,"Internal LATTE problem"); // expand compressed forces array diff --git a/src/LATTE/fix_latte.h b/src/LATTE/fix_latte.h index 0ce6e0f4ce..18730e7f5e 100644 --- a/src/LATTE/fix_latte.h +++ b/src/LATTE/fix_latte.h @@ -49,10 +49,12 @@ class FixLatte : public Fix { int eflag_caller; char *id_pe,*id_exclude; int *exclusion_group_ptr; + int setupflag, newsystem; + bigint natoms_last; int flags_latte[6]; - int nmax, newsystem; + int nmax; double *qpotential; double **flatte; double latte_energy; From abfdb5bca3851158489c5bdd340c63f099f97a3f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Sep 2022 18:33:27 -0400 Subject: [PATCH 109/364] whitespace --- src/LATTE/fix_latte.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 4daaf9d40a..8da1db5261 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -72,7 +72,7 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : thermo_energy = thermo_virial = 1; // process optional args - + coulomb = 0; id_pe = nullptr; exclude = 0; @@ -147,7 +147,7 @@ void FixLatte::init() if (atom->q_flag == 0 || force->pair == nullptr || force->kspace == nullptr) error->all(FLERR,"Fix latte cannot compute Coulomb potential"); c_pe = modify->get_compute_by_id(id_pe); - if (!c_pe) + if (!c_pe) error->all(FLERR,"Fix latte could not find Coulomb compute ID {}",id_pe); } @@ -171,12 +171,12 @@ void FixLatte::init() if (exclude) { Fix *f_exclude = modify->get_fix_by_id(id_exclude); - if (!f_exclude) + if (!f_exclude) error->all(FLERR,"Fix latte could not find exclude fix ID {}", id_exclude); int exclude_group_index,dim; exclusion_group_ptr = (int *) f_exclude->extract("exclusion_group",dim); - if (!exclusion_group_ptr || dim != 0) - error->all(FLERR,"Fix latte could not query exclude_group of fix ID {}", + if (!exclusion_group_ptr || dim != 0) + error->all(FLERR,"Fix latte could not query exclude_group of fix ID {}", id_exclude); } } @@ -308,7 +308,7 @@ void FixLatte::post_force(int vflag) newsystem = 0; natoms_last = atom->natoms; - + // sum LATTE forces to LAMMPS forces // e.g. LAMMPS may compute Coulombics at some point @@ -362,7 +362,7 @@ void FixLatte::latte_wrapper_exclude() int *mask = atom->mask; int nlocal = atom->nlocal; - + // nlatte = number of non-excluded atoms to pass to LATTE int nlatte = 0; From cc2b6a35652921cfe2f8460ec7942d53ff49b164 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Sep 2022 19:02:46 -0400 Subject: [PATCH 110/364] reorder punctuation and quotation characters for clarity --- doc/src/Bibliography.rst | 2 +- doc/src/Packages_details.rst | 2 +- doc/src/Run_options.rst | 2 +- doc/src/Speed_intel.rst | 2 +- doc/src/compute_angmom_chunk.rst | 2 +- doc/src/compute_born_matrix.rst | 2 +- doc/src/compute_com.rst | 2 +- doc/src/compute_com_chunk.rst | 2 +- doc/src/compute_dipole.rst | 2 +- doc/src/compute_dipole_chunk.rst | 2 +- doc/src/compute_erotate_asphere.rst | 2 +- doc/src/compute_erotate_rigid.rst | 2 +- doc/src/compute_erotate_sphere.rst | 2 +- doc/src/compute_event_displace.rst | 4 +- doc/src/compute_fep.rst | 2 +- doc/src/compute_group_group.rst | 2 +- doc/src/compute_gyration.rst | 2 +- doc/src/compute_gyration_shape.rst | 2 +- doc/src/compute_gyration_shape_chunk.rst | 2 +- doc/src/compute_heat_flux.rst | 14 +- doc/src/compute_hma.rst | 2 +- doc/src/compute_inertia_chunk.rst | 2 +- doc/src/compute_ke.rst | 2 +- doc/src/compute_ke_rigid.rst | 2 +- doc/src/compute_momentum.rst | 2 +- doc/src/compute_msd.rst | 2 +- doc/src/compute_msd_chunk.rst | 2 +- doc/src/compute_msd_nongauss.rst | 2 +- doc/src/compute_omega_chunk.rst | 2 +- doc/src/compute_pe.rst | 4 +- doc/src/compute_plasticity_atom.rst | 2 +- doc/src/compute_pressure.rst | 6 +- doc/src/compute_property_chunk.rst | 2 +- doc/src/compute_property_local.rst | 2 +- doc/src/compute_rdf.rst | 2 +- doc/src/compute_reduce.rst | 12 +- doc/src/compute_reduce_chunk.rst | 2 +- doc/src/compute_stress_profile.rst | 2 +- doc/src/compute_tally.rst | 2 +- doc/src/compute_temp.rst | 2 +- doc/src/compute_temp_asphere.rst | 4 +- doc/src/compute_temp_body.rst | 4 +- doc/src/compute_temp_chunk.rst | 4 +- doc/src/compute_temp_com.rst | 4 +- doc/src/compute_temp_cs.rst | 4 +- doc/src/compute_temp_deform.rst | 2 +- doc/src/compute_temp_deform_eff.rst | 4 +- doc/src/compute_temp_drude.rst | 4 +- doc/src/compute_temp_eff.rst | 4 +- doc/src/compute_temp_partial.rst | 4 +- doc/src/compute_temp_profile.rst | 4 +- doc/src/compute_temp_ramp.rst | 4 +- doc/src/compute_temp_region.rst | 4 +- doc/src/compute_temp_region_eff.rst | 4 +- doc/src/compute_temp_rotate.rst | 4 +- doc/src/compute_temp_sphere.rst | 4 +- doc/src/compute_ti.rst | 2 +- doc/src/compute_torque_chunk.rst | 2 +- doc/src/compute_vacf.rst | 2 +- doc/src/compute_vcm_chunk.rst | 2 +- doc/src/compute_viscosity_cos.rst | 6 +- doc/src/compute_voronoi_atom.rst | 2 +- doc/src/compute_xrd.rst | 2 +- doc/src/create_atoms.rst | 4 +- doc/src/dump.rst | 233 ++++++++++++----------- doc/src/dump_image.rst | 55 +++--- doc/src/fix_adapt.rst | 56 +++--- doc/src/fix_adapt_fep.rst | 4 +- doc/src/fix_addforce.rst | 2 +- doc/src/fix_addtorque.rst | 2 +- doc/src/fix_amoeba_bitorsion.rst | 2 +- doc/src/fix_amoeba_pitorsion.rst | 2 +- doc/src/fix_atc.rst | 2 +- doc/src/fix_atom_swap.rst | 2 +- doc/src/fix_ave_atom.rst | 8 +- doc/src/fix_ave_chunk.rst | 36 ++-- doc/src/fix_ave_correlate.rst | 6 +- doc/src/fix_ave_histo.rst | 6 +- doc/src/fix_ave_time.rst | 6 +- doc/src/fix_balance.rst | 4 +- doc/src/group.rst | 2 +- doc/src/kim_commands.rst | 2 +- doc/src/pair_zbl.rst | 2 +- 83 files changed, 315 insertions(+), 311 deletions(-) diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index 9f3591dcde..dff457836c 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -1373,7 +1373,7 @@ Bibliography Zhu, Tajkhorshid, and Schulten, Biophys. J. 83, 154 (2002). **(Ziegler)** - J.F. Ziegler, J. P. Biersack and U. Littmark, "The Stopping and Range of Ions in Matter," Volume 1, Pergamon, 1985. + J.F. Ziegler, J. P. Biersack and U. Littmark, "The Stopping and Range of Ions in Matter", Volume 1, Pergamon, 1985. **(Zimmerman2004)** Zimmerman, JA; Webb, EB; Hoyt, JJ;. Jones, RE; Klein, PA; Bammann, DJ, "Calculation of stress in atomistic simulation." Special Issue of Modelling and Simulation in Materials Science and Engineering (2004),12:S319. diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 4e75c5e94a..f89ab00039 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -276,7 +276,7 @@ the barostat as outlined in: N. J. H. Dunn and W. G. Noid, "Bottom-up coarse-grained models that accurately describe the structure, pressure, and compressibility of -molecular liquids," J. Chem. Phys. 143, 243148 (2015). +molecular liquids", J. Chem. Phys. 143, 243148 (2015). **Authors:** Nicholas J. H. Dunn and Michael R. DeLyser (The Pennsylvania State University) diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index d2d7f8c155..f3c7973197 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -495,7 +495,7 @@ run: write_dump group-ID dumpstyle dumpfile arg1 arg2 ... Note that the specified restartfile and dumpfile names may contain -wild-card characters ("\*","%") as explained on the +wild-card characters ("\*" or "%") as explained on the :doc:`read_restart ` and :doc:`write_dump ` doc pages. The use of "%" means that a parallel restart file and/or parallel dump file can be read and/or written. Note that a filename diff --git a/doc/src/Speed_intel.rst b/doc/src/Speed_intel.rst index 6526f836b2..2b53af8698 100644 --- a/doc/src/Speed_intel.rst +++ b/doc/src/Speed_intel.rst @@ -536,6 +536,6 @@ supported. References """""""""" -* Brown, W.M., Carrillo, J.-M.Y., Mishra, B., Gavhane, N., Thakkar, F.M., De Kraker, A.R., Yamada, M., Ang, J.A., Plimpton, S.J., "Optimizing Classical Molecular Dynamics in LAMMPS," in Intel Xeon Phi Processor High Performance Programming: Knights Landing Edition, J. Jeffers, J. Reinders, A. Sodani, Eds. Morgan Kaufmann. +* Brown, W.M., Carrillo, J.-M.Y., Mishra, B., Gavhane, N., Thakkar, F.M., De Kraker, A.R., Yamada, M., Ang, J.A., Plimpton, S.J., "Optimizing Classical Molecular Dynamics in LAMMPS", in Intel Xeon Phi Processor High Performance Programming: Knights Landing Edition, J. Jeffers, J. Reinders, A. Sodani, Eds. Morgan Kaufmann. * Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. `Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. `_ 2016 High Performance Computing, Networking, Storage and Analysis, SC16: International Conference (pp. 82-95). * Brown, W.M., Carrillo, J.-M.Y., Gavhane, N., Thakkar, F.M., Plimpton, S.J. Optimizing Legacy Molecular Dynamics Software with Directive-Based Offload. Computer Physics Communications. 2015. 195: p. 95-101. diff --git a/doc/src/compute_angmom_chunk.rst b/doc/src/compute_angmom_chunk.rst index 2e98742772..ba3ec526cf 100644 --- a/doc/src/compute_angmom_chunk.rst +++ b/doc/src/compute_angmom_chunk.rst @@ -78,7 +78,7 @@ These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in mass-velocity-distance :doc:`units `. Restrictions diff --git a/doc/src/compute_born_matrix.rst b/doc/src/compute_born_matrix.rst index 920ae46532..52bed6a357 100644 --- a/doc/src/compute_born_matrix.rst +++ b/doc/src/compute_born_matrix.rst @@ -182,7 +182,7 @@ by any command that uses global values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The array values calculated by this compute are all "extensive." +The array values calculated by this compute are all "extensive". Restrictions """""""""""" diff --git a/doc/src/compute_com.rst b/doc/src/compute_com.rst index df5373293e..6fa3fda64c 100644 --- a/doc/src/compute_com.rst +++ b/doc/src/compute_com.rst @@ -49,7 +49,7 @@ accessed by indices 1--3 by any command that uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The vector values are "intensive." The vector values will be in +The vector values are "intensive". The vector values will be in distance :doc:`units `. Restrictions diff --git a/doc/src/compute_com_chunk.rst b/doc/src/compute_com_chunk.rst index a2df80d5d8..2556d97b09 100644 --- a/doc/src/compute_com_chunk.rst +++ b/doc/src/compute_com_chunk.rst @@ -77,7 +77,7 @@ values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in distance :doc:`units `. Restrictions diff --git a/doc/src/compute_dipole.rst b/doc/src/compute_dipole.rst index 7fb4b54fab..95c5e216f0 100644 --- a/doc/src/compute_dipole.rst +++ b/doc/src/compute_dipole.rst @@ -54,7 +54,7 @@ the computed dipole moment and a global vector of length 3 with the dipole vector. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The computed values are "intensive." The array values will be in +The computed values are "intensive". The array values will be in dipole units (i.e., charge :doc:`units ` times distance :doc:`units `). diff --git a/doc/src/compute_dipole_chunk.rst b/doc/src/compute_dipole_chunk.rst index 24e6442a63..504e6f20d0 100644 --- a/doc/src/compute_dipole_chunk.rst +++ b/doc/src/compute_dipole_chunk.rst @@ -86,7 +86,7 @@ chunk. These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in dipole units (i.e., charge :doc:`units ` times distance :doc:`units `). diff --git a/doc/src/compute_erotate_asphere.rst b/doc/src/compute_erotate_asphere.rst index 44415c63cc..35691d8c9a 100644 --- a/doc/src/compute_erotate_asphere.rst +++ b/doc/src/compute_erotate_asphere.rst @@ -48,7 +48,7 @@ used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_erotate_rigid.rst b/doc/src/compute_erotate_rigid.rst index 1e03a2316c..b1342bf15e 100644 --- a/doc/src/compute_erotate_rigid.rst +++ b/doc/src/compute_erotate_rigid.rst @@ -48,7 +48,7 @@ of all the rigid bodies). This value can be used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_erotate_sphere.rst b/doc/src/compute_erotate_sphere.rst index 28b0052b89..aae37277a4 100644 --- a/doc/src/compute_erotate_sphere.rst +++ b/doc/src/compute_erotate_sphere.rst @@ -44,7 +44,7 @@ used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_event_displace.rst b/doc/src/compute_event_displace.rst index f8911e1224..43881460f4 100644 --- a/doc/src/compute_event_displace.rst +++ b/doc/src/compute_event_displace.rst @@ -40,7 +40,7 @@ further than the threshold distance. If the system is undergoing significant center-of-mass motion, due to thermal motion, an external force, or an initial net momentum, then this compute will not be able to distinguish that motion from - local atom displacements and may generate "false positives." + local atom displacements and may generate "false positives". Output info """"""""""" @@ -50,7 +50,7 @@ used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The +The scalar value calculated by this compute is "intensive". The scalar value will be a 0 or 1 as explained above. Restrictions diff --git a/doc/src/compute_fep.rst b/doc/src/compute_fep.rst index e2de8d405b..481e4ead91 100644 --- a/doc/src/compute_fep.rst +++ b/doc/src/compute_fep.rst @@ -299,7 +299,7 @@ These output results can be used by any command that uses a global scalar or vector from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. For example, the computed values can be averaged using :doc:`fix ave/time `. -The values calculated by this compute are "extensive." +The values calculated by this compute are "extensive". Restrictions """""""""""" diff --git a/doc/src/compute_group_group.rst b/doc/src/compute_group_group.rst index 87e855ae1e..b4eccf959f 100644 --- a/doc/src/compute_group_group.rst +++ b/doc/src/compute_group_group.rst @@ -140,7 +140,7 @@ vector values from a compute as input. See the options. Both the scalar and vector values calculated by this compute are -"extensive." The scalar value will be in energy :doc:`units `. +"extensive". The scalar value will be in energy :doc:`units `. The vector values will be in force :doc:`units `. Restrictions diff --git a/doc/src/compute_gyration.rst b/doc/src/compute_gyration.rst index 5610dd1d98..eaefc3abbb 100644 --- a/doc/src/compute_gyration.rst +++ b/doc/src/compute_gyration.rst @@ -69,7 +69,7 @@ vector values from a compute as input. See the :doc:`Howto output `, respectively. Restrictions diff --git a/doc/src/compute_gyration_shape.rst b/doc/src/compute_gyration_shape.rst index 892677b0ba..2cbffbbdf4 100644 --- a/doc/src/compute_gyration_shape.rst +++ b/doc/src/compute_gyration_shape.rst @@ -78,7 +78,7 @@ vector values from a compute as input. See the options. The vector values calculated by this compute are -"intensive." The first five vector values will be in +"intensive". The first five vector values will be in distance\ :math:`2` :doc:`units ` while the sixth one is dimensionless. Restrictions diff --git a/doc/src/compute_gyration_shape_chunk.rst b/doc/src/compute_gyration_shape_chunk.rst index 2bf8c970e9..62a25b05a3 100644 --- a/doc/src/compute_gyration_shape_chunk.rst +++ b/doc/src/compute_gyration_shape_chunk.rst @@ -80,7 +80,7 @@ See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array calculated by this compute is -"intensive." The first five columns will be in +"intensive". The first five columns will be in distance\ :math:`^2` :doc:`units ` while the sixth one is dimensionless. Restrictions diff --git a/doc/src/compute_heat_flux.rst b/doc/src/compute_heat_flux.rst index 4302ecddb8..b88cb76260 100644 --- a/doc/src/compute_heat_flux.rst +++ b/doc/src/compute_heat_flux.rst @@ -142,14 +142,14 @@ command that uses global vector values from a compute as input. See the :doc:`Howto output ` documentation for an overview of LAMMPS output options. -The vector values calculated by this compute are "extensive," meaning +The vector values calculated by this compute are "extensive", meaning they scale with the number of atoms in the simulation. They can be -divided by the appropriate volume to get a flux, which would then be -an "intensive" value, meaning independent of the number of atoms in -the simulation. Note that if the compute is "all," then the -appropriate volume to divide by is the simulation box volume. -However, if a sub-group is used, it should be the volume containing -those atoms. +divided by the appropriate volume to get a flux, which would then be an +"intensive" value, meaning independent of the number of atoms in the +simulation. Note that if the compute group is "all", then the +appropriate volume to divide by is the simulation box volume. However, +if a group with a subset of atoms is used, it should be the volume +containing those atoms. The vector values will be in energy\*velocity :doc:`units `. Once divided by a volume the units will be that of flux, namely diff --git a/doc/src/compute_hma.rst b/doc/src/compute_hma.rst index 8c0c958ae5..4fa4579651 100644 --- a/doc/src/compute_hma.rst +++ b/doc/src/compute_hma.rst @@ -172,7 +172,7 @@ requested as arguments to the command (the potential energy, pressure and/or hea capacity). The elements of the vector can be accessed by indices 1--n by any command that uses global vector values as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The vector values calculated by this compute are "extensive." The +The vector values calculated by this compute are "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_inertia_chunk.rst b/doc/src/compute_inertia_chunk.rst index 74f59dd7a7..6569c3965d 100644 --- a/doc/src/compute_inertia_chunk.rst +++ b/doc/src/compute_inertia_chunk.rst @@ -84,7 +84,7 @@ by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in mass\*distance\ :math:`^2` :doc:`units `. Restrictions diff --git a/doc/src/compute_ke.rst b/doc/src/compute_ke.rst index 4eb07b920c..8a19438640 100644 --- a/doc/src/compute_ke.rst +++ b/doc/src/compute_ke.rst @@ -52,7 +52,7 @@ can be used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_ke_rigid.rst b/doc/src/compute_ke_rigid.rst index b3e446daf6..e77cabfeb6 100644 --- a/doc/src/compute_ke_rigid.rst +++ b/doc/src/compute_ke_rigid.rst @@ -48,7 +48,7 @@ global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_momentum.rst b/doc/src/compute_momentum.rst index 59215c889b..d16d220673 100644 --- a/doc/src/compute_momentum.rst +++ b/doc/src/compute_momentum.rst @@ -37,7 +37,7 @@ length 3. This value can be used by any command that uses a global vector value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The vector value calculated by this compute is "extensive." The vector +The vector value calculated by this compute is "extensive". The vector value will be in mass\*velocity :doc:`units `. Restrictions diff --git a/doc/src/compute_msd.rst b/doc/src/compute_msd.rst index 77694ca8fc..bc16a3de6f 100644 --- a/doc/src/compute_msd.rst +++ b/doc/src/compute_msd.rst @@ -105,7 +105,7 @@ accessed by indices 1--4 by any command that uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The vector values are "intensive." The vector values will be in +The vector values are "intensive". The vector values will be in distance\ :math:`^2` :doc:`units `. Restrictions diff --git a/doc/src/compute_msd_chunk.rst b/doc/src/compute_msd_chunk.rst index 6be5196782..584453d76b 100644 --- a/doc/src/compute_msd_chunk.rst +++ b/doc/src/compute_msd_chunk.rst @@ -121,7 +121,7 @@ These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in distance\ :math:`^2` :doc:`units `. Restrictions diff --git a/doc/src/compute_msd_nongauss.rst b/doc/src/compute_msd_nongauss.rst index 16c4e0b06c..512437a932 100644 --- a/doc/src/compute_msd_nongauss.rst +++ b/doc/src/compute_msd_nongauss.rst @@ -67,7 +67,7 @@ accessed by indices 1--3 by any command that uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The vector values are "intensive." The first vector value will be in +The vector values are "intensive". The first vector value will be in distance\ :math:`^2` :doc:`units `, the second is in distance\ :math:`^4` units, and the third is dimensionless. diff --git a/doc/src/compute_omega_chunk.rst b/doc/src/compute_omega_chunk.rst index 8c32d6491e..7eaddff602 100644 --- a/doc/src/compute_omega_chunk.rst +++ b/doc/src/compute_omega_chunk.rst @@ -84,7 +84,7 @@ These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in velocity/distance :doc:`units `. Restrictions diff --git a/doc/src/compute_pe.rst b/doc/src/compute_pe.rst index 825fe4cba4..a96bdd249e 100644 --- a/doc/src/compute_pe.rst +++ b/doc/src/compute_pe.rst @@ -27,7 +27,7 @@ Description """"""""""" Define a computation that calculates the potential energy of the -entire system of atoms. The specified group must be "all." See the +entire system of atoms. The specified group must be "all". See the :doc:`compute pe/atom ` command if you want per-atom energies. These per-atom values could be summed for a group of atoms via the :doc:`compute reduce ` command. @@ -73,7 +73,7 @@ value can be used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." The +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. Restrictions diff --git a/doc/src/compute_plasticity_atom.rst b/doc/src/compute_plasticity_atom.rst index ad0c22dbf5..45d77d228d 100644 --- a/doc/src/compute_plasticity_atom.rst +++ b/doc/src/compute_plasticity_atom.rst @@ -73,5 +73,5 @@ none .. _Mitchell: **(Mitchell)** Mitchell, "A non-local, ordinary-state-based -viscoelasticity model for peridynamics," Sandia National Lab Report, +viscoelasticity model for peridynamics", Sandia National Lab Report, 8064:1-28 (2011). diff --git a/doc/src/compute_pressure.rst b/doc/src/compute_pressure.rst index c1a9e3d2ec..bf344be270 100644 --- a/doc/src/compute_pressure.rst +++ b/doc/src/compute_pressure.rst @@ -29,7 +29,7 @@ Description """"""""""" Define a computation that calculates the pressure of the entire system -of atoms. The specified group must be "all." See the +of atoms. The specified group must be "all". See the :doc:`compute stress/atom ` command if you want per-atom pressure (stress). These per-atom values could be summed for a group of atoms via the :doc:`compute reduce ` command. @@ -115,7 +115,7 @@ LAMMPS starts up, as if this command were in the input script: compute thermo_press all pressure thermo_temp where thermo_temp is the ID of a similarly defined compute of style -"temp." See the :doc:`thermo_style ` command for more details. +"temp". See the :doc:`thermo_style ` command for more details. ---------- @@ -137,7 +137,7 @@ The ordering of values in the symmetric pressure tensor is as follows: :math:`p_{xz},` :math:`p_{yz}.` The scalar and vector values calculated by this compute are -"intensive." The scalar and vector values will be in pressure +"intensive". The scalar and vector values will be in pressure :doc:`units `. Restrictions diff --git a/doc/src/compute_property_chunk.rst b/doc/src/compute_property_chunk.rst index 6475a4b962..7c06b8d51e 100644 --- a/doc/src/compute_property_chunk.rst +++ b/doc/src/compute_property_chunk.rst @@ -110,7 +110,7 @@ accessed by any command that uses global values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The vector or array values are "intensive." The values will be +The vector or array values are "intensive". The values will be unitless or in the units discussed above. Restrictions diff --git a/doc/src/compute_property_local.rst b/doc/src/compute_property_local.rst index 2f74f45bf4..f1234ade09 100644 --- a/doc/src/compute_property_local.rst +++ b/doc/src/compute_property_local.rst @@ -164,7 +164,7 @@ the type of the bond, from 1 to Nbtypes = # of bond types. The number of bond types is defined in the data file read by the :doc:`read_data ` command. -The attributes that start with "a," "d," and "i" refer to similar values +The attributes that start with "a", "d", and "i" refer to similar values for :doc:`angles `, :doc:`dihedrals `, and :doc:`impropers `. diff --git a/doc/src/compute_rdf.rst b/doc/src/compute_rdf.rst index 2ccc03cf8f..e40775c6e0 100644 --- a/doc/src/compute_rdf.rst +++ b/doc/src/compute_rdf.rst @@ -166,7 +166,7 @@ by any command that uses a global values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values calculated by this compute are all "intensive." +The array values calculated by this compute are all "intensive". The first column of array values will be in distance :doc:`units `. The :math:`g(r)` columns of array values are normalized diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index b85b2b7dbb..89554ebece 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -128,7 +128,7 @@ inputs to this fix by using the :doc:`compute property/atom ` command and then specifying an input value from that compute. -If a value begins with "c\_," a compute ID must follow which has been +If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. Computes can generate per-atom or local quantities. See the individual :doc:`compute ` page for details. If no bracketed integer @@ -139,7 +139,7 @@ compute styles and :doc:`add them to LAMMPS `. See the discussion above for how :math:`I` can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "f\_," a fix ID must follow which has been +If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. Fixes can generate per-atom or local quantities. See the individual :doc:`fix ` page for details. Note that some fixes only produce their values on certain @@ -152,7 +152,7 @@ is used. Users can also write code for their own fix style and :math:`I` can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "v\_," a variable name must follow which has +If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. It must be an :doc:`atom-style variable `. Atom-style variables can reference thermodynamic keywords and various per-atom attributes, or @@ -197,7 +197,7 @@ global vector of values, the length of which is equal to the number of inputs specified. As discussed below, for the *sum*, *sumabs*, and *sumsq* modes, the value(s) -produced by this compute are all "extensive," meaning their value +produced by this compute are all "extensive", meaning their value scales linearly with the number of atoms involved. If normalized values are desired, this compute can be accessed by the :doc:`thermo_style custom ` command with @@ -218,9 +218,9 @@ compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. All the scalar or vector values calculated by this compute are -"intensive," except when the *sum*, *sumabs*, or *sumsq* modes are used on +"intensive", except when the *sum*, *sumabs*, or *sumsq* modes are used on per-atom or local vectors, in which case the calculated values are -"extensive." +"extensive". The scalar or vector values will be in whatever :doc:`units ` the quantities being reduced are in. diff --git a/doc/src/compute_reduce_chunk.rst b/doc/src/compute_reduce_chunk.rst index c988af276f..43fee39cf2 100644 --- a/doc/src/compute_reduce_chunk.rst +++ b/doc/src/compute_reduce_chunk.rst @@ -102,7 +102,7 @@ The commands below can be added to the examples/in.micelle script. Imagine a collection of polymer chains or small molecules with hydrophobic end groups. All the hydrophobic (HP) atoms are assigned -to a group called "phobic." +to a group called "phobic". These commands will assign a unique cluster ID to all HP atoms within a specified distance of each other. A cluster will contain all HP diff --git a/doc/src/compute_stress_profile.rst b/doc/src/compute_stress_profile.rst index 9761c68b1e..cb4628bd5d 100644 --- a/doc/src/compute_stress_profile.rst +++ b/doc/src/compute_stress_profile.rst @@ -114,7 +114,7 @@ This array can be output with :doc:`fix ave/time `, compute p all stress/cartesian x 0.1 fix 2 all ave/time 100 1 100 c_p[*] file dump_p.out mode vector -The values calculated by this compute are "intensive." The stress +The values calculated by this compute are "intensive". The stress values will be in pressure :doc:`units `. The number density values are in inverse volume :doc:`units `. diff --git a/doc/src/compute_tally.rst b/doc/src/compute_tally.rst index fd979d19a0..6eff1e186e 100644 --- a/doc/src/compute_tally.rst +++ b/doc/src/compute_tally.rst @@ -182,7 +182,7 @@ Output info from individual atoms in both groups). Both the scalar and vector values calculated by this compute are -"extensive." +"extensive". Restrictions """""""""""" diff --git a/doc/src/compute_temp.rst b/doc/src/compute_temp.rst index 2e9d4ab362..1d5a62d6f6 100644 --- a/doc/src/compute_temp.rst +++ b/doc/src/compute_temp.rst @@ -91,7 +91,7 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The +The scalar value calculated by this compute is "intensive". The vector values are "extensive". The scalar value will be in temperature :doc:`units `. The diff --git a/doc/src/compute_temp_asphere.rst b/doc/src/compute_temp_asphere.rst index cef8d573c1..cba52a68b4 100644 --- a/doc/src/compute_temp_asphere.rst +++ b/doc/src/compute_temp_asphere.rst @@ -134,8 +134,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_body.rst b/doc/src/compute_temp_body.rst index 42497e34cb..64f5ce9a0f 100644 --- a/doc/src/compute_temp_body.rst +++ b/doc/src/compute_temp_body.rst @@ -117,8 +117,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_chunk.rst b/doc/src/compute_temp_chunk.rst index f3d1a83351..c92b4e36e9 100644 --- a/doc/src/compute_temp_chunk.rst +++ b/doc/src/compute_temp_chunk.rst @@ -242,8 +242,8 @@ can be accessed by any command that uses global array values from a compute as input. Again, see the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." The array values are "intensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The array values are "intensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. The array values diff --git a/doc/src/compute_temp_com.rst b/doc/src/compute_temp_com.rst index fde6f701fd..d54fa7dfa6 100644 --- a/doc/src/compute_temp_com.rst +++ b/doc/src/compute_temp_com.rst @@ -87,8 +87,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_cs.rst b/doc/src/compute_temp_cs.rst index 3c9503cf4f..45de17be89 100644 --- a/doc/src/compute_temp_cs.rst +++ b/doc/src/compute_temp_cs.rst @@ -101,8 +101,8 @@ vector of length 6 (KE tensor), which can be accessed by indices 1--6. These values can be used by any command that uses global scalar or vector values from a compute as input. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_deform.rst b/doc/src/compute_temp_deform.rst index b2d6b68b17..adf76564a8 100644 --- a/doc/src/compute_temp_deform.rst +++ b/doc/src/compute_temp_deform.rst @@ -134,7 +134,7 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The +The scalar value calculated by this compute is "intensive". The vector values are "extensive". The scalar value will be in temperature :doc:`units `. diff --git a/doc/src/compute_temp_deform_eff.rst b/doc/src/compute_temp_deform_eff.rst index 3dd1225299..83535f4727 100644 --- a/doc/src/compute_temp_deform_eff.rst +++ b/doc/src/compute_temp_deform_eff.rst @@ -53,8 +53,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_drude.rst b/doc/src/compute_temp_drude.rst index 8c50831941..8602bc3589 100644 --- a/doc/src/compute_temp_drude.rst +++ b/doc/src/compute_temp_drude.rst @@ -67,8 +67,8 @@ vector values from a compute as input. See the options. Both the scalar value and the first two values of the vector -calculated by this compute are "intensive." The other four vector values -are "extensive." +calculated by this compute are "intensive". The other four vector values +are "extensive". Restrictions """""""""""" diff --git a/doc/src/compute_temp_eff.rst b/doc/src/compute_temp_eff.rst index c76581fa68..3ec6300ca4 100644 --- a/doc/src/compute_temp_eff.rst +++ b/doc/src/compute_temp_eff.rst @@ -88,9 +88,9 @@ thermostatting. Output info """"""""""" -The scalar value calculated by this compute is "intensive," meaning it +The scalar value calculated by this compute is "intensive", meaning it is independent of the number of atoms in the simulation. The vector -values are "extensive," meaning they scale with the number of atoms in +values are "extensive", meaning they scale with the number of atoms in the simulation. Restrictions diff --git a/doc/src/compute_temp_partial.rst b/doc/src/compute_temp_partial.rst index 0512311d8f..d5628e0d60 100644 --- a/doc/src/compute_temp_partial.rst +++ b/doc/src/compute_temp_partial.rst @@ -94,8 +94,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_profile.rst b/doc/src/compute_temp_profile.rst index 9076a6cb14..566d8cf3fc 100644 --- a/doc/src/compute_temp_profile.rst +++ b/doc/src/compute_temp_profile.rst @@ -183,8 +183,8 @@ vector or array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." The array values are "intensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The array values are "intensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. The first column diff --git a/doc/src/compute_temp_ramp.rst b/doc/src/compute_temp_ramp.rst index 13799874ab..5c18243c23 100644 --- a/doc/src/compute_temp_ramp.rst +++ b/doc/src/compute_temp_ramp.rst @@ -106,8 +106,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_region.rst b/doc/src/compute_temp_region.rst index c8a3075771..77954e8898 100644 --- a/doc/src/compute_temp_region.rst +++ b/doc/src/compute_temp_region.rst @@ -99,8 +99,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_region_eff.rst b/doc/src/compute_temp_region_eff.rst index ebfc35cbe6..b8cd73f4fd 100644 --- a/doc/src/compute_temp_region_eff.rst +++ b/doc/src/compute_temp_region_eff.rst @@ -46,8 +46,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_rotate.rst b/doc/src/compute_temp_rotate.rst index e760a49b00..7c445109a1 100644 --- a/doc/src/compute_temp_rotate.rst +++ b/doc/src/compute_temp_rotate.rst @@ -86,8 +86,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_temp_sphere.rst b/doc/src/compute_temp_sphere.rst index 3f41837013..5c7c73a8d2 100644 --- a/doc/src/compute_temp_sphere.rst +++ b/doc/src/compute_temp_sphere.rst @@ -122,8 +122,8 @@ vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -vector values are "extensive." +The scalar value calculated by this compute is "intensive". The +vector values are "extensive". The scalar value will be in temperature :doc:`units `. The vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_ti.rst b/doc/src/compute_ti.rst index a32f0d1b18..f1f2e5d430 100644 --- a/doc/src/compute_ti.rst +++ b/doc/src/compute_ti.rst @@ -125,7 +125,7 @@ value can be used by any command that uses a global scalar value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "extensive." +The scalar value calculated by this compute is "extensive". The scalar value will be in energy :doc:`units `. diff --git a/doc/src/compute_torque_chunk.rst b/doc/src/compute_torque_chunk.rst index 97c9c127b8..23befe8458 100644 --- a/doc/src/compute_torque_chunk.rst +++ b/doc/src/compute_torque_chunk.rst @@ -83,7 +83,7 @@ array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in force-distance :doc:`units `. Restrictions diff --git a/doc/src/compute_vacf.rst b/doc/src/compute_vacf.rst index c94277f43b..704e597e18 100644 --- a/doc/src/compute_vacf.rst +++ b/doc/src/compute_vacf.rst @@ -66,7 +66,7 @@ accessed by indices 1--4 by any command that uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -The vector values are "intensive." The vector values will be in +The vector values are "intensive". The vector values will be in velocity\ :math:`^2` :doc:`units `. Restrictions diff --git a/doc/src/compute_vcm_chunk.rst b/doc/src/compute_vcm_chunk.rst index 5579208766..c2960075f0 100644 --- a/doc/src/compute_vcm_chunk.rst +++ b/doc/src/compute_vcm_chunk.rst @@ -69,7 +69,7 @@ each chunk. These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The array values are "intensive." The array values will be in +The array values are "intensive". The array values will be in velocity :doc:`units `. Restrictions diff --git a/doc/src/compute_viscosity_cos.rst b/doc/src/compute_viscosity_cos.rst index a3adf3d78b..1bf9bc2588 100644 --- a/doc/src/compute_viscosity_cos.rst +++ b/doc/src/compute_viscosity_cos.rst @@ -134,9 +134,9 @@ These values can be used by any command that uses global scalar or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -The scalar value calculated by this compute is "intensive." The -first six elements of vector values are "extensive," -and the seventh element of vector values is "intensive." +The scalar value calculated by this compute is "intensive". The +first six elements of vector values are "extensive", +and the seventh element of vector values is "intensive". The scalar value will be in temperature :doc:`units `. The first six elements of vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index e1f8de0667..699d3f2aaa 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -198,7 +198,7 @@ Voronoi volume, the second is the neighbor count, as described above (read above for the output data in case the *occupation* keyword is specified). These values can be accessed by any command that uses per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output -options. If the *peratom* keyword is set to "no," the per-atom array +options. If the *peratom* keyword is set to "no", the per-atom array is still created, but it is not accessible. If the *edge_histo* keyword is used, then this compute generates a diff --git a/doc/src/compute_xrd.rst b/doc/src/compute_xrd.rst index 39dc78a314..10ee35496d 100644 --- a/doc/src/compute_xrd.rst +++ b/doc/src/compute_xrd.rst @@ -219,7 +219,7 @@ The array can be accessed by any command that uses global values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. -All array values calculated by this compute are "intensive." +All array values calculated by this compute are "intensive". Restrictions """""""""""" diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index 489d4fa5d1..c8f94f7d5e 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -95,7 +95,7 @@ typically created via the :doc:`create_box ` command. Before using this command, a lattice must also be defined using the :doc:`lattice ` command, unless you specify the *single* style with units = box or the *random* style. For the remainder of this doc -page, a created atom or molecule is referred to as a "particle." +page, a created atom or molecule is referred to as a "particle". If created particles are individual atoms, they are assigned the specified atom *type*, though this can be altered via the *basis* @@ -352,7 +352,7 @@ As an example, these commands can be used in a 2d simulation, to create a sinusoidal surface. Note that the surface is "rough" due to individual lattice points being "above" or "below" the mathematical expression for the sinusoidal curve. If a finer lattice were used, -the sinusoid would appear to be "smoother." Also note the use of the +the sinusoid would appear to be "smoother". Also note the use of the "xlat" and "ylat" :doc:`thermo_style ` keywords, which converts lattice spacings to distance. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index fc86fbaaed..21b82de4f0 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -224,30 +224,29 @@ page for details. The *atom/gz*, *cfg/gz*, *custom/gz*, *local/gz*, and *xyz/gz* styles are identical in command syntax to the corresponding styles without -"gz," however, they generate compressed files using the zlib +"gz", however, they generate compressed files using the zlib library. Thus the filename suffix ".gz" is mandatory. This is an -alternative approach to writing compressed files via a pipe, as done -by the regular dump styles, which may be required on clusters where -the interface to the high-speed network disallows using the fork() -library call (which is needed for a pipe). For the remainder of this -page, you should thus consider the *atom* and *atom/gz* styles -(etc.) to be inter-changeable, with the exception of the required -filename suffix. +alternative approach to writing compressed files via a pipe, as done by +the regular dump styles, which may be required on clusters where the +interface to the high-speed network disallows using the fork() library +call (which is needed for a pipe). For the remainder of this page, you +should thus consider the *atom* and *atom/gz* styles (etc.) to be +inter-changeable, with the exception of the required filename suffix. -Similarly, the *atom/zstd*, *cfg/zstd*, *custom/zstd*, *local/zstd*, -and *xyz/zstd* styles are identical to the gz styles, but use the Zstd +Similarly, the *atom/zstd*, *cfg/zstd*, *custom/zstd*, *local/zstd*, and +*xyz/zstd* styles are identical to the gz styles, but use the Zstd compression library instead and require the ".zst" suffix. See the -:doc:`dump_modify ` page for details on how to control -the compression level in both variants. +:doc:`dump_modify ` page for details on how to control the +compression level in both variants. As explained below, the *atom/mpiio*, *cfg/mpiio*, *custom/mpiio*, and -*xyz/mpiio* styles are identical in command syntax and in the format -of the dump files they create, to the corresponding styles without -"mpiio," except the single dump file they produce is written in -parallel via the MPI-IO library. For the remainder of this page, -you should thus consider the *atom* and *atom/mpiio* styles (etc.) to -be inter-changeable. The one exception is how the filename is -specified for the MPI-IO styles, as explained below. +*xyz/mpiio* styles are identical in command syntax and in the format of +the dump files they create, to the corresponding styles without "mpiio", +except the single dump file they produce is written in parallel via the +MPI-IO library. For the remainder of this page, you should thus +consider the *atom* and *atom/mpiio* styles (etc.) to be +inter-changeable. The one exception is how the filename is specified +for the MPI-IO styles, as explained below. .. warning:: @@ -434,7 +433,7 @@ Below is an example for a YAML format dump created by the following commands. dump out all yaml 100 dump.yaml id type x y z vx vy vz ix iy iz dump_modify out time yes units yes thermo yes format 1 %5d format "% 10.6e" -The tags "time," "units," and "thermo" are optional and enabled by the +The tags "time", "units", and "thermo" are optional and enabled by the dump_modify command. The list under the "box" tag has three lines for orthogonal boxes and four lines for triclinic boxes, where the first three are the box boundaries and the fourth the three tilt factors (:math:`xy`, @@ -553,15 +552,14 @@ package installed, viz., make yes-mpiio # installs the MPIIO package make mpi # build LAMMPS for your platform -Second, use a dump filename which contains ".mpiio." Note that it -does not have to end in ".mpiio," just contain those characters. -Unlike MPI-IO restart files, which must be both written and read using -MPI-IO, the dump files produced by these MPI-IO styles are identical -in format to the files produced by their non-MPI-IO style -counterparts. This means you can write a dump file using MPI-IO and -use the :doc:`read_dump ` command or perform other -post-processing, just as if the dump file was not written using -MPI-IO. +Second, use a dump filename which contains ".mpiio". Note that it does +not have to end in ".mpiio", just contain those characters. Unlike +MPI-IO restart files, which must be both written and read using MPI-IO, +the dump files produced by these MPI-IO styles are identical in format +to the files produced by their non-MPI-IO style counterparts. This +means you can write a dump file using MPI-IO and use the :doc:`read_dump +` command or perform other post-processing, just as if the +dump file was not written using MPI-IO. .. warning:: @@ -570,37 +568,40 @@ MPI-IO. Note that MPI-IO dump files are one large file which all processors write to. You thus cannot use the "%" wildcard character described -above in the filename since that specifies generation of multiple -files. You can use the ".bin" or ".lammpsbin" suffix described below in an -MPI-IO dump file; again this file will be written in parallel and have the -same binary format as if it were written without MPI-IO. +above in the filename since that specifies generation of multiple files. +You can use the ".bin" or ".lammpsbin" suffix described below in an +MPI-IO dump file; again this file will be written in parallel and have +the same binary format as if it were written without MPI-IO. -If the filename ends with ".bin" or ".lammpsbin," the dump file (or files, if -"\*" or "%" is also used) is written in binary format. A binary dump file -will be about the same size as a text version, but will typically -write out much faster. Of course, when post-processing, you will need -to convert it back to text format (see the :ref:`binary2txt tool `) or -write your own code to read the binary file. The format of the binary file can -be understood by looking at the :file:`tools/binary2txt.cpp` file. This option -is only available for the *atom* and *custom* styles. +If the filename ends with ".bin" or ".lammpsbin", the dump file (or +files, if "\*" or "%" is also used) is written in binary format. A +binary dump file will be about the same size as a text version, but will +typically write out much faster. Of course, when post-processing, you +will need to convert it back to text format (see the :ref:`binary2txt +tool `) or write your own code to read the binary file. The +format of the binary file can be understood by looking at the +:file:`tools/binary2txt.cpp` file. This option is only available for +the *atom* and *custom* styles. -If the filename ends with ".gz," the dump file (or files, if "\*" or "%" -is also used) is written in gzipped format. A gzipped dump file will be about -:math:`3\times` smaller than the text version, but will also take longer -to write. This option is not available for the *dcd* and *xtc* styles. +If the filename ends with ".gz", the dump file (or files, if "\*" or "%" +is also used) is written in gzipped format. A gzipped dump file will be +about :math:`3\times` smaller than the text version, but will also take +longer to write. This option is not available for the *dcd* and *xtc* +styles. ---------- Note that in the discussion which follows, for styles which can -reference values from a compute or fix or custom atom property, like -the *custom*\ , *cfg*\ , or *local* styles, the bracketed index :math:`i` can -be specified using a wildcard asterisk with the index to effectively -specify multiple values. This takes the form "\*" or "\*n" or "m\*" -or "m\*n." If :math:`N` is the number of columns in the array, then an -asterisk with no numeric values means all column indices from 1 to :math:`N`. -A leading asterisk means all indices from 1 to n (inclusive). A -trailing asterisk means all indices from m to :math:`N` (inclusive). A middle -asterisk means all indices from m to n (inclusive). +reference values from a compute or fix or custom atom property, like the +*custom*\ , *cfg*\ , or *local* styles, the bracketed index :math:`i` +can be specified using a wildcard asterisk with the index to effectively +specify multiple values. This takes the form "\*" or "\*n" or "m\*" or +"m\*n". If :math:`N` is the number of columns in the array, then an +asterisk with no numeric values means all column indices from 1 to +:math:`N`. A leading asterisk means all indices from 1 to n +(inclusive). A trailing asterisk means all indices from m to :math:`N` +(inclusive). A middle asterisk means all indices from m to n +(inclusive). Using a wildcard is the same as if the individual columns of the array had been listed one by one. For example, these two dump commands are @@ -679,37 +680,38 @@ The *id*, *mol*, *proc*, *procp1*, *type*, *element*, *mass*, *vx*, *Id* is the atom ID. *Mol* is the molecule ID, included in the data file for molecular systems. *Proc* is the ID of the processor (0 to -:math:`N_\text{procs}-1`) that currently owns the atom. -*Procp1* is the proc ID+1, which can be convenient in place of a *type* -attribute (1 to :math:`N_\text{types}`) for coloring atoms in a visualization -program. *Type* is the atom type (1 to :math:`N_\text{types}`). *Element* is -typically the chemical name of an element, which you must assign to each type -via the :doc:`dump_modify element ` command. More generally, it -can be any string you wish to associated with an atom type. *Mass* is the atom -mass. The quantities *vx*, *vy*, *vz*, *fx*, *fy*, *fz*, and *q* are components -of atom velocity and force and atomic charge. +:math:`N_\text{procs}-1`) that currently owns the atom. *Procp1* is the +proc ID+1, which can be convenient in place of a *type* attribute (1 to +:math:`N_\text{types}`) for coloring atoms in a visualization program. +*Type* is the atom type (1 to :math:`N_\text{types}`). *Element* is +typically the chemical name of an element, which you must assign to each +type via the :doc:`dump_modify element ` command. More +generally, it can be any string you wish to associated with an atom +type. *Mass* is the atom mass. The quantities *vx*, *vy*, *vz*, *fx*, +*fy*, *fz*, and *q* are components of atom velocity and force and atomic +charge. There are several options for outputting atom coordinates. The *x*, -*y*, and *z* attributes write atom coordinates "unscaled," in the +*y*, and *z* attributes write atom coordinates "unscaled", in the appropriate distance :doc:`units ` (:math:`\mathrm{\mathring A}`, -:math:`\sigma`, etc.). Use *xs*, *ys*, and *zs* if you want the coordinates -"scaled" to the box size so that each value is 0.0 to 1.0. If the simulation -box is triclinic (tilted), then all atom coords will still be between 0.0 and -1.0. The actual unscaled :math:`(x,y,z)` coordinate is -:math:`x_s a + y_s b + z_s c`, where :math:`(a,b,c)` are the non-orthogonal -vectors of the simulation box edges, as discussed on the -:doc:`Howto triclinic ` page. +:math:`\sigma`, etc.). Use *xs*, *ys*, and *zs* if you want the +coordinates "scaled" to the box size so that each value is 0.0 to 1.0. +If the simulation box is triclinic (tilted), then all atom coords will +still be between 0.0 and 1.0. The actual unscaled :math:`(x,y,z)` +coordinate is :math:`x_s a + y_s b + z_s c`, where :math:`(a,b,c)` are +the non-orthogonal vectors of the simulation box edges, as discussed on +the :doc:`Howto triclinic ` page. Use *xu*, *yu*, and *zu* if you want the coordinates "unwrapped" by the -image flags for each atom. Unwrapped means that if the atom has -passed through a periodic boundary one or more times, the value is -printed for what the coordinate would be if it had not been wrapped -back into the periodic box. Note that using *xu*, *yu*, and *zu* means -that the coordinate values may be far outside the box bounds printed -with the snapshot. Using *xsu*, *ysu*, and *zsu* is similar to using -*xu*, *yu*, and *zu*, except that the unwrapped coordinates are scaled by -the box size. Atoms that have passed through a periodic boundary will -have the corresponding coordinate increased or decreased by 1.0. +image flags for each atom. Unwrapped means that if the atom has passed +through a periodic boundary one or more times, the value is printed for +what the coordinate would be if it had not been wrapped back into the +periodic box. Note that using *xu*, *yu*, and *zu* means that the +coordinate values may be far outside the box bounds printed with the +snapshot. Using *xsu*, *ysu*, and *zsu* is similar to using *xu*, *yu*, +and *zu*, except that the unwrapped coordinates are scaled by the box +size. Atoms that have passed through a periodic boundary will have the +corresponding coordinate increased or decreased by 1.0. The image flags can be printed directly using the *ix*, *iy*, and *iz* attributes. For periodic dimensions, they specify which image of the @@ -721,8 +723,8 @@ periodic boundaries during the simulation. The *mux*, *muy*, and *muz* attributes are specific to dipolar systems defined with an atom style of *dipole*\ . They give the orientation of -the atom's point dipole moment. The *mu* attribute gives the -magnitude of the atom's dipole moment. +the atom's point dipole moment. The *mu* attribute gives the magnitude +of the atom's dipole moment. The *radius* and *diameter* attributes are specific to spherical particles that have a finite size, such as those defined with an atom @@ -736,17 +738,17 @@ The *angmomx*, *angmomy*, and *angmomz* attributes are specific to finite-size aspherical particles that have an angular momentum. Only the *ellipsoid* atom style defines this quantity. -The *tqx*, *tqy*, and *tqz* attributes are for finite-size particles that -can sustain a rotational torque due to interactions with other +The *tqx*, *tqy*, and *tqz* attributes are for finite-size particles +that can sustain a rotational torque due to interactions with other particles. The *c_ID* and *c_ID[I]* attributes allow per-atom vectors or arrays calculated by a :doc:`compute ` to be output. The ID in the attribute should be replaced by the actual ID of the compute that has -been defined previously in the input script. See the -:doc:`compute ` command for details. There are computes for -calculating the per-atom energy, stress, centro-symmetry parameter, -and coordination number of individual atoms. +been defined previously in the input script. See the :doc:`compute +` command for details. There are computes for calculating the +per-atom energy, stress, centro-symmetry parameter, and coordination +number of individual atoms. Note that computes which calculate global or local quantities, as opposed to per-atom quantities, cannot be output in a dump custom @@ -754,39 +756,39 @@ command. Instead, global quantities can be output by the :doc:`thermo_style custom ` command, and local quantities can be output by the dump local command. -If *c_ID* is used as a attribute, then the per-atom vector calculated -by the compute is printed. If *c_ID[i]* is used, then :math:`i` must be in -the range from 1 to :math:`M`, which will print the :math:`i`\ th column of the -per-atom array with :math:`M` columns calculated by the compute. See the -discussion above for how :math:`i` can be specified with a wildcard asterisk to -effectively specify multiple values. +If *c_ID* is used as a attribute, then the per-atom vector calculated by +the compute is printed. If *c_ID[i]* is used, then :math:`i` must be in +the range from 1 to :math:`M`, which will print the :math:`i`\ th column +of the per-atom array with :math:`M` columns calculated by the compute. +See the discussion above for how :math:`i` can be specified with a +wildcard asterisk to effectively specify multiple values. The *f_ID* and *f_ID[I]* attributes allow vector or array per-atom -quantities calculated by a :doc:`fix ` to be output. The ID in -the attribute should be replaced by the actual ID of the fix that has -been defined previously in the input script. The :doc:`fix ave/atom +quantities calculated by a :doc:`fix ` to be output. The ID in the +attribute should be replaced by the actual ID of the fix that has been +defined previously in the input script. The :doc:`fix ave/atom ` command is one that calculates per-atom quantities. Since it can time-average per-atom quantities produced by any -:doc:`compute `, :doc:`fix `, or atom-style -:doc:`variable `, this allows those time-averaged results to -be written to a dump file. +:doc:`compute `, :doc:`fix `, or atom-style :doc:`variable +`, this allows those time-averaged results to be written to a +dump file. -If *f_ID* is used as a attribute, then the per-atom vector calculated -by the fix is printed. If *f_ID[i]* is used, then :math:`i` must be in the -range from 1 to :math:`M`, which will print the :math:`i`\ th column of the -per-atom array with :math:`M` columns calculated by the fix. See the -discussion above for how :math:`i` can be specified with a wildcard asterisk -to effectively specify multiple values. +If *f_ID* is used as a attribute, then the per-atom vector calculated by +the fix is printed. If *f_ID[i]* is used, then :math:`i` must be in the +range from 1 to :math:`M`, which will print the :math:`i`\ th column of +the per-atom array with :math:`M` columns calculated by the fix. See +the discussion above for how :math:`i` can be specified with a wildcard +asterisk to effectively specify multiple values. The *v_name* attribute allows per-atom vectors calculated by a :doc:`variable ` to be output. The name in the attribute should be replaced by the actual name of the variable that has been -defined previously in the input script. Only an atom-style variable -can be referenced, since it is the only style that generates per-atom +defined previously in the input script. Only an atom-style variable can +be referenced, since it is the only style that generates per-atom values. Variables of style *atom* can reference individual atom -attributes, per-atom attributes, thermodynamic keywords, or invoke -other computes, fixes, or variables when they are evaluated, so this -is a very general means of creating quantities to output to a dump file. +attributes, per-atom attributes, thermodynamic keywords, or invoke other +computes, fixes, or variables when they are evaluated, so this is a very +general means of creating quantities to output to a dump file. The *i_name*, *d_name*, *i2_name*, *d2_name* attributes refer to per-atom integer and floating-point vectors or arrays that have been @@ -794,10 +796,11 @@ added via the :doc:`fix property/atom ` command. When that command is used specific names are given to each attribute which are the "name" portion of these keywords. For arrays *i2_name* and *d2_name*, the column of the array must also be included following -the name in brackets (e.g., d2_xyz[i], i2_mySpin[i], where :math:`i` is in the -range from 1 to :math:`M`, where :math:`M` is the number of columns in the -custom array). See the discussion above for how :math:`i` can be specified with -a wildcard asterisk to effectively specify multiple values. +the name in brackets (e.g., d2_xyz[i], i2_mySpin[i], where :math:`i` is +in the range from 1 to :math:`M`, where :math:`M` is the number of +columns in the custom array). See the discussion above for how :math:`i` +can be specified with a wildcard asterisk to effectively specify +multiple values. See the :doc:`Modify ` page for information on how to add new compute and fix styles to LAMMPS to calculate per-atom quantities diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 257f7a87a8..c395f6ef06 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -196,8 +196,8 @@ Only atoms in the specified group are rendered in the image. The alter what atoms are included in the image. The filename suffix determines whether a JPEG, PNG, or PPM file is created with the *image* dump style. If the suffix is ".jpg" or -".jpeg," then a `JPEG format `_ file is created, if the -suffix is ".png," then a `PNG format `_ is created, else +".jpeg", then a `JPEG format `_ file is created, if the +suffix is ".png", then a `PNG format `_ is created, else a `PPM (aka NETPBM) format `_ file is created. The JPEG and PNG files are binary; PPM has a text mode header followed by binary data. JPEG images have lossy compression, PNG has lossless @@ -261,7 +261,7 @@ atoms rendered in the image. They can be any atom attribute defined for the :doc:`dump custom ` command, including *type* and *element*\ . This includes per-atom quantities calculated by a :doc:`compute `, :doc:`fix `, or :doc:`variable `, -which are prefixed by "c\_," "f\_," or "v\_," respectively. Note that the +which are prefixed by "c\_", "f\_", or "v\_", respectively. Note that the *diameter* setting can be overridden with a numeric value applied to all atoms by the optional *adiam* keyword. @@ -297,18 +297,18 @@ and sizes used by the `AtomEye `_ visualization package. If other atom attributes are used for the *color* or *diameter* settings, they are interpreted in the following way. -If "vx," for example, is used as the *color* setting, then the color +If "vx", for example, is used as the *color* setting, then the color of the atom will depend on the x-component of its velocity. The association of a per-atom value with a specific color is determined by -a "color map," which can be specified via the dump_modify command, as +a "color map", which can be specified via the dump_modify command, as described below. The basic idea is that the atom-attribute will be within a range of values, and every value within the range is mapped to a specific color. Depending on how the color map is defined, that mapping can take place via interpolation so that a value of -3.2 is -halfway between "red" and "blue," or discretely so that the value of +halfway between "red" and "blue", or discretely so that the value of -3.2 is "orange". -If "vx," for example, is used as the *diameter* setting, then the atom +If "vx", for example, is used as the *diameter* setting, then the atom will be rendered using the x-component of its velocity as the diameter. If the per-atom value <= 0.0, them the atom will not be drawn. Note that finite-size spherical particles, as defined by @@ -792,14 +792,14 @@ increasing values. Note that numeric values can be specified either as absolute numbers or as fractions (0.0 to 1.0) of the range, depending on the "a" or "f" in the style setting for the color map. -Here is how the entries are used to determine the color of an -individual atom, given the value :math:`X` of its atom attribute. -:math:`X` will fall between 2 of the entry values. The color of the atom is -linearly interpolated (in each of the RGB values) between the 2 colors -associated with those entries. For example, if :math:`X = -5.0` and the two -surrounding entries are "red" at :math:`-10.0` and "blue" at :math:`0.0`, -then the atom's color will be halfway between "red" and "blue," which happens -to be "purple." +Here is how the entries are used to determine the color of an individual +atom, given the value :math:`X` of its atom attribute. :math:`X` will +fall between 2 of the entry values. The color of the atom is linearly +interpolated (in each of the RGB values) between the 2 colors associated +with those entries. For example, if :math:`X = -5.0` and the two +surrounding entries are "red" at :math:`-10.0` and "blue" at +:math:`0.0`, then the atom's color will be halfway between "red" and +"blue", which happens to be "purple". For discrete color maps, each entry has a *lo* and *hi* value and a *color*\ . The *lo* and *hi* settings are either numbers within the @@ -807,19 +807,18 @@ range of values or *lo* can be *min* or *hi* can be *max*\ . The *lo* and *hi* settings of the last entry must be *min* and *max*\ . Other entries can have any *lo* and *hi* values and the sub-ranges of different values can overlap. Note that numeric *lo* and *hi* values -can be specified either as absolute numbers or as fractions (0.0 to -1.0) of the range, depending on the "a" or "f" in the style setting -for the color map. +can be specified either as absolute numbers or as fractions (0.0 to 1.0) +of the range, depending on the "a" or "f" in the style setting for the +color map. -Here is how the entries are used to determine the color of an -individual atom, given the value X of its atom attribute. The entries -are scanned from first to last. The first time that *lo* <= X <= -*hi*, X is assigned the color associated with that entry. You can -think of the last entry as assigning a default color (since it will -always be matched by X), and the earlier entries as colors that -override the default. Also note that no interpolation of a color RGB -is done. All atoms will be drawn with one of the colors in the list -of entries. +Here is how the entries are used to determine the color of an individual +atom, given the value X of its atom attribute. The entries are scanned +from first to last. The first time that *lo* <= X <= *hi*, X is +assigned the color associated with that entry. You can think of the +last entry as assigning a default color (since it will always be matched +by X), and the earlier entries as colors that override the default. +Also note that no interpolation of a color RGB is done. All atoms will +be drawn with one of the colors in the list of entries. For sequential color maps, each entry has only a *color*\ . Here is how the entries are used to determine the color of an individual atom, @@ -867,7 +866,7 @@ that bonds of each type will be drawn in the image. The specified *type* should be an integer from 1 to :math:`N`, where :math:`N` is the number of bond types. A wildcard asterisk can be used in place of or in conjunction with the *type* argument to specify a range of bond -types. This takes the form "\*" or "\*n" or "m\*" or "m\*n." If :math:`N` +types. This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of bond types, then an asterisk with no numerical values means all types from 1 to :math:`N`. A leading asterisk means all types from 1 to n (inclusive). A trailing asterisk means all types from m to :math:`N` diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index a782f32331..a0c9c5edea 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -122,7 +122,7 @@ The *pstyle* argument is the name of the pair style. If sub-styles using the same pair style, then *pstyle* should be specified as "style:N", where :math:`N` is which instance of the pair style you wish to adapt (e.g., the first or second). For example, *pstyle* could be -specified as "soft" or "lubricate" or "lj/cut:1" or "lj/cut:2." The +specified as "soft" or "lubricate" or "lj/cut:1" or "lj/cut:2". The *pparam* argument is the name of the parameter to change. This is the current list of pair styles and parameters that can be varied by this fix. See the doc pages for individual pair styles and their energy @@ -245,7 +245,7 @@ the coefficients for the symmetric :math:`J,I` interaction to the same values. A wild-card asterisk can be used in place of or in conjunction with the :math:`I,J` arguments to set the coefficients for multiple pairs of atom -types. This takes the form "\*" or "\*n" or "m\*" or "m\*n." If :math:`N` +types. This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of atom types, then an asterisk with no numeric values means all types from 1 to :math:`N`. A leading asterisk means all types from 1 to n (inclusive). A trailing asterisk means all types from m to :math:`N` @@ -260,17 +260,17 @@ values defined (via the :doc:`pair_coeff ` command) for that sub-style. The *v_name* argument for keyword *pair* is the name of an -:doc:`equal-style variable ` which will be evaluated each -time this fix is invoked to set the parameter to a new value. It -should be specified as v_name, where name is the variable name. -Equal-style variables can specify formulas with various mathematical -functions, and include :doc:`thermo_style ` command -keywords for the simulation box parameters and timestep and elapsed -time. Thus it is easy to specify parameters that change as a function -of time or span consecutive runs in a continuous fashion. For the -latter, see the *start* and *stop* keywords of the :doc:`run ` -command and the *elaplong* keyword of :doc:`thermo_style custom -` for details. +:doc:`equal-style variable ` which will be evaluated each time +this fix is invoked to set the parameter to a new value. It should be +specified as v_name, where name is the variable name. Equal-style +variables can specify formulas with various mathematical functions, and +include :doc:`thermo_style ` command keywords for the +simulation box parameters and timestep and elapsed time. Thus it is +easy to specify parameters that change as a function of time or span +consecutive runs in a continuous fashion. For the latter, see the +*start* and *stop* keywords of the :doc:`run ` command and the +*elaplong* keyword of :doc:`thermo_style custom ` for +details. For example, these commands would change the prefactor coefficient of the :doc:`pair_style soft ` potential from 10.0 to 30.0 in a @@ -288,13 +288,14 @@ a bond coefficient over time, very similar to how the *pair* keyword operates. The only difference is that now a bond coefficient for a given bond type is adapted. -A wild-card asterisk can be used in place of or in conjunction with -the bond type argument to set the coefficients for multiple bond -types. This takes the form "\*" or "\*n" or "m\*" or "m\*n." If :math:`N` -is the number of bond types, then an asterisk with no numeric values -means all types from 1 to :math:`N`. A leading asterisk means all types from -1 to n (inclusive). A trailing asterisk means all types from m to :math:`N` -(inclusive). A middle asterisk means all types from m to n (inclusive). +A wild-card asterisk can be used in place of or in conjunction with the +bond type argument to set the coefficients for multiple bond types. +This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is +the number of bond types, then an asterisk with no numeric values means +all types from 1 to :math:`N`. A leading asterisk means all types from +1 to n (inclusive). A trailing asterisk means all types from m to +:math:`N` (inclusive). A middle asterisk means all types from m to n +(inclusive). Currently *bond* does not support bond_style hybrid nor bond_style hybrid/overlay as bond styles. The bond styles that currently work @@ -323,13 +324,14 @@ an angle coefficient over time, very similar to how the *pair* keyword operates. The only difference is that now an angle coefficient for a given angle type is adapted. -A wild-card asterisk can be used in place of or in conjunction with -the angle type argument to set the coefficients for multiple angle -types. This takes the form "\*" or "\*n" or "m\*" or "m\*n." If :math:`N` -is the number of angle types, then an asterisk with no numeric values -means all types from 1 to :math:`N`. A leading asterisk means all types from -1 to n (inclusive). A trailing asterisk means all types from m to :math:`N` -(inclusive). A middle asterisk means all types from m to n (inclusive). +A wild-card asterisk can be used in place of or in conjunction with the +angle type argument to set the coefficients for multiple angle types. +This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is +the number of angle types, then an asterisk with no numeric values means +all types from 1 to :math:`N`. A leading asterisk means all types from +1 to n (inclusive). A trailing asterisk means all types from m to +:math:`N` (inclusive). A middle asterisk means all types from m to n +(inclusive). Currently *angle* does not support angle_style hybrid nor angle_style hybrid/overlay as angle styles. The angle styles that currently work diff --git a/doc/src/fix_adapt_fep.rst b/doc/src/fix_adapt_fep.rst index 2f8a1a9475..c35986de49 100644 --- a/doc/src/fix_adapt_fep.rst +++ b/doc/src/fix_adapt_fep.rst @@ -115,7 +115,7 @@ overrides the parameters. The *pstyle* argument is the name of the pair style. If :doc:`pair_style hybrid or hybrid/overlay ` is used, *pstyle* should be a sub-style name. For example, *pstyle* could be specified as "soft" -or "lubricate." The *pparam* argument is the name of the parameter to +or "lubricate". The *pparam* argument is the name of the parameter to change. This is the current list of pair styles and parameters that can be varied by this fix. See the doc pages for individual pair styles and their energy formulas for the meaning of these parameters: @@ -209,7 +209,7 @@ the coefficients for the symmetric J,I interaction to the same values. A wild-card asterisk can be used in place of or in conjunction with the :math:`I,J` arguments to set the coefficients for multiple pairs of atom -types. This takes the form "\*" or "\*n" or "m\*" or "m\*n." If :math:`N` is +types. This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of atom types, then an asterisk with no numeric values means all types from 1 to :math:`N`. A leading asterisk means all types from 1 to n (inclusive). A trailing asterisk means all types from m to :math:`N` diff --git a/doc/src/fix_addforce.rst b/doc/src/fix_addforce.rst index 8734593b58..4e696f709b 100644 --- a/doc/src/fix_addforce.rst +++ b/doc/src/fix_addforce.rst @@ -153,7 +153,7 @@ which can be accessed by various :doc:`output commands `. The scalar is the potential energy discussed above. The vector is the total force on the group of atoms before the forces on individual atoms are changed by the fix. The scalar and vector -values calculated by this fix are "extensive." +values calculated by this fix are "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. diff --git a/doc/src/fix_addtorque.rst b/doc/src/fix_addtorque.rst index e90e70a8d3..be2823afcf 100644 --- a/doc/src/fix_addtorque.rst +++ b/doc/src/fix_addtorque.rst @@ -75,7 +75,7 @@ accessed by various :doc:`output commands `. The scalar is the potential energy discussed above. The vector is the total torque on the group of atoms before the forces on individual atoms are changed by the fix. The scalar and vector values calculated by this -fix are "extensive." +fix are "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. diff --git a/doc/src/fix_amoeba_bitorsion.rst b/doc/src/fix_amoeba_bitorsion.rst index ebfcf7ad40..a9abaf19ce 100644 --- a/doc/src/fix_amoeba_bitorsion.rst +++ b/doc/src/fix_amoeba_bitorsion.rst @@ -124,7 +124,7 @@ setting for this fix is :doc:`fix_modify virial yes `. This fix computes a global scalar which can be accessed by various :doc:`output commands `. The scalar is the potential energy discussed above. The scalar value calculated by this fix is -"extensive." +"extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. diff --git a/doc/src/fix_amoeba_pitorsion.rst b/doc/src/fix_amoeba_pitorsion.rst index e20324fa0d..484c1015c8 100644 --- a/doc/src/fix_amoeba_pitorsion.rst +++ b/doc/src/fix_amoeba_pitorsion.rst @@ -138,7 +138,7 @@ setting for this fix is :doc:`fix_modify virial yes `. This fix computes a global scalar which can be accessed by various :doc:`output commands `. The scalar is the potential energy discussed above. The scalar value calculated by this fix is -"extensive." +"extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. diff --git a/doc/src/fix_atc.rst b/doc/src/fix_atc.rst index 0aa91dbc6f..c6bde5dcc4 100644 --- a/doc/src/fix_atc.rst +++ b/doc/src/fix_atc.rst @@ -135,7 +135,7 @@ fix are listed below. This fix computes a global scalar which can be accessed by various :doc:`output commands `. The scalar is the energy -discussed in the previous paragraph. The scalar value is "extensive." +discussed in the previous paragraph. The scalar value is "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not diff --git a/doc/src/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst index d6779925a5..0deda8a5f5 100644 --- a/doc/src/fix_atom_swap.rst +++ b/doc/src/fix_atom_swap.rst @@ -167,7 +167,7 @@ the following global cumulative quantities: * 1 = swap attempts * 2 = swap accepts -The vector values calculated by this fix are "extensive." +The vector values calculated by this fix are "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during diff --git a/doc/src/fix_ave_atom.rst b/doc/src/fix_ave_atom.rst index 711aa653e4..e2ca9bf16e 100644 --- a/doc/src/fix_ave_atom.rst +++ b/doc/src/fix_ave_atom.rst @@ -70,7 +70,7 @@ per-atom vectors. Note that for values from a compute or fix, the bracketed index I can be specified using a wildcard asterisk with the index to effectively specify multiple values. This takes the form "\*" or "\*n" or "m\*" or -"m\*n." If :math:`N` is the size of the vector (for *mode* = scalar) or the +"m\*n". If :math:`N` is the size of the vector (for *mode* = scalar) or the number of columns in the array (for *mode* = vector), then an asterisk with no numeric values means all indices from 1 to :math:`N`. A leading asterisk means all indices from 1 to n (inclusive). A trailing @@ -127,7 +127,7 @@ specifying an input value from that compute. :doc:`compute property/atom ` command via its *xu*, *yu*, and *zu* attributes. -If a value begins with "c\_," a compute ID must follow which has been +If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. If no bracketed term is appended, the per-atom vector calculated by the compute is used. If a bracketed term containing an index :math:`I` is appended, the @@ -137,7 +137,7 @@ used. Users can also write code for their own compute styles and :math:`I` can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "f\_," a fix ID must follow which has been previously +If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. If no bracketed term is appended, the per-atom vector calculated by the fix is used. If a bracketed term containing an index :math:`I` is appended, the :math:`I^\text{th}` column of the per-atom array @@ -148,7 +148,7 @@ and :doc:`add them to LAMMPS `. See the discussion above for how :math:`I` can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "v\_," a variable name must follow which has +If a value begins with "v\_", a variable name must follow which has been previously defined in the input script as an :doc:`atom-style variable `. Variables of style *atom* can reference thermodynamic keywords or invoke other computes, fixes, or variables diff --git a/doc/src/fix_ave_chunk.rst b/doc/src/fix_ave_chunk.rst index a014e587eb..354c8d8e8b 100644 --- a/doc/src/fix_ave_chunk.rst +++ b/doc/src/fix_ave_chunk.rst @@ -288,7 +288,7 @@ together as one set of atoms to calculate their temperature. The compute allows the center-of-mass velocity of each chunk to be subtracted before calculating the temperature; this fix does not. -If a value begins with "c\_," a compute ID must follow which has been +If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. If no bracketed integer is appended, the per-atom vector calculated by the compute is used. If a bracketed integer is appended, the Ith column of the per-atom array @@ -297,7 +297,7 @@ their own compute styles and :doc:`add them to LAMMPS `. See the discussion above for how I can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "f\_," a fix ID must follow which has been +If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. If no bracketed integer is appended, the per-atom vector calculated by the fix is used. If a bracketed integer is appended, the Ith column of the per-atom array @@ -308,7 +308,7 @@ their own fix styles and :doc:`add them to LAMMPS `. See the discussion above for how I can be specified with a wildcard asterisk to effectively specify multiple values. -If a value begins with "v\_," a variable name must follow which has +If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. Variables of style *atom* can reference thermodynamic keywords and various per-atom attributes, or invoke other computes, fixes, or variables when they @@ -348,7 +348,7 @@ at each sampling step. If the *norm* setting is *none*, a similar computation as for the *sample* setting is done, except the individual "average sample -values" are "summed sample values." A summed sample value is simply +values" are "summed sample values". A summed sample value is simply the chunk value summed over atoms in the sample, without dividing by the number of atoms in the sample. The output value for the chunk on the :math:`N_\text{freq}` timesteps is the average of the @@ -494,21 +494,21 @@ relevant to this fix. This fix computes a global array of values which can be accessed by various :doc:`output commands `. The values can only be -accessed on timesteps that are multiples of :math:`N_\text{freq}`, since that -is when averaging is performed. The global array has # of rows = the number -of chunks :math:`N_\text{chunk}`, as calculated by the specified -:doc:`compute chunk/atom ` command. The # of columns is -:math:`M+1+N_\text{values}`, where :math:`M \in \{1,\dotsc,4\}`, -depending on whether the optional -columns for OrigID and CoordN are used, as explained above. Following -the optional columns, the next column contains the count of atoms in -the chunk, and the remaining columns are the Nvalue quantities. When -the array is accessed with a row :math:`I` that exceeds the current number of -chunks, than a 0.0 is returned by the fix instead of an error, since -the number of chunks can vary as a simulation runs depending on how -that value is computed by the compute chunk/atom command. +accessed on timesteps that are multiples of :math:`N_\text{freq}`, since +that is when averaging is performed. The global array has # of rows = +the number of chunks :math:`N_\text{chunk}`, as calculated by the +specified :doc:`compute chunk/atom ` command. The # +of columns is :math:`M+1+N_\text{values}`, where :math:`M \in +\{1,\dotsc,4\}`, depending on whether the optional columns for OrigID +and CoordN are used, as explained above. Following the optional +columns, the next column contains the count of atoms in the chunk, and +the remaining columns are the Nvalue quantities. When the array is +accessed with a row :math:`I` that exceeds the current number of chunks, +than a 0.0 is returned by the fix instead of an error, since the number +of chunks can vary as a simulation runs depending on how that value is +computed by the compute chunk/atom command. -The array values calculated by this fix are treated as "intensive," +The array values calculated by this fix are treated as "intensive", since they are typically already normalized by the count of atoms in each chunk. diff --git a/doc/src/fix_ave_correlate.rst b/doc/src/fix_ave_correlate.rst index 82046990e0..1aff749048 100644 --- a/doc/src/fix_ave_correlate.rst +++ b/doc/src/fix_ave_correlate.rst @@ -189,7 +189,7 @@ Also, if the *ave* keyword is set to *one* which is the default, then ---------- -If a value begins with "c\_," a compute ID must follow which has been +If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. If no bracketed term is appended, the global scalar calculated by the compute is used. If a bracketed term is appended, the :math:`I^\text{th}` element of the global @@ -206,7 +206,7 @@ or :doc:`fix temp/rescale `. See the doc pages for these commands which give the IDs of these computes. Users can also write code for their own compute styles and :doc:`add them to LAMMPS `. -If a value begins with "f\_," a fix ID must follow which has been +If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. If no bracketed term is appended, the global scalar calculated by the fix is used. If a bracketed term is appended, the :math:`I^\text{th}` element of the global @@ -219,7 +219,7 @@ which must be compatible with :math:`N_\text{every}`, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. -If a value begins with "v\_," a variable name must follow which has been +If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. Only equal-style or vector-style variables can be referenced; the latter requires a bracketed term to specify the :math:`I^\text{th}` element of the vector calculated by the variable. diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 56671c30f5..e915526aa7 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -193,7 +193,7 @@ inputs to this fix by using the :doc:`compute property/atom ` command and then specifying an input value from that compute. -If a value begins with "c\_," a compute ID must follow which has been +If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. If *mode* = scalar, then if no bracketed term is appended, the global scalar calculated by the compute is used. If a bracketed term is appended, the Ith element of @@ -215,7 +215,7 @@ these commands which give the IDs of these computes. Users can also write code for their own compute styles and :doc:`add them to LAMMPS `. -If a value begins with "f\_," a fix ID must follow which has been +If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. If *mode* = scalar, then if no bracketed term is appended, the global scalar calculated by the fix is used. If a bracketed term is appended, the Ith element of the @@ -232,7 +232,7 @@ which must be compatible with :math:`N_\text{every}`, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. -If a value begins with "v\_," a variable name must follow which has +If a value begins with "v\_", a variable name must follow which has been previously defined in the input script. If *mode* = scalar, then only equal-style or vector-style variables can be used, which both produce global values. In this mode, a vector-style variable requires diff --git a/doc/src/fix_ave_time.rst b/doc/src/fix_ave_time.rst index 782f0850cc..0308ecc92a 100644 --- a/doc/src/fix_ave_time.rst +++ b/doc/src/fix_ave_time.rst @@ -358,11 +358,11 @@ of rows = length of the input vectors and # of columns = number of inputs. If the fix produces a scalar or vector, then the scalar and each -element of the vector can be either "intensive" or "extensive," +element of the vector can be either "intensive" or "extensive", depending on whether the values contributing to the scalar or vector -element are "intensive" or "extensive." If the fix produces an array, +element are "intensive" or "extensive". If the fix produces an array, then all elements in the array must be the same, either "intensive" or -"extensive." If a compute or fix provides the value being time +"extensive". If a compute or fix provides the value being time averaged, then the compute or fix determines whether the value is intensive or extensive; see the page for that compute or fix for further info. Values produced by a variable are treated as intensive. diff --git a/doc/src/fix_balance.rst b/doc/src/fix_balance.rst index 7afb077881..bf4f77ecd9 100644 --- a/doc/src/fix_balance.rst +++ b/doc/src/fix_balance.rst @@ -361,7 +361,7 @@ The "SQUARES" section lists the node IDs of the four vertices in a rectangle for each processor (1 to 4). For a 3d problem, the syntax is similar but with eight vertices listed for -each processor instead of four, and "SQUARES" replaced by "CUBES." +each processor instead of four, and "SQUARES" replaced by "CUBES". ---------- @@ -387,7 +387,7 @@ number of particles (or total weight) per processor. These quantities can be accessed by various :doc:`output commands `. The scalar and vector values calculated -by this fix are "intensive." +by this fix are "intensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during diff --git a/doc/src/group.rst b/doc/src/group.rst index 5cdbfb5c13..4f2a18c8a6 100644 --- a/doc/src/group.rst +++ b/doc/src/group.rst @@ -318,7 +318,7 @@ Restrictions """""""""""" There can be no more than 32 groups defined at one time, including -"all." +"all". The parent group of a dynamic group cannot itself be a dynamic group. diff --git a/doc/src/kim_commands.rst b/doc/src/kim_commands.rst index a002b539bd..d886fa7dab 100644 --- a/doc/src/kim_commands.rst +++ b/doc/src/kim_commands.rst @@ -981,7 +981,7 @@ In the last example, "new-property.edn" and "/home/mary/marys-kim-properties/dissociation-energy.edn" are the names of files that contain user-defined (local) property definitions. -A KIM property instance takes the form of a "map," i.e. a set of key-value +A KIM property instance takes the form of a "map", i.e. a set of key-value pairs akin to Perl's hash, Python's dictionary, or Java's Hashtable. It consists of a set of property key names, each of which is referred to here by the *key_name* argument, that are defined as part of the relevant KIM Property diff --git a/doc/src/pair_zbl.rst b/doc/src/pair_zbl.rst index bbf9f6bc29..6c698b23d2 100644 --- a/doc/src/pair_zbl.rst +++ b/doc/src/pair_zbl.rst @@ -140,4 +140,4 @@ none .. _Ziegler: **(Ziegler)** J.F. Ziegler, J. P. Biersack and U. Littmark, "The -Stopping and Range of Ions in Matter," Volume 1, Pergamon, 1985. +Stopping and Range of Ions in Matter", Volume 1, Pergamon, 1985. From 446cc46bbd86f569c75cf0ed62177ef96c761deb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Sep 2022 19:10:18 -0400 Subject: [PATCH 111/364] spelling --- doc/src/labelmap.rst | 10 +++++----- doc/src/read_data.rst | 2 +- doc/src/restart.rst | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/labelmap.rst b/doc/src/labelmap.rst index a709bb1104..98bc4cfbd3 100644 --- a/doc/src/labelmap.rst +++ b/doc/src/labelmap.rst @@ -69,13 +69,13 @@ there is a label defined for *every* numeric type within a given type-kind in order to write out the type label section for that type-kind. -The *clear* option resets the labelmap and thus discards all previous +The *clear* option resets the label map and thus discards all previous settings. The *write* option takes a filename as argument and writes the current -label mappings to a file as labelmap commands, so the file can be copied -into a new LAMMPS input file or read in using the :doc:`include -` command. +label mappings to a file as a sequence of *labelmap* commands, so the +file can be copied into a new LAMMPS input file or read in using the +:doc:`include ` command. ---------- @@ -86,7 +86,7 @@ This command must come after the simulation box is defined by a :doc:`read_data `, :doc:`read_restart `, or :doc:`create_box ` command. -Labelmaps are currently not supported when using the KOKKOS package. +Label maps are currently not supported when using the KOKKOS package. Related commands """""""""""""""" diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index f39e27df90..858029caae 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -1519,7 +1519,7 @@ To read gzipped data files, you must compile LAMMPS with the -DLAMMPS_GZIP option. See the :doc:`Build settings ` doc page for details. -Labelmaps are currently not supported when using the KOKKOS package. +Label maps are currently not supported when using the KOKKOS package. Related commands """""""""""""""" diff --git a/doc/src/restart.rst b/doc/src/restart.rst index 91b920f377..5de2d3d75c 100644 --- a/doc/src/restart.rst +++ b/doc/src/restart.rst @@ -12,7 +12,7 @@ Syntax restart N root keyword value ... restart N file1 file2 keyword value ... -* N = write a restart file on timesteps which are multipls of N +* N = write a restart file on timesteps which are multiples of N * N can be a variable (see below) * root = filename to which timestep # is appended * file1,file2 = two full filenames, toggle between them when writing file From 526cc1566eac8b531e3b3f696804531a44977ccb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 06:13:37 -0400 Subject: [PATCH 112/364] cosmetic --- src/MC/fix_bond_swap.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index ea31270b92..a1f1c2b307 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -114,10 +114,10 @@ FixBondSwap::~FixBondSwap() // delete temperature if fix created it if (tflag) modify->delete_compute(id_temp); - delete [] id_temp; + delete[] id_temp; memory->destroy(alist); - delete [] permute; + delete[] permute; } /* ---------------------------------------------------------------------- */ @@ -244,14 +244,14 @@ void FixBondSwap::post_integrate() memory->create(alist,nmax,"bondswap:alist"); } - // use randomized permulation of both I and J atoms in double loop below + // use randomized permutation of both I and J atoms in double loop below // this is to avoid any bias in accepted MC swaps based on // ordering LAMMPS creates on a processor for atoms or their neighbors // create a random permutation of list of Neligible atoms // uses one-pass Fisher-Yates shuffle on an initial identity permutation // output: randomized alist[] vector, used in outer loop to select an I atom - // similar randomized permulation is created for neighbors of each I atom + // similar randomized permutation is created for neighbors of each I atom int neligible = 0; for (ii = 0; ii < inum; ii++) { @@ -693,7 +693,7 @@ int FixBondSwap::modify_param(int narg, char **arg) modify->delete_compute(id_temp); tflag = 0; } - delete [] id_temp; + delete[] id_temp; id_temp = utils::strdup(arg[1]); int icompute = modify->find_compute(id_temp); @@ -767,7 +767,7 @@ void FixBondSwap::neighbor_permutation(int n) int i,j,tmp; if (n > maxpermute) { - delete [] permute; + delete[] permute; maxpermute = n + DELTA_PERMUTE; permute = new int[maxpermute]; } From 7dd95db47454c9ecb1f89eeaa35e62dd5d33efe5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 06:22:41 -0400 Subject: [PATCH 113/364] fix typo --- doc/src/fix_latte.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index df23027238..f069c3bddc 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -64,7 +64,7 @@ The *coulomb* argument is not yet supported by fix latte (as of Sept Coulomb potential as an alternative to LATTE performing the calculation. -The *exclude argument allows this fix to work in tandem with another +The *exclude* argument allows this fix to work in tandem with another fix which may decide to delete one or more atoms of molecules. The specified fixID is the ID of the other fix. From 197ce9187e5364e24edc28872e6556a46697f39f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 06:31:49 -0400 Subject: [PATCH 114/364] small programming style updates --- src/LATTE/fix_latte.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/LATTE/fix_latte.cpp b/src/LATTE/fix_latte.cpp index 8da1db5261..f97162cd40 100644 --- a/src/LATTE/fix_latte.cpp +++ b/src/LATTE/fix_latte.cpp @@ -55,6 +55,8 @@ extern "C" { FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { + if (narg < 3) utils::missing_cmd_args(FLERR, "fix latte", error); + if (strcmp(update->unit_style,"metal") != 0) error->all(FLERR,"Must use units metal with fix latte command"); @@ -84,19 +86,19 @@ FixLatte::FixLatte(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix latte coulomb", error); coulomb = 1; - error->all(FLERR,"Fix latte does not yet support a " - "LAMMPS calculation of a Coulomb potential"); + error->all(FLERR,"Fix latte does not yet support LAMMPS calculation of a Coulomb potential"); + delete[] id_pe; id_pe = utils::strdup(arg[iarg+1]); c_pe = modify->get_compute_by_id(id_pe); if (!c_pe) error->all(FLERR,"Could not find fix latte compute ID {}", id_pe); - if (c_pe->peatomflag == 0) - error->all(FLERR,"Fix latte compute ID does not compute pe/atom"); + if (c_pe->peatomflag == 0) error->all(FLERR,"Fix latte compute ID does not compute pe/atom"); iarg += 2; } else if (strcmp(arg[iarg],"exclude") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix latte exclude", error); exclude = 1; + delete[] id_exclude; id_exclude = utils::strdup(arg[iarg+1]); iarg += 2; @@ -147,8 +149,7 @@ void FixLatte::init() if (atom->q_flag == 0 || force->pair == nullptr || force->kspace == nullptr) error->all(FLERR,"Fix latte cannot compute Coulomb potential"); c_pe = modify->get_compute_by_id(id_pe); - if (!c_pe) - error->all(FLERR,"Fix latte could not find Coulomb compute ID {}",id_pe); + if (!c_pe) error->all(FLERR,"Fix latte could not find Coulomb compute ID {}",id_pe); } // must be fully periodic or fully non-periodic @@ -171,13 +172,11 @@ void FixLatte::init() if (exclude) { Fix *f_exclude = modify->get_fix_by_id(id_exclude); - if (!f_exclude) - error->all(FLERR,"Fix latte could not find exclude fix ID {}", id_exclude); - int exclude_group_index,dim; - exclusion_group_ptr = (int *) f_exclude->extract("exclusion_group",dim); + if (!f_exclude) error->all(FLERR,"Fix latte could not find exclude fix ID {}", id_exclude); + int dim; + exclusion_group_ptr = (int *) f_exclude->extract("exclusion_group", dim); if (!exclusion_group_ptr || dim != 0) - error->all(FLERR,"Fix latte could not query exclude_group of fix ID {}", - id_exclude); + error->all(FLERR,"Fix latte could not query exclude_group of fix ID {}", id_exclude); } } From b34d45644ee1a53eed7061ee2808398c9d625108 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 13 Sep 2022 09:17:50 -0600 Subject: [PATCH 115/364] update fix latte doc page --- doc/src/fix_latte.rst | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index df23027238..22f8614d53 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -57,6 +57,23 @@ found in examples/latte. A step-by-step tutorial can be followed at: `LAMMPS-LATTE tutorial `_ +Currently, LAMMPS must be run in serial or as a single MPI task, to +use this fix. This is because the version of the LATTE library LAMMPS +uses does not support MPI. On the LAMMPS size, this is typically not +a bottleneck, since LATTE will be doing 99% or more of the work to +compute quantum-accurate forces. On the LATTE side, the LATTE library +does support threaded parallelism via OpenMP. You must build the +LATTE library with OpenMP support, then set the OMP_NUM_THREADS +environment variable before performing a LAMMPS + LATTE simulation to +tell LATTE how many threads to invoke. + +.. note:: + + NEB calculations can be done using this fix using multiple + replicas and running LAMMPS in parallel. However, each replica must + be run on a single MPI task. For details, see the :doc:`neb ` + command page and the :doc:`-partition command-line switch ` + ---------- The *coulomb* argument is not yet supported by fix latte (as of Sept @@ -176,18 +193,8 @@ use this fix. LATTE does not currently compute per-atom energy or per-atom virial contributions. So they will not show up as part of the calculations -performed by the :doc:`compute pe/atom ` or :doc:`compute stress/atom ` commands. - -Currently, LAMMPS must be run in serial or as a single MPI task, to -use this fix. This is typically not a bottleneck, since LATTE will be -doing 99% or more of the work to compute quantum-accurate forces. - -.. note:: - - NEB calculations can be done using this fix using multiple - replicas and running LAMMPS in parallel. However, each replica must - be run on a single MPI task. For details, see the :doc:`neb ` - command page and the :doc:`-partition command-line switch ` +performed by the :doc:`compute pe/atom ` or +:doc:`compute stress/atom ` commands. Related commands """""""""""""""" From 56304fe939c3639988d462da609e8db317c0454e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 11:24:20 -0400 Subject: [PATCH 116/364] move check for Fortran Compiler validity --- unittest/fortran/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index c7174d8e6e..7aa2177918 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -6,14 +6,14 @@ endif() include(CheckLanguage) check_language(Fortran) -if(NOT CMAKE_Fortran_COMPILER_ID) - message(STATUS "Skipping Tests for the LAMMPS Fortran Module: cannot identify Fortran compiler") - return() -endif() if(CMAKE_Fortran_COMPILER) enable_language(C) enable_language(Fortran) + if(NOT CMAKE_Fortran_COMPILER_ID) + message(STATUS "Skipping Tests for the LAMMPS Fortran Module: cannot identify Fortran compiler") + return() + endif() get_filename_component(LAMMPS_FORTRAN_MODULE ${LAMMPS_SOURCE_DIR}/../fortran/lammps.f90 ABSOLUTE) if(BUILD_MPI) find_package(MPI REQUIRED) From f3fa24617946e1615f9fb89bc342a0cce346122c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 11:39:16 -0400 Subject: [PATCH 117/364] update LATTE package examples --- ...hene.boxrel => in.latte.graphene.boxrelax} | 20 +- examples/latte/in.latte.multiple | 8 +- examples/latte/in.latte.sucrose | 40 -- examples/latte/in.latte.sucrose.md | 24 +- examples/latte/in.latte.water | 40 -- examples/latte/in.latte.water.md | 24 +- examples/latte/in.latte.water.min | 22 +- .../log.13Sep22.latte.graphene.boxrelax.g++.1 | 179 ++++++++ .../latte/log.13Sep22.latte.multiple.g++.1 | 189 ++++++++ .../latte/log.13Sep22.latte.sucrose.md.g++.1 | 112 +++++ .../latte/log.13Sep22.latte.water.md.g++.1 | 112 +++++ .../latte/log.13Sep22.latte.water.min.g++.1 | 122 ++++++ .../latte/log.19Sep17.latte.sucrose.md.g++.1 | 406 ------------------ .../latte/log.19Sep17.latte.water.md.g++.1 | 406 ------------------ .../log.21Jun18.latte.graphene.boxrelax.g++.1 | 170 -------- .../latte/log.21Jun18.latte.sucrose.g++.1 | 103 ----- examples/latte/log.21Jun18.latte.water.g++.1 | 103 ----- .../latte/log.21Jun18.latte.water.min.g++.1 | 108 ----- 18 files changed, 763 insertions(+), 1425 deletions(-) rename examples/latte/{in.graphene.boxrel => in.latte.graphene.boxrelax} (68%) delete mode 100644 examples/latte/in.latte.sucrose delete mode 100644 examples/latte/in.latte.water create mode 100644 examples/latte/log.13Sep22.latte.graphene.boxrelax.g++.1 create mode 100644 examples/latte/log.13Sep22.latte.multiple.g++.1 create mode 100644 examples/latte/log.13Sep22.latte.sucrose.md.g++.1 create mode 100644 examples/latte/log.13Sep22.latte.water.md.g++.1 create mode 100644 examples/latte/log.13Sep22.latte.water.min.g++.1 delete mode 100644 examples/latte/log.19Sep17.latte.sucrose.md.g++.1 delete mode 100644 examples/latte/log.19Sep17.latte.water.md.g++.1 delete mode 100644 examples/latte/log.21Jun18.latte.graphene.boxrelax.g++.1 delete mode 100644 examples/latte/log.21Jun18.latte.sucrose.g++.1 delete mode 100644 examples/latte/log.21Jun18.latte.water.g++.1 delete mode 100644 examples/latte/log.21Jun18.latte.water.min.g++.1 diff --git a/examples/latte/in.graphene.boxrel b/examples/latte/in.latte.graphene.boxrelax similarity index 68% rename from examples/latte/in.graphene.boxrel rename to examples/latte/in.latte.graphene.boxrelax index 721b7f014f..bd61c358e6 100644 --- a/examples/latte/in.graphene.boxrel +++ b/examples/latte/in.latte.graphene.boxrelax @@ -1,35 +1,35 @@ # Simple water model with LATTE -units metal -atom_style full +units metal +atom_style full atom_modify sort 0 0.0 # turn off sorting of the coordinates read_data data.graphene # replicate system if requested -variable x index 1 -variable y index 1 -variable z index 1 +variable x index 1 +variable y index 1 +variable z index 1 variable nrep equal v_x*v_y*v_z if "${nrep} > 1" then "replicate $x $y $z" # initialize system -velocity all create 0.0 87287 loop geom +velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes timestep 0.00025 fix 1 all box/relax iso 0.0 vmax 0.001 -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom etotal diff --git a/examples/latte/in.latte.multiple b/examples/latte/in.latte.multiple index 4888d14ebc..1c5dc3d2d3 100644 --- a/examples/latte/in.latte.multiple +++ b/examples/latte/in.latte.multiple @@ -9,7 +9,7 @@ read_data data.water velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * neighbor 1.0 bin neigh_modify every 1 delay 0 check yes @@ -17,7 +17,7 @@ neigh_modify every 1 delay 0 check yes timestep 0.00025 fix 1 all nve -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom step temp pe etotal press @@ -44,7 +44,7 @@ read_data data.ch4 velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * neighbor 1.0 bin neigh_modify every 1 delay 0 check yes @@ -53,7 +53,7 @@ timestep 0.00025 fix 1 all nve -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom step temp pe etotal press diff --git a/examples/latte/in.latte.sucrose b/examples/latte/in.latte.sucrose deleted file mode 100644 index a10dae5c5e..0000000000 --- a/examples/latte/in.latte.sucrose +++ /dev/null @@ -1,40 +0,0 @@ -# simple sucrose model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.sucrose - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all nve - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom step temp pe etotal press - -# dynamics - -thermo 10 -run 100 diff --git a/examples/latte/in.latte.sucrose.md b/examples/latte/in.latte.sucrose.md index a10dae5c5e..53eaf80dd7 100644 --- a/examples/latte/in.latte.sucrose.md +++ b/examples/latte/in.latte.sucrose.md @@ -1,35 +1,35 @@ # simple sucrose model with LATTE -units metal -atom_style full +units metal +atom_style full atom_modify sort 0 0.0 # turn off sorting of the coordinates read_data data.sucrose # replicate system if requested -variable x index 1 -variable y index 1 -variable z index 1 +variable x index 1 +variable y index 1 +variable z index 1 variable nrep equal v_x*v_y*v_z if "${nrep} > 1" then "replicate $x $y $z" # initialize system -velocity all create 0.0 87287 loop geom +velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes timestep 0.00025 -fix 1 all nve +fix 1 all nve -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom step temp pe etotal press @@ -37,4 +37,4 @@ thermo_style custom step temp pe etotal press # dynamics thermo 10 -run 100 +run 100 diff --git a/examples/latte/in.latte.water b/examples/latte/in.latte.water deleted file mode 100644 index e1185602b4..0000000000 --- a/examples/latte/in.latte.water +++ /dev/null @@ -1,40 +0,0 @@ -# simple water model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.water - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all nve - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom step temp pe etotal press - -# dynamics - -thermo 10 -run 100 diff --git a/examples/latte/in.latte.water.md b/examples/latte/in.latte.water.md index e1185602b4..7940b7f992 100644 --- a/examples/latte/in.latte.water.md +++ b/examples/latte/in.latte.water.md @@ -1,35 +1,35 @@ # simple water model with LATTE -units metal -atom_style full +units metal +atom_style full atom_modify sort 0 0.0 # turn off sorting of the coordinates read_data data.water # replicate system if requested -variable x index 1 -variable y index 1 -variable z index 1 +variable x index 1 +variable y index 1 +variable z index 1 variable nrep equal v_x*v_y*v_z if "${nrep} > 1" then "replicate $x $y $z" # initialize system -velocity all create 0.0 87287 loop geom +velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes timestep 0.00025 -fix 1 all nve +fix 1 all nve -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom step temp pe etotal press @@ -37,4 +37,4 @@ thermo_style custom step temp pe etotal press # dynamics thermo 10 -run 100 +run 100 diff --git a/examples/latte/in.latte.water.min b/examples/latte/in.latte.water.min index 173afee96a..81474a0773 100644 --- a/examples/latte/in.latte.water.min +++ b/examples/latte/in.latte.water.min @@ -1,35 +1,35 @@ # simple water model with LATTE -units metal -atom_style full +units metal +atom_style full atom_modify sort 0 0.0 # turn off sorting of the coordinates read_data data.water # replicate system if requested -variable x index 1 -variable y index 1 -variable z index 1 +variable x index 1 +variable y index 1 +variable z index 1 variable nrep equal v_x*v_y*v_z if "${nrep} > 1" then "replicate $x $y $z" # initialize system -velocity all create 0.0 87287 loop geom +velocity all create 0.0 87287 loop geom pair_style zero 1.0 -pair_coeff * * +pair_coeff * * -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes timestep 0.00025 -fix 1 all nve +fix 1 all nve -fix 2 all latte NULL +fix 2 all latte fix_modify 2 energy yes thermo_style custom step temp pe etotal press diff --git a/examples/latte/log.13Sep22.latte.graphene.boxrelax.g++.1 b/examples/latte/log.13Sep22.latte.graphene.boxrelax.g++.1 new file mode 100644 index 0000000000..2350e8ad39 --- /dev/null +++ b/examples/latte/log.13Sep22.latte.graphene.boxrelax.g++.1 @@ -0,0 +1,179 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# Simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.graphene +Reading data file ... + triclinic box = (0 0 0) to (10 8 20) with tilt (4.8985872e-16 1.2246468e-15 1.2246468e-15) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 32 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.001 seconds + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all box/relax iso 0.0 vmax 0.001 + +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom etotal + +# minimization + +thermo 1 +fix 3 all print 1 "Total Energy =" +min_style cg +min_modify dmax 0.1 +min_modify line quadratic +minimize 1.0e-4 1.0e-4 10000 10000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 11 9 20 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.03 | 7.03 | 7.03 Mbytes + TotEng +-247.46002 +-247.67224 +-247.87937 +-248.08148 +-248.27865 +-248.47096 +-248.65851 +-248.84137 +-249.01964 +-249.19342 +-249.36281 +-249.52791 +-249.68883 +-249.8457 +-249.99865 +-250.1478 +-250.29332 +-250.43535 +-250.57409 +-250.70972 +-250.84247 +-250.97258 +-251.10035 +-251.2261 +-251.35021 +-251.47314 +-251.59543 +-251.71776 +-251.84096 +-251.9661 +-252.09459 +-252.22833 +-252.37003 +-252.52371 +-252.69578 +-252.89752 +-253.15197 +-253.52044 +-254.31418 +-255.6175 +-256.8162 +-258.1227 +-259.38401 +-260.74831 +-262.03991 +-263.5463 +-264.70486 +-267.69143 +-267.88682 +-269.0352 +-270.602 +-270.65395 +-270.7429 +-271.55831 +-271.81159 +-271.87447 +-273.03096 +-273.23109 +-273.27869 +-273.34621 +-273.4082 +-273.45599 +-273.53849 +-273.57478 +-273.71381 +-273.74092 +Loop time of 20.5496 on 1 procs for 65 steps with 32 atoms + +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +Minimization stats: + Stopping criterion = energy tolerance + Energy initial, next-to-last, final = + -247.460020562055 -273.713813242259 -273.740918498854 + Force two-norm initial, final = 201.60784 9.4927634 + Force max component initial, final = 188.92406 2.4327308 + Final line search alpha, max atom move = 0.00022885545 0.0005567437 + Iterations, force evaluations = 65 65 + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.7869e-05 | 7.7869e-05 | 7.7869e-05 | 0.0 | 0.00 +Bond | 3.531e-06 | 3.531e-06 | 3.531e-06 | 0.0 | 0.00 +Neigh | 1.3988e-05 | 1.3988e-05 | 1.3988e-05 | 0.0 | 0.00 +Comm | 0.00014355 | 0.00014355 | 0.00014355 | 0.0 | 0.00 +Output | 0.00071475 | 0.00071475 | 0.00071475 | 0.0 | 0.00 +Modify | 20.547 | 20.547 | 20.547 | 0.0 | 99.99 +Other | | 0.001683 | | | 0.01 + +Nlocal: 32 ave 32 max 32 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 48 ave 48 max 48 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 48 +Ave neighs/atom = 1.5 +Ave special neighs/atom = 0 +Neighbor list builds = 1 +Dangerous builds = 0 +Total wall time: 0:00:20 diff --git a/examples/latte/log.13Sep22.latte.multiple.g++.1 b/examples/latte/log.13Sep22.latte.multiple.g++.1 new file mode 100644 index 0000000000..ca32c96e15 --- /dev/null +++ b/examples/latte/log.13Sep22.latte.multiple.g++.1 @@ -0,0 +1,189 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (6.267 6.267 6.267) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 24 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.001 seconds + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 10 +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.88 | 5.88 | 5.88 Mbytes + Step Temp PotEng TotEng Press + 0 0 -104.95596 -104.95596 48235.442 + 10 336.53107 -105.96027 -104.95977 97996.851 +Loop time of 0.334108 on 1 procs for 10 steps with 24 atoms + +Performance: 0.646 ns/day, 37.123 hours/ns, 29.930 timesteps/s +99.2% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.714e-06 | 3.714e-06 | 3.714e-06 | 0.0 | 0.00 +Bond | 5.02e-07 | 5.02e-07 | 5.02e-07 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 1.1209e-05 | 1.1209e-05 | 1.1209e-05 | 0.0 | 0.00 +Output | 2.3638e-05 | 2.3638e-05 | 2.3638e-05 | 0.0 | 0.01 +Modify | 0.33404 | 0.33404 | 0.33404 | 0.0 | 99.98 +Other | | 2.795e-05 | | | 0.01 + +Nlocal: 24 ave 24 max 24 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 71 ave 71 max 71 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 37 ave 37 max 37 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 37 +Ave neighs/atom = 1.5416667 +Ave special neighs/atom = 0 +Neighbor list builds = 0 +Dangerous builds = 0 + +# Clear up previus calculation + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task + +# simple CH4 molecule with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.ch4 +Reading data file ... + triclinic box = (0 0 0) to (19.523 12.758 11.692) with tilt (0 0 0) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 5 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 10 +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 20 13 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton/tri + stencil: half/bin/3d/tri + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.902 | 5.902 | 5.902 Mbytes + Step Temp PotEng TotEng Press + 0 0 -23.980353 -23.980353 348.02716 + 10 19.123149 -23.990297 -23.98041 18.774332 +Loop time of 0.0121573 on 1 procs for 10 steps with 5 atoms + +Performance: 17.767 ns/day, 1.351 hours/ns, 822.549 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.224e-06 | 1.224e-06 | 1.224e-06 | 0.0 | 0.01 +Bond | 2.93e-07 | 2.93e-07 | 2.93e-07 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 3.845e-06 | 3.845e-06 | 3.845e-06 | 0.0 | 0.03 +Output | 8.633e-06 | 8.633e-06 | 8.633e-06 | 0.0 | 0.07 +Modify | 0.012132 | 0.012132 | 0.012132 | 0.0 | 99.80 +Other | | 1.089e-05 | | | 0.09 + +Nlocal: 5 ave 5 max 5 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7 ave 7 max 7 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 10 ave 10 max 10 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 10 +Ave neighs/atom = 2 +Ave special neighs/atom = 0 +Neighbor list builds = 0 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/latte/log.13Sep22.latte.sucrose.md.g++.1 b/examples/latte/log.13Sep22.latte.sucrose.md.g++.1 new file mode 100644 index 0000000000..9d3a98b66b --- /dev/null +++ b/examples/latte/log.13Sep22.latte.sucrose.md.g++.1 @@ -0,0 +1,112 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# simple sucrose model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.sucrose +Reading data file ... + orthogonal box = (0 0 0) to (17.203 18.009 21.643) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 45 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.001 seconds + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 100 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 18 19 22 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.93 | 5.93 | 5.93 Mbytes + Step Temp PotEng TotEng Press + 0 0 -251.26617 -251.26617 16.617233 + 10 0.025263738 -251.26631 -251.26617 8.0576369 + 20 0.034232485 -251.26636 -251.26617 1.6672772 + 30 0.059079585 -251.2665 -251.26617 11.058355 + 40 0.055499785 -251.26648 -251.26617 14.837599 + 50 0.058499496 -251.2665 -251.26617 6.7180488 + 60 0.071094531 -251.26657 -251.26617 6.6131215 + 70 0.084309398 -251.26665 -251.26617 12.372502 + 80 0.1089929 -251.26679 -251.26617 8.8352747 + 90 0.11378255 -251.26681 -251.26617 5.1175071 + 100 0.13003967 -251.26691 -251.26617 8.2429118 +Loop time of 14.4456 on 1 procs for 100 steps with 45 atoms + +Performance: 0.150 ns/day, 160.507 hours/ns, 6.923 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 | 7.5758e-05 | 7.5758e-05 | 7.5758e-05 | 0.0 | 0.00 +Bond | 6.748e-06 | 6.748e-06 | 6.748e-06 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 9.0137e-05 | 9.0137e-05 | 9.0137e-05 | 0.0 | 0.00 +Output | 0.00025976 | 0.00025976 | 0.00025976 | 0.0 | 0.00 +Modify | 14.445 | 14.445 | 14.445 | 0.0 | 99.99 +Other | | 0.0005283 | | | 0.00 + +Nlocal: 45 ave 45 max 45 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 59 ave 59 max 59 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 59 +Ave neighs/atom = 1.3111111 +Ave special neighs/atom = 0 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:14 diff --git a/examples/latte/log.13Sep22.latte.water.md.g++.1 b/examples/latte/log.13Sep22.latte.water.md.g++.1 new file mode 100644 index 0000000000..04cc99135c --- /dev/null +++ b/examples/latte/log.13Sep22.latte.water.md.g++.1 @@ -0,0 +1,112 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (6.267 6.267 6.267) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 24 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.001 seconds + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# dynamics + +thermo 10 +run 100 +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 5.88 | 5.88 | 5.88 Mbytes + Step Temp PotEng TotEng Press + 0 0 -104.95596 -104.95596 48235.442 + 10 336.53107 -105.96027 -104.95977 97996.851 + 20 529.06408 -106.53023 -104.95733 131519.85 + 30 753.62603 -107.19952 -104.959 49296.66 + 40 716.65648 -107.08803 -104.95742 28307.121 + 50 824.04392 -107.40823 -104.95836 102167.59 + 60 933.56146 -107.73479 -104.95933 92508.517 + 70 851.18489 -107.48767 -104.95711 13993.262 + 80 999.8028 -107.93147 -104.95907 36700.736 + 90 998.77488 -107.9257 -104.95636 107233.54 + 100 1281.4438 -108.76963 -104.95992 49702.386 +Loop time of 3.14578 on 1 procs for 100 steps with 24 atoms + +Performance: 0.687 ns/day, 34.953 hours/ns, 31.789 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 | 3.0818e-05 | 3.0818e-05 | 3.0818e-05 | 0.0 | 0.00 +Bond | 4.704e-06 | 4.704e-06 | 4.704e-06 | 0.0 | 0.00 +Neigh | 1.8668e-05 | 1.8668e-05 | 1.8668e-05 | 0.0 | 0.00 +Comm | 0.00010831 | 0.00010831 | 0.00010831 | 0.0 | 0.00 +Output | 0.00021087 | 0.00021087 | 0.00021087 | 0.0 | 0.01 +Modify | 3.1452 | 3.1452 | 3.1452 | 0.0 | 99.98 +Other | | 0.0002339 | | | 0.01 + +Nlocal: 24 ave 24 max 24 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 77 ave 77 max 77 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 31 ave 31 max 31 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 31 +Ave neighs/atom = 1.2916667 +Ave special neighs/atom = 0 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/latte/log.13Sep22.latte.water.min.g++.1 b/examples/latte/log.13Sep22.latte.water.min.g++.1 new file mode 100644 index 0000000000..1b1cc59e10 --- /dev/null +++ b/examples/latte/log.13Sep22.latte.water.min.g++.1 @@ -0,0 +1,122 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# simple water model with LATTE + +units metal +atom_style full +atom_modify sort 0 0.0 # turn off sorting of the coordinates + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (6.267 6.267 6.267) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 24 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.001 seconds + +# replicate system if requested + +variable x index 1 +variable y index 1 +variable z index 1 + +variable nrep equal v_x*v_y*v_z +if "${nrep} > 1" then "replicate $x $y $z" + +# initialize system + +velocity all create 0.0 87287 loop geom + +pair_style zero 1.0 +pair_coeff * * + +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.00025 + +fix 1 all nve + +fix 2 all latte +fix_modify 2 energy yes + +thermo_style custom step temp pe etotal press + +# minimization + +thermo 10 + +min_style fire +minimize 1.0e-4 1.0e-4 500 500 +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2 + ghost atom cutoff = 2 + binsize = 1, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + Parameters for fire: + dmax delaystep dtgrow dtshrink alpha0 alphashrink tmax tmin integrator halfstepback + 0.1 20 1.1 0.5 0.25 0.99 10 0.02 eulerimplicit yes +Per MPI rank memory allocation (min/avg/max) = 5.88 | 5.88 | 5.88 Mbytes + Step Temp PotEng TotEng Press + 0 0 -104.95596 -104.95596 48235.442 + 10 853.69689 -106.31143 -103.7734 79191.444 + 20 1112.0893 -107.2723 -103.96607 82675.468 + 30 1897.6249 -108.36769 -102.72608 71447.508 + 40 3068.3491 -110.06452 -100.94237 47627.967 + 50 3.730935 -110.16042 -110.14932 5913.0643 + 60 28.603141 -110.18885 -110.10381 5778.8586 + 66 54.717686 -110.21503 -110.05236 5739.5831 +Loop time of 2.48723 on 1 procs for 66 steps with 24 atoms + +99.5% CPU use with 1 MPI tasks x 1 OpenMP threads + +Minimization stats: + Stopping criterion = energy tolerance + Energy initial, next-to-last, final = + -104.955957263186 -110.209885831179 -110.215033825672 + Force two-norm initial, final = 19.119006 0.51695213 + Force max component initial, final = 11.775801 0.1663917 + Final line search alpha, max atom move = 0 0 + Iterations, force evaluations = 66 69 + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.7159e-05 | 2.7159e-05 | 2.7159e-05 | 0.0 | 0.00 +Bond | 3.124e-06 | 3.124e-06 | 3.124e-06 | 0.0 | 0.00 +Neigh | 1.0201e-05 | 1.0201e-05 | 1.0201e-05 | 0.0 | 0.00 +Comm | 0.000109 | 0.000109 | 0.000109 | 0.0 | 0.00 +Output | 0.00010568 | 0.00010568 | 0.00010568 | 0.0 | 0.00 +Modify | 2.4866 | 2.4866 | 2.4866 | 0.0 | 99.98 +Other | | 0.0003552 | | | 0.01 + +Nlocal: 24 ave 24 max 24 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 75 ave 75 max 75 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 33 ave 33 max 33 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 33 +Ave neighs/atom = 1.375 +Ave special neighs/atom = 0 +Neighbor list builds = 1 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/latte/log.19Sep17.latte.sucrose.md.g++.1 b/examples/latte/log.19Sep17.latte.sucrose.md.g++.1 deleted file mode 100644 index bc8843ef7f..0000000000 --- a/examples/latte/log.19Sep17.latte.sucrose.md.g++.1 +++ /dev/null @@ -1,406 +0,0 @@ - The log file for latte_lib - - CONTROL{ } - - WARNING: variable JobName= is missing. I will use a default value instead ... - WARNING: variable PARAMPATH= is missing. I will use a default value instead ... - WARNING: variable DEBUGON= is missing. I will use a default value instead ... - WARNING: variable FERMIM= is missing. I will use a default value instead ... - WARNING: variable CGORLIB= is missing. I will use a default value instead ... - WARNING: variable NORECS= is missing. I will use a default value instead ... - WARNING: variable VDWON= is missing. I will use a default value instead ... - WARNING: variable ORDERNMOL= is missing. I will use a default value instead ... - WARNING: variable LCNON= is missing. I will use a default value instead ... - WARNING: variable LCNITER= is missing. I will use a default value instead ... - WARNING: variable MDON= is missing. I will use a default value instead ... - WARNING: variable PBCON= is missing. I will use a default value instead ... - WARNING: variable RESTART= is missing. I will use a default value instead ... - WARNING: variable NGPU= is missing. I will use a default value instead ... - WARNING: variable COMPFORCE= is missing. I will use a default value instead ... - WARNING: variable DOSFIT= is missing. I will use a default value instead ... - WARNING: variable INTS2FIT= is missing. I will use a default value instead ... - WARNING: variable NFITSTEP= is missing. I will use a default value instead ... - WARNING: variable QFIT= is missing. I will use a default value instead ... - WARNING: variable PPFITON= is missing. I will use a default value instead ... - WARNING: variable ALLFITON= is missing. I will use a default value instead ... - WARNING: variable PPSTEP= is missing. I will use a default value instead ... - WARNING: variable BISTEP= is missing. I will use a default value instead ... - WARNING: variable PP2FIT= is missing. I will use a default value instead ... - WARNING: variable BINT2FIT= is missing. I will use a default value instead ... - WARNING: variable PPNMOL= is missing. I will use a default value instead ... - WARNING: variable PPNGEOM= is missing. I will use a default value instead ... - WARNING: variable PARREP= is missing. I will use a default value instead ... - WARNING: variable VERBOSE= is missing. I will use a default value instead ... - WARNING: variable MIXER= is missing. I will use a default value instead ... - WARNING: variable RESTARTLIB= is missing. I will use a default value instead ... - WARNING: variable CGTOL= is missing. I will use a default value instead ... - WARNING: variable ELEC_ETOL= is missing. I will use a default value instead ... - WARNING: variable COULACC= is missing. I will use a default value instead ... - WARNING: variable COULCUT= is missing. I will use a default value instead ... - WARNING: variable COULR1= is missing. I will use a default value instead ... - WARNING: variable CHTOL= is missing. I will use a default value instead ... - WARNING: variable BETA= is missing. I will use a default value instead ... - WARNING: variable MCSIGMA= is missing. I will use a default value instead ... - WARNING: variable PPBETA= is missing. I will use a default value instead ... - WARNING: variable PPSIGMA= is missing. I will use a default value instead ... - WARNING: variable ER= is missing. I will use a default value instead ... - WARNING: variable INITIALIZED= is missing. I will use a default value instead ... - - - ############### Parameters used for this run ################ - CONTROL{ - xControl= 1 - DEBUGON= 0 - FERMIM= 6 - CGORLIB= 1 - NORECS= 1 - ENTROPYKIND= 1 - PPOTON= 1 - VDWON= 0 - SPINON= 0 - ELECTRO= 1 - ELECMETH= 0 - MAXSCF= 450 - MINSP2ITER= 22 - FULLQCONV= 1 - QITER= 3 - ORDERNMOL= 0 - SPARSEON= 1 - THRESHOLDON= 1 - FILLINSTOP= 100 - BLKSZ= 4 - MSPARSE= 1500 - LCNON= 0 - LCNITER= 4 - RELAX= 0 - MAXITER= 100000 - MDON= 1 - PBCON= 1 - RESTART= 0 - CHARGE= 0 - XBO= 1 - XBODISON= 1 - XBODISORDER= 5 - NGPU= 2 - KON= 0 - COMPFORCE= 1 - DOSFIT= 0 - INTS2FIT= 1 - NFITSTEP= 5000 - QFIT= 0 - PPFITON= 0 - ALLFITON= 0 - PPSTEP= 500 - BISTEP= 500 - PP2FIT= 2 - BINT2FIT= 6 - PPNMOL= 10 - PPNGEOM= 200 - PARREP= 0 - VERBOSE= 0 - MIXER= 0 - RESTARTLIB= 0 - CGTOL= 9.9999999747524271E-007 - KBT= 0.0000000000000000 - SPINTOL= 1.0000000000000000E-004 - ELEC_ETOL= 1.0000000474974513E-003 - ELEC_QTOL= 1.0000000000000000E-008 - COULACC= 9.9999999747524271E-007 - COULCUT= -500.00000000000000 - COULR1= 500.00000000000000 - BREAKTOL= 9.9999999999999995E-007 - QMIX= 0.25000000000000000 - SPINMIX= 0.25000000000000000 - MDMIX= 0.25000000000000000 - NUMTHRESH= 9.9999999999999995E-007 - CHTOL= 9.9999997764825821E-003 - SKIN= 1.0000000000000000 - RLXFTOL= 9.9999999999999995E-008 - BETA= 1000.0000000000000 - MCSIGMA= 0.20000000298023224 - PPBETA= 1000.0000000000000 - PPSIGMA= 9.9999997764825821E-003 - ER= 1.0000000000000000 - JobName=MyJob - BASISTYPE=NONORTHO - SP2CONV=REL - RELAXTYPE=SD - PARAMPATH=./TBparam - COORDSFILE=./coords.dat - INITIALIZED= F - } - - ./TBparam/electrons.dat - MDCONTROL{ } - - WARNING: variable RNDIST= is missing. I will use a default value instead ... - WARNING: variable SEEDINIT= is missing. I will use a default value instead ... - WARNING: variable NPTTYPE= is missing. I will use a default value instead ... - WARNING: variable UDNEIGH= is missing. I will use a default value instead ... - WARNING: variable DUMPFREQ= is missing. I will use a default value instead ... - WARNING: variable RSFREQ= is missing. I will use a default value instead ... - WARNING: variable WRTFREQ= is missing. I will use a default value instead ... - WARNING: variable TOINITTEMP5= is missing. I will use a default value instead ... - WARNING: variable THERMPER= is missing. I will use a default value instead ... - WARNING: variable THERMRUN= is missing. I will use a default value instead ... - WARNING: variable NVTON= is missing. I will use a default value instead ... - WARNING: variable NPTON= is missing. I will use a default value instead ... - WARNING: variable AVEPER= is missing. I will use a default value instead ... - WARNING: variable SEED= is missing. I will use a default value instead ... - WARNING: variable SHOCKON= is missing. I will use a default value instead ... - WARNING: variable SHOCKSTART= is missing. I will use a default value instead ... - WARNING: variable SHOCKDIR= is missing. I will use a default value instead ... - WARNING: variable MDADAPT= is missing. I will use a default value instead ... - WARNING: variable GETHUG= is missing. I will use a default value instead ... - WARNING: variable RSLEVEL= is missing. I will use a default value instead ... - WARNING: variable DT= is missing. I will use a default value instead ... - WARNING: variable TEMPERATURE= is missing. I will use a default value instead ... - WARNING: variable FRICTION= is missing. I will use a default value instead ... - WARNING: variable PTARGET= is missing. I will use a default value instead ... - WARNING: variable UPARTICLE= is missing. I will use a default value instead ... - WARNING: variable USHOCK= is missing. I will use a default value instead ... - WARNING: variable C0= is missing. I will use a default value instead ... - WARNING: variable E0= is missing. I will use a default value instead ... - WARNING: variable V0= is missing. I will use a default value instead ... - WARNING: variable P0= is missing. I will use a default value instead ... - WARNING: variable DUMMY= is missing. I will use a default value instead ... - - - ############### Parameters used for this run ################ - MDCONTROL{ - MAXITER= -1 - UDNEIGH= 1 - DUMPFREQ= 250 - RSFREQ= 500 - WRTFREQ= 25 - TOINITTEMP5= 1 - THERMPER= 500 - THERMRUN= 50000 - NVTON= 0 - NPTON= 0 - AVEPER= 1000 - SEED= 54 - SHOCKON= 0 - SHOCKSTART= 100000 - SHOCKDIR= 1 - MDADAPT= 0 - GETHUG= 0 - RSLEVEL= 0 - DT= 0.25000000000000000 - TEMPERATURE= 300.00000000000000 - FRICTION= 1000.0000000000000 - PTARGET= 0.0000000000000000 - UPARTICLE= 500.00000000000000 - USHOCK= -4590.0000000000000 - C0= 1300.0000000000000 - E0= -795.72497558593750 - V0= 896.98486328125000 - P0= 8.3149001002311707E-002 - RNDIST=GAUSSIAN - SEEDINIT=UNIFORM - NPTTYPE=ISO - DUMMY= F - } - - LIBCALLS 0 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15165627147849 13.850829743067372 0.0000000000000000 3.9653384620309846 - LIBCALLS 1 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15142147081917 13.850596160685321 0.0000000000000000 3.9653428217526296 - LIBCALLS 2 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15072431717670 13.849902902335046 0.0000000000000000 3.9653556077235628 - LIBCALLS 3 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14958682134301 13.848772166382796 0.0000000000000000 3.9653762812719782 - LIBCALLS 4 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14804481054080 13.847240065975685 0.0000000000000000 3.9654039257311324 - LIBCALLS 5 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14614669298459 13.845355347298943 0.0000000000000000 3.9654372593625880 - LIBCALLS 6 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14395200541782 13.843177681164811 0.0000000000000000 3.9654747563744728 - LIBCALLS 7 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14152950027858 13.840775605612510 0.0000000000000000 3.9655146828204026 - LIBCALLS 8 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13895477239572 13.838224210058369 0.0000000000000000 3.9655551214573213 - LIBCALLS 9 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13630808318862 13.835602658269416 0.0000000000000000 3.9655940696401335 - LIBCALLS 10 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13367156672246 13.832991646694552 0.0000000000000000 3.9656294961085377 - LIBCALLS 11 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13112695791978 13.830470890853416 0.0000000000000000 3.9656594331001127 - LIBCALLS 12 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12875304084571 13.828116721514562 0.0000000000000000 3.9656820468287637 - LIBCALLS 13 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12662314462005 13.825999860613845 0.0000000000000000 3.9656956633599689 - LIBCALLS 14 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12480303363179 13.824183432931337 0.0000000000000000 3.9656988576578489 - LIBCALLS 15 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12334906554690 13.822721254684298 0.0000000000000000 3.9656905013961525 - LIBCALLS 16 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12230649281338 13.821656427050725 0.0000000000000000 3.9656697961568699 - LIBCALLS 17 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12170820445976 13.821020251989051 0.0000000000000000 3.9656362957330207 - LIBCALLS 18 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12157378544725 13.820831478957400 0.0000000000000000 3.9655899465557289 - LIBCALLS 19 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12190902409918 13.821095885466233 0.0000000000000000 3.9655310732858191 - LIBCALLS 20 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12270578464654 13.821806190548854 0.0000000000000000 3.9654603894825375 - LIBCALLS 21 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12394226924755 13.822942298269552 0.0000000000000000 3.9653789701528157 - LIBCALLS 22 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12558369933174 13.824471866833779 0.0000000000000000 3.9652882392864672 - LIBCALLS 23 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12758334335854 13.826351196916939 0.0000000000000000 3.9651899208403507 - LIBCALLS 24 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12988392857540 13.828526429544008 0.0000000000000000 3.9650859962581815 - LIBCALLS 25 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13241933900565 13.830935038404082 0.0000000000000000 3.9649786471076300 - LIBCALLS 26 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13511663668885 13.833507593821677 0.0000000000000000 3.9648702062183578 - LIBCALLS 27 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13789821166085 13.836169765592846 0.0000000000000000 3.9647630647732250 - LIBCALLS 28 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14068416314257 13.838844520440762 0.0000000000000000 3.9646596094056243 - LIBCALLS 29 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14339478125902 13.841454456993119 0.0000000000000000 3.9645621614306648 - LIBCALLS 30 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14595299166797 13.843924209084781 0.0000000000000000 3.9644728862209537 - LIBCALLS 31 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14828672908391 13.846182838096166 0.0000000000000000 3.9643937231592781 - LIBCALLS 32 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15033121417270 13.848166127650318 0.0000000000000000 3.9643263326484774 - LIBCALLS 33 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15203097820654 13.849818691045462 0.0000000000000000 3.9642720350529470 - LIBCALLS 34 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15334158494318 13.851095804201121 0.0000000000000000 3.9642317563508436 - LIBCALLS 35 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15423101277941 13.851964884709183 0.0000000000000000 3.9642060118064197 - LIBCALLS 36 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15468060067406 13.852406550643760 0.0000000000000000 3.9641948735126151 - LIBCALLS 37 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15468556770435 13.852415210893483 0.0000000000000000 3.9641979705462513 - LIBCALLS 38 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15425506702360 13.851999160128511 0.0000000000000000 3.9642145018322728 - LIBCALLS 39 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15341177086162 13.851180175004831 0.0000000000000000 3.9642432622019754 - LIBCALLS 40 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15219100341108 13.849992631968849 0.0000000000000000 3.9642826797086155 - LIBCALLS 41 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15063948253476 13.848482189284203 0.0000000000000000 3.9643308764467280 - LIBCALLS 42 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14881366363778 13.846704095034502 0.0000000000000000 3.9643857194231229 - LIBCALLS 43 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14677783841711 13.844721197666447 0.0000000000000000 3.9644449063996254 - LIBCALLS 44 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14460195130079 13.842601745208173 0.0000000000000000 3.9645060327113080 - LIBCALLS 45 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14235930197236 13.840417063344470 0.0000000000000000 3.9645666751650537 - LIBCALLS 46 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14012416839108 13.838239201362184 0.0000000000000000 3.9646244709241216 - LIBCALLS 47 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13796944534135 13.836138629087953 0.0000000000000000 3.9646771958199687 - LIBCALLS 48 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13596436459642 13.834182058508610 0.0000000000000000 3.9647228360374207 - LIBCALLS 49 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13417236277201 13.832430452024822 0.0000000000000000 3.9647596471475066 - LIBCALLS 50 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13264918465853 13.830937266579358 0.0000000000000000 3.9647862263274365 - LIBCALLS 51 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13144121811348 13.829746970164395 0.0000000000000000 3.9648015300858930 - LIBCALLS 52 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13058418584075 13.828893856279002 0.0000000000000000 3.9648049379175174 - LIBCALLS 53 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13010212355317 13.828401171909800 0.0000000000000000 3.9647962482159476 - LIBCALLS 54 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13000675986638 13.828280567696357 0.0000000000000000 3.9647757005033171 - LIBCALLS 55 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13029725443062 13.828531873218640 0.0000000000000000 3.9647439679967813 - LIBCALLS 56 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13096031859556 13.829143196581525 0.0000000000000000 3.9647021412055241 - LIBCALLS 57 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13197071275096 13.830091344339912 0.0000000000000000 3.9646517009757813 - LIBCALLS 58 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13329208290526 13.831342554670950 0.0000000000000000 3.9645944691057076 - LIBCALLS 59 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13487817952188 13.832853532802908 0.0000000000000000 3.9645325717081379 - LIBCALLS 60 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13667431785007 13.834572772174083 0.0000000000000000 3.9644683636269380 - LIBCALLS 61 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13861917436014 13.836442137716100 0.0000000000000000 3.9644043716683206 - LIBCALLS 62 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14064674344610 13.838398678492441 0.0000000000000000 3.9643432117931376 - LIBCALLS 63 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14268847880851 13.840376626541268 0.0000000000000000 3.9642875107994442 - LIBCALLS 64 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14467552446979 13.842309527587247 0.0000000000000000 3.9642398279114381 - LIBCALLS 65 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14654097615647 13.844132438475109 0.0000000000000000 3.9642025589783412 - LIBCALLS 66 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14822207995957 13.845784117078871 0.0000000000000000 3.9641778771678413 - LIBCALLS 67 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14966231911774 13.847209123749478 0.0000000000000000 3.9641676470155103 - LIBCALLS 68 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15081329445576 13.848359751049152 0.0000000000000000 3.9641733618391299 - LIBCALLS 69 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15163634076458 13.849197700537186 0.0000000000000000 3.9641960937768981 - LIBCALLS 70 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15210380659516 13.849695432596437 0.0000000000000000 3.9642364336978391 - LIBCALLS 71 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15219997215792 13.849837127658775 0.0000000000000000 3.9642944914660605 - LIBCALLS 72 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15192153900722 13.849619213627008 0.0000000000000000 3.9643698667021590 - LIBCALLS 73 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15127769530471 13.849050434626310 0.0000000000000000 3.9644616585289247 - LIBCALLS 74 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.15028974592457 13.848151458176057 0.0000000000000000 3.9645684873567908 - LIBCALLS 75 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14899032381624 13.846954040343237 0.0000000000000000 3.9646885325372980 - LIBCALLS 76 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14742221364327 13.845499789571511 0.0000000000000000 3.9648195821504211 - LIBCALLS 77 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14563684020112 13.843838588134755 0.0000000000000000 3.9649591055666282 - LIBCALLS 78 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14369246883172 13.842026744273829 0.0000000000000000 3.9651043223068876 - LIBCALLS 79 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14165219754119 13.840124957235691 0.0000000000000000 3.9652522794782556 - LIBCALLS 80 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13958181195608 13.838196181062383 0.0000000000000000 3.9653999492835532 - LIBCALLS 81 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13754757713065 13.836303471774007 0.0000000000000000 3.9655443071963385 - LIBCALLS 82 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13561405478509 13.834507896249461 0.0000000000000000 3.9656824354232736 - LIBCALLS 83 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13384198639028 13.832866571528193 0.0000000000000000 3.9658115908515681 - LIBCALLS 84 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13228634940748 13.831430891696755 0.0000000000000000 3.9659292903699495 - LIBCALLS 85 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13099461122306 13.830244986101496 0.0000000000000000 3.9660333724384569 - LIBCALLS 86 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13000526350720 13.829344440260281 0.0000000000000000 3.9661220782532145 - LIBCALLS 87 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12934661713206 13.828755299191645 0.0000000000000000 3.9661940662588862 - LIBCALLS 88 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12903595764971 13.828493364127572 0.0000000000000000 3.9662484623936765 - LIBCALLS 89 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12907904533250 13.828563786156602 0.0000000000000000 3.9662848954537067 - LIBCALLS 90 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.12946994320248 13.828960955791626 0.0000000000000000 3.9663034756730777 - LIBCALLS 91 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13019123489619 13.829668684955367 0.0000000000000000 3.9663048073711558 - LIBCALLS 92 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13121457766835 13.830660675785223 0.0000000000000000 3.9662899643566578 - LIBCALLS 93 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13250159637499 13.831901269302985 0.0000000000000000 3.9662604605307470 - LIBCALLS 94 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13400508153813 13.833346464674193 0.0000000000000000 3.9662181906403653 - LIBCALLS 95 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13567049003717 13.834945196074795 0.0000000000000000 3.9661653991148187 - LIBCALLS 96 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13743766487022 13.836640848231452 0.0000000000000000 3.9661045863001441 - LIBCALLS 97 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.13924277096038 13.838372983906890 0.0000000000000000 3.9660384593805307 - LIBCALLS 98 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14102036682124 13.840079246589914 0.0000000000000000 3.9659698320311318 - LIBCALLS 99 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14270555407057 13.841697390518378 0.0000000000000000 3.9659015537535014 - LIBCALLS 100 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -261.14423615166146 13.843167378892108 0.0000000000000000 3.9658364191978137 diff --git a/examples/latte/log.19Sep17.latte.water.md.g++.1 b/examples/latte/log.19Sep17.latte.water.md.g++.1 deleted file mode 100644 index f4603f5963..0000000000 --- a/examples/latte/log.19Sep17.latte.water.md.g++.1 +++ /dev/null @@ -1,406 +0,0 @@ - The log file for latte_lib - - CONTROL{ } - - WARNING: variable JobName= is missing. I will use a default value instead ... - WARNING: variable PARAMPATH= is missing. I will use a default value instead ... - WARNING: variable DEBUGON= is missing. I will use a default value instead ... - WARNING: variable FERMIM= is missing. I will use a default value instead ... - WARNING: variable CGORLIB= is missing. I will use a default value instead ... - WARNING: variable NORECS= is missing. I will use a default value instead ... - WARNING: variable VDWON= is missing. I will use a default value instead ... - WARNING: variable ORDERNMOL= is missing. I will use a default value instead ... - WARNING: variable LCNON= is missing. I will use a default value instead ... - WARNING: variable LCNITER= is missing. I will use a default value instead ... - WARNING: variable MDON= is missing. I will use a default value instead ... - WARNING: variable PBCON= is missing. I will use a default value instead ... - WARNING: variable RESTART= is missing. I will use a default value instead ... - WARNING: variable NGPU= is missing. I will use a default value instead ... - WARNING: variable COMPFORCE= is missing. I will use a default value instead ... - WARNING: variable DOSFIT= is missing. I will use a default value instead ... - WARNING: variable INTS2FIT= is missing. I will use a default value instead ... - WARNING: variable NFITSTEP= is missing. I will use a default value instead ... - WARNING: variable QFIT= is missing. I will use a default value instead ... - WARNING: variable PPFITON= is missing. I will use a default value instead ... - WARNING: variable ALLFITON= is missing. I will use a default value instead ... - WARNING: variable PPSTEP= is missing. I will use a default value instead ... - WARNING: variable BISTEP= is missing. I will use a default value instead ... - WARNING: variable PP2FIT= is missing. I will use a default value instead ... - WARNING: variable BINT2FIT= is missing. I will use a default value instead ... - WARNING: variable PPNMOL= is missing. I will use a default value instead ... - WARNING: variable PPNGEOM= is missing. I will use a default value instead ... - WARNING: variable PARREP= is missing. I will use a default value instead ... - WARNING: variable VERBOSE= is missing. I will use a default value instead ... - WARNING: variable MIXER= is missing. I will use a default value instead ... - WARNING: variable RESTARTLIB= is missing. I will use a default value instead ... - WARNING: variable CGTOL= is missing. I will use a default value instead ... - WARNING: variable ELEC_ETOL= is missing. I will use a default value instead ... - WARNING: variable COULACC= is missing. I will use a default value instead ... - WARNING: variable COULCUT= is missing. I will use a default value instead ... - WARNING: variable COULR1= is missing. I will use a default value instead ... - WARNING: variable CHTOL= is missing. I will use a default value instead ... - WARNING: variable BETA= is missing. I will use a default value instead ... - WARNING: variable MCSIGMA= is missing. I will use a default value instead ... - WARNING: variable PPBETA= is missing. I will use a default value instead ... - WARNING: variable PPSIGMA= is missing. I will use a default value instead ... - WARNING: variable ER= is missing. I will use a default value instead ... - WARNING: variable INITIALIZED= is missing. I will use a default value instead ... - - - ############### Parameters used for this run ################ - CONTROL{ - xControl= 1 - DEBUGON= 0 - FERMIM= 6 - CGORLIB= 1 - NORECS= 1 - ENTROPYKIND= 1 - PPOTON= 1 - VDWON= 0 - SPINON= 0 - ELECTRO= 1 - ELECMETH= 0 - MAXSCF= 450 - MINSP2ITER= 22 - FULLQCONV= 1 - QITER= 3 - ORDERNMOL= 0 - SPARSEON= 1 - THRESHOLDON= 1 - FILLINSTOP= 100 - BLKSZ= 4 - MSPARSE= 1500 - LCNON= 0 - LCNITER= 4 - RELAX= 0 - MAXITER= 100000 - MDON= 1 - PBCON= 1 - RESTART= 0 - CHARGE= 0 - XBO= 1 - XBODISON= 1 - XBODISORDER= 5 - NGPU= 2 - KON= 0 - COMPFORCE= 1 - DOSFIT= 0 - INTS2FIT= 1 - NFITSTEP= 5000 - QFIT= 0 - PPFITON= 0 - ALLFITON= 0 - PPSTEP= 500 - BISTEP= 500 - PP2FIT= 2 - BINT2FIT= 6 - PPNMOL= 10 - PPNGEOM= 200 - PARREP= 0 - VERBOSE= 0 - MIXER= 0 - RESTARTLIB= 0 - CGTOL= 9.9999999747524271E-007 - KBT= 0.0000000000000000 - SPINTOL= 1.0000000000000000E-004 - ELEC_ETOL= 1.0000000474974513E-003 - ELEC_QTOL= 1.0000000000000000E-008 - COULACC= 9.9999999747524271E-007 - COULCUT= -500.00000000000000 - COULR1= 500.00000000000000 - BREAKTOL= 9.9999999999999995E-007 - QMIX= 0.25000000000000000 - SPINMIX= 0.25000000000000000 - MDMIX= 0.25000000000000000 - NUMTHRESH= 9.9999999999999995E-007 - CHTOL= 9.9999997764825821E-003 - SKIN= 1.0000000000000000 - RLXFTOL= 9.9999999999999995E-008 - BETA= 1000.0000000000000 - MCSIGMA= 0.20000000298023224 - PPBETA= 1000.0000000000000 - PPSIGMA= 9.9999997764825821E-003 - ER= 1.0000000000000000 - JobName=MyJob - BASISTYPE=NONORTHO - SP2CONV=REL - RELAXTYPE=SD - PARAMPATH=./TBparam - COORDSFILE=./coords.dat - INITIALIZED= F - } - - ./TBparam/electrons.dat - MDCONTROL{ } - - WARNING: variable RNDIST= is missing. I will use a default value instead ... - WARNING: variable SEEDINIT= is missing. I will use a default value instead ... - WARNING: variable NPTTYPE= is missing. I will use a default value instead ... - WARNING: variable UDNEIGH= is missing. I will use a default value instead ... - WARNING: variable DUMPFREQ= is missing. I will use a default value instead ... - WARNING: variable RSFREQ= is missing. I will use a default value instead ... - WARNING: variable WRTFREQ= is missing. I will use a default value instead ... - WARNING: variable TOINITTEMP5= is missing. I will use a default value instead ... - WARNING: variable THERMPER= is missing. I will use a default value instead ... - WARNING: variable THERMRUN= is missing. I will use a default value instead ... - WARNING: variable NVTON= is missing. I will use a default value instead ... - WARNING: variable NPTON= is missing. I will use a default value instead ... - WARNING: variable AVEPER= is missing. I will use a default value instead ... - WARNING: variable SEED= is missing. I will use a default value instead ... - WARNING: variable SHOCKON= is missing. I will use a default value instead ... - WARNING: variable SHOCKSTART= is missing. I will use a default value instead ... - WARNING: variable SHOCKDIR= is missing. I will use a default value instead ... - WARNING: variable MDADAPT= is missing. I will use a default value instead ... - WARNING: variable GETHUG= is missing. I will use a default value instead ... - WARNING: variable RSLEVEL= is missing. I will use a default value instead ... - WARNING: variable DT= is missing. I will use a default value instead ... - WARNING: variable TEMPERATURE= is missing. I will use a default value instead ... - WARNING: variable FRICTION= is missing. I will use a default value instead ... - WARNING: variable PTARGET= is missing. I will use a default value instead ... - WARNING: variable UPARTICLE= is missing. I will use a default value instead ... - WARNING: variable USHOCK= is missing. I will use a default value instead ... - WARNING: variable C0= is missing. I will use a default value instead ... - WARNING: variable E0= is missing. I will use a default value instead ... - WARNING: variable V0= is missing. I will use a default value instead ... - WARNING: variable P0= is missing. I will use a default value instead ... - WARNING: variable DUMMY= is missing. I will use a default value instead ... - - - ############### Parameters used for this run ################ - MDCONTROL{ - MAXITER= -1 - UDNEIGH= 1 - DUMPFREQ= 250 - RSFREQ= 500 - WRTFREQ= 25 - TOINITTEMP5= 1 - THERMPER= 500 - THERMRUN= 50000 - NVTON= 0 - NPTON= 0 - AVEPER= 1000 - SEED= 54 - SHOCKON= 0 - SHOCKSTART= 100000 - SHOCKDIR= 1 - MDADAPT= 0 - GETHUG= 0 - RSLEVEL= 0 - DT= 0.25000000000000000 - TEMPERATURE= 300.00000000000000 - FRICTION= 1000.0000000000000 - PTARGET= 0.0000000000000000 - UPARTICLE= 500.00000000000000 - USHOCK= -4590.0000000000000 - C0= 1300.0000000000000 - E0= -795.72497558593750 - V0= 896.98486328125000 - P0= 8.3149001002311707E-002 - RNDIST=GAUSSIAN - SEEDINIT=UNIFORM - NPTTYPE=ISO - DUMMY= F - } - - LIBCALLS 0 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -110.94281402417451 9.3197859655447317 0.0000000000000000 3.3331152608769714 - LIBCALLS 1 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.00875524736128 9.3653691493930946 0.0000000000000000 3.3307590218500454 - LIBCALLS 2 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.20542679804305 9.5022104076319209 0.0000000000000000 3.3237269236958826 - LIBCALLS 3 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.52938059528239 9.7304811436977623 0.0000000000000000 3.3121168872278743 - LIBCALLS 4 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -111.97463249071366 10.050121693432235 0.0000000000000000 3.2961492065207088 - LIBCALLS 5 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.53270518796754 10.460328095449432 0.0000000000000000 3.2761112890303719 - LIBCALLS 6 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.19233973551384 10.958848347453728 0.0000000000000000 3.2524094948032394 - LIBCALLS 7 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.93936061504219 11.541120618354967 0.0000000000000000 3.2255715906285793 - LIBCALLS 8 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.75657630591589 12.199315594286325 0.0000000000000000 3.1962412869596100 - LIBCALLS 9 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.62363727592754 12.921383532128770 0.0000000000000000 3.1652236023838971 - LIBCALLS 10 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.51738028417616 13.690253224922545 0.0000000000000000 3.1333864449223818 - LIBCALLS 11 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.41167836078414 14.483370804317431 0.0000000000000000 3.1018474945925432 - LIBCALLS 12 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.27888830961329 15.272791625586624 0.0000000000000000 3.0716022180609772 - LIBCALLS 13 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.09006809777934 16.026020995592610 0.0000000000000000 3.0437832241644842 - LIBCALLS 14 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.81665859965702 16.707725410478066 0.0000000000000000 3.0194382402972129 - LIBCALLS 15 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.43171665196000 17.282293509806884 0.0000000000000000 2.9995944159949395 - LIBCALLS 16 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.91202932933264 17.717025741135480 0.0000000000000000 2.9850159611897484 - LIBCALLS 17 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.23935305628714 17.985521384886379 0.0000000000000000 2.9763132734231292 - LIBCALLS 18 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.40195013006486 18.070687763205626 0.0000000000000000 2.9738279411203812 - LIBCALLS 19 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.39540873020161 17.966785565900089 0.0000000000000000 2.9776410698341418 - LIBCALLS 20 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.22299732491055 17.680085363043698 0.0000000000000000 2.9875419962840417 - LIBCALLS 21 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.89520311723561 17.228004261852682 0.0000000000000000 3.0030824758482719 - LIBCALLS 22 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.42892991839108 16.636927104987372 0.0000000000000000 3.0235548851138652 - LIBCALLS 23 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.84603562384113 15.939176953031323 0.0000000000000000 3.0480682132279808 - LIBCALLS 24 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.17151378155378 15.169713318754383 0.0000000000000000 3.0757033760823562 - LIBCALLS 25 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.43237009319661 14.363090728730079 0.0000000000000000 3.1053593079625457 - LIBCALLS 26 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.65587959220025 13.551051330611342 0.0000000000000000 3.1359367589132958 - LIBCALLS 27 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.86794783202731 12.760928656005802 0.0000000000000000 3.1665525874091585 - LIBCALLS 28 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.09314111752745 12.014864684105008 0.0000000000000000 3.1962157162544820 - LIBCALLS 29 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.35329645548983 11.329720850249741 0.0000000000000000 3.2241713466126849 - LIBCALLS 30 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.66766945168203 10.717501941208962 0.0000000000000000 3.2497326120829619 - LIBCALLS 31 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.05267853351812 10.186102377105355 0.0000000000000000 3.2723439005172468 - LIBCALLS 32 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.52195471723405 9.7402032028335377 0.0000000000000000 3.2915777178346559 - LIBCALLS 33 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.08654808143162 9.3821857555240076 0.0000000000000000 3.3070881064986164 - LIBCALLS 34 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.75494140290169 9.1129669843369658 0.0000000000000000 3.3186769594405297 - LIBCALLS 35 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.53346080566452 8.9326971516334606 0.0000000000000000 3.3261797960311763 - LIBCALLS 36 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.42631053676025 8.8412887543407273 0.0000000000000000 3.3295101207595583 - LIBCALLS 37 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.43567911088179 8.8387604511711384 0.0000000000000000 3.3286360397306387 - LIBCALLS 38 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.56180874683180 8.9253908783870841 0.0000000000000000 3.3235794828927934 - LIBCALLS 39 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.80290981416660 9.1016780459478674 0.0000000000000000 3.3144303393175201 - LIBCALLS 40 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.15529209572232 9.3681021116147463 0.0000000000000000 3.3012719922659173 - LIBCALLS 41 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.61284717182851 9.7246892073080176 0.0000000000000000 3.2843276907821406 - LIBCALLS 42 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.16711238367500 10.170382433756300 0.0000000000000000 3.2638758866524444 - LIBCALLS 43 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.80697882175535 10.702240750749448 0.0000000000000000 3.2402928278295451 - LIBCALLS 44 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.51862249254057 11.314512276989859 0.0000000000000000 3.2140189987358694 - LIBCALLS 45 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.28534475502829 11.997664972113199 0.0000000000000000 3.1855791836729437 - LIBCALLS 46 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.08723294353808 12.737504349188432 0.0000000000000000 3.1557205936583181 - LIBCALLS 47 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.90172272355942 13.514542609912253 0.0000000000000000 3.1252466759266087 - LIBCALLS 48 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.70392627447073 14.303827027310493 0.0000000000000000 3.0950533786893732 - LIBCALLS 49 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.46728361372288 15.075425279261220 0.0000000000000000 3.0661202668284480 - LIBCALLS 50 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.16480071670361 15.795723720235596 0.0000000000000000 3.0394030522382605 - LIBCALLS 51 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.77012122199473 16.429579578207949 0.0000000000000000 3.0158910566711334 - LIBCALLS 52 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.25943485841766 16.943195338409559 0.0000000000000000 2.9964108616830281 - LIBCALLS 53 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.61275582007269 17.307379355481601 0.0000000000000000 2.9817016064731785 - LIBCALLS 54 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.81557415209883 17.500688554193868 0.0000000000000000 2.9722905637821611 - LIBCALLS 55 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.85979389563140 17.511877645177901 0.0000000000000000 2.9685356305551474 - LIBCALLS 56 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.74454585055143 17.341170281709367 0.0000000000000000 2.9705149057151141 - LIBCALLS 57 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.47625724150488 17.000096879575938 0.0000000000000000 2.9780008785307088 - LIBCALLS 58 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.06771474420596 16.509959464438374 0.0000000000000000 2.9906138266349656 - LIBCALLS 59 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.53702830874704 15.899266098308772 0.0000000000000000 3.0078351734174715 - LIBCALLS 60 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.90667912574422 15.200652842845301 0.0000000000000000 3.0288733658622142 - LIBCALLS 61 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.20142467775943 14.447825469624703 0.0000000000000000 3.0529481020908245 - LIBCALLS 62 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.44747494197328 13.672949108115853 0.0000000000000000 3.0790791220573088 - LIBCALLS 63 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.67063237406208 12.904741667499017 0.0000000000000000 3.1063745183559131 - LIBCALLS 64 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.89550228683500 12.167344616151606 0.0000000000000000 3.1339818740985033 - LIBCALLS 65 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.14487351718614 11.479908971904207 0.0000000000000000 3.1610748652786995 - LIBCALLS 66 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.43917601644073 10.856755674815151 0.0000000000000000 3.1869042214936911 - LIBCALLS 67 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.79630542914917 10.307930318909381 0.0000000000000000 3.2107896540741994 - LIBCALLS 68 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.23118520942130 9.8399835349372715 0.0000000000000000 3.2322754400486997 - LIBCALLS 69 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.75645667348935 9.4568320682906393 0.0000000000000000 3.2508686207040949 - LIBCALLS 70 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.38220191758144 9.1605931457952803 0.0000000000000000 3.2662052636761625 - LIBCALLS 71 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.11651461323785 8.9523172650382463 0.0000000000000000 3.2778578161416640 - LIBCALLS 72 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.96490300473705 8.8325758589074610 0.0000000000000000 3.2856373346184280 - LIBCALLS 73 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -112.93101384064629 8.8018792766284140 0.0000000000000000 3.2893376450243901 - LIBCALLS 74 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.01657988020818 8.8609123616606951 0.0000000000000000 3.2887786713823335 - LIBCALLS 75 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.22122702505257 9.0105808374276855 0.0000000000000000 3.2838806809960044 - LIBCALLS 76 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.54255812607462 9.2518619694254909 0.0000000000000000 3.2746170980725564 - LIBCALLS 77 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -113.97595003796289 9.5854566564348804 0.0000000000000000 3.2610495238703536 - LIBCALLS 78 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -114.51445216471619 10.011242264155852 0.0000000000000000 3.2433103887056101 - LIBCALLS 79 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.14835871057100 10.527538366743359 0.0000000000000000 3.2217018278255036 - LIBCALLS 80 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -115.86512618816471 11.130220642932718 0.0000000000000000 3.1966546818138903 - LIBCALLS 81 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -116.64916580084807 11.811746817430592 0.0000000000000000 3.1687509169099037 - LIBCALLS 82 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -117.48162972769103 12.560201275368994 0.0000000000000000 3.1387793445426220 - LIBCALLS 83 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.34080112521505 13.358507776606700 0.0000000000000000 3.1076005013428842 - LIBCALLS 84 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.20206255799097 14.183999576696523 0.0000000000000000 3.0762625451098367 - LIBCALLS 85 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.03875955947012 15.008549885925623 0.0000000000000000 3.0458557745855401 - LIBCALLS 86 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.82281065648482 15.799445052997022 0.0000000000000000 3.0175902569508040 - LIBCALLS 87 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.52638053902615 16.521105731022047 0.0000000000000000 2.9925661691795984 - LIBCALLS 88 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.12297505178334 17.137613862262167 0.0000000000000000 2.9718740800190462 - LIBCALLS 89 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.58954501498538 17.615819283155187 0.0000000000000000 2.9563457612376758 - LIBCALLS 90 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.90768650775293 17.928615619513138 0.0000000000000000 2.9466637669908935 - LIBCALLS 91 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -123.06510359278838 18.057846294334183 0.0000000000000000 2.9432773288779130 - LIBCALLS 92 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -123.05653995529889 17.996310208253615 0.0000000000000000 2.9463730237128352 - LIBCALLS 93 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.88443709725219 17.748486968230267 0.0000000000000000 2.9557418006906766 - LIBCALLS 94 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.55804625906457 17.329857520510558 0.0000000000000000 2.9710497340098647 - LIBCALLS 95 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -122.09316916859144 16.764989519228550 0.0000000000000000 2.9916333369114647 - LIBCALLS 96 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -121.51050736457847 16.084787212290774 0.0000000000000000 3.0167038701280053 - LIBCALLS 97 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.83475656442954 15.323405512114466 0.0000000000000000 3.0451593241515909 - LIBCALLS 98 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -120.09218577985371 14.515310319889227 0.0000000000000000 3.0759929793994090 - LIBCALLS 99 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -119.30969482099719 13.692843612811791 0.0000000000000000 3.1081426979179545 - LIBCALLS 100 - Energy Components (TRRHOH, EREP, ENTE, ECOUL) -118.51358261827596 12.884492109393644 0.0000000000000000 3.1405428597121636 diff --git a/examples/latte/log.21Jun18.latte.graphene.boxrelax.g++.1 b/examples/latte/log.21Jun18.latte.graphene.boxrelax.g++.1 deleted file mode 100644 index 3a37136fd3..0000000000 --- a/examples/latte/log.21Jun18.latte.graphene.boxrelax.g++.1 +++ /dev/null @@ -1,170 +0,0 @@ -LAMMPS (11 May 2018) -# Simple water model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.graphene.boxrel - triclinic box = (0 0 0) to (10 8 20) with tilt (4.89859e-16 1.22465e-15 1.22465e-15) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 32 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all box/relax iso 0.0 vmax 0.001 - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom etotal - -# minimization - -thermo 1 -fix 3 all print 1 "Total Energy =" -min_style cg -min_modify dmax 0.1 -min_modify line quadratic -minimize 1.0e-4 1.0e-4 10000 10000 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2 - binsize = 1, bins = 11 9 20 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair zero, perpetual - attributes: half, newton on - pair build: half/bin/newton/tri - stencil: half/bin/3d/newton/tri - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.779 | 6.779 | 6.779 Mbytes -TotEng - -247.46002 - -247.67224 - -247.87937 - -248.08148 - -248.27865 - -248.47096 - -248.65851 - -248.84137 - -249.01964 - -249.19342 - -249.36281 - -249.52791 - -249.68883 - -249.8457 - -249.99865 - -250.1478 - -250.29332 - -250.43535 - -250.57409 - -250.70972 - -250.84247 - -250.97258 - -251.10035 - -251.2261 - -251.35021 - -251.47314 - -251.59543 - -251.71776 - -251.84096 - -251.9661 - -252.09459 - -252.22833 - -252.37003 - -252.52371 - -252.69578 - -252.89752 - -253.15197 - -253.52044 - -254.31418 - -255.6175 - -256.8162 - -258.1227 - -259.38401 - -260.74831 - -262.03991 - -263.5463 - -264.70486 - -267.69144 - -267.88682 - -269.03519 - -270.60187 - -270.65382 - -270.74279 - -271.55883 - -271.81248 - -271.87529 - -273.01494 - -273.23948 - -273.28719 - -273.35272 - -273.41591 - -273.46274 - -273.54755 - -273.58318 - -273.73111 - -273.75754 -Loop time of 39.4155 on 1 procs for 65 steps with 32 atoms - -1582.4% CPU use with 1 MPI tasks x no OpenMP threads - -Minimization stats: - Stopping criterion = energy tolerance - Energy initial, next-to-last, final = - -247.460020579 -273.731112592 -273.757543461 - Force two-norm initial, final = 201.608 9.43485 - Force max component initial, final = 188.924 2.41297 - Final line search alpha, max atom move = 0.000223273 0.00053875 - Iterations, force evaluations = 65 65 - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.00012159 | 0.00012159 | 0.00012159 | 0.0 | 0.00 -Bond | 5.1975e-05 | 5.1975e-05 | 5.1975e-05 | 0.0 | 0.00 -Neigh | 4.1962e-05 | 4.1962e-05 | 4.1962e-05 | 0.0 | 0.00 -Comm | 0.00026107 | 0.00026107 | 0.00026107 | 0.0 | 0.00 -Output | 0.0013342 | 0.0013342 | 0.0013342 | 0.0 | 0.00 -Modify | 39.412 | 39.412 | 39.412 | 0.0 | 99.99 -Other | | 0.00127 | | | 0.00 - -Nlocal: 32 ave 32 max 32 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 100 ave 100 max 100 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 48 ave 48 max 48 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 48 -Ave neighs/atom = 1.5 -Ave special neighs/atom = 0 -Neighbor list builds = 1 -Dangerous builds = 0 -Total wall time: 0:00:40 diff --git a/examples/latte/log.21Jun18.latte.sucrose.g++.1 b/examples/latte/log.21Jun18.latte.sucrose.g++.1 deleted file mode 100644 index cb4526587c..0000000000 --- a/examples/latte/log.21Jun18.latte.sucrose.g++.1 +++ /dev/null @@ -1,103 +0,0 @@ -LAMMPS (11 May 2018) -# simple sucrose model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.sucrose - orthogonal box = (0 0 0) to (17.203 18.009 21.643) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 45 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all nve - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom step temp pe etotal press - -# dynamics - -thermo 10 -run 100 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2 - binsize = 1, bins = 18 19 22 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair zero, 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) = 0.5064 | 0.5064 | 0.5064 Mbytes -Step Temp PotEng TotEng Press - 0 0 -251.26617 -251.26617 16.617234 - 10 0.025263709 -251.26631 -251.26617 8.0576708 - 20 0.034232467 -251.26636 -251.26617 1.6673442 - 30 0.059079556 -251.2665 -251.26617 11.058458 - 40 0.055499766 -251.26648 -251.26617 14.837775 - 50 0.058499509 -251.2665 -251.26617 6.7183113 - 60 0.071094535 -251.26657 -251.26617 6.6133687 - 70 0.084309439 -251.26665 -251.26617 12.372721 - 80 0.1089929 -251.26679 -251.26617 8.8355516 - 90 0.11378257 -251.26681 -251.26617 5.1177922 - 100 0.13003966 -251.26691 -251.26617 8.2431185 -Loop time of 27.8386 on 1 procs for 100 steps with 45 atoms - -Performance: 0.078 ns/day, 309.318 hours/ns, 3.592 timesteps/s -1799.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 | 8.3685e-05 | 8.3685e-05 | 8.3685e-05 | 0.0 | 0.00 -Bond | 7.4148e-05 | 7.4148e-05 | 7.4148e-05 | 0.0 | 0.00 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.00016689 | 0.00016689 | 0.00016689 | 0.0 | 0.00 -Output | 0.00032401 | 0.00032401 | 0.00032401 | 0.0 | 0.00 -Modify | 27.837 | 27.837 | 27.837 | 0.0 |100.00 -Other | | 0.0005403 | | | 0.00 - -Nlocal: 45 ave 45 max 45 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 0 ave 0 max 0 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 59 ave 59 max 59 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 59 -Ave neighs/atom = 1.31111 -Ave special neighs/atom = 0 -Neighbor list builds = 0 -Dangerous builds = 0 -Total wall time: 0:00:28 diff --git a/examples/latte/log.21Jun18.latte.water.g++.1 b/examples/latte/log.21Jun18.latte.water.g++.1 deleted file mode 100644 index 0decce1f98..0000000000 --- a/examples/latte/log.21Jun18.latte.water.g++.1 +++ /dev/null @@ -1,103 +0,0 @@ -LAMMPS (11 May 2018) -# simple water model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.water - orthogonal box = (0 0 0) to (6.267 6.267 6.267) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 24 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all nve - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom step temp pe etotal press - -# dynamics - -thermo 10 -run 100 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2 - binsize = 1, bins = 7 7 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair zero, 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) = 5.629 | 5.629 | 5.629 Mbytes -Step Temp PotEng TotEng Press - 0 0 -104.95594 -104.95594 48236.006 - 10 336.5303 -105.96026 -104.95976 97997.303 - 20 529.06385 -106.53021 -104.95731 131520.49 - 30 753.62616 -107.1995 -104.95898 49297.371 - 40 716.6565 -107.08802 -104.95741 28307.272 - 50 824.04417 -107.40822 -104.95835 102167.48 - 60 933.56056 -107.73478 -104.95932 92508.792 - 70 851.18518 -107.48766 -104.95711 13993.28 - 80 999.80265 -107.93146 -104.95906 36700.417 - 90 998.77707 -107.92569 -104.95634 107233.7 - 100 1281.4446 -108.76961 -104.95989 49703.193 -Loop time of 10.6388 on 1 procs for 100 steps with 24 atoms - -Performance: 0.203 ns/day, 118.209 hours/ns, 9.400 timesteps/s -6459.7% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 7.6771e-05 | 7.6771e-05 | 7.6771e-05 | 0.0 | 0.00 -Bond | 7.5817e-05 | 7.5817e-05 | 7.5817e-05 | 0.0 | 0.00 -Neigh | 4.6015e-05 | 4.6015e-05 | 4.6015e-05 | 0.0 | 0.00 -Comm | 0.00031829 | 0.00031829 | 0.00031829 | 0.0 | 0.00 -Output | 0.00032401 | 0.00032401 | 0.00032401 | 0.0 | 0.00 -Modify | 10.637 | 10.637 | 10.637 | 0.0 | 99.99 -Other | | 0.00052 | | | 0.00 - -Nlocal: 24 ave 24 max 24 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 77 ave 77 max 77 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 31 ave 31 max 31 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 31 -Ave neighs/atom = 1.29167 -Ave special neighs/atom = 0 -Neighbor list builds = 2 -Dangerous builds = 0 -Total wall time: 0:00:10 diff --git a/examples/latte/log.21Jun18.latte.water.min.g++.1 b/examples/latte/log.21Jun18.latte.water.min.g++.1 deleted file mode 100644 index 1c8921fd60..0000000000 --- a/examples/latte/log.21Jun18.latte.water.min.g++.1 +++ /dev/null @@ -1,108 +0,0 @@ -LAMMPS (11 May 2018) -# simple water model with LATTE - -units metal -atom_style full -atom_modify sort 0 0.0 # turn off sorting of the coordinates - -read_data data.water - orthogonal box = (0 0 0) to (6.267 6.267 6.267) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 24 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - -# replicate system if requested - -variable x index 1 -variable y index 1 -variable z index 1 - -variable nrep equal v_x*v_y*v_z -if "${nrep} > 1" then "replicate $x $y $z" - -# initialize system - -velocity all create 0.0 87287 loop geom - -pair_style zero 1.0 -pair_coeff * * - -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -timestep 0.00025 - -fix 1 all nve - -fix 2 all latte NULL -fix_modify 2 energy yes - -thermo_style custom step temp pe etotal press - -# minimization - -thermo 10 - -min_style fire -minimize 1.0e-4 1.0e-4 500 500 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2 - ghost atom cutoff = 2 - binsize = 1, bins = 7 7 7 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair zero, 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) = 5.629 | 5.629 | 5.629 Mbytes -Step Temp PotEng TotEng Press - 0 0 -104.95594 -104.95594 48236.006 - 10 349.4534 -105.50948 -104.47056 62157.729 - 20 1253.6636 -107.00863 -103.28151 116456.71 - 30 134.64051 -107.56155 -107.16127 59864.196 - 40 2.4044989 -108.1527 -108.14556 32695.648 - 47 137.26885 -108.30413 -107.89603 60177.442 -Loop time of 6.42677 on 1 procs for 47 steps with 24 atoms - -6481.9% CPU use with 1 MPI tasks x no OpenMP threads - -Minimization stats: - Stopping criterion = energy tolerance - Energy initial, next-to-last, final = - -104.955944301 -108.302982895 -108.304126127 - Force two-norm initial, final = 19.119 3.44609 - Force max component initial, final = 11.7758 1.3408 - Final line search alpha, max atom move = 0 0 - Iterations, force evaluations = 47 47 - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 4.6253e-05 | 4.6253e-05 | 4.6253e-05 | 0.0 | 0.00 -Bond | 3.1948e-05 | 3.1948e-05 | 3.1948e-05 | 0.0 | 0.00 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.00014353 | 0.00014353 | 0.00014353 | 0.0 | 0.00 -Output | 0.00012302 | 0.00012302 | 0.00012302 | 0.0 | 0.00 -Modify | 6.426 | 6.426 | 6.426 | 0.0 | 99.99 -Other | | 0.0004699 | | | 0.01 - -Nlocal: 24 ave 24 max 24 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 71 ave 71 max 71 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 37 ave 37 max 37 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 37 -Ave neighs/atom = 1.54167 -Ave special neighs/atom = 0 -Neighbor list builds = 0 -Dangerous builds = 0 -Total wall time: 0:00:06 From fe4f7bd46737c62471470707bb6ac737922282d4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 13 Sep 2022 11:43:09 -0400 Subject: [PATCH 118/364] spelling --- doc/src/labelmap.rst | 2 +- doc/src/read_data.rst | 2 +- doc/src/restart.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/labelmap.rst b/doc/src/labelmap.rst index a709bb1104..1f500db6b4 100644 --- a/doc/src/labelmap.rst +++ b/doc/src/labelmap.rst @@ -86,7 +86,7 @@ This command must come after the simulation box is defined by a :doc:`read_data `, :doc:`read_restart `, or :doc:`create_box ` command. -Labelmaps are currently not supported when using the KOKKOS package. +Label maps are currently not supported when using the KOKKOS package. Related commands """""""""""""""" diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index f39e27df90..858029caae 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -1519,7 +1519,7 @@ To read gzipped data files, you must compile LAMMPS with the -DLAMMPS_GZIP option. See the :doc:`Build settings ` doc page for details. -Labelmaps are currently not supported when using the KOKKOS package. +Label maps are currently not supported when using the KOKKOS package. Related commands """""""""""""""" diff --git a/doc/src/restart.rst b/doc/src/restart.rst index 91b920f377..5de2d3d75c 100644 --- a/doc/src/restart.rst +++ b/doc/src/restart.rst @@ -12,7 +12,7 @@ Syntax restart N root keyword value ... restart N file1 file2 keyword value ... -* N = write a restart file on timesteps which are multipls of N +* N = write a restart file on timesteps which are multiples of N * N can be a variable (see below) * root = filename to which timestep # is appended * file1,file2 = two full filenames, toggle between them when writing file From e415eddee504c84cec37fdfa085607e0ce13a541 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Sep 2022 14:16:22 -0400 Subject: [PATCH 119/364] spelling and improved consistency with other doc pages --- doc/src/dump_modify.rst | 16 +++++------ doc/src/fix_pair.rst | 32 ++++++++++++--------- doc/src/pair_amoeba.rst | 16 +++++------ doc/src/pair_eam.rst | 13 ++++----- doc/utils/sphinx-config/false_positives.txt | 2 ++ 5 files changed, 42 insertions(+), 37 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index eddf36c44c..275ad26325 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -702,7 +702,7 @@ The *skip* keyword can be used with all dump styles. It allows a dump snapshot to be skipped (not written to the dump file), if a condition is met. The condition is computed by an :doc:`equal-style variable `, which should be specified as v_name, where name is the -variable name. If the variable evaulation returns a non-zero value, +variable name. If the variable evaluation returns a non-zero value, then the dump snapshot is skipped. If it returns zero, the dump proceeds as usual. Note that :doc:`equal-style variable ` can contain Boolean operators which effectively evaluate as a true @@ -718,12 +718,12 @@ value. The *sort* keyword determines whether lines of per-atom output in a snapshot are sorted or not. A sort value of *off* means they will typically be written in indeterminate order, either in serial or -parallel. This is the case even in serial if the :doc:`atom_modify -sort ` option is turned on, which it is by default, to -improve performance. A sort value of *id* means sort the output by -atom ID. A sort value of N or -N means sort the output by the value -in the Nth column of per-atom info in either ascending or descending -order. +parallel. This is the case even in serial if the :doc:`atom_modify sort +` option is turned on, which it is by default, to improve +performance. A sort value of *id* means sort the output by atom ID. A +sort value of :math:`N` or :math:`-N` means sort the output by the value +in the :math:`N`\ th column of per-atom info in either ascending or +descending order. The dump *local* style cannot be sorted by atom ID, since there are typically multiple lines of output per atom. Some dump styles, such @@ -766,7 +766,7 @@ attributes that can be tested for are the same as those that can be specified in the :doc:`dump custom ` command, with the exception of the *element* attribute, since it is not a numeric value. Note that a different attributes can be used than those output by the -:doc:`dump custom ` command. E.g. you can output the +:doc:`dump custom ` command. For example, you can output the coordinates and stress of atoms whose energy is above some threshold. If an atom-style variable is used as the attribute, then it can diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index b1d3010be0..0718be5d3c 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -8,12 +8,12 @@ Syntax .. parsed-literal:: - fix ID group-ID pair N pairstyle name flag ... + fix ID group-ID pair N pstyle name flag ... * ID, group-ID are documented in :doc:`fix ` command * pair = style name of this fix command * N = invoke this fix once every N timesteps -* pairstyle = name of pair style to extract info from (e.g. eam) +* pstyle = name of pair style to extract info from (e.g. eam) * one or more name/flag pairs can be listed * name = name of quantity the pair style allows extraction of * flag = 1 if pair style needs to be triggered to produce data for name, 0 if not @@ -46,7 +46,7 @@ These are example use cases: The *N* argument determines how often the fix is invoked. -The *pairstyle* argument is the name of the pair style. It can be a +The *pstyle* argument is the name of the pair style. It can be a sub-style used in a :doc:`pair_style hybrid ` command. One or more *name/flag* pairs of arguments follow. Each *name* is a @@ -55,11 +55,11 @@ request. See the doc pages for individual :doc:`pair_styles ` to see what fix pair requests (if any) they support. The *flag* setting determines whether this fix will also trigger the -pair style to compute the named quantity so it can be extracted. If -the quantity is always computed by the pair style, no trigger is -needed; specify *flag* = 0. If the quantity is not always computed -(e.g. it is expensive to calculate), then specify *flag* = 1. This -will trigger the quantity to be calculated only on timesteps it is +pair style to compute the named quantity so it can be extracted. If the +quantity is always computed by the pair style, no trigger is needed; +specify *flag* = 0. If the quantity is not always computed +(e.g. because it is expensive to calculate), then specify *flag* = 1. +This will trigger the quantity to be calculated only on timesteps it is needed. Again, see the doc pages for individual :doc:`pair_styles ` to determine which fix pair requests (if any) need to be triggered with a *flag* = 1 setting. @@ -71,12 +71,16 @@ atom, then this fix stores it as a per-atom vector. Otherwise a per-atom array is created, with its data in the order of the *name* arguments. -For example, :doc:`pair_style amoeba ` allows extraction -of two named quantities: "uind" and "uinp", both of which are -3-vectors for each atom, i.e. dipole moments. If this fix specifies -"uind" and "uinp" (in that order), then a 6-column per-atom array will -be created. Columns 1-3 will store the "uind" values; columns 4-6 -will store the "uinp" values. +For example, :doc:`pair_style amoeba ` allows extraction of +two named quantities: "uind" and "uinp", both of which are 3-vectors for +each atom, i.e. dipole moments. In the example below a 6-column per-atom +array will be created. Columns 1-3 will store the "uind" values; +columns 4-6 will store the "uinp" values. + +.. code-block:: LAMMPS + + pair_style amoeba + fix ex all pair amoeba 10 uind 0 uinp 0 Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/pair_amoeba.rst b/doc/src/pair_amoeba.rst index 22ec2281dd..44a14f0f45 100644 --- a/doc/src/pair_amoeba.rst +++ b/doc/src/pair_amoeba.rst @@ -158,15 +158,15 @@ settings. .. versionadded:: TBD -The *amoeba* and *hippo* pair styles support extraction of two -per-atom quantities by the :doc:`fix pair ` command. This -allows the quantities to be output to files by the :doc:`dump ` -or otherwise processed by other LAMMPS commamds. +The *amoeba* and *hippo* pair styles support extraction of two per-atom +quantities by the :doc:`fix pair ` command. This allows the +quantities to be output to files by the :doc:`dump ` or otherwise +processed by other LAMMPS commands. -The names of the two quantites are "uind" and "uinp" for the induced -dipole moments for each atom. Neither quantity needs to be triggered -by the :doc:`fix pair ` command in order for these pair -styles to calculate it. +The names of the two quantities are "uind" and "uinp" for the induced +dipole moments for each atom. Neither quantity needs to be triggered by +the :doc:`fix pair ` command in order for these pair styles to +calculate it. ---------- diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index bb8433f101..af936a6bc9 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -447,15 +447,14 @@ identical to the FS EAM files (see above). .. versionadded:: TBD The *eam*, *eam/alloy*, *eam/fs*, and *eam/he* pair styles support -extraction of two per-atom quantities by the :doc:`fix pair -` command. This allows the quantities to be output to files -by the :doc:`dump ` or otherwise processed by other LAMMPS -commamds. +extraction of two per-atom quantities by the :doc:`fix pair ` +command. This allows the quantities to be output to files by the +:doc:`dump ` or otherwise processed by other LAMMPS commands. -The names of the two quantites are "rho" and "fp" for the density and +The names of the two quantities are "rho" and "fp" for the density and derivative of the embedding energy for each atom. Neither quantity -needs to be triggered by the :doc:`fix pair ` command in -order for these pair styles to calculate it. +needs to be triggered by the :doc:`fix pair ` command in order +for these pair styles to calculate it. ---------- diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c6c6a2de6a..15316b4f09 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -3581,7 +3581,9 @@ UEF ufm Uhlenbeck Ui +uind uInfParallel +uinp uk ul ulb From a52c4a55375d9737b8d569de5513f52f97dabcc0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Sep 2022 14:35:57 -0400 Subject: [PATCH 120/364] improve error messages --- src/fix_pair.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 3c967e2cfa..6f98ad2790 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -37,14 +37,14 @@ using namespace FixConst; FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg < 7) error->all(FLERR,"Illegal fix pair command"); + if (narg < 7) utils::missing_cmd_args(FLERR, "fix pair", error); nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery < 1) error->all(FLERR,"Illegal fix pair command"); + if (nevery < 1) error->all(FLERR,"Illegal fix pair every value: {}", nevery); pairname = utils::strdup(arg[4]); pstyle = force->pair_match(pairname,1,0); - if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); + if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); nfield = (narg-5) / 2; fieldname = new char*[nfield]; @@ -54,12 +54,12 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : int iarg = 5; while (iarg < narg) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix pair command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix pair {}", arg[iarg]), error); fieldname[nfield] = utils::strdup(arg[iarg]); int flag = utils::inumeric(FLERR,arg[iarg+1],true,lmp); if (flag == 0) trigger[nfield] = 0; else if (flag == 1) trigger[nfield] = 1; - else error->all(FLERR,"Illegal fix pair command"); + else error->all(FLERR,"Illegal fix pair {} command flag: {}", arg[iarg], arg[iarg+1]); nfield++; iarg += 2; } @@ -70,10 +70,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { if (trigger[ifield] == 0) triggername[ifield] = nullptr; - else { - auto str = fmt::format("%s_flag", fieldname[ifield]); - triggername[nfield] = utils::strdup(str); - } + else triggername[nfield] = utils::strdup(fmt::format("{}_flag", fieldname[ifield])); } // extract all fields just to get number of per-atom values @@ -94,10 +91,10 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : int dim; triggerptr[ifield] = (int *) pstyle->extract(triggername[ifield],dim); if (!triggerptr[ifield]) - error->all(FLERR,"Fix pair pair style cannot extract {}", - triggername[ifield]); - if (dim) error->all(FLERR,"Fix pair pair style {} is not a scalar", - triggername[ifield]); + error->all(FLERR,"Fix pair pair style cannot extract {}", triggername[ifield]); + if (dim) + error->all(FLERR,"Fix pair pair style {} trigger {} is not a scalar", + pairname, triggername[ifield]); } } @@ -145,16 +142,16 @@ FixPair::~FixPair() atom->delete_callback(id,Atom::GROW); - delete [] pairname; + delete[] pairname; for (int ifield = 0; ifield < nfield; ifield++) { - delete [] fieldname[ifield]; - delete [] triggername[ifield]; + delete[] fieldname[ifield]; + delete[] triggername[ifield]; } - delete [] fieldname; - delete [] trigger; - delete [] triggername; - delete [] triggerptr; + delete[] fieldname; + delete[] trigger; + delete[] triggername; + delete[] triggerptr; if (ncols == 1) memory->destroy(vector); else memory->destroy(array); @@ -179,7 +176,7 @@ void FixPair::init() // insure pair style still exists pstyle = force->pair_match(pairname,1,0); - if (pstyle == nullptr) error->all(FLERR,"Fix pair pair style not found"); + if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); } /* ---------------------------------------------------------------------- */ From 69034167b87c9ca782a92cfad3a968903c4c3de6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Sep 2022 16:29:10 -0400 Subject: [PATCH 121/364] update versions strings for the next patch release --- doc/lammps.1 | 4 ++-- doc/src/Developer_updating.rst | 4 ++-- doc/src/Howto_type_labels.rst | 2 +- doc/src/angle_mesocnt.rst | 2 +- doc/src/bond_mesocnt.rst | 2 +- doc/src/compute_property_atom.rst | 2 +- doc/src/labelmap.rst | 2 +- doc/src/pair_mesocnt.rst | 4 ++-- doc/src/set.rst | 8 ++++---- src/version.h | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index f1a3d0f2f9..e4f0f2a9eb 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,7 +1,7 @@ -.TH LAMMPS "1" "3 August 2022" "2022-8-3" +.TH LAMMPS "1" "15 September 2022" "2022-9-15" .SH NAME .B LAMMPS -\- Molecular Dynamics Simulator. Version 3 August 2022 +\- Molecular Dynamics Simulator. Version 15 September 2022 .SH SYNOPSIS .B lmp diff --git a/doc/src/Developer_updating.rst b/doc/src/Developer_updating.rst index c4831d8db7..091312d68e 100644 --- a/doc/src/Developer_updating.rst +++ b/doc/src/Developer_updating.rst @@ -328,7 +328,7 @@ removed so this update is **required** to avoid compilation failure. Split of fix STORE into fix STORE/GLOBAL and fix STORE/PERATOM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 This change splits the GLOBAL and PERATOM modes of fix STORE into two separate fixes STORE/GLOBAL and STORE/PERATOM. There was very little @@ -387,7 +387,7 @@ This change is **required** or else the code will not compile. Use Output::get_dump_by_id() instead of Output::find_dump() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 The accessor function to individual dump style instances has been changed from ``Output::find_dump()`` returning the index of the dump instance in diff --git a/doc/src/Howto_type_labels.rst b/doc/src/Howto_type_labels.rst index ec32aff95f..8f03f45ef9 100644 --- a/doc/src/Howto_type_labels.rst +++ b/doc/src/Howto_type_labels.rst @@ -1,7 +1,7 @@ Type labels =========== -.. versionadded:: TBD +.. versionadded:: 15Sep2022 Each atom in LAMMPS has an associated numeric atom type. Similarly, each bond, angle, dihedral, and improper is assigned a bond type, diff --git a/doc/src/angle_mesocnt.rst b/doc/src/angle_mesocnt.rst index 94383929f8..2d7e98e737 100644 --- a/doc/src/angle_mesocnt.rst +++ b/doc/src/angle_mesocnt.rst @@ -24,7 +24,7 @@ Examples Description """"""""""" -.. versionadded:: TBD +.. versionadded:: 15Sep2022 The *mesocnt* angle style uses the potential diff --git a/doc/src/bond_mesocnt.rst b/doc/src/bond_mesocnt.rst index 4631519440..8ed357a06b 100644 --- a/doc/src/bond_mesocnt.rst +++ b/doc/src/bond_mesocnt.rst @@ -22,7 +22,7 @@ Examples Description """"""""""" -.. versionadded:: TBD +.. versionadded:: 15Sep2022 The *mesocnt* bond style is a wrapper for the :doc:`harmonic ` style, and uses the potential diff --git a/doc/src/compute_property_atom.rst b/doc/src/compute_property_atom.rst index 71cf4dda72..1eaf4e7513 100644 --- a/doc/src/compute_property_atom.rst +++ b/doc/src/compute_property_atom.rst @@ -167,7 +167,7 @@ triangular particles and define the corner points of each triangle. In addition, the various per-atom quantities listed above for specific packages are only accessible by this command. -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 The *espin* property was previously called *spin*. diff --git a/doc/src/labelmap.rst b/doc/src/labelmap.rst index 98bc4cfbd3..57e4926611 100644 --- a/doc/src/labelmap.rst +++ b/doc/src/labelmap.rst @@ -33,7 +33,7 @@ Examples Description """"""""""" -.. versionadded:: TBD +.. versionadded:: 15Sep2022 Define alphanumeric type labels to associate with one or more numeric atom, bond, angle, dihedral or improper types. A collection of type diff --git a/doc/src/pair_mesocnt.rst b/doc/src/pair_mesocnt.rst index 4833ea6eb8..dcc50161c5 100644 --- a/doc/src/pair_mesocnt.rst +++ b/doc/src/pair_mesocnt.rst @@ -48,7 +48,7 @@ in LAMMPS. For the exact functional form of the potential and implementation details, the reader is referred to the original papers :ref:`(Volkov1) ` and :ref:`(Volkov2) `. -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 The potential supports two modes, *segment* and *chain*. By default, *chain* mode is enabled. In *segment* mode, interactions are @@ -84,7 +84,7 @@ is faster and is enabled by default. IDs. If this is not possible (e.g. in simulations of CNT rings), *topology* mode needs to be enabled in the pair_style command. -.. versionadded:: TBD +.. versionadded:: 15Sep2022 In addition to the LJ interactions described above, style *mesocnt/viscous* explicitly models friction between neighboring diff --git a/doc/src/set.rst b/doc/src/set.rst index 3d970d7044..a3f50fe1cd 100644 --- a/doc/src/set.rst +++ b/doc/src/set.rst @@ -282,25 +282,25 @@ the orientation of a particular atom is the same, regardless of how many processors are being used. This keyword does not allow use of an atom-style variable. -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 Keyword *spin/atom* uses the specified g value to set the magnitude of the magnetic spin vectors, and the x,y,z values as components of a vector to set as the orientation of the magnetic spin vectors of the selected atoms. This keyword was previously called *spin*. -.. versionchanged:: TBD +.. versionchanged:: 15Sep2022 Keyword *spin/atom/random* randomizes the orientation of the magnetic spin vectors for the selected atoms and sets the magnitude of each to the specified *Dlen* value. This keyword was previously called *spin/random*. -.. versionadded:: TBD +.. versionadded:: 15Sep2022 Keyword *radius/electron* uses the specified value to set the radius of electrons or fixed cores. -.. versionadded:: TBD +.. versionadded:: 15Sep2022 Keyword *spin/electron* sets the spin of an electron (+/- 1) or indicates nuclei (=0), fixed-cores (=2), or pseudo-cores (= 3). diff --git a/src/version.h b/src/version.h index 5358478b59..8f9e5a3941 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "3 Aug 2022" +#define LAMMPS_VERSION "15 Sep 2022" From 2997fff361620e203ef83f4a84da0281ce2c5d3e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Sep 2022 16:48:33 -0400 Subject: [PATCH 122/364] update version strings --- doc/src/dump_modify.rst | 2 +- doc/src/fix_pair.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 275ad26325..7b16a9ce4d 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -696,7 +696,7 @@ most effective when the typical magnitude of position data is between ---------- -.. versionadded:: TBD +.. versionadded:: 15Sep2022 The *skip* keyword can be used with all dump styles. It allows a dump snapshot to be skipped (not written to the dump file), if a condition diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index 0718be5d3c..abb44718cd 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -30,7 +30,7 @@ Examples Description """"""""""" -.. versionadded:: TBD +.. versionadded:: 15Sep2022 Extract per-atom quantities from a pair style and store them in this fix so they can be accessed by other LAMMPS commands, e.g. by a From 72573987fa106689597057b6f8bc370d0f731384 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 14 Sep 2022 21:07:32 -0500 Subject: [PATCH 123/364] I wrote unit tests for all the Fortran interface commands in this pull request --- fortran/lammps.f90 | 466 +++++++++-------- unittest/fortran/CMakeLists.txt | 25 +- unittest/fortran/test_fortran_box.f90 | 142 +++++ unittest/fortran/test_fortran_commands.f90 | 1 + .../fortran/test_fortran_extract_global.f90 | 491 ++++++++++++++++++ unittest/fortran/test_fortran_get_thermo.f90 | 174 +++++++ unittest/fortran/test_fortran_properties.f90 | 52 ++ unittest/fortran/wrap_box.cpp | 64 +++ unittest/fortran/wrap_extract_global.cpp | 177 +++++++ unittest/fortran/wrap_get_thermo.cpp | 67 +++ unittest/fortran/wrap_properties.cpp | 109 ++++ 11 files changed, 1556 insertions(+), 212 deletions(-) create mode 100644 unittest/fortran/test_fortran_box.f90 create mode 100644 unittest/fortran/test_fortran_extract_global.f90 create mode 100644 unittest/fortran/test_fortran_get_thermo.f90 create mode 100644 unittest/fortran/test_fortran_properties.f90 create mode 100644 unittest/fortran/wrap_box.cpp create mode 100644 unittest/fortran/wrap_extract_global.cpp create mode 100644 unittest/fortran/wrap_get_thermo.cpp create mode 100644 unittest/fortran/wrap_properties.cpp diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 5916823df1..7541bf7c0f 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -19,19 +19,19 @@ ! Karl D. Hammond ! University of Missouri, 2012-2020 ! -! The Fortran module tries to follow the API of the C-library interface -! closely, but like the Python wrapper it employs an object oriented -! approach. To accommodate the object oriented approach, all exported -! subroutine and functions have to be implemented in Fortran to then -! call the interfaced C style functions with adapted calling conventions -! as needed. The C-library interfaced functions retain their names -! starting with "lammps_" while the Fortran versions start with "lmp_". +! The Fortran module tries to follow the API of the C library interface +! closely, but like the Python wrapper it employs an object-oriented +! approach. To accommodate the object-oriented approach, all exported +! subroutines and functions have to be implemented in Fortran and +! call the interfaced C-style functions with adapted calling conventions +! as needed. The C library interface functions retain their names +! starting with "lammps_", while the Fortran versions start with "lmp_". ! MODULE LIBLAMMPS USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_loc, & c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, c_f_pointer - USE, INTRINSIC :: ISO_Fortran_env, ONLY : ERROR_UNIT, OUTPUT_UNIT ! FIXME + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : ERROR_UNIT IMPLICIT NONE PRIVATE @@ -69,6 +69,7 @@ MODULE LIBLAMMPS PROCEDURE :: extract_setting => lmp_extract_setting PROCEDURE :: extract_global => lmp_extract_global PROCEDURE :: version => lmp_version + PROCEDURE :: is_running => lmp_is_running END TYPE lammps INTERFACE lammps @@ -104,257 +105,262 @@ MODULE LIBLAMMPS ! LAMMPS data (after checking type-compatibility) INTERFACE ASSIGNMENT(=) MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & + assign_intvec_to_lammps_data, & assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & assign_string_to_lammps_data END INTERFACE ! interface definitions for calling functions in library.cpp INTERFACE - FUNCTION lammps_open(argc, argv, comm) BIND(C,name='lammps_open_fortran') - IMPORT :: c_ptr, c_int - IMPLICIT NONE - INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm - TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv - TYPE(c_ptr) :: lammps_open - END FUNCTION lammps_open + FUNCTION lammps_open(argc, argv, comm) BIND(C,name='lammps_open_fortran') + IMPORT :: c_ptr, c_int + IMPLICIT NONE + INTEGER(c_int), VALUE, INTENT(IN) :: argc, comm + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv + TYPE(c_ptr) :: lammps_open + END FUNCTION lammps_open - FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - INTEGER(c_int), VALUE, INTENT(IN) :: argc - TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv - TYPE(c_ptr), VALUE, INTENT(IN) :: handle - TYPE(c_ptr) :: lammps_open_no_mpi - END FUNCTION lammps_open_no_mpi + FUNCTION lammps_open_no_mpi(argc, argv, handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + INTEGER(c_int), VALUE, INTENT(IN) :: argc + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: argv + TYPE(c_ptr), VALUE, INTENT(IN) :: handle + TYPE(c_ptr) :: lammps_open_no_mpi + END FUNCTION lammps_open_no_mpi - SUBROUTINE lammps_close(handle) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - END SUBROUTINE lammps_close + SUBROUTINE lammps_close(handle) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END SUBROUTINE lammps_close - SUBROUTINE lammps_mpi_init() BIND(C) - END SUBROUTINE lammps_mpi_init + SUBROUTINE lammps_mpi_init() BIND(C) + END SUBROUTINE lammps_mpi_init - SUBROUTINE lammps_mpi_finalize() BIND(C) - END SUBROUTINE lammps_mpi_finalize + SUBROUTINE lammps_mpi_finalize() BIND(C) + END SUBROUTINE lammps_mpi_finalize - SUBROUTINE lammps_kokkos_finalize() BIND(C) - END SUBROUTINE lammps_kokkos_finalize + SUBROUTINE lammps_kokkos_finalize() BIND(C) + END SUBROUTINE lammps_kokkos_finalize - SUBROUTINE lammps_file(handle, filename) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: filename - END SUBROUTINE lammps_file + SUBROUTINE lammps_file(handle, filename) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: filename + END SUBROUTINE lammps_file - SUBROUTINE lammps_command(handle, cmd) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: cmd - END SUBROUTINE lammps_command + SUBROUTINE lammps_command(handle, cmd) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: cmd + END SUBROUTINE lammps_command - SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int), VALUE, INTENT(IN) :: ncmd - TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds - END SUBROUTINE lammps_commands_list + SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE, INTENT(IN) :: ncmd + TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds + END SUBROUTINE lammps_commands_list - SUBROUTINE lammps_commands_string(handle, str) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: str - END SUBROUTINE lammps_commands_string + SUBROUTINE lammps_commands_string(handle, str) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: str + END SUBROUTINE lammps_commands_string - FUNCTION lammps_get_natoms(handle) BIND(C) - IMPORT :: c_ptr, c_double - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - REAL(c_double) :: lammps_get_natoms - END FUNCTION lammps_get_natoms + FUNCTION lammps_get_natoms(handle) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + REAL(c_double) :: lammps_get_natoms + END FUNCTION lammps_get_natoms - FUNCTION lammps_get_thermo(handle,name) BIND(C) - IMPORT :: c_ptr, c_double - IMPLICIT NONE - REAL(c_double) :: lammps_get_thermo - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: name - END FUNCTION lammps_get_thermo + FUNCTION lammps_get_thermo(handle,name) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + REAL(c_double) :: lammps_get_thermo + TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: name + END FUNCTION lammps_get_thermo - SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & - boxflag) BIND(C) - IMPORT :: c_ptr, c_double, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & - boxflag - END SUBROUTINE lammps_extract_box + SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & + boxflag) BIND(C) + IMPORT :: c_ptr, c_double, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & + boxflag + END SUBROUTINE lammps_extract_box - SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) - IMPORT :: c_ptr, c_double - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - REAL(c_double), DIMENSION(3) :: boxlo, boxhi - REAL(c_double), VALUE :: xy, yz, xz - END SUBROUTINE lammps_reset_box + SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + REAL(c_double), DIMENSION(3) :: boxlo, boxhi + REAL(c_double), VALUE :: xy, yz, xz + END SUBROUTINE lammps_reset_box - SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) - IMPORT :: c_ptr, c_double - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - REAL(c_double), DIMENSION(*) :: meminfo - END SUBROUTINE lammps_memory_usage + SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) + IMPORT :: c_ptr, c_double + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + REAL(c_double), DIMENSION(*) :: meminfo + END SUBROUTINE lammps_memory_usage - FUNCTION lammps_get_mpi_comm(handle) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int) :: lammps_get_mpi_comm - END FUNCTION lammps_get_mpi_comm + FUNCTION lammps_get_mpi_comm(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int) :: lammps_get_mpi_comm + END FUNCTION lammps_get_mpi_comm - FUNCTION lammps_extract_setting(handle,keyword) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, keyword - INTEGER(c_int) :: lammps_extract_setting - END FUNCTION lammps_extract_setting + FUNCTION lammps_extract_setting(handle,keyword) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, keyword + INTEGER(c_int) :: lammps_extract_setting + END FUNCTION lammps_extract_setting - FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name - INTEGER(c_int) :: lammps_extract_global_datatype - END FUNCTION lammps_extract_global_datatype + FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_global_datatype + END FUNCTION lammps_extract_global_datatype - FUNCTION c_strlen (str) BIND(C,name='strlen') - IMPORT :: c_ptr, c_size_t - IMPLICIT NONE - TYPE(c_ptr) :: str - INTEGER(c_size_t) :: c_strlen - END FUNCTION c_strlen + FUNCTION c_strlen (str) BIND(C,name='strlen') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + TYPE(c_ptr), VALUE :: str + INTEGER(c_size_t) :: c_strlen + END FUNCTION c_strlen - FUNCTION lammps_extract_global(handle, name) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name - TYPE(c_ptr) :: lammps_extract_global - END FUNCTION lammps_extract_global + FUNCTION lammps_extract_global(handle, name) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr) :: lammps_extract_global + END FUNCTION lammps_extract_global - !INTEGER (c_int) FUNCTION lammps_extract_atom_datatype + !INTEGER (c_int) FUNCTION lammps_extract_atom_datatype - !(generic) lammps_extract_atom + !(generic) lammps_extract_atom - !(generic) lammps_extract_compute + !(generic) lammps_extract_compute - !(generic) lammps_extract_fix + !(generic) lammps_extract_fix - !(generic) lammps_extract_variable + !(generic) lammps_extract_variable - !INTEGER (c_int) lammps_set_variable + !INTEGER (c_int) lammps_set_variable - !SUBROUTINE lammps_gather_atoms + !SUBROUTINE lammps_gather_atoms - !SUBROUTINE lammps_gather_atoms_concat + !SUBROUTINE lammps_gather_atoms_concat - !SUBROUTINE lammps_gather_atoms_subset + !SUBROUTINE lammps_gather_atoms_subset - !SUBROUTINE lammps_scatter_atoms + !SUBROUTINE lammps_scatter_atoms - !SUBROUTINE lammps_scatter_atoms_subset + !SUBROUTINE lammps_scatter_atoms_subset - !SUBROUTINE lammps_gather_bonds + !SUBROUTINE lammps_gather_bonds - !SUBROUTINE lammps_gather + !SUBROUTINE lammps_gather - !SUBROUTINE lammps_gather_concat + !SUBROUTINE lammps_gather_concat - !SUBROUTINE lammps_gather_subset + !SUBROUTINE lammps_gather_subset - !SUBROUTINE lammps_scatter_subset + !SUBROUTINE lammps_scatter_subset - !(generic / id, type, and image are special) / requires LAMMPS_BIGBIG - !INTEGER (C_int) FUNCTION lammps_create_atoms + !(generic / id, type, and image are special) / requires LAMMPS_BIGBIG + !INTEGER (C_int) FUNCTION lammps_create_atoms - !INTEGER (C_int) FUNCTION lammps_find_pair_neighlist + !INTEGER (C_int) FUNCTION lammps_find_pair_neighlist - !INTEGER (C_int) FUNCTION lammps_find_fix_neighlist + !INTEGER (C_int) FUNCTION lammps_find_fix_neighlist - !INTEGER (C_int) FUNCTION lammps_find_compute_neighlist + !INTEGER (C_int) FUNCTION lammps_find_compute_neighlist - !INTEGER (C_int) FUNCTION lammps_neighlist_num_elements + !INTEGER (C_int) FUNCTION lammps_neighlist_num_elements - !SUBROUTINE lammps_neighlist_element_neighbors + !SUBROUTINE lammps_neighlist_element_neighbors - FUNCTION lammps_version(handle) BIND(C) - IMPORT :: c_ptr, c_int - IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int) :: lammps_version - END FUNCTION lammps_version + FUNCTION lammps_version(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int) :: lammps_version + END FUNCTION lammps_version - !SUBROUTINE lammps_get_os_info + !SUBROUTINE lammps_get_os_info - !LOGICAL FUNCTION lammps_config_has_mpi_support - !LOGICAL FUNCTION lammps_config_has_gzip_support - !LOGICAL FUNCTION lammps_config_has_png_support - !LOGICAL FUNCTION lammps_config_has_jpeg_support - !LOGICAL FUNCTION lammps_config_has_ffmpeg_support - !LOGICAL FUNCTION lammps_config_has_exceptions - !LOGICAL FUNCTION lammps_config_has_package - !INTEGER (C_int) FUNCTION lammps_config_package_count - !SUBROUTINE lammps_config_package_name + !LOGICAL FUNCTION lammps_config_has_mpi_support + !LOGICAL FUNCTION lammps_config_has_gzip_support + !LOGICAL FUNCTION lammps_config_has_png_support + !LOGICAL FUNCTION lammps_config_has_jpeg_support + !LOGICAL FUNCTION lammps_config_has_ffmpeg_support + !LOGICAL FUNCTION lammps_config_has_exceptions + !LOGICAL FUNCTION lammps_config_has_package + !INTEGER (C_int) FUNCTION lammps_config_package_count + !SUBROUTINE lammps_config_package_name - !LOGICAL FUNCTION lammps_config_accelerator - !LOGICAL FUNCTION lammps_has_gpu_device - !SUBROUTINE lammps_get_gpu_device + !LOGICAL FUNCTION lammps_config_accelerator + !LOGICAL FUNCTION lammps_has_gpu_device + !SUBROUTINE lammps_get_gpu_device - !LOGICAL FUNCTION lammps_has_id - !INTEGER (C_int) FUNCTION lammps_id_count - !SUBROUTINE lammps_id_name + !LOGICAL FUNCTION lammps_has_id + !INTEGER (C_int) FUNCTION lammps_id_count + !SUBROUTINE lammps_id_name - !INTEGER (C_int) FUNCTION lammps_plugin_count - !SUBROUTINE lammps_plugin_name + !INTEGER (C_int) FUNCTION lammps_plugin_count + !SUBROUTINE lammps_plugin_name - !Both of these use LAMMPS_BIGBIG - !INTEGER (LAMMPS_imageint) FUNCTION lammps_encode_image_flags - !SUBROUTINE lammps_decode_image_flags + !Both of these use LAMMPS_BIGBIG + !INTEGER (LAMMPS_imageint) FUNCTION lammps_encode_image_flags + !SUBROUTINE lammps_decode_image_flags - !SUBROUTINE lammps_set_fix_external_callback ! may have trouble.... - !FUNCTION lammps_fix_external_get_force() ! returns real(c_double) (:) + !SUBROUTINE lammps_set_fix_external_callback ! may have trouble.... + !FUNCTION lammps_fix_external_get_force() ! returns real(c_double) (:) - !SUBROUTINE lammps_fix_external_set_energy_global - !SUBROUTINE lammps_fix_external_set_energy_peratom - !SUBROUTINE lammps_fix_external_set_virial_global - !SUBROUTINE lammps_fix_external_set_virial_peratom - !SUBROUTINE lammps_fix_external_set_vector_length - !SUBROUTINE lammps_fix_external_set_vector + !SUBROUTINE lammps_fix_external_set_energy_global + !SUBROUTINE lammps_fix_external_set_energy_peratom + !SUBROUTINE lammps_fix_external_set_virial_global + !SUBROUTINE lammps_fix_external_set_virial_peratom + !SUBROUTINE lammps_fix_external_set_vector_length + !SUBROUTINE lammps_fix_external_set_vector - !SUBROUTINE lammps_flush_buffers + !SUBROUTINE lammps_flush_buffers - FUNCTION lammps_malloc(size) BIND(C, name='malloc') - IMPORT :: c_ptr, c_size_t - IMPLICIT NONE - INTEGER(c_size_t), VALUE :: size - TYPE(c_ptr) :: lammps_malloc - END FUNCTION lammps_malloc + FUNCTION lammps_malloc(size) BIND(C, name='malloc') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + INTEGER(c_size_t), VALUE :: size + TYPE(c_ptr) :: lammps_malloc + END FUNCTION lammps_malloc - SUBROUTINE lammps_free(ptr) BIND(C) - IMPORT :: c_ptr - IMPLICIT NONE - TYPE(c_ptr), VALUE :: ptr - END SUBROUTINE lammps_free + SUBROUTINE lammps_free(ptr) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: ptr + END SUBROUTINE lammps_free - !LOGICAL FUNCTION lammps_is_running + INTEGER(c_int) FUNCTION lammps_is_running(handle) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END FUNCTION lammps_is_running - !SUBROUTINE lammps_force_timeout + !SUBROUTINE lammps_force_timeout - !LOGICAL FUNCTION lammps_has_error + !LOGICAL FUNCTION lammps_has_error - !INTEGER (c_int) FUNCTION lammps_get_last_error_message + !INTEGER (c_int) FUNCTION lammps_get_last_error_message END INTERFACE @@ -558,7 +564,7 @@ CONTAINS ! equivalent function to lammps_extract_global ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS - FUNCTION lmp_extract_global (self, name) result(global_data) + FUNCTION lmp_extract_global (self, name) RESULT (global_data) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: global_data @@ -622,7 +628,7 @@ CONTAINS CASE DEFAULT WRITE(ERROR_UNIT,'(A)') 'ERROR: Unknown pointer type in& & extract_global' - STOP + STOP 2 END SELECT END FUNCTION @@ -633,6 +639,13 @@ CONTAINS lmp_version = lammps_version(self%handle) END FUNCTION lmp_version + ! equivalent function to lammps_is_running + LOGICAL FUNCTION lmp_is_running(self) + CLASS(lammps) :: self + + lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) + END FUNCTION lmp_is_running + ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS data ! ---------------------------------------------------------------------- @@ -643,8 +656,7 @@ CONTAINS IF ( rhs%datatype == DATA_INT ) THEN lhs => rhs%i32 ELSE - WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' - STOP + CALL assignment_error(rhs%datatype, 'scalar int') END IF END SUBROUTINE assign_int_to_lammps_data @@ -655,11 +667,21 @@ CONTAINS IF ( rhs%datatype == DATA_INT64 ) THEN lhs => rhs%i64 ELSE - WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' - STOP + CALL assignment_error(rhs%datatype, 'scalar long int') END IF END SUBROUTINE assign_int64_to_lammps_data + SUBROUTINE assign_intvec_to_lammps_data (lhs, rhs) + INTEGER(c_int), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_INT_1D ) THEN + lhs => rhs%i32_vec + ELSE + CALL assignment_error(rhs%datatype, 'vector of ints') + END IF + END SUBROUTINE assign_intvec_to_lammps_data + SUBROUTINE assign_double_to_lammps_data (lhs, rhs) REAL(c_double), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -667,8 +689,7 @@ CONTAINS IF ( rhs%datatype == DATA_DOUBLE ) THEN lhs => rhs%r64 ELSE - WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' - STOP + CALL assignment_error(rhs%datatype, 'scalar double') END IF END SUBROUTINE assign_double_to_lammps_data @@ -679,8 +700,7 @@ CONTAINS IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN lhs => rhs%r64_vec ELSE - WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' - STOP + CALL assignment_error(rhs%datatype, 'vector of doubles') END IF END SUBROUTINE assign_doublevec_to_lammps_data @@ -691,11 +711,41 @@ CONTAINS IF ( rhs%datatype == DATA_STRING ) THEN lhs = rhs%str ELSE - WRITE(ERROR_UNIT,'(A)') 'ERROR: Data types incompatible in assignment' - STOP + CALL assignment_error(rhs%datatype, 'string') END IF END SUBROUTINE assign_string_to_lammps_data + SUBROUTINE assignment_error (type1, type2) + INTEGER (c_int) :: type1 + CHARACTER (LEN=*) :: type2 + INTEGER, PARAMETER :: ERROR_CODE = 1 + CHARACTER (LEN=:), ALLOCATABLE :: str1 + + SELECT CASE (type1) + CASE (DATA_INT) + str1 = 'scalar int' + CASE (DATA_INT_1D) + str1 = 'vector of ints' + CASE (DATA_INT_2D) + str1 = 'matrix of ints' + CASE (DATA_INT64) + str1 = 'scalar long int' + CASE (DATA_INT64_1D) + str1 = 'vector of long ints' + CASE (DATA_INT64_2D) + str1 = 'matrix of long ints' + CASE (DATA_DOUBLE) + str1 = 'scalar double' + CASE (DATA_DOUBLE_1D) + str1 = 'vector of doubles' + CASE (DATA_DOUBLE_2D) + str1 = 'matrix of doubles' + CASE DEFAULT + str1 = 'that type' + END SELECT + WRITE (ERROR_UNIT,'(A)') 'Cannot associate ' // str1 // ' with ' // type2 + STOP ERROR_CODE + END SUBROUTINE assignment_error ! ---------------------------------------------------------------------- ! local helper functions diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index c7174d8e6e..c2bea82480 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -6,14 +6,14 @@ endif() include(CheckLanguage) check_language(Fortran) -if(NOT CMAKE_Fortran_COMPILER_ID) - message(STATUS "Skipping Tests for the LAMMPS Fortran Module: cannot identify Fortran compiler") - return() -endif() if(CMAKE_Fortran_COMPILER) enable_language(C) enable_language(Fortran) + if(NOT CMAKE_Fortran_COMPILER_ID) + message(STATUS "Skipping Tests for the LAMMPS Fortran Module: cannot identify Fortran compiler") + return() + endif() get_filename_component(LAMMPS_FORTRAN_MODULE ${LAMMPS_SOURCE_DIR}/../fortran/lammps.f90 ABSOLUTE) if(BUILD_MPI) find_package(MPI REQUIRED) @@ -40,6 +40,23 @@ if(CMAKE_Fortran_COMPILER) add_executable(test_fortran_commands wrap_commands.cpp test_fortran_commands.f90) target_link_libraries(test_fortran_commands PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranCommands COMMAND test_fortran_commands) + + add_executable(test_fortran_get_thermo wrap_get_thermo.cpp test_fortran_get_thermo.f90) + target_link_libraries(test_fortran_get_thermo PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranGetThermo COMMAND test_fortran_get_thermo) + + add_executable(test_fortran_box wrap_box.cpp test_fortran_box.f90) + target_link_libraries(test_fortran_box PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranBox COMMAND test_fortran_box) + + add_executable(test_fortran_properties wrap_properties.cpp test_fortran_properties.f90 test_fortran_commands.f90) + target_link_libraries(test_fortran_properties PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranProperties COMMAND test_fortran_properties) + + add_executable(test_fortran_extract_global wrap_extract_global.cpp test_fortran_extract_global.f90) + target_link_libraries(test_fortran_extract_global PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranExtractGlobal COMMAND test_fortran_extract_global) + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/test_fortran_box.f90 b/unittest/fortran/test_fortran_box.f90 new file mode 100644 index 0000000000..c21918afd0 --- /dev/null +++ b/unittest/fortran/test_fortran_box.f90 @@ -0,0 +1,142 @@ +MODULE keepbox + USE liblammps + IMPLICIT NONE + TYPE(LAMMPS) :: lmp + CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 2 0 2', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] +END MODULE keepbox + +FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") + USE ISO_C_BINDING, ONLY: c_ptr + USE liblammps + USE keepbox, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepbox, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_box_setup () BIND(C) + USE liblammps + USE keepbox, ONLY : lmp, demo_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) +END SUBROUTINE f_lammps_box_setup + +SUBROUTINE f_lammps_delete_everything() BIND(C) + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + + CALL lmp%command("delete_atoms group all"); +END SUBROUTINE f_lammps_delete_everything + +FUNCTION f_lammps_extract_box_xlo () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_xlo + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxlo=boxdim) + f_lammps_extract_box_xlo = boxdim(1) +END FUNCTION f_lammps_extract_box_xlo + +FUNCTION f_lammps_extract_box_xhi () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_xhi + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxhi=boxdim) + f_lammps_extract_box_xhi = boxdim(1) +END FUNCTION f_lammps_extract_box_xhi + +FUNCTION f_lammps_extract_box_ylo () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_ylo + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxlo=boxdim) + f_lammps_extract_box_ylo = boxdim(2) +END FUNCTION f_lammps_extract_box_ylo + +FUNCTION f_lammps_extract_box_yhi () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_yhi + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxhi=boxdim) + f_lammps_extract_box_yhi = boxdim(2) +END FUNCTION f_lammps_extract_box_yhi + +FUNCTION f_lammps_extract_box_zlo () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_zlo + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxlo=boxdim) + f_lammps_extract_box_zlo = boxdim(2) +END FUNCTION f_lammps_extract_box_zlo + +FUNCTION f_lammps_extract_box_zhi () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_extract_box_zhi + REAL (c_double) :: boxdim(3) + + CALL lmp%extract_box(boxhi=boxdim) + f_lammps_extract_box_zhi = boxdim(2) +END FUNCTION f_lammps_extract_box_zhi + +SUBROUTINE f_lammps_reset_box_2x () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double + USE liblammps + USE keepbox, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: newlo(3), newhi(3), xy, yz, xz + + xy = 0.0_c_double + yz = 0.0_c_double + xz = 0.0_c_double + newlo = [-1.0_c_double, -1.0_c_double, -1.0_c_double] + newhi = [3.0_c_double, 3.0_c_double, 3.0_c_double] + CALL lmp%reset_box(newlo, newhi, xy, yz, xz) +END SUBROUTINE f_lammps_reset_box_2x diff --git a/unittest/fortran/test_fortran_commands.f90 b/unittest/fortran/test_fortran_commands.f90 index b5cffe698f..d85b0f183e 100644 --- a/unittest/fortran/test_fortran_commands.f90 +++ b/unittest/fortran/test_fortran_commands.f90 @@ -1,5 +1,6 @@ MODULE keepcmds USE liblammps + IMPLICIT NONE TYPE(LAMMPS) :: lmp CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & [ CHARACTER(len=40) :: & diff --git a/unittest/fortran/test_fortran_extract_global.f90 b/unittest/fortran/test_fortran_extract_global.f90 new file mode 100644 index 0000000000..9a8552d677 --- /dev/null +++ b/unittest/fortran/test_fortran_extract_global.f90 @@ -0,0 +1,491 @@ +MODULE keepglobal + USE liblammps + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 1.0' ] +END MODULE keepglobal + +FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") + USE ISO_C_BINDING, ONLY: c_ptr + USE liblammps + USE keepglobal, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepglobal, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_extract_global () BIND(C) + USE LIBLAMMPS + USE keepglobal, ONLY : lmp, demo_input, cont_input, pair_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) + CALL lmp%command('run 0') +END SUBROUTINE f_lammps_setup_extract_global + +SUBROUTINE f_lammps_setup_full_extract_global () BIND(C) + USE LIBLAMMPS + USE keepglobal, ONLY : lmp + IMPLICIT NONE + INTERFACE + SUBROUTINE f_lammps_setup_extract_global () BIND(C) + END SUBROUTINE f_lammps_setup_extract_global + END INTERFACE + + CALL lmp%command('atom_style full') + CALL f_lammps_setup_extract_global + CALL lmp%command('bond_style zero') + CALL lmp%command('angle_style zero') + CALL lmp%command('dihedral_style zero') + CALL lmp%command('run 0') +END SUBROUTINE f_lammps_setup_full_extract_global + +FUNCTION f_lammps_extract_global_units () BIND(C) RESULT(success) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepglobal, ONLY : lmp + IMPLICIT NONE + INTEGER (C_int) :: success + CHARACTER (LEN=16) :: units + + ! passing strings from Fortran to C is icky, so we do the test here and + ! report the result instead + units = lmp%extract_global('units') + IF ( TRIM(units) == 'lj' ) THEN + success = 1_C_int + ELSE + success = 0_C_int + END IF +END FUNCTION f_lammps_extract_global_units + +FUNCTION f_lammps_extract_global_ntimestep () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: ntimestep + INTEGER (C_int) :: f_lammps_extract_global_ntimestep + + ntimestep = lmp%extract_global("ntimestep") + f_lammps_extract_global_ntimestep = ntimestep +END FUNCTION f_lammps_extract_global_ntimestep +FUNCTION f_lammps_extract_global_ntimestep_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: ntimestep + INTEGER (C_int64_t) :: f_lammps_extract_global_ntimestep_big + + ntimestep = lmp%extract_global("ntimestep") + f_lammps_extract_global_ntimestep_big = ntimestep +END FUNCTION f_lammps_extract_global_ntimestep_big + +FUNCTION f_lammps_extract_global_dt () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double), POINTER :: dt + REAL (C_double) :: f_lammps_extract_global_dt + + dt = lmp%extract_global("dt") + f_lammps_extract_global_dt = dt +END FUNCTION f_lammps_extract_global_dt + +SUBROUTINE f_lammps_extract_global_boxlo (C_boxlo) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double), DIMENSION(3) :: C_boxlo + REAL (C_double), DIMENSION(:), POINTER :: boxlo + + boxlo = lmp%extract_global("boxlo") + C_boxlo = boxlo +END SUBROUTINE f_lammps_extract_global_boxlo + +SUBROUTINE f_lammps_extract_global_boxhi (C_boxhi) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double), DIMENSION(3) :: C_boxhi + REAL (C_double), DIMENSION(:), POINTER :: boxhi + + boxhi = lmp%extract_global("boxhi") + C_boxhi = boxhi +END SUBROUTINE f_lammps_extract_global_boxhi + +FUNCTION f_lammps_extract_global_boxxlo () BIND(C) RESULT(C_boxxlo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxxlo + REAL (C_double), POINTER :: boxxlo + + boxxlo = lmp%extract_global("boxxlo") + C_boxxlo = boxxlo +END FUNCTION f_lammps_extract_global_boxxlo + +FUNCTION f_lammps_extract_global_boxxhi () BIND(C) RESULT(C_boxxhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxxhi + REAL (C_double), POINTER :: boxxhi + + boxxhi = lmp%extract_global("boxxhi") + C_boxxhi = boxxhi +END FUNCTION f_lammps_extract_global_boxxhi + +FUNCTION f_lammps_extract_global_boxylo () BIND(C) RESULT(C_boxylo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxylo + REAL (C_double), POINTER :: boxylo + + boxylo = lmp%extract_global("boxylo") + C_boxylo = boxylo +END FUNCTION f_lammps_extract_global_boxylo + +FUNCTION f_lammps_extract_global_boxyhi () BIND(C) RESULT(C_boxyhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxyhi + REAL (C_double), POINTER :: boxyhi + + boxyhi = lmp%extract_global("boxyhi") + C_boxyhi = boxyhi +END FUNCTION f_lammps_extract_global_boxyhi + +FUNCTION f_lammps_extract_global_boxzlo () BIND(C) RESULT(C_boxzlo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxzlo + REAL (C_double), POINTER :: boxzlo + + boxzlo = lmp%extract_global("boxzlo") + C_boxzlo = boxzlo +END FUNCTION f_lammps_extract_global_boxzlo + +FUNCTION f_lammps_extract_global_boxzhi () BIND(C) RESULT(C_boxzhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_boxzhi + REAL (C_double), POINTER :: boxzhi + + boxzhi = lmp%extract_global("boxzhi") + C_boxzhi = boxzhi +END FUNCTION f_lammps_extract_global_boxzhi + +SUBROUTINE f_lammps_extract_global_periodicity (C_periodicity) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), DIMENSION(3) :: C_periodicity + INTEGER (C_int), DIMENSION(:), POINTER :: periodicity + + periodicity = lmp%extract_global("periodicity") + C_periodicity = periodicity +END SUBROUTINE f_lammps_extract_global_periodicity + +FUNCTION f_lammps_extract_global_triclinic () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: triclinic + INTEGER (C_int) :: f_lammps_extract_global_triclinic + + triclinic = lmp%extract_global("triclinic") + f_lammps_extract_global_triclinic = triclinic +END FUNCTION f_lammps_extract_global_triclinic + +FUNCTION f_lammps_extract_global_xy () BIND(C) RESULT(C_xy) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_xy + REAL (C_double), POINTER :: xy + + xy = lmp%extract_global("xy") + C_xy = xy +END FUNCTION f_lammps_extract_global_xy + +FUNCTION f_lammps_extract_global_xz () BIND(C) RESULT(C_xz) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_xz + REAL (C_double), POINTER :: xz + + xz = lmp%extract_global("xz") + C_xz = xz +END FUNCTION f_lammps_extract_global_xz + +FUNCTION f_lammps_extract_global_yz () BIND(C) RESULT(C_yz) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_yz + REAL (C_double), POINTER :: yz + + yz = lmp%extract_global("yz") + C_yz = yz +END FUNCTION f_lammps_extract_global_yz + +FUNCTION f_lammps_extract_global_natoms () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: natoms + INTEGER (C_int) :: f_lammps_extract_global_natoms + + natoms = lmp%extract_global("natoms") + f_lammps_extract_global_natoms = natoms +END FUNCTION f_lammps_extract_global_natoms +FUNCTION f_lammps_extract_global_natoms_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: natoms + INTEGER (C_int64_t) :: f_lammps_extract_global_natoms_big + + natoms = lmp%extract_global("natoms") + f_lammps_extract_global_natoms_big = natoms +END FUNCTION f_lammps_extract_global_natoms_big + +FUNCTION f_lammps_extract_global_nbonds () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nbonds + INTEGER (C_int) :: f_lammps_extract_global_nbonds + + nbonds = lmp%extract_global("nbonds") + f_lammps_extract_global_nbonds = nbonds +END FUNCTION f_lammps_extract_global_nbonds +FUNCTION f_lammps_extract_global_nbonds_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: nbonds + INTEGER (C_int64_t) :: f_lammps_extract_global_nbonds_big + + nbonds = lmp%extract_global("nbonds") + f_lammps_extract_global_nbonds_big = nbonds +END FUNCTION f_lammps_extract_global_nbonds_big + +FUNCTION f_lammps_extract_global_nangles () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nangles + INTEGER (C_int) :: f_lammps_extract_global_nangles + + nangles = lmp%extract_global("nangles") + f_lammps_extract_global_nangles = nangles +END FUNCTION f_lammps_extract_global_nangles +FUNCTION f_lammps_extract_global_nangles_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: nangles + INTEGER (C_int64_t) :: f_lammps_extract_global_nangles_big + + nangles = lmp%extract_global("nangles") + f_lammps_extract_global_nangles_big = nangles +END FUNCTION f_lammps_extract_global_nangles_big + +FUNCTION f_lammps_extract_global_ndihedrals () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: ndihedrals + INTEGER (C_int) :: f_lammps_extract_global_ndihedrals + + ndihedrals = lmp%extract_global("ndihedrals") + f_lammps_extract_global_ndihedrals = ndihedrals +END FUNCTION f_lammps_extract_global_ndihedrals +FUNCTION f_lammps_extract_global_ndihedrals_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: ndihedrals + INTEGER (C_int64_t) :: f_lammps_extract_global_ndihedrals_big + + ndihedrals = lmp%extract_global("ndihedrals") + f_lammps_extract_global_ndihedrals_big = ndihedrals +END FUNCTION f_lammps_extract_global_ndihedrals_big + +FUNCTION f_lammps_extract_global_nimpropers () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nimpropers + INTEGER (C_int) :: f_lammps_extract_global_nimpropers + + nimpropers = lmp%extract_global("nimpropers") + f_lammps_extract_global_nimpropers = nimpropers +END FUNCTION f_lammps_extract_global_nimpropers +FUNCTION f_lammps_extract_global_nimpropers_big () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int64_t), POINTER :: nimpropers + INTEGER (C_int64_t) :: f_lammps_extract_global_nimpropers_big + + nimpropers = lmp%extract_global("nimpropers") + f_lammps_extract_global_nimpropers_big = nimpropers +END FUNCTION f_lammps_extract_global_nimpropers_big + + +FUNCTION f_lammps_extract_global_ntypes () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: ntypes + INTEGER (C_int) :: f_lammps_extract_global_ntypes + + ntypes = lmp%extract_global("ntypes") + f_lammps_extract_global_ntypes = ntypes +END FUNCTION f_lammps_extract_global_ntypes + +FUNCTION f_lammps_extract_global_nlocal () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nlocal + INTEGER (C_int) :: f_lammps_extract_global_nlocal + + nlocal = lmp%extract_global("nlocal") + f_lammps_extract_global_nlocal = nlocal +END FUNCTION f_lammps_extract_global_nlocal + +FUNCTION f_lammps_extract_global_nghost () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nghost + INTEGER (C_int) :: f_lammps_extract_global_nghost + + nghost = lmp%extract_global("nghost") + f_lammps_extract_global_nghost = nghost +END FUNCTION f_lammps_extract_global_nghost + +FUNCTION f_lammps_extract_global_nmax () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int), POINTER :: nmax + INTEGER (C_int) :: f_lammps_extract_global_nmax + + nmax = lmp%extract_global("nmax") + f_lammps_extract_global_nmax = nmax +END FUNCTION f_lammps_extract_global_nmax + +FUNCTION f_lammps_extract_global_boltz () BIND(C) RESULT(C_k_B) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_k_B + REAL (C_double), POINTER :: k_B + + k_B = lmp%extract_global("boltz") + C_k_B = k_B +END FUNCTION f_lammps_extract_global_boltz + +FUNCTION f_lammps_extract_global_hplanck () BIND(C) RESULT(C_h) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: C_h + REAL (C_double), POINTER :: h + + h = lmp%extract_global("boltz") + C_h = h +END FUNCTION f_lammps_extract_global_hplanck + +FUNCTION f_lammps_extract_global_angstrom () BIND(C) RESULT(Angstrom) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: Angstrom + REAL (C_double), POINTER :: A + + A = lmp%extract_global("angstrom") + Angstrom = A +END FUNCTION f_lammps_extract_global_angstrom + +FUNCTION f_lammps_extract_global_femtosecond () BIND(C) RESULT(fs) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE keepglobal, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + REAL (C_double) :: fs + REAL (C_double), POINTER :: femtosecond + + femtosecond = lmp%extract_global("femtosecond") + fs = femtosecond +END FUNCTION f_lammps_extract_global_femtosecond diff --git a/unittest/fortran/test_fortran_get_thermo.f90 b/unittest/fortran/test_fortran_get_thermo.f90 new file mode 100644 index 0000000000..e96c964e7c --- /dev/null +++ b/unittest/fortran/test_fortran_get_thermo.f90 @@ -0,0 +1,174 @@ +MODULE keepthermo + USE liblammps + IMPLICIT NONE + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 1.0' ] +END MODULE keepthermo + +FUNCTION f_lammps_with_args() BIND(C) + USE ISO_C_BINDING, ONLY: c_ptr + USE liblammps + USE keepthermo, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C) + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepthermo, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_get_thermo_setup () BIND(C) + USE liblammps + USE keepthermo, ONLY : lmp, demo_input, cont_input, pair_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) +END SUBROUTINE f_lammps_get_thermo_setup + +FUNCTION f_lammps_get_thermo_natoms () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_natoms + + f_lammps_get_thermo_natoms = lmp%get_thermo('atoms') +END FUNCTION f_lammps_get_thermo_natoms + +FUNCTION f_lammps_get_thermo_dt () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_dt + + f_lammps_get_thermo_dt = lmp%get_thermo('dt') +END FUNCTION f_lammps_get_thermo_dt + +FUNCTION f_lammps_get_thermo_vol () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_vol + + f_lammps_get_thermo_vol = lmp%get_thermo('vol') +END FUNCTION f_lammps_get_thermo_vol + +FUNCTION f_lammps_get_thermo_lx () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_lx + + f_lammps_get_thermo_lx = lmp%get_thermo('lx') +END FUNCTION f_lammps_get_thermo_lx + +FUNCTION f_lammps_get_thermo_ly () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_ly + + f_lammps_get_thermo_ly = lmp%get_thermo('ly') +END FUNCTION f_lammps_get_thermo_ly + +FUNCTION f_lammps_get_thermo_lz () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_lz + + f_lammps_get_thermo_lz = lmp%get_thermo('lz') +END FUNCTION f_lammps_get_thermo_lz + +FUNCTION f_lammps_get_thermo_xlo () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_xlo + + f_lammps_get_thermo_xlo = lmp%get_thermo('xlo') +END FUNCTION f_lammps_get_thermo_xlo + +FUNCTION f_lammps_get_thermo_xhi () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_xhi + + f_lammps_get_thermo_xhi = lmp%get_thermo('xhi') +END FUNCTION f_lammps_get_thermo_xhi + +FUNCTION f_lammps_get_thermo_ylo () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_ylo + + f_lammps_get_thermo_ylo = lmp%get_thermo('ylo') +END FUNCTION f_lammps_get_thermo_ylo + +FUNCTION f_lammps_get_thermo_yhi () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_yhi + + f_lammps_get_thermo_yhi = lmp%get_thermo('yhi') +END FUNCTION f_lammps_get_thermo_yhi + +FUNCTION f_lammps_get_thermo_zlo () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_zlo + + f_lammps_get_thermo_zlo = lmp%get_thermo('zlo') +END FUNCTION f_lammps_get_thermo_zlo + +FUNCTION f_lammps_get_thermo_zhi () BIND (C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double + USE liblammps + USE keepthermo, ONLY : lmp + IMPLICIT NONE + REAL (c_double) :: f_lammps_get_thermo_zhi + + f_lammps_get_thermo_zhi = lmp%get_thermo('zhi') +END FUNCTION f_lammps_get_thermo_zhi diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 new file mode 100644 index 0000000000..00e083b301 --- /dev/null +++ b/unittest/fortran/test_fortran_properties.f90 @@ -0,0 +1,52 @@ +FUNCTION f_lammps_version () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE liblammps + USE keepcmds, ONLY : lmp + IMPLICIT NONE + INTEGER (C_int) :: f_lammps_version + + f_lammps_version = lmp%version() +END FUNCTION f_lammps_version + +SUBROUTINE f_lammps_memory_usage (meminfo) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE liblammps + USE keepcmds, ONLY : lmp + IMPLICIT NONE + REAL (C_double), DIMENSION(3), INTENT(OUT) :: meminfo + + CALL lmp%memory_usage(meminfo) +END SUBROUTINE f_lammps_memory_usage + +FUNCTION f_lammps_get_mpi_comm () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE liblammps + USE keepcmds, ONLY : lmp + IMPLICIT NONE + INTEGER (C_int) :: f_lammps_get_mpi_comm + + f_lammps_get_mpi_comm = lmp%get_mpi_comm() +END FUNCTION f_lammps_get_mpi_comm + +FUNCTION f_lammps_extract_setting (Cstr) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char + USE keepcmds, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER (C_int) :: f_lammps_extract_setting + CHARACTER (KIND=C_char, LEN=1), DIMENSION(*), INTENT(IN) :: Cstr + INTEGER :: strlen, i + CHARACTER (LEN=:), ALLOCATABLE :: Fstr + + i = 1 + DO WHILE (Cstr(i) /= ACHAR(0)) + i = i + 1 + END DO + strlen = i + allocate ( CHARACTER(LEN=strlen) :: Fstr) + FORALL (i=1:strlen) + Fstr(i:i) = Cstr(i) + END FORALL + f_lammps_extract_setting = lmp%extract_setting(Fstr) + deallocate (Fstr) +END FUNCTION f_lammps_extract_setting diff --git a/unittest/fortran/wrap_box.cpp b/unittest/fortran/wrap_box.cpp new file mode 100644 index 0000000000..8678816658 --- /dev/null +++ b/unittest/fortran/wrap_box.cpp @@ -0,0 +1,64 @@ +// unit tests for extracting box dimensions fom a LAMMPS instance through the Fortran wrapper + +#include "lammps.h" +#include +#include + +#include "gtest/gtest.h" + +// prototypes for fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_box_setup(); +double f_lammps_extract_box_xlo(); +double f_lammps_extract_box_xhi(); +double f_lammps_extract_box_ylo(); +double f_lammps_extract_box_yhi(); +double f_lammps_extract_box_zlo(); +double f_lammps_extract_box_zhi(); +void f_lammps_delete_everything(); +void f_lammps_reset_box_2x(); +} + +class LAMMPS_commands : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_commands() = default; + ~LAMMPS_commands() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_commands, get_thermo) +{ + f_lammps_box_setup(); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_xlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_xhi(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_ylo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_yhi(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_zlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_zhi(), 2.0); + f_lammps_delete_everything(); + f_lammps_reset_box_2x(); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_xlo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_xhi(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_ylo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_yhi(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_zlo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_zhi(), 3.0); +}; diff --git a/unittest/fortran/wrap_extract_global.cpp b/unittest/fortran/wrap_extract_global.cpp new file mode 100644 index 0000000000..adf3986073 --- /dev/null +++ b/unittest/fortran/wrap_extract_global.cpp @@ -0,0 +1,177 @@ +// unit tests for extracting global data from a LAMMPS instance through the +// Fortran wrapper + +#include "lammps.h" +#include "library.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_setup_extract_global(); +void f_lammps_setup_full_extract_global(); +int f_lammps_extract_global_units(); +int f_lammps_extract_global_ntimestep(); +int64_t f_lammps_extract_global_ntimestep_big(); +double f_lammps_extract_global_dt(); +void f_lammps_extract_global_boxlo(double[3]); +void f_lammps_extract_global_boxhi(double[3]); +double f_lammps_extract_global_boxxlo(); +double f_lammps_extract_global_boxylo(); +double f_lammps_extract_global_boxzlo(); +double f_lammps_extract_global_boxxhi(); +double f_lammps_extract_global_boxyhi(); +double f_lammps_extract_global_boxzhi(); +void f_lammps_extract_global_periodicity(int[3]); +int f_lammps_extract_global_triclinic(); +double f_lammps_extract_global_xy(); +double f_lammps_extract_global_yz(); +double f_lammps_extract_global_xz(); +int f_lammps_extract_global_natoms(); +int64_t f_lammps_extract_global_natoms_big(); +int f_lammps_extract_global_nbonds(); +int64_t f_lammps_extract_global_nbonds_big(); +int f_lammps_extract_global_nangles(); +int64_t f_lammps_extract_global_nangles_big(); +int f_lammps_extract_global_ndihedrals(); +int64_t f_lammps_extract_global_ndihedrals_big(); +int f_lammps_extract_global_nimpropers(); +int64_t f_lammps_extract_global_nimpropers_big(); +int f_lammps_extract_global_ntypes(); +int f_lammps_extract_global_nlocal(); +int f_lammps_extract_global_nghost(); +int f_lammps_extract_global_nmax(); +double f_lammps_extract_global_boltz(); +double f_lammps_extract_global_hplanck(); +double f_lammps_extract_global_angstrom(); +double f_lammps_extract_global_femtosecond(); +} + +class LAMMPS_extract_global : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_extract_global() = default; + ~LAMMPS_extract_global() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_extract_global, units) +{ + f_lammps_setup_extract_global(); + EXPECT_EQ(f_lammps_extract_global_units(), 1); +}; + +TEST_F(LAMMPS_extract_global, ntimestep) +{ + f_lammps_setup_extract_global(); +#ifdef LAMMPS_SMALLSMALL + EXPECT_EQ(f_lammps_extract_global_ntimestep(), 0); +#else + EXPECT_EQ(f_lammps_extract_global_ntimestep_big(), 0l); +#endif +}; + +TEST_F(LAMMPS_extract_global, dt) +{ + f_lammps_setup_extract_global(); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_dt(), 0.005); +}; + +TEST_F(LAMMPS_extract_global, boxprops) +{ + f_lammps_setup_extract_global(); + double boxlo[3], boxhi[3]; + f_lammps_extract_global_boxlo(boxlo); + EXPECT_DOUBLE_EQ(boxlo[0], 0.0); + EXPECT_DOUBLE_EQ(boxlo[1], 0.0); + EXPECT_DOUBLE_EQ(boxlo[2], 0.0); + f_lammps_extract_global_boxhi(boxhi); + EXPECT_DOUBLE_EQ(boxhi[0], 2.0); + EXPECT_DOUBLE_EQ(boxhi[1], 3.0); + EXPECT_DOUBLE_EQ(boxhi[2], 4.0); + + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxhi(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxylo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxyhi(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzhi(), 4.0); + + int periodicity[3]; + f_lammps_extract_global_periodicity(periodicity); + EXPECT_EQ(periodicity[0], 1); + EXPECT_EQ(periodicity[1], 1); + EXPECT_EQ(periodicity[2], 1); + + EXPECT_EQ(f_lammps_extract_global_triclinic(), 0); + + EXPECT_DOUBLE_EQ(f_lammps_extract_global_xy(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_yz(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_xz(), 0.0); +}; + +TEST_F(LAMMPS_extract_global, atomprops) +{ + f_lammps_setup_extract_global(); +#ifdef LAMMPS_SMALLSMALL + EXPECT_EQ(f_lammps_extract_global_natoms(), 2); + EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); + EXPECT_EQ(f_lammps_extract_global_nangles(), 0); + EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); +#else + EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); + EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); +#endif + + EXPECT_EQ(f_lammps_extract_global_ntypes(), 1); + EXPECT_EQ(f_lammps_extract_global_nlocal(), 2); + EXPECT_EQ(f_lammps_extract_global_nghost(), 41); + EXPECT_EQ(f_lammps_extract_global_nmax(), 16384); + + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boltz(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_hplanck(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_angstrom(), 1.0); + + EXPECT_DOUBLE_EQ(f_lammps_extract_global_femtosecond(), 1.0); +}; + +TEST_F(LAMMPS_extract_global, fullprops) +{ + if (! lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); + // This is not currently the world's most convincing test.... + f_lammps_setup_full_extract_global(); +#ifdef LAMMPS_SMALLSMALL + EXPECT_EQ(f_lammps_extract_global_natoms(), 2); + EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); + EXPECT_EQ(f_lammps_extract_global_nangles(), 0); + EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); +#else + EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); + EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); +#endif +} diff --git a/unittest/fortran/wrap_get_thermo.cpp b/unittest/fortran/wrap_get_thermo.cpp new file mode 100644 index 0000000000..71b51609eb --- /dev/null +++ b/unittest/fortran/wrap_get_thermo.cpp @@ -0,0 +1,67 @@ +// unit tests for getting thermodynamic output from a LAMMPS instance through the Fortran wrapper + +#include "lammps.h" +#include +#include + +#include "gtest/gtest.h" + +// prototypes for fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_get_thermo_setup(); +double f_lammps_get_thermo_natoms(); +double f_lammps_get_thermo_dt(); +double f_lammps_get_thermo_vol(); +double f_lammps_get_thermo_lx(); +double f_lammps_get_thermo_ly(); +double f_lammps_get_thermo_lz(); +double f_lammps_get_thermo_xlo(); +double f_lammps_get_thermo_xhi(); +double f_lammps_get_thermo_ylo(); +double f_lammps_get_thermo_yhi(); +double f_lammps_get_thermo_zlo(); +double f_lammps_get_thermo_zhi(); +} + +class LAMMPS_thermo : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_thermo() = default; + ~LAMMPS_thermo() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_thermo, get_thermo) +{ + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_natoms(), 0.0); + f_lammps_get_thermo_setup(); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_natoms(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_dt(), 0.005); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_vol(), 24.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_lx(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_ly(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_lz(), 4.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_xlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_xhi(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_ylo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_yhi(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_zlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_get_thermo_zhi(), 4.0); +}; diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp new file mode 100644 index 0000000000..8ecd9346dc --- /dev/null +++ b/unittest/fortran/wrap_properties.cpp @@ -0,0 +1,109 @@ +// unit tests for getting LAMMPS properties through the Fortran wrapper + +#include "lammps.h" +//#include // for stdin, stdout +#include "library.h" +#include +#include + +#include "gtest/gtest.h" + +// prototypes for fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +int f_lammps_version(); +void f_lammps_memory_usage(double*); +int f_lammps_get_mpi_comm(); +int f_lammps_extract_setting(const char*); +} + +class LAMMPS_properties : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_properties() = default; + ~LAMMPS_properties() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_properties, version) +{ + EXPECT_LT(20200917, f_lammps_version()); +}; + +TEST_F(LAMMPS_properties, memory_usage) +{ +// copied from c-library, with a two-character modification + double meminfo[3]; + f_lammps_memory_usage(meminfo); + EXPECT_GT(meminfo[0], 0.0); +#if defined(__linux__) || defined(_WIN32) + EXPECT_GE(meminfo[1], 0.0); +#endif +#if (defined(__linux__) || defined(__APPLE__) || defined(_WIN32)) && !defined(__INTEL_LLVM_COMPILER) + EXPECT_GT(meminfo[2], 0.0); +#endif +}; + +TEST_F(LAMMPS_properties, get_mpi_comm) +{ + int f_comm = f_lammps_get_mpi_comm(); + if ( lammps_config_has_mpi_support() ) + EXPECT_GE(f_comm, 0); + else + EXPECT_EQ(f_comm, -1); +}; + +TEST_F(LAMMPS_properties, extract_setting) +{ +#if defined(LAMMPS_SMALLSMALL) + EXPECT_EQ(f_lammps_extract_setting("bigint"), 4); +#else + EXPECT_EQ(f_lammps_extract_setting("bigint"), 8); +#endif +#if defined(LAMMPS_BIGBIG) + EXPECT_EQ(f_lammps_extract_setting("tagint"), 8); + EXPECT_EQ(f_lammps_extract_setting("imageint"), 8); +#else + EXPECT_EQ(f_lammps_extract_setting("tagint"), 4); + EXPECT_EQ(f_lammps_extract_setting("imageint"), 4); +#endif + + EXPECT_EQ(f_lammps_extract_setting("box_exist"), 0); + EXPECT_EQ(f_lammps_extract_setting("dimension"), 3); + EXPECT_EQ(f_lammps_extract_setting("world_size"), 1); + EXPECT_EQ(f_lammps_extract_setting("world_rank"), 0); + EXPECT_EQ(f_lammps_extract_setting("universe_size"), 1); + EXPECT_EQ(f_lammps_extract_setting("universe_rank"), 0); + EXPECT_GT(f_lammps_extract_setting("nthreads"), 0); + EXPECT_EQ(f_lammps_extract_setting("newton_pair"), 1); + EXPECT_EQ(f_lammps_extract_setting("newton_bond"), 1); + + EXPECT_EQ(f_lammps_extract_setting("ntypes"), 0); + EXPECT_EQ(f_lammps_extract_setting("nbondtypes"), 0); + EXPECT_EQ(f_lammps_extract_setting("nangletypes"), 0); + EXPECT_EQ(f_lammps_extract_setting("ndihedraltypes"), 0); + EXPECT_EQ(f_lammps_extract_setting("nimpropertypes"), 0); + + EXPECT_EQ(f_lammps_extract_setting("molecule_flag"), 0); + EXPECT_EQ(f_lammps_extract_setting("q_flag"), 0); + EXPECT_EQ(f_lammps_extract_setting("mu_flag"), 0); + EXPECT_EQ(f_lammps_extract_setting("rmass_flag"), 0); + EXPECT_EQ(f_lammps_extract_setting("UNKNOWN"), -1); + +}; From e4575aec3cbb8168cfd0c13eabe0863ad86c7a78 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 14 Sep 2022 21:14:13 -0500 Subject: [PATCH 124/364] One fix after running fix-whitespace --- doc/src/Fortran.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 0db5f8f097..28436c813f 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -221,7 +221,7 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. communicator, such as in .. code-block:: Fortran - + PROGRAM testmpi USE LIBLAMMPS USE MPI_F08 @@ -312,7 +312,7 @@ Procedures Bound to the lammps Derived Type are optional, though obviously at least one should be present. The parameters *pflags* and *boxflag* are stored in LAMMPS as integers, but should be declared as ``LOGICAL`` variables when calling from Fortran. - + :o real(c_double) boxlo [dimension(3),optional]: vector in which to store lower-bounds of simulation box :o real(c_double) boxhi [dimension(3),optional]: vector in which to store From aae96b9cb0cf2e272af63d82d361dbd76753cc97 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Sep 2022 23:26:01 -0400 Subject: [PATCH 125/364] fix multiple typesetting issues and make consistent --- doc/src/pair_dpd.rst | 49 +++++++++++---------- doc/src/pair_dpd_fdt.rst | 92 +++++++++++++++++++--------------------- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/doc/src/pair_dpd.rst b/doc/src/pair_dpd.rst index 5bc8cedaed..aef085ca6e 100644 --- a/doc/src/pair_dpd.rst +++ b/doc/src/pair_dpd.rst @@ -56,8 +56,10 @@ field. This pairwise thermostat can be used in conjunction with any :doc:`pair style `, and in leiu of per-particle thermostats like :doc:`fix langevin ` or ensemble thermostats like Nose Hoover as implemented by :doc:`fix nvt `. To use -*dpd/tstat* as a thermostat for another pair style, use the :doc:`pair_style hybrid/overlay ` command to compute both the desired -pair interaction and the thermostat for each pair of particles. +*dpd/tstat* as a thermostat for another pair style, use the +:doc:`pair_style hybrid/overlay ` command to compute both +the desired pair interaction and the thermostat for each pair of +particles. For style *dpd*, the force on atom I due to atom J is given as a sum of 3 terms @@ -68,29 +70,30 @@ of 3 terms F^C = & A w(r) \\ F^D = & - \gamma w^2(r) (\hat{r_{ij}} \bullet \vec{v_{ij}}) \\ F^R = & \sigma w(r) \alpha (\Delta t)^{-1/2} \\ - w(r) = & 1 - r/r_c + w(r) = & 1 - \frac{r}{r_c} where :math:`F^C` is a conservative force, :math:`F^D` is a dissipative -force, and :math:`F^R` is a random force. :math:`r_{ij}` is a unit -vector in the direction :math:`r_i - r_j`, :math:`v_{ij}` is the vector -difference in velocities of the two atoms :math:`= \vec{v}_i - -\vec{v}_j`, :math:`\alpha` is a Gaussian random number with zero mean and -unit variance, dt is the timestep size, and w(r) is a weighting factor -that varies between 0 and 1. :math:`r_c` is the cutoff. :math:`\sigma` -is set equal to :math:`\sqrt{2 k_B T \gamma}`, where :math:`k_B` is the -Boltzmann constant and T is the temperature parameter in the pair_style -command. +force, and :math:`F^R` is a random force. :math:`\hat{r_{ij}}` is a +unit vector in the direction :math:`r_i - r_j`, :math:`\vec{v_{ij}}` is +the vector difference in velocities of the two atoms :math:`\vec{v}_i - +\vec{v}_j`, :math:`\alpha` is a Gaussian random number with zero mean +and unit variance, *dt* is the timestep size, and :math:`w(r)` is a +weighting factor that varies between 0 and 1. :math:`r_c` is the +pairwise cutoff. :math:`\sigma` is set equal to :math:`\sqrt{2 k_B T +\gamma}`, where :math:`k_B` is the Boltzmann constant and *T* is the +temperature parameter in the pair_style command. -For style *dpd/tstat*, the force on atom I due to atom J is the same -as the above equation, except that the conservative Fc term is -dropped. Also, during the run, T is set each timestep to a ramped -value from Tstart to Tstop. +For style *dpd/tstat*, the force on atom I due to atom J is the same as +the above equation, except that the conservative :math:`F^C` term is +dropped. Also, during the run, *T* is set each timestep to a ramped +value from *Tstart* to *Tstop*. -For style *dpd*, the pairwise energy associated with style *dpd* is -only due to the conservative force term Fc, and is shifted to be zero -at the cutoff distance Rc. The pairwise virial is calculated using -all 3 terms. For style *dpd/tstat* there is no pairwise energy, but -the last two terms of the formula make a contribution to the virial. +For style *dpd*, the pairwise energy associated with style *dpd* is only +due to the conservative force term :math:`F^C`, and is shifted to be +zero at the cutoff distance :math:`r_c`. The pairwise virial is +calculated using all 3 terms. For style *dpd/tstat* there is no +pairwise energy, but the last two terms of the formula make a +contribution to the virial. For style *dpd*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in @@ -146,8 +149,8 @@ I,J pairs must be specified explicitly. These pair styles do not support the :doc:`pair_modify ` shift option for the energy of the pair interaction. Note that as -discussed above, the energy due to the conservative Fc term is already -shifted to be 0.0 at the cutoff distance Rc. +discussed above, the energy due to the conservative :math:`F^C` term is already +shifted to be 0.0 at the cutoff distance :math:`r_c`. The :doc:`pair_modify ` table option is not relevant for these pair styles. diff --git a/doc/src/pair_dpd_fdt.rst b/doc/src/pair_dpd_fdt.rst index 25fe2581db..133e7ab52c 100644 --- a/doc/src/pair_dpd_fdt.rst +++ b/doc/src/pair_dpd_fdt.rst @@ -58,32 +58,27 @@ given as a sum of 3 terms F^C = & A w(r) \\ F^D = & - \gamma w^2(r) (\hat{r_{ij}} \bullet \vec{v_{ij}}) \\ F^R = & \sigma w(r) \alpha (\Delta t)^{-1/2} \\ - w(r) = & 1 - r/r_c + w(r) = & 1 - \frac{r}{r_c} where :math:`F^C` is a conservative force, :math:`F^D` is a dissipative -force, and :math:`F^R` is a random force. :math:`r_{ij}` is a unit -vector in the direction :math:`r_i - r_j`, :math:`V_{ij} is the vector -difference in velocities of the two atoms :math:`= \vec{v}_i - -\vec{v}_j, :math:`\alpha` is a Gaussian random number with zero mean and -unit variance, dt is the timestep size, and w(r) is a weighting factor -that varies between 0 and 1. Rc is the cutoff. The weighting factor, -:math:`\omega_{ij}`, varies between 0 and 1, and is chosen to have the -following functional form: +force, and :math:`F^R` is a random force. :math:`\hat{r_{ij}}` is a +unit vector in the direction :math:`r_i - r_j`, :math:`\vec{v_{ij}}` is +the vector difference in velocities of the two atoms, :math:`\vec{v}_i - +\vec{v}_j`, :math:`\alpha` is a Gaussian random number with zero mean +and unit variance, *dt* is the timestep size, and :math:`w(r)` is a +weighting factor that varies between 0 and 1, :math:`r_c` is the +pairwise cutoff. Note that alternative definitions of the weighting +function exist, but would have to be implemented as a separate pair +style command. -.. math:: - - \omega_{ij} = 1 - \frac{r_{ij}}{r_{c}} - -Note that alternative definitions of the weighting function exist, but -would have to be implemented as a separate pair style command. - -For style *dpd/fdt*, the fluctuation-dissipation theorem defines :math:`\gamma` -to be set equal to :math:`\sigma^2/(2 T)`, where T is the set point -temperature specified as a pair style parameter in the above examples. -The following coefficients must be defined for each pair of atoms types -via the :doc:`pair_coeff ` command as in the examples above, -or in the data file or restart files read by the -:doc:`read_data ` or :doc:`read_restart ` commands: +For style *dpd/fdt*, the fluctuation-dissipation theorem defines +:math:`\gamma` to be set equal to :math:`\sigma^2/(2 T)`, where *T* is the +set point temperature specified as a pair style parameter in the above +examples. The following coefficients must be defined for each pair of +atoms types via the :doc:`pair_coeff ` command as in the +examples above, or in the data file or restart files read by the +:doc:`read_data ` or :doc:`read_restart ` +commands: * A (force units) * :math:`\sigma` (force\*time\^(1/2) units) @@ -94,9 +89,9 @@ cutoff is used. Style *dpd/fdt/energy* is used to perform DPD simulations under isoenergetic and isoenthalpic conditions. The fluctuation-dissipation -theorem defines :math:`\gamma` to be set equal to :math:`sigma^2/(2 -\theta)`, where :math:theta` is the average internal temperature for the -pair. The particle internal temperature is related to the particle +theorem defines :math:`\gamma` to be set equal to :math:`\sigma^2/(2 +\theta)`, where :math:`\theta` is the average internal temperature for +the pair. The particle internal temperature is related to the particle internal energy through a mesoparticle equation of state (see :doc:`fix eos `). The differential internal conductive and mechanical energies are computed within style *dpd/fdt/energy* as: @@ -116,15 +111,15 @@ where \sigma^{2}_{ij} = & 2\gamma_{ij}k_{B}\Theta_{ij} \\ \Theta_{ij}^{-1} = & \frac{1}{2}(\frac{1}{\theta_{i}}+\frac{1}{\theta_{j}}) -:math:`\zeta_ij^q` is a second Gaussian random number with zero mean and unit -variance that is used to compute the internal conductive energy. The -fluctuation-dissipation theorem defines :math:`alpha^2` to be set -equal to :math:2k_B\kappa`, where :math:`\kappa` is the mesoparticle thermal -conductivity parameter. The following coefficients must be defined for -each pair of atoms types via the :doc:`pair_coeff ` -command as in the examples above, or in the data file or restart files -read by the :doc:`read_data ` or :doc:`read_restart ` -commands: +:math:`\zeta_ij^q` is a second Gaussian random number with zero mean and +unit variance that is used to compute the internal conductive +energy. The fluctuation-dissipation theorem defines :math:`alpha^2` to +be set equal to :math:`2k_B\kappa`, where :math:`\kappa` is the +mesoparticle thermal conductivity parameter. The following coefficients +must be defined for each pair of atoms types via the :doc:`pair_coeff +` command as in the examples above, or in the data file or +restart files read by the :doc:`read_data ` or +:doc:`read_restart ` commands: * A (force units) * :math:`\sigma` (force\*time\^(1/2) units) @@ -135,23 +130,23 @@ The last coefficient is optional. If not specified, the global DPD cutoff is used. The pairwise energy associated with styles *dpd/fdt* and -*dpd/fdt/energy* is only due to the conservative force term Fc, and is -shifted to be zero at the cutoff distance Rc. The pairwise virial is -calculated using only the conservative term. +*dpd/fdt/energy* is only due to the conservative force term :math:`F^C`, +and is shifted to be zero at the cutoff distance :math:`r_c`. The +pairwise virial is calculated using only the conservative term. The forces computed through the *dpd/fdt* and *dpd/fdt/energy* styles can be integrated with the velocity-Verlet integration scheme or the -Shardlow splitting integration scheme described by :ref:`(Lisal) `. -In the cases when these pair styles are combined with the +Shardlow splitting integration scheme described by :ref:`(Lisal) +`. In the cases when these pair styles are combined with the :doc:`fix shardlow `, these pair styles differ from the other dpd styles in that the dissipative and random forces are split from the force calculation and are not computed within the pair style. -Thus, only the conservative force is computed by the pair style, -while the stochastic integration of the dissipative and random forces -are handled through the Shardlow splitting algorithm approach. The -Shardlow splitting algorithm is advantageous, especially when -performing DPD under isoenergetic conditions, as it allows -significantly larger timesteps to be taken. +Thus, only the conservative force is computed by the pair style, while +the stochastic integration of the dissipative and random forces are +handled through the Shardlow splitting algorithm approach. The Shardlow +splitting algorithm is advantageous, especially when performing DPD +under isoenergetic conditions, as it allows significantly larger +timesteps to be taken. ---------- @@ -162,8 +157,9 @@ significantly larger timesteps to be taken. Restrictions """""""""""" -These commands are part of the DPD-REACT package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +These commands are part of the DPD-REACT package. They are only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Pair styles *dpd/fdt* and *dpd/fdt/energy* require use of the :doc:`comm_modify vel yes ` option so that velocities are From 3989aa4dabc7461df283f68fda88896d298ead53 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 15 Sep 2022 11:50:38 +0200 Subject: [PATCH 126/364] BUGFIX: use triggername[ifield] instead of triggername[nfield] --- src/fix_pair.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 3691bad254..f57efeb29f 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -70,7 +70,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { if (trigger[ifield] == 0) triggername[ifield] = nullptr; - else triggername[nfield] = utils::strdup(fmt::format("{}_flag", fieldname[ifield])); + else triggername[ifield] = utils::strdup(fmt::format("{}_flag", fieldname[ifield])); } // extract all fields just to get number of per-atom values From 3770c02752bddfc26ee8c1385c84867f58781a02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Sep 2022 09:22:20 -0400 Subject: [PATCH 127/364] fix typo --- src/fix_pair.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 6f98ad2790..5f9363daaa 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -70,7 +70,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { if (trigger[ifield] == 0) triggername[ifield] = nullptr; - else triggername[nfield] = utils::strdup(fmt::format("{}_flag", fieldname[ifield])); + else triggername[ifield] = utils::strdup(fmt::format("{}_flag", fieldname[ifield])); } // extract all fields just to get number of per-atom values From f764260c530ff4bebff74c7dde436275d2ce0832 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 15 Sep 2022 15:47:31 -0600 Subject: [PATCH 128/364] Removing BPM bond coefficients from data files --- doc/src/bond_bpm_rotational.rst | 3 --- doc/src/bond_bpm_spring.rst | 3 --- src/BPM/bond_bpm.cpp | 1 - src/BPM/bond_bpm_rotational.cpp | 11 ----------- src/BPM/bond_bpm_rotational.h | 1 - src/BPM/bond_bpm_spring.cpp | 10 ---------- src/BPM/bond_bpm_spring.h | 1 - 7 files changed, 30 deletions(-) diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index e665de466f..d8fbd27c95 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -186,9 +186,6 @@ of a pairwise interaction, since energy is not conserved in these dissipative potentials. It also returns only the normal component of the pairwise interaction force. -The accumulated data is not written to restart files and should be -output before a restart file is written to avoid missing data. - The internal fix calculates a local vector or local array depending on the number of input values. The length of the vector or number of rows in the array is the number of recorded, lost interactions. If a single diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 7f781e4657..6a05e7d3c1 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -149,9 +149,6 @@ The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these dissipative potentials. -The accumulated data is not written to restart files and should be -output before a restart file is written to avoid missing data. - The internal fix calculates a local vector or local array depending on the number of input values. The length of the vector or number of rows in the array is the number of recorded, lost interactions. If a single diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index dd7d14b3f3..c35e5d4b9b 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -36,7 +36,6 @@ BondBPM::BondBPM(LAMMPS *_lmp) : id_fix_bond_history(nullptr), id_fix_store_local(nullptr), id_fix_prop_atom(nullptr), fix_store_local(nullptr), fix_bond_history(nullptr), fix_update_special_bonds(nullptr), pack_choice(nullptr), output_data(nullptr) - { overlay_flag = 0; prop_atom_flag = 0; diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index 49b66a77a7..6aa851331c 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -752,17 +752,6 @@ void BondBPMRotational::read_restart_settings(FILE *fp) MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); } -/* ---------------------------------------------------------------------- - proc 0 writes to data file -------------------------------------------------------------------------- */ - -void BondBPMRotational::write_data(FILE *fp) -{ - for (int i = 1; i <= atom->nbondtypes; i++) - fprintf(fp, "%d %g %g %g %g %g %g %g %g %g %g %g %g\n", i, Kr[i], Ks[i], Kt[i], Kb[i], Fcr[i], - Fcs[i], Tct[i], Tcb[i], gnorm[i], gslide[i], groll[i], gtwist[i]); -} - /* ---------------------------------------------------------------------- */ double BondBPMRotational::single(int type, double rsq, int i, int j, double &fforce) diff --git a/src/BPM/bond_bpm_rotational.h b/src/BPM/bond_bpm_rotational.h index 050b766880..e52b1a9182 100644 --- a/src/BPM/bond_bpm_rotational.h +++ b/src/BPM/bond_bpm_rotational.h @@ -36,7 +36,6 @@ class BondBPMRotational : public BondBPM { void read_restart(FILE *) override; void write_restart_settings(FILE *) override; void read_restart_settings(FILE *) override; - void write_data(FILE *) override; double single(int, double, int, int, double &) override; protected: diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index a4c824db29..e87419e178 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -361,16 +361,6 @@ void BondBPMSpring::read_restart_settings(FILE *fp) MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); } -/* ---------------------------------------------------------------------- - proc 0 writes to data file -------------------------------------------------------------------------- */ - -void BondBPMSpring::write_data(FILE *fp) -{ - for (int i = 1; i <= atom->nbondtypes; i++) - fprintf(fp, "%d %g %g %g\n", i, k[i], ecrit[i], gamma[i]); -} - /* ---------------------------------------------------------------------- */ double BondBPMSpring::single(int type, double rsq, int i, int j, double &fforce) diff --git a/src/BPM/bond_bpm_spring.h b/src/BPM/bond_bpm_spring.h index 9be014e8dc..4bea7266a5 100644 --- a/src/BPM/bond_bpm_spring.h +++ b/src/BPM/bond_bpm_spring.h @@ -36,7 +36,6 @@ class BondBPMSpring : public BondBPM { void read_restart(FILE *) override; void write_restart_settings(FILE *) override; void read_restart_settings(FILE *) override; - void write_data(FILE *) override; double single(int, double, int, int, double &) override; protected: From 85bbc4ae47ee7742db07d399997e9868023fb161 Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 15 Sep 2022 16:08:33 -0600 Subject: [PATCH 129/364] Clarifying documentation on use of store/local BPM option --- doc/src/bond_bpm_rotational.rst | 36 ++++++++++++++------------------- doc/src/bond_bpm_spring.rst | 35 ++++++++++++++------------------ 2 files changed, 30 insertions(+), 41 deletions(-) diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index d8fbd27c95..5c43071274 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -138,15 +138,14 @@ the *overlay/pair* keyword. These settings require specific restrictions. Further details can be found in the `:doc: how to ` page on BPMs. -If the *store/local* keyword is used, this fix will track bonds that +If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed and transferred to an internal fix labeled *fix_ID*. This allows the -local data to be accessed by other LAMMPS commands. -Following any optional keyword/value arguments, a list of one or more -attributes is specified. These include the IDs of the two atoms in -the bond. The other attributes for the two atoms include the timestep -during which the bond broke and the current/initial center of mass -position of the two atoms. +local data to be accessed by other LAMMPS commands. Following this optional +keyword, a list of one or more attributes is specified. These include the +IDs of the two atoms in the bond. The other attributes for the two atoms +include the timestep during which the bond broke and the current/initial +center of mass position of the two atoms. Data is continuously accumulated over intervals of *N* timesteps. At the end of each interval, all of the saved accumulated @@ -181,20 +180,15 @@ properly resume bonds. However, the reference state is NOT written to data files. Therefore reading a data file will not restore bonds and will cause their reference states to be redefined. -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. It also returns only the normal component of -the pairwise interaction force. - -The internal fix calculates a local vector or local array depending on the -number of input values. The length of the vector or number of rows in -the array is the number of recorded, lost interactions. If a single -input is specified, a local vector is produced. If two or more inputs -are specified, a local array is produced where the number of columns = -the number of inputs. The vector or array can be accessed by any -command that uses local values from a compute as input. See the -:doc:`Howto output ` page for an overview of LAMMPS -output options. +If the *store/local* option is used, an internal fix will calculate +a local vector or local array depending on the number of input values. +The length of the vector or number of rows in the array is the number +of recorded, broken bonds. If a single input is specified, a local +vector is produced. If two or more inputs are specified, a local array +is produced where the number of columns = the number of inputs. The +vector or array can be accessed by any command that uses local values +from a compute as input. See the :doc:`Howto output ` page +for an overview of LAMMPS output options. The vector or array will be floating point values that correspond to the specified attribute. diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 6a05e7d3c1..de31357afe 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -103,15 +103,14 @@ the *overlay/pair* keyword. These settings require specific restrictions. Further details can be found in the `:doc: how to ` page on BPMs. -If the *store/local* keyword is used, this fix will track bonds that +If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed and transferred to an internal fix labeled *fix_ID*. This allows the -local data to be accessed by other LAMMPS commands. -Following any optional keyword/value arguments, a list of one or more -attributes is specified. These include the IDs of the two atoms in -the bond. The other attributes for the two atoms include the timestep -during which the bond broke and the current/initial center of mass -position of the two atoms. +local data to be accessed by other LAMMPS commands. Following this optional +keyword, a list of one or more attributes is specified. These include the +IDs of the two atoms in the bond. The other attributes for the two atoms +include the timestep during which the bond broke and the current/initial +center of mass position of the two atoms. Data is continuously accumulated over intervals of *N* timesteps. At the end of each interval, all of the saved accumulated @@ -145,19 +144,15 @@ file will properly restore bonds. However, the reference state is NOT written to data files. Therefore reading a data file will not restore bonds and will cause their reference states to be redefined. -The single() function of these pair styles returns 0.0 for the energy -of a pairwise interaction, since energy is not conserved in these -dissipative potentials. - -The internal fix calculates a local vector or local array depending on the -number of input values. The length of the vector or number of rows in -the array is the number of recorded, lost interactions. If a single -input is specified, a local vector is produced. If two or more inputs -are specified, a local array is produced where the number of columns = -the number of inputs. The vector or array can be accessed by any -command that uses local values from a compute as input. See the -:doc:`Howto output ` page for an overview of LAMMPS -output options. +If the *store/local* option is used, an internal fix will calculate +a local vector or local array depending on the number of input values. +The length of the vector or number of rows in the array is the number +of recorded, broken bonds. If a single input is specified, a local +vector is produced. If two or more inputs are specified, a local array +is produced where the number of columns = the number of inputs. The +vector or array can be accessed by any command that uses local values +from a compute as input. See the :doc:`Howto output ` page +for an overview of LAMMPS output options. The vector or array will be floating point values that correspond to the specified attribute. From fc7e39be059ebd510965bac5bfaf1856cb6aa29a Mon Sep 17 00:00:00 2001 From: jtclemm Date: Thu, 15 Sep 2022 16:13:53 -0600 Subject: [PATCH 130/364] Fixing overlooked merge conflict in dump_modify.rst --- doc/src/dump_modify.rst | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 2747cac1e1..29f59ffaef 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -181,8 +181,8 @@ extra buffering. .. versionadded:: 4May2022 The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, and *cfg* and their compressed, ADIOS, -and MPIIO variants. The setting for *ID string* replaces the default +for dump styles: *atom*, *custom*, *cfg*, and *local* and their compressed, +ADIOS, and MPIIO variants. The setting for *ID string* replaces the default text with the provided string. *ID* can be a positive integer when it represents the column number counting from the left, a negative integer when it represents the column number from the right (i.e. -1 is the last @@ -415,33 +415,6 @@ performed with dump style *xtc*\ . ---------- -<<<<<<< HEAD -.. versionadded:: 4May2022 - -The *colname* keyword can be used to change the default header keyword -for dump styles: *atom*, *custom*, *cfg*, and *local* and their compressed, -ADIOS, and MPIIO variants. The setting for *ID string* replaces the -default text with the provided string. *ID* can be a positive integer when -it represents the column number counting from the left, a negative integer -when it represents the column number from the right (i.e. -1 is the last -column/keyword), or a custom dump keyword (or compute, fix, property, or -variable reference) and then it replaces the string for that specific -keyword. For *atom* dump styles only the keywords "id", "type", "x", -"y", "z", "ix", "iy", "iz" can be accessed via string regardless of -whether scaled or unwrapped coordinates were enabled or disabled, and -it always assumes 8 columns for indexing regardless of whether image -flags are enabled or not. For dump style *cfg* only changes to the -"auxiliary" keywords (6th or later keyword) will become visible. - -The *colname* keyword can be used multiple times. If multiple *colname* -settings refer to the same keyword, the last setting has precedence. A -setting of *default* clears all previous settings, reverting all values -to their default names. - ----------- - -======= ->>>>>>> develop 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* From 35c4b791f8e499089fb3a73b060d55a2f2194100 Mon Sep 17 00:00:00 2001 From: Steven Anaya Date: Fri, 16 Sep 2022 02:53:42 -0600 Subject: [PATCH 131/364] Add MLIAP Unified LJ example logs --- .../log.15Sep22.mliap.unified.lj.Ar.g++.1 | 62 +++++++++++++++++++ .../log.15Sep22.mliap.unified.lj.Ar.g++.4 | 62 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 create mode 100644 examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 diff --git a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 b/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 new file mode 100644 index 0000000000..bba6fbb9df --- /dev/null +++ b/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 @@ -0,0 +1,62 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 1 by 1 by 1 MPI processor grid +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.001 seconds +Neighbor list info ... + update: every = 20 steps, delay = 0 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair mliap, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : lj + Current step : 0 + Time step : 0.005 +Per MPI rank memory allocation (min/avg/max) = 12.7 | 12.7 | 12.7 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6842865 -4.8082494 0 -2.2824513 5.5666131 + 100 1.6712577 -4.7875609 0 -2.281301 5.6613913 + 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 + 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 + 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 +Loop time of 2.37841 on 1 procs for 250 steps with 4000 atoms + +Performance: 45408.415 tau/day, 105.112 timesteps/s +87.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.2535 | 2.2535 | 2.2535 | 0.0 | 94.75 +Neigh | 0.11137 | 0.11137 | 0.11137 | 0.0 | 4.68 +Comm | 0.0063093 | 0.0063093 | 0.0063093 | 0.0 | 0.27 +Output | 0.00014549 | 0.00014549 | 0.00014549 | 0.0 | 0.01 +Modify | 0.0055828 | 0.0055828 | 0.0055828 | 0.0 | 0.23 +Other | | 0.001505 | | | 0.06 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5506 ave 5506 max 5506 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 303576 ave 303576 max 303576 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 303576 +Ave neighs/atom = 75.894 +Neighbor list builds = 12 +Dangerous builds not checked +Total wall time: 0:00:03 diff --git a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 b/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 new file mode 100644 index 0000000000..73dafb7c76 --- /dev/null +++ b/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 @@ -0,0 +1,62 @@ +LAMMPS (3 Aug 2022) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + 1 by 2 by 2 MPI processor grid +Created 4000 atoms + using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) + create_atoms CPU = 0.000 seconds +Neighbor list info ... + update: every = 20 steps, delay = 0 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair mliap, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : lj + Current step : 0 + Time step : 0.005 +Per MPI rank memory allocation (min/avg/max) = 5.774 | 5.774 | 5.774 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6842865 -4.8082494 0 -2.2824513 5.5666131 + 100 1.6712577 -4.7875609 0 -2.281301 5.6613913 + 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 + 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 + 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 +Loop time of 0.729791 on 4 procs for 250 steps with 4000 atoms + +Performance: 147987.652 tau/day, 342.564 timesteps/s +84.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.59736 | 0.64811 | 0.67755 | 3.8 | 88.81 +Neigh | 0.028786 | 0.029168 | 0.029619 | 0.2 | 4.00 +Comm | 0.018895 | 0.048858 | 0.10017 | 13.9 | 6.69 +Output | 0.00010361 | 0.00010602 | 0.00010794 | 0.0 | 0.01 +Modify | 0.0014584 | 0.0014907 | 0.0015097 | 0.1 | 0.20 +Other | | 0.002061 | | | 0.28 + +Nlocal: 1000 ave 1008 max 987 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Nghost: 2711.25 ave 2728 max 2693 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 75894 ave 77414 max 74214 min +Histogram: 1 0 0 1 0 0 0 1 0 1 + +Total # of neighbors = 303576 +Ave neighs/atom = 75.894 +Neighbor list builds = 12 +Dangerous builds not checked +Total wall time: 0:00:01 From 1655aba5f37157c45e2253d216d5ee9d9d2fb33c Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 16 Sep 2022 14:08:19 -0600 Subject: [PATCH 132/364] Add masses back and change pickle paths --- examples/mliap/in.mliap.unified.hippynn.Al | 4 +++- examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh | 4 +++- examples/mliap/in.mliap.unified.hippynn.InP | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al index 18729e2154..2be0af158e 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al +++ b/examples/mliap/in.mliap.unified.hippynn.Al @@ -20,9 +20,11 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 1 box create_atoms 1 box +mass 1 26.981 + # choose potential -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al.pt 0 +pair_style mliap unified mliap_unified_hippynn_Al.pt 0 pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh index 69ac8f199c..923568f25f 100644 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh @@ -20,9 +20,11 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 1 box create_atoms 1 box +mass 1 26.981 + # choose potential -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_Al_multilayer.pt 1 +pair_style mliap unified mliap_unified_hippynn_Al_multilayer.pt 1 pair_coeff * * Al # Setup output diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP index b58c1b99cd..9cdf78e847 100644 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -20,10 +20,13 @@ region box block 0 ${nx} 0 ${ny} 0 ${nz} create_box 2 box create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 +mass 1 114.76 +mass 2 30.98 + # choose potential # Specify MLIAP Unified pair style -pair_style mliap unified ../../../hippynn/examples/mliap_unified_hippynn_InP.pt 0 +pair_style mliap unified mliap_unified_hippynn_InP.pt 0 pair_coeff * * In P #dump 4 all custom 1 forces.xyz fx fy fz From 43998570d1fa4f6dc3f2a8031642cbcb7824f81f Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 16 Sep 2022 14:10:58 -0600 Subject: [PATCH 133/364] Remove optional toggle from pair style commands --- examples/mliap/in.mliap.unified.hippynn.InP | 2 +- examples/mliap/in.mliap.unified.lj.Ar | 2 +- src/ML-IAP/pair_mliap.cpp | 14 +++++++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP index 9cdf78e847..2300f1b15b 100644 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ b/examples/mliap/in.mliap.unified.hippynn.InP @@ -26,7 +26,7 @@ mass 2 30.98 # choose potential # Specify MLIAP Unified pair style -pair_style mliap unified mliap_unified_hippynn_InP.pt 0 +pair_style mliap unified mliap_unified_hippynn_InP.pt pair_coeff * * In P #dump 4 all custom 1 forces.xyz fx fy fz diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 167f101fc6..9ec447a812 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -11,7 +11,7 @@ mass 1 1.0 velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_style mliap unified mliap_unified_lj_Ar.pkl pair_coeff * * Ar neighbor 0.3 bin diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index e3a5c90492..4134afe24e 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -185,15 +185,19 @@ void PairMLIAP::settings(int narg, char ** arg) } else if (strcmp(arg[iarg], "unified") == 0) { if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); MLIAPBuildUnified_t build = build_unified(arg[iarg+1], data, lmp); - if (strcmp(arg[iarg+2],"0") == 0) { + if (iarg+3 > narg) { ghostneigh = 0; - } else if (strcmp(arg[iarg+2],"1") == 0) { - ghostneigh = 1; } else { - error->all(FLERR,"Illegal pair_style mliap command"); + if (strcmp(arg[iarg+2],"0") == 0) + ghostneigh = 0; + else if (strcmp(arg[iarg+2],"1") == 0) + ghostneigh = 1; + else + error->all(FLERR,"Illegal pair_style mliap command"); } + iarg += 3; model = build.model; descriptor = build.descriptor; From 8d6629cb8032b6e59ae45d4e61647473039d51ae Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Sep 2022 11:04:57 -0400 Subject: [PATCH 134/364] update MDI library to version 1.4.12 which plugs memory leaks on initialization --- cmake/Modules/Packages/MDI.cmake | 4 ++-- lib/mdi/Install.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index 8f7c87b684..edae4ffcbd 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -8,8 +8,8 @@ option(DOWNLOAD_MDI "Download and compile the MDI library instead of using an al if(DOWNLOAD_MDI) message(STATUS "MDI download requested - we will build our own") - set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.11.tar.gz" CACHE STRING "URL for MDI tarball") - set(MDI_MD5 "3791fe5081405c14aac07d4687f1cc58" CACHE STRING "MD5 checksum for MDI tarball") + set(MDI_URL "https://github.com/MolSSI-MDI/MDI_Library/archive/v1.4.12.tar.gz" CACHE STRING "URL for MDI tarball") + set(MDI_MD5 "7a222353ae8e03961d5365e6cd48baee" CACHE STRING "MD5 checksum for MDI tarball") mark_as_advanced(MDI_URL) mark_as_advanced(MDI_MD5) enable_language(C) diff --git a/lib/mdi/Install.py b/lib/mdi/Install.py index 1ef6a515da..59d218b1f9 100644 --- a/lib/mdi/Install.py +++ b/lib/mdi/Install.py @@ -32,12 +32,13 @@ make lib-mdi args="-m mpi" # build MDI lib with same settings as in the mpi Make # settings -version = "1.4.11" +version = "1.4.12" url = "https://github.com/MolSSI-MDI/MDI_Library/archive/v%s.tar.gz" % version # known checksums for different MDI versions. used to validate the download. checksums = { \ '1.4.11' : '3791fe5081405c14aac07d4687f1cc58', \ + '1.4.12' : '7a222353ae8e03961d5365e6cd48baee', \ } # print error message or help From 72fab8d5f58bd639900c962b75e7d57b98814361 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Sep 2022 16:35:28 -0400 Subject: [PATCH 135/364] must depend on libflammps so that there is no race condition --- unittest/fortran/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 7aa2177918..9e46cef23e 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -33,7 +33,7 @@ if(CMAKE_Fortran_COMPILER) add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE}) add_executable(test_fortran_create wrap_create.cpp test_fortran_create.f90) - target_link_libraries(test_fortran_create PRIVATE lammps MPI::MPI_Fortran GTest::GTestMain) + target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) target_include_directories(test_fortran_create PRIVATE "${LAMMPS_SOURCE_DIR}/../fortran") add_test(NAME FortranOpen COMMAND test_fortran_create) From 293a70b7190ece8bc25103134198ee11daa0b21e Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Mon, 19 Sep 2022 09:02:00 +0200 Subject: [PATCH 136/364] JT190922, C1: - correction of a memory issue in compute_spin.cpp - correction of the Langevin calculation in fix_langevin_spin.cpp --- src/SPIN/compute_spin.cpp | 1 + src/SPIN/fix_langevin_spin.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index ba553335bb..d4053284ce 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -69,6 +69,7 @@ ComputeSpin::~ComputeSpin() { memory->destroy(vector); delete [] spin_pairs; + delete [] lockprecessionspin; } /* ---------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index f8aacc0c5c..88af6d8dfd 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -109,7 +109,8 @@ void FixLangevinSpin::init() double hbar = force->hplanck/MY_2PI; // eV/(rad.THz) double kb = force->boltz; // eV/K - D = (alpha_t*gil_factor*kb*temp); + //D = (alpha_t*gil_factor*kb*temp); + D = (alpha_t*(1.0+(alpha_t)*(alpha_t))*kb*temp); D /= (hbar*dts); sigma = sqrt(2.0*D); } From 62b00244254c0534aca5207cf7c26a9de9c17bb4 Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Tue, 20 Sep 2022 19:07:38 +0200 Subject: [PATCH 137/364] removing small bug in compute_atom_property.cpp --- src/compute_property_atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index e2b0c1e422..d245817ebd 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -152,7 +152,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); pack_choice[i] = &ComputePropertyAtom::pack_spx; } else if (strcmp(arg[iarg],"spy") == 0) { - error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); + // error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); if (!atom->sp_flag) error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); pack_choice[i] = &ComputePropertyAtom::pack_spy; From 7e8e40fefab36815c60534e33649106262561f8b Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Wed, 21 Sep 2022 09:34:30 +0200 Subject: [PATCH 138/364] correcting memory issue in SPIN/compute_spin.cpp removing incorrect line in compute_property_atom.cpp --- src/SPIN/compute_spin.cpp | 2 +- src/compute_property_atom.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index d4053284ce..fd0174cff0 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -43,7 +43,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr) + Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), lockprecessionspin(nullptr) { if ((narg != 3) && (narg != 4)) error->all(FLERR,"Illegal compute compute/spin command"); diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index d245817ebd..f6ed867c63 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -152,7 +152,6 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); pack_choice[i] = &ComputePropertyAtom::pack_spx; } else if (strcmp(arg[iarg],"spy") == 0) { - // error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); if (!atom->sp_flag) error->all(FLERR,"Compute property/atom {} is not available", arg[iarg]); pack_choice[i] = &ComputePropertyAtom::pack_spy; From 1ef2c8c5dc8b35f08a71e62fac4e212c46e4ce39 Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Wed, 21 Sep 2022 10:06:41 +0200 Subject: [PATCH 139/364] improving the energy computation model in SPIN/compute_spin.cpp --- src/SPIN/compute_spin.cpp | 47 ++++++++++++++++++++++++++++++++++----- src/SPIN/compute_spin.h | 3 ++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index fd0174cff0..66145a1063 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -43,7 +43,8 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), lockprecessionspin(nullptr) + Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), + lockprecessionspin(nullptr) { if ((narg != 3) && (narg != 4)) error->all(FLERR,"Illegal compute compute/spin command"); @@ -136,15 +137,49 @@ void ComputeSpin::init() } } - // ptrs FixPrecessionSpin classes + // set ptrs for fix precession/spin styles + + // loop 1: obtain # of fix precession/spin styles int iforce; + nprecspin = 0; for (iforce = 0; iforce < modify->nfix; iforce++) { if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { - precession_spin_flag = 1; - lockprecessionspin = dynamic_cast(modify->fix[iforce]); + nprecspin++; } } + + // init length of vector of ptrs to precession/spin styles + + if (nprecspin > 0) { + lockprecessionspin = new FixPrecessionSpin*[nprecspin]; + } + + // loop 2: fill vector with ptrs to precession/spin styles + + int count2 = 0; + if (nprecspin > 0) { + for (iforce = 0; iforce < modify->nfix; iforce++) { + if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { + precession_spin_flag = 1; + lockprecessionspin[count2] = dynamic_cast(modify->fix[iforce]); + count2++; + } + } + } + + if (count2 != nprecspin) + error->all(FLERR,"Incorrect number of precession/spin fixes"); + + // // ptrs FixPrecessionSpin classes + + // int iforce; + // for (iforce = 0; iforce < modify->nfix; iforce++) { + // if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { + // precession_spin_flag = 1; + // lockprecessionspin = dynamic_cast(modify->fix[iforce]); + // } + // } } /* ---------------------------------------------------------------------- */ @@ -192,7 +227,9 @@ void ComputeSpin::compute_vector() // update magnetic precession energies if (precession_spin_flag) { - magenergy += lockprecessionspin->emag[i]; + for (int k = 0; k < nprecspin; k++) { + magenergy += lockprecessionspin[k]->emag[i]; + } } // update magnetic pair interactions diff --git a/src/SPIN/compute_spin.h b/src/SPIN/compute_spin.h index 1bcebfec67..45aac3c89f 100644 --- a/src/SPIN/compute_spin.h +++ b/src/SPIN/compute_spin.h @@ -40,7 +40,8 @@ class ComputeSpin : public Compute { // pointers to magnetic fixes - class FixPrecessionSpin *lockprecessionspin; + int nprecspin; + class FixPrecessionSpin **lockprecessionspin; // pointers to magnetic pair styles From 83b36f7e4b90de6618f495b9306395baa0de213d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Sep 2022 09:41:55 -0400 Subject: [PATCH 140/364] fix some minor documentation issues --- doc/src/Howto_bpm.rst | 4 ++-- doc/src/pair_bpm_spring.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 9dc043a7e1..46e7e70131 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -58,11 +58,11 @@ velocity damping as its sister bond style. ---------- -Bond data can be output using a combination of standard LAMMPS comamnds. +Bond data can be output using a combination of standard LAMMPS commands. A list of IDs for bonded atoms can be generated using the :doc:`compute property/local ` command. Various properties of bonds can be computed using the -:doc:`compute property/bond ` command. This +:doc:`compute bond/local ` command. This command allows one to access data saved to the bond's history such as the reference length of the bond. More information on bond history data can be found on the documentation pages for the specific diff --git a/doc/src/pair_bpm_spring.rst b/doc/src/pair_bpm_spring.rst index a9a4bbee70..72e0083bd8 100644 --- a/doc/src/pair_bpm_spring.rst +++ b/doc/src/pair_bpm_spring.rst @@ -59,7 +59,7 @@ include this pair interaction and overlay the pair force over the bond force or to exclude this pair interaction such that the two particles only interact via the bond force. See discussion of the *overlay/pair* option for BPM bond styles and the :doc:`special_bonds ` -command in the :doc:`how to ` page on BPMs for more details. +command in the :doc:`how to ` page on BPMs for more details. The following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples From 7c2013d86273298783895f1dd3d287be6680bb6a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Sep 2022 10:01:53 -0400 Subject: [PATCH 141/364] silence compiler warnings --- src/BPM/bond_bpm.cpp | 3 +-- src/MC/fix_gcmc.h | 2 +- src/fix_pair.cpp | 2 +- src/fix_update_special_bonds.cpp | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index c35e5d4b9b..5a20059860 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -279,8 +279,7 @@ double BondBPM::equilibrium_distance(int /*i*/) } } else { int type, j; - double delx, dely, delz, r; - double **x = atom->x; + double r; for (int i = 0; i < atom->nlocal; i++) { for (int m = 0; m < atom->num_bond[i]; m++) { type = atom->bond_type[i][m]; diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index 2bdd9eb461..685451aaa1 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -35,7 +35,7 @@ class FixGCMC : public Fix { double memory_usage() override; void write_restart(FILE *) override; void restart(char *) override; - void *extract(const char *, int &); + void *extract(const char *, int &) override; private: int molecule_group, molecule_group_bit; diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 5f9363daaa..4ef42b2f8b 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -84,7 +84,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int ifield = 0; ifield < nfield; ifield++) { int columns = 0; // set in case fieldname not recognized by pstyle - void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); + pstyle->extract_peratom(fieldname[ifield],columns); if (columns) ncols += columns; else ncols++; if (trigger[ifield]) { diff --git a/src/fix_update_special_bonds.cpp b/src/fix_update_special_bonds.cpp index 2eb24ff726..4b06b39ad4 100644 --- a/src/fix_update_special_bonds.cpp +++ b/src/fix_update_special_bonds.cpp @@ -84,7 +84,7 @@ void FixUpdateSpecialBonds::setup(int /*vflag*/) void FixUpdateSpecialBonds::pre_exchange() { - int i, j, m, n1, n3; + int i, j, m, n1; tagint tagi, tagj; int nlocal = atom->nlocal; From 51b323fc76f465b3b63f49c7d7a36ca5e33f526f Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Wed, 21 Sep 2022 20:01:38 +0200 Subject: [PATCH 142/364] Fixing typo in pair_gayberne.rst Fixing typo in the documentation --- doc/src/pair_gayberne.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_gayberne.rst b/doc/src/pair_gayberne.rst index 09bc3706c2..84d3d1a282 100644 --- a/doc/src/pair_gayberne.rst +++ b/doc/src/pair_gayberne.rst @@ -129,7 +129,7 @@ that type. e.g. in a "pair_coeff I J" command. .. note:: - If the :math:`\epsilon` a = b = c for an atom type, and if the shape + If the :math:`\epsilon_{a}` = :math:`\epsilon_{b}` = :math:`\epsilon_{c}` for an atom type, and if the shape of the particle itself is spherical, meaning its 3 shape parameters are all the same, then the particle is treated as an LJ sphere by the Gay-Berne potential. This is significant because if two LJ spheres @@ -137,7 +137,7 @@ that type. e.g. in a "pair_coeff I J" command. their interaction energy/force using the specified epsilon and sigma as the standard LJ parameters. This is much cheaper to compute than the full Gay-Berne formula. To treat the particle as a LJ sphere - with sigma = D, you should normally set :math:`\epsilon` a = b = c = + with sigma = D, you should normally set :math:`\epsilon_{a}` = :math:`\epsilon_{b}` = :math:`\epsilon_{c}` = 1.0, set the pair_coeff :math:`\sigma = D`, and also set the 3 shape parameters for the particle to D. The one exception is that if the 3 shape parameters are set to 0.0, which is a valid way in LAMMPS to From 0343ad09ea7db0e90b6b3a078f1779a359e8f648 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Sep 2022 15:54:25 -0400 Subject: [PATCH 143/364] additional formatting updates --- doc/src/pair_gayberne.rst | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/src/pair_gayberne.rst b/doc/src/pair_gayberne.rst index 84d3d1a282..553cbdd8d3 100644 --- a/doc/src/pair_gayberne.rst +++ b/doc/src/pair_gayberne.rst @@ -44,14 +44,15 @@ ellipsoidal and spherical particle via the formulas U_r = & 4 \epsilon ( \varrho^{12} - \varrho^6) \\ \varrho = & \frac{\sigma}{ h_{12} + \gamma \sigma} -where A1 and A2 are the transformation matrices from the simulation box -frame to the body frame and :math:`r_{12}` is the center to center -vector between the particles. :math:`U_r` controls the shifted distance -dependent interaction based on the distance of closest approach of the -two particles (:math:`h_{12}`) and the user-specified shift parameter -gamma. When both particles are spherical, the formula reduces to the -usual Lennard-Jones interaction (see details below for when Gay-Berne -treats a particle as "spherical"). +where :math:`\mathbf{A}_1` and :math:`\mathbf{A}_2` are the +transformation matrices from the simulation box frame to the body frame +and :math:`r_{12}` is the center to center vector between the particles. +:math:`U_r` controls the shifted distance dependent interaction based on +the distance of closest approach of the two particles (:math:`h_{12}`) +and the user-specified shift parameter :math:`\gamma`. When both +particles are spherical, the formula reduces to the usual Lennard-Jones +interaction (see details below for when Gay-Berne treats a particle as +"spherical"). For large uniform molecules it has been shown that the energy parameters are approximately representable in terms of local contact @@ -74,8 +75,9 @@ listed below and in `this supplementary document `_ Use of this pair style requires the NVE, NVT, or NPT fixes with the *asphere* extension (e.g. :doc:`fix nve/asphere `) in -order to integrate particle rotation. Additionally, :doc:`atom_style ellipsoid ` should be used since it defines the -rotational state and the size and shape of each ellipsoidal particle. +order to integrate particle rotation. Additionally, :doc:`atom_style +ellipsoid ` should be used since it defines the rotational +state and the size and shape of each ellipsoidal particle. The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples From 39763444c5e7eecbb33588b6c4a205b20cb11596 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 21 Sep 2022 14:03:04 -0600 Subject: [PATCH 144/364] add lasttime check to fix pair --- src/fix_pair.cpp | 23 +++++++++++++++++++++-- src/fix_pair.h | 2 ++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 5f9363daaa..8d3ce717d3 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -120,7 +120,8 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : atom->add_callback(Atom::GROW); // zero the vector/array since dump may access it on timestep 0 - // zero the vector/array since a variable may access it before first run + // zero the vector/array since a variable may access it before first ru + // initialize lasttime so step 0 will trigger/extract int nlocal = atom->nlocal; @@ -132,6 +133,8 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int m = 0; m < ncols; m++) array[i][m] = 0.0; } + + lasttime = -1; } /* ---------------------------------------------------------------------- */ @@ -188,6 +191,13 @@ void FixPair::setup(int vflag) /* ---------------------------------------------------------------------- */ +void FixPair::min_setup(int vflag) +{ + setup(vflag); +} + +/* ---------------------------------------------------------------------- */ + void FixPair::setup_pre_force(int vflag) { pre_force(vflag); @@ -195,14 +205,18 @@ void FixPair::setup_pre_force(int vflag) /* ---------------------------------------------------------------------- trigger pair style computation on steps which are multiples of Nevery + lasttime prevents mulitiple triggers by min linesearch on same iteration ------------------------------------------------------------------------- */ void FixPair::pre_force(int /*vflag*/) { if (update->ntimestep % nevery) return; + if (update->ntimestep == lasttime) return; // set pair style triggers + printf("FPAIR preforce: set trigger %ld\n",update->ntimestep); + for (int ifield = 0; ifield < nfield; ifield++) if (trigger[ifield]) *(triggerptr[ifield]) = 1; } @@ -215,12 +229,15 @@ void FixPair::min_pre_force(int vflag) } /* ---------------------------------------------------------------------- - extract results from pair style + extract results from pair style on steps which are multiples of Nevery + lasttime prevents mulitiple extracts by min linesearch on same iteration ------------------------------------------------------------------------- */ void FixPair::post_force(int /*vflag*/) { if (update->ntimestep % nevery) return; + if (update->ntimestep == lasttime) return; + lasttime = update->ntimestep; // extract pair style fields one by one // store their values in this fix @@ -230,6 +247,8 @@ void FixPair::post_force(int /*vflag*/) int icol = 0; int columns; + printf("FPAIR postforce: extract %ld\n",update->ntimestep); + for (int ifield = 0; ifield < nfield; ifield++) { void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); if (pvoid == nullptr) diff --git a/src/fix_pair.h b/src/fix_pair.h index c4d0bb593c..c3d8454185 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -31,6 +31,7 @@ class FixPair : public Fix { int setmask() override; void init() override; void setup(int) override; + void min_setup(int) override; void setup_pre_force(int) override; void pre_force(int) override; void min_pre_force(int) override; @@ -46,6 +47,7 @@ class FixPair : public Fix { private: int nevery,nfield,ncols; + bigint lasttime; char *pairname; char **fieldname,**triggername; int *trigger; From fc969bc99b91a77747d7c1c767a60b88c19e1bbc Mon Sep 17 00:00:00 2001 From: jtclemm Date: Wed, 21 Sep 2022 15:28:23 -0600 Subject: [PATCH 145/364] Adding parentheses to logic statement in fix update/special/bonds --- src/fix_update_special_bonds.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fix_update_special_bonds.cpp b/src/fix_update_special_bonds.cpp index 2eb24ff726..00cb0a85cb 100644 --- a/src/fix_update_special_bonds.cpp +++ b/src/fix_update_special_bonds.cpp @@ -210,7 +210,7 @@ void FixUpdateSpecialBonds::pre_force(int /*vflag*/) jnum = numneigh[i1]; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; - if (j >> SBBITS & 3 != 0) continue; // Skip bonded pairs + if (((j >> SBBITS) & 3) != 0) continue; // Skip bonded pairs if (tag[j] == tag2) jlist[jj] = j ^ (1 << SBBITS); // Add 1-2 special bond bits } } @@ -220,7 +220,7 @@ void FixUpdateSpecialBonds::pre_force(int /*vflag*/) jnum = numneigh[i2]; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; - if (j >> SBBITS & 3 != 0) continue; // Skip bonded pairs + if (((j >> SBBITS) & 3) != 0) continue; // Skip bonded pairs if (tag[j] == tag1) jlist[jj] = j ^ (1 << SBBITS); // Add 1-2 special bond bits } } From f149d14abca77227971da70b0611f66a29d79cfb Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 22 Sep 2022 12:32:06 +0200 Subject: [PATCH 146/364] remove debug print statements in fix_pair.cpp --- src/fix_pair.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index c58677ac95..23914acad0 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -215,7 +215,7 @@ void FixPair::pre_force(int /*vflag*/) // set pair style triggers - printf("FPAIR preforce: set trigger %ld\n",update->ntimestep); +// printf("FPAIR preforce: set trigger %ld\n",update->ntimestep); for (int ifield = 0; ifield < nfield; ifield++) if (trigger[ifield]) *(triggerptr[ifield]) = 1; @@ -247,7 +247,7 @@ void FixPair::post_force(int /*vflag*/) int icol = 0; int columns; - printf("FPAIR postforce: extract %ld\n",update->ntimestep); +// printf("FPAIR postforce: extract %ld\n",update->ntimestep); for (int ifield = 0; ifield < nfield; ifield++) { void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); @@ -361,6 +361,7 @@ double FixPair::memory_usage() return bytes; } +//TODO: generalize to another arguments int FixPair::modify_param(int narg, char **arg) { nevery = utils::inumeric(FLERR,arg[0],false,lmp); From 4afa603bcb6eda6437c8e2cdfcb63857a1f9f538 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 22 Sep 2022 12:42:57 +0200 Subject: [PATCH 147/364] fix_pair.cpp: FixPair::modify_param - change args format (now incl. keyword 'every') --- src/fix_pair.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 23914acad0..b4e4ddc185 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -361,11 +361,18 @@ double FixPair::memory_usage() return bytes; } -//TODO: generalize to another arguments -int FixPair::modify_param(int narg, char **arg) -{ - nevery = utils::inumeric(FLERR,arg[0],false,lmp); - if (nevery < 1) error->all(FLERR,"Illegal fix_modify pair command"); +int FixPair::modify_param(int narg, char **arg) { + int processed_args=0; + int iarg = 0; + while (iarg < narg) { + if (strcmp(arg[iarg], "every") == 0) { + nevery = utils::inumeric(FLERR, arg[iarg+1], false, lmp); + if (nevery < 1) error->all(FLERR, "Illegal fix_modify pair command"); + iarg += 2; + processed_args+=2; + } else + iarg +=1; + } - return 1; // how many arguments were processed + return processed_args; // how many arguments were processed } \ No newline at end of file From 2b27fd8acb2fc993b85300b51e2be79dbdec37de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 10:34:23 -0400 Subject: [PATCH 148/364] address possible initialization issues reported by coverity scan --- src/MC/fix_charge_regulation.cpp | 7 ++----- src/OPENMP/fix_nvt_sllod_omp.cpp | 7 +++---- src/fix_nvt_sllod.cpp | 7 +++---- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/MC/fix_charge_regulation.cpp b/src/MC/fix_charge_regulation.cpp index 795ccb75d1..e97b8ccafb 100644 --- a/src/MC/fix_charge_regulation.cpp +++ b/src/MC/fix_charge_regulation.cpp @@ -377,11 +377,8 @@ void FixChargeRegulation::forward_acid() { double energy_before = energy_stored; double factor; double dummyp[3]; - double pos[3]; - pos[0] = 0; - pos[1] = 0; - pos[2] = 0; // acid/base particle position - double pos_all[3]; + double pos[3] = {0.0, 0.0, 0.0}; // acid/base particle position + double pos_all[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; m1 = get_random_particle(acid_type, 0, 0, dummyp); diff --git a/src/OPENMP/fix_nvt_sllod_omp.cpp b/src/OPENMP/fix_nvt_sllod_omp.cpp index 866592728d..d1d8910af1 100644 --- a/src/OPENMP/fix_nvt_sllod_omp.cpp +++ b/src/OPENMP/fix_nvt_sllod_omp.cpp @@ -56,9 +56,9 @@ FixNVTSllodOMP::FixNVTSllodOMP(LAMMPS *lmp, int narg, char **arg) : // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/deform", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/deform",id_temp,group->names[igroup])); tcomputeflag = 1; + nondeformbias = 0; } /* ---------------------------------------------------------------------- */ @@ -79,8 +79,7 @@ void FixNVTSllodOMP::init() for (i = 0; i < modify->nfix; i++) if (utils::strmatch(modify->fix[i]->style,"^deform")) { if ((dynamic_cast(modify->fix[i]))->remapflag != Domain::V_REMAP) - error->all(FLERR,"Using fix nvt/sllod/omp with inconsistent fix " - "deform remap option"); + error->all(FLERR,"Using fix nvt/sllod/omp with inconsistent fix deform remap option"); break; } if (i == modify->nfix) diff --git a/src/fix_nvt_sllod.cpp b/src/fix_nvt_sllod.cpp index a721afd2ee..610d310e3f 100644 --- a/src/fix_nvt_sllod.cpp +++ b/src/fix_nvt_sllod.cpp @@ -51,9 +51,9 @@ FixNVTSllod::FixNVTSllod(LAMMPS *lmp, int narg, char **arg) : // id = fix-ID + temp id_temp = utils::strdup(std::string(id) + "_temp"); - modify->add_compute(fmt::format("{} {} temp/deform", - id_temp,group->names[igroup])); + modify->add_compute(fmt::format("{} {} temp/deform",id_temp,group->names[igroup])); tcomputeflag = 1; + nondeformbias = 0; } /* ---------------------------------------------------------------------- */ @@ -74,8 +74,7 @@ void FixNVTSllod::init() for (i = 0; i < modify->nfix; i++) if (strncmp(modify->fix[i]->style,"deform",6) == 0) { if ((dynamic_cast(modify->fix[i]))->remapflag != Domain::V_REMAP) - error->all(FLERR,"Using fix nvt/sllod with inconsistent fix deform " - "remap option"); + error->all(FLERR,"Using fix nvt/sllod with inconsistent fix deform remap option"); break; } if (i == modify->nfix) From 6c9c61e7631f320992b5d0b0fb08e36bda546065 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 10:45:53 -0400 Subject: [PATCH 149/364] remove debug output --- src/fix_pair.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 8d3ce717d3..9bc4619adc 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -215,8 +215,6 @@ void FixPair::pre_force(int /*vflag*/) // set pair style triggers - printf("FPAIR preforce: set trigger %ld\n",update->ntimestep); - for (int ifield = 0; ifield < nfield; ifield++) if (trigger[ifield]) *(triggerptr[ifield]) = 1; } @@ -247,8 +245,6 @@ void FixPair::post_force(int /*vflag*/) int icol = 0; int columns; - printf("FPAIR postforce: extract %ld\n",update->ntimestep); - for (int ifield = 0; ifield < nfield; ifield++) { void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); if (pvoid == nullptr) From e99bdeefb8af833b4e3795b37c338a555c3ec74a Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 22 Sep 2022 17:05:13 +0200 Subject: [PATCH 150/364] remove docs for unexisting command `compute pace/extrapolation` --- doc/src/Commands_compute.rst | 1 - doc/src/compute.rst | 1 - doc/src/compute_pace_extrapolation.rst | 69 -------------------------- doc/src/dump_pace_extrapolation.rst | 45 ----------------- doc/src/pair_pace.rst | 60 ++++++++-------------- 5 files changed, 22 insertions(+), 154 deletions(-) delete mode 100644 doc/src/compute_pace_extrapolation.rst delete mode 100644 doc/src/dump_pace_extrapolation.rst diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 38c4f204c8..682a75f201 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -96,7 +96,6 @@ KOKKOS, o = OPENMP, t = OPT. * :doc:`nbond/atom ` * :doc:`omega/chunk ` * :doc:`orientorder/atom (k) ` - * :doc:`pace/extrapolation ` * :doc:`pair ` * :doc:`pair/local ` * :doc:`pe ` diff --git a/doc/src/compute.rst b/doc/src/compute.rst index cb5e319736..7d1e423e93 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -240,7 +240,6 @@ The individual style names on the :doc:`Commands compute ` pag * :doc:`nbond/atom ` - calculates number of bonds per atom * :doc:`omega/chunk ` - angular velocity for each chunk * :doc:`orientorder/atom ` - Steinhardt bond orientational order parameters Ql -* :doc:`pace/extrapolation ` - calculate extrapolation grade for pair style pace/extrapolation * :doc:`pair ` - values computed by a pair style * :doc:`pair/local ` - distance/energy/force of each pairwise interaction * :doc:`pe ` - potential energy diff --git a/doc/src/compute_pace_extrapolation.rst b/doc/src/compute_pace_extrapolation.rst deleted file mode 100644 index b983f983e9..0000000000 --- a/doc/src/compute_pace_extrapolation.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. index:: compute pace/extrapolation - -compute pace/extrapolation command -================================== - -Syntax -"""""" - -.. parsed-literal:: - - compute ID all pace/extrapolation - -* ID is documented in :doc:`compute ` command -* pace/extrapolation = style name of this compute command - -Examples -"""""""" - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - -Description -""""""""""" - -Define a computation that calculates both per-atom and per-structure extrapolation grades for PACE interatomic potential. -Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. -Extrapolation grades are computed by `pair_style pace/extrapolation` every *gamma_freq* steps (see :doc:`pair_style pace/extrapolation `), -but `compute pace/extrapolation` will invoke extra calculations with this pair style if necessary. -For better performance, it is recommended to use the same values of *gamma_freq* and -the frequency of compute style callers, i.e. `dump` or `thermo`. - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - - # per-structure extrapolation grade c_pace_gamma - thermo_style custom step etotal temp press c_pace_gamma - - # per-atom extrapolation grade c_pace_gamma - dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma - - -Output info -""""""""""" - -This compute calculates both per-atom vector and per-structure scalar, -which can be accessed by any command that uses per-atom and/or per-structure values from a compute as input. -See the :doc:`Howto output ` page for an overview of -LAMMPS output options. - -All values are unitless. - -Restrictions -"""""""""""" - - Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. - - group-ID always corresponds to the group atoms used by `pair_style pace/extrapolation` and by default is `all`. - -Related commands -"""""""""""""""" - -:doc:`pair_style pace/extrapolation `, :doc:`dump custom `, :doc:`thermo custom ` - -Default -""""""" - -`compute pace_gamma all pace/extrapolation` diff --git a/doc/src/dump_pace_extrapolation.rst b/doc/src/dump_pace_extrapolation.rst deleted file mode 100644 index 0b14222c42..0000000000 --- a/doc/src/dump_pace_extrapolation.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. index:: dump pace/extrapolation - -dump pace/extrapolation command -================================ - -Syntax -"""""" - -.. parsed-literal:: - - dump ID group-ID pace/extrapolation N file args - - -* ID = user-assigned name for the dump -* group-ID = ID of the group of atoms to be dumped -* N = dump every this many timesteps (use 1 to potentially dump on every step, see below) -* file = name of file to write dump info to -* args = list of arguments (see :doc:`dump custom `) - -Examples -"""""""" - -.. code-block:: LAMMPS - - dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma - dump pace all pace/extrapolation 1 extrapolation.lammpsbin id type mass x y z c_pace_gamma - -Description -""""""""""" - -Dump a snapshot of atom coordinates if extrapolation grade, computed by -:doc:`compute pace/extrapolation `, exceeds *gamma_lower_bound* threshold, -provided in :doc:`pair_style pace/extrapolation `. - -.. note:: - - To be able to use this dump, you need to setup :doc:`pair_style pace/extrapolation ` - and :doc:`compute pace/extrapolation ` beforehand - ----------- - -Related commands -"""""""""""""""" - -:doc:`pair_style pace/extrapolation `, :doc:`compute pace/extrapolation ` diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index c2d33240db..91851d54f3 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -28,14 +28,7 @@ Syntax .. code-block:: LAMMPS - pair_style pace/extrapolation gamma_lower_bound gamma_upper_bound gamma_freq - -* one or more arguments may be appended - - .. parsed-literal:: - *gamma_lower_bound* = minimal value of extrapolation grade considered as moderate extrapolation - *gamma_upper_bound* = maximal value of extrapolation grade considered as moderate extrapolation - *gamma_freq* value = frequency of computing extrapolation grade (in steps) + pair_style pace/extrapolation Examples """""""" @@ -46,7 +39,7 @@ Examples pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu - pair_style pace/extrapolation 1.5 10 20 + pair_style pace/extrapolation pair_coeff * * Cu.yaml Cu.asi Cu Description @@ -106,37 +99,32 @@ In order to compute extrapolation grade one needs to provide: #. Active Set Inverted (ASI) file for corresponding potential (`.asi` format) Calculation of extrapolation grades requires matrix-vector multiplication for each atom -and can be slower than the usual `pair_style pace recursive`, -therefore it make sense *not* to do it on every step. -Extrapolation grade calculation frequency is controlled by *gamma_freq* parameter. -On all other steps `pair_style pace recursive` is used. - -The maximal value of *gamma* for all atoms in a structure determines the extrapolation grade for structure. -Both per-atom and per-structure extrapolation grades are accessible via `compute pace/extrapolation`: +and is slower than the usual `pair_style pace recursive`, therefore it is *not* computed by default. +Extrapolation grade calculation is involved by `fix pair`, which requests to compute `gamma`, as shown in example below: .. code-block:: LAMMPS - compute pace_gamma all pace/extrapolation + pair_style pace/extrapolation + pair_coeff * * Cu.yaml Cu.asi Cu - # show maximal extrapolation grade per-structure - thermo_style custom step etotal temp press c_pace_gamma + fix pace_gamma all pair 10 pace/extrapolation gamma 1 - # dump structure with per-atom extrapolation grades - dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma - -If maximal extrapolation grade per-structure exceeds *gamma_lower_bound* but less than *gamma_upper_bound*, -the structure is considered as extrapolative and can be stored with `dump pace/extrapolation`: - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma - -Please note, that even if you provide dump frequency equal to one, dump will write structure -only if extrapolation grades are computed on current timestep *and* maximal extrapolation grade exceeds *gamma_lower_bound*. -If extrapolation grade exceeds *gamma_upper_bound*, simulation will be aborted. + compute max_pace_gamma all reduce max f_pace_gamma + variable dump_skip equal "c_max_pace_gamma < 5" + dump pace_dump all custom 20 extrapolative_structures.dump id x y z f_pace_gamma + dump_modify pace_dump skip v_dump_skip + + variable max_pace_gamma equal c_max_pace_gamma + fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25 + +Here extrapolation grade gamma is computed every 10 steps and is stored in `f_pace_gamma` per-atom variable. +The largest value of extrapolation grade among all atoms in a structure is reduced to `c_max_pace_gamma` variable. +Only if this value exceeds extrapolation threshold 5, then the structure will be dumped into `extrapolative_structures.dump` +file, but not more often than every 20 steps. + +On all other steps `pair_style pace recursive` will be used. ---------- @@ -179,16 +167,12 @@ Related commands """""""""""""""" :doc:`pair_style snap `, -:doc:`compute pace/extrapolation `, -:doc:`dump pace/extrapolation `, +:doc:`fix pair ` Default """"""" recursive, chunksize = 4096, -gamma_lower_bound = 1.5, -gamma_upper_bound = 10, -gamma_freq = 1 .. _Drautz20191: From 6fac8f168881b3af77cf5605aa499e331d753850 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 11:32:14 -0400 Subject: [PATCH 151/364] remove unused NeighRequest member variable index --- src/neigh_request.cpp | 3 +-- src/neigh_request.h | 3 +-- src/neighbor.cpp | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/neigh_request.cpp b/src/neigh_request.cpp index 37da50eaea..dc38205d55 100644 --- a/src/neigh_request.cpp +++ b/src/neigh_request.cpp @@ -99,9 +99,8 @@ NeighRequest::NeighRequest(LAMMPS *_lmp) : Pointers(_lmp) /* ---------------------------------------------------------------------- */ -NeighRequest::NeighRequest(LAMMPS *_lmp, int idx, void *ptr, int num) : NeighRequest(_lmp) +NeighRequest::NeighRequest(LAMMPS *_lmp, void *ptr, int num) : NeighRequest(_lmp) { - index = idx; requestor = ptr; requestor_instance = num; } diff --git a/src/neigh_request.h b/src/neigh_request.h index 13b5b11466..9f2d56add8 100644 --- a/src/neigh_request.h +++ b/src/neigh_request.h @@ -29,7 +29,6 @@ class NeighRequest : protected Pointers { friend class FixIntel; protected: - int index; // index of which neigh request this is void *requestor; // class that made request int requestor_instance; // instance of that class (only Fix, Compute, Pair) int id; // ID of request as stored by requestor @@ -122,7 +121,7 @@ class NeighRequest : protected Pointers { // methods public: NeighRequest(class LAMMPS *); - NeighRequest(class LAMMPS *, int, void *, int); + NeighRequest(class LAMMPS *, void *, int); NeighRequest(NeighRequest *); ~NeighRequest() override; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 298ec29994..6af4094a21 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -2163,13 +2163,13 @@ int Neighbor::request(void *requestor, int instance) memory->srealloc(requests,maxrequest*sizeof(NeighRequest *), "neighbor:requests"); } - requests[nrequest] = new NeighRequest(lmp, nrequest, requestor, instance); + requests[nrequest] = new NeighRequest(lmp, requestor, instance); nrequest++; return nrequest-1; } /* ---------------------------------------------------------------------- - called by other classes to request a pairwise neighbor list + add_request() is called by other classes to request a pairwise neighbor list ------------------------------------------------------------------------- */ NeighRequest *Neighbor::add_request(Pair *requestor, int flags) From e3729e51e8407a79a2add351f27975bde015ae65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 12:23:52 -0400 Subject: [PATCH 152/364] remove unused method, modernize errors and access to molecule class, reformat --- src/MC/fix_widom.cpp | 302 +++++++++++++------------------------------ src/MC/fix_widom.h | 10 +- 2 files changed, 95 insertions(+), 217 deletions(-) diff --git a/src/MC/fix_widom.cpp b/src/MC/fix_widom.cpp index d1bc5dfa58..72c02203e3 100644 --- a/src/MC/fix_widom.cpp +++ b/src/MC/fix_widom.cpp @@ -48,20 +48,18 @@ using namespace LAMMPS_NS; using namespace FixConst; -using namespace MathConst; +using MathConst::MY_2PI; #define MAXENERGYTEST 1.0e50 - -enum{EXCHATOM,EXCHMOL}; // exchmode +enum { EXCHATOM, EXCHMOL }; // exchmode /* ---------------------------------------------------------------------- */ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - region(nullptr), idregion(nullptr), full_flag(false), local_gas_list(nullptr), - molcoords(nullptr),molq(nullptr), molimage(nullptr), random_equal(nullptr) + Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), full_flag(false), molcoords(nullptr), + molq(nullptr), molimage(nullptr), random_equal(nullptr), c_pe(nullptr) { - if (narg < 8) error->all(FLERR,"Illegal fix widom command"); + if (narg < 8) utils::missing_cmd_args(FLERR, "fix widom", error); if (atom->molecular == Atom::TEMPLATE) error->all(FLERR,"Fix widom does not (yet) work with atom_style template"); @@ -83,11 +81,11 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : seed = utils::inumeric(FLERR,arg[6],false,lmp); insertion_temperature = utils::numeric(FLERR,arg[7],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal fix widom command"); - if (ninsertions < 0) error->all(FLERR,"Illegal fix widom command"); - if (seed <= 0) error->all(FLERR,"Illegal fix widom command"); + if (nevery <= 0) error->all(FLERR,"Invalid fix widom every argument: {}", nevery); + if (ninsertions < 0) error->all(FLERR,"Invalid fix widom insertions argument: {}", ninsertions); + if (seed <= 0) error->all(FLERR,"Invalid fix widom seed argument: {}", seed); if (insertion_temperature < 0.0) - error->all(FLERR,"Illegal fix widom command"); + error->all(FLERR,"Invalid fix widom temperature argument: {}", insertion_temperature); // read options from end of input line @@ -99,13 +97,12 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : // error checks on region and its extent being inside simulation box - region_xlo = region_xhi = region_ylo = region_yhi = - region_zlo = region_zhi = 0.0; + region_xlo = region_xhi = region_ylo = region_yhi = region_zlo = region_zhi = 0.0; if (region) { if (region->bboxflag == 0) - error->all(FLERR,"Fix widom region does not support a bounding box"); + error->all(FLERR,"Fix widom region {} does not support a bounding box", region->id); if (region->dynamic_check()) - error->all(FLERR,"Fix widom region cannot be dynamic"); + error->all(FLERR,"Fix widom region {} cannot be dynamic", region->id); region_xlo = region->extent_xlo; region_xhi = region->extent_xhi; @@ -117,7 +114,7 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : if (region_xlo < domain->boxlo[0] || region_xhi > domain->boxhi[0] || region_ylo < domain->boxlo[1] || region_yhi > domain->boxhi[1] || region_zlo < domain->boxlo[2] || region_zhi > domain->boxhi[2]) - error->all(FLERR,"Fix widom region extends outside simulation box"); + error->all(FLERR,"Fix widom region {} extends outside simulation box", region->id); // estimate region volume using MC trials @@ -132,8 +129,8 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : inside++; } - double max_region_volume = (region_xhi - region_xlo) * - (region_yhi - region_ylo) * (region_zhi - region_zlo); + double max_region_volume = (region_xhi - region_xlo) * (region_yhi - region_ylo) + * (region_zhi - region_zlo); region_volume = max_region_volume * static_cast(inside) / static_cast(attempts); } @@ -141,28 +138,25 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : // error check and further setup for exchmode = EXCHMOL if (exchmode == EXCHMOL) { - if (onemols[imol]->xflag == 0) - error->all(FLERR,"Fix widom molecule must have coordinates"); - if (onemols[imol]->typeflag == 0) - error->all(FLERR,"Fix widom molecule must have atom types"); + if (onemol->xflag == 0) + error->all(FLERR,"Fix widom molecule {} must have coordinates", onemol->id); + if (onemol->typeflag == 0) + error->all(FLERR,"Fix widom molecule {} must have atom types", onemol->id); if (nwidom_type != 0) error->all(FLERR,"Atom type must be zero in fix widom mol command"); - if (onemols[imol]->qflag == 1 && atom->q == nullptr) - error->all(FLERR,"Fix widom molecule has charges, but atom style does not"); + if (onemol->qflag == 1 && atom->q == nullptr) + error->all(FLERR,"Fix widom molecule {} has charges, but atom style does not", onemol->id); - if (atom->molecular == Atom::TEMPLATE && onemols != atom->avec->onemols) - error->all(FLERR,"Fix widom molecule template ID must be same " - "as atom_style template ID"); - onemols[imol]->check_attributes(); + onemol->check_attributes(); } if (charge_flag && atom->q == nullptr) - error->all(FLERR,"Fix Widom atom has charge, but atom style does not"); + error->all(FLERR,"Fix widom atom has charge, but atom style does not"); // setup of array of coordinates for molecule insertion if (exchmode == EXCHATOM) natoms_per_molecule = 1; - else natoms_per_molecule = onemols[imol]->natoms; + else natoms_per_molecule = onemol->natoms; nmaxmolatoms = natoms_per_molecule; grow_molecule_arrays(nmaxmolatoms); @@ -173,7 +167,7 @@ FixWidom::FixWidom(LAMMPS *lmp, int narg, char **arg) : // zero out counters widom_nmax = 0; - local_gas_list = nullptr; + ave_widom_chemical_potential = 0.0; } /* ---------------------------------------------------------------------- @@ -201,17 +195,16 @@ void FixWidom::options(int narg, char **arg) int iarg = 0; while (iarg < narg) { - if (strcmp(arg[iarg],"mol") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix widom command"); - imol = atom->find_molecule(arg[iarg+1]); - if (imol == -1) - error->all(FLERR,"Molecule template ID for fix widom does not exist"); - if (atom->molecules[imol]->nset > 1 && comm->me == 0) - error->warning(FLERR,"Molecule template for " - "fix widom has multiple molecules"); + if (strcmp(arg[iarg],"mol") == 0) { + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "fix widom mol", error); + auto onemols = atom->get_molecule_by_id(arg[iarg+1]); + if (onemols.size() == 0) + error->all(FLERR,"Molecule template ID {} for fix widom does not exist", arg[iarg+1]); + if (onemols.size() > 1 && comm->me == 0) + error->warning(FLERR,"Molecule template {} for fix widom has multiple molecules; " + "will use only the first molecule", arg[iarg+1]); exchmode = EXCHMOL; - onemols = atom->molecules; - nmol = onemols[imol]->nset; + onemol = onemols[0]; iarg += 2; } else if (strcmp(arg[iarg],"region") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix widom command"); @@ -243,7 +236,6 @@ FixWidom::~FixWidom() delete[] idregion; delete random_equal; - memory->destroy(local_gas_list); memory->destroy(molcoords); memory->destroy(molq); memory->destroy(molimage); @@ -292,7 +284,7 @@ void FixWidom::init() } } - if (full_flag) c_pe = modify->compute[modify->find_compute("thermo_pe")]; + if (full_flag) c_pe = modify->get_compute_by_id("thermo_pe"); if (exchmode == EXCHATOM) { if (nwidom_type <= 0 || nwidom_type > atom->ntypes) @@ -360,22 +352,21 @@ void FixWidom::init() if (exchmode == EXCHMOL) { - onemols[imol]->compute_mass(); - onemols[imol]->compute_com(); - gas_mass = onemols[imol]->masstotal; - for (int i = 0; i < onemols[imol]->natoms; i++) { - onemols[imol]->x[i][0] -= onemols[imol]->com[0]; - onemols[imol]->x[i][1] -= onemols[imol]->com[1]; - onemols[imol]->x[i][2] -= onemols[imol]->com[2]; + onemol->compute_mass(); + onemol->compute_com(); + gas_mass = onemol->masstotal; + for (int i = 0; i < onemol->natoms; i++) { + onemol->x[i][0] -= onemol->com[0]; + onemol->x[i][1] -= onemol->com[1]; + onemol->x[i][2] -= onemol->com[2]; } - onemols[imol]->com[0] = 0; - onemols[imol]->com[1] = 0; - onemols[imol]->com[2] = 0; + onemol->com[0] = 0; + onemol->com[1] = 0; + onemol->com[2] = 0; } else gas_mass = atom->mass[nwidom_type]; - if (gas_mass <= 0.0) - error->all(FLERR,"Illegal fix widom gas mass <= 0"); + if (gas_mass <= 0.0) error->all(FLERR,"Illegal fix widom gas mass <= 0"); // check that no deletable atoms are in atom->firstgroup // deleting such an atom would not leave firstgroup atoms first @@ -443,7 +434,6 @@ void FixWidom::pre_exchange() atom->nghost = 0; comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - update_gas_atoms_list(); if (full_flag) { energy_stored = energy_full(); @@ -525,12 +515,12 @@ void FixWidom::attempt_atomic_insertion() if (!domain->inside(coord)) error->one(FLERR,"Fix widom put atom outside box"); if (coord[0] >= sublo[0] && coord[0] < subhi[0] && - coord[1] >= sublo[1] && coord[1] < subhi[1] && - coord[2] >= sublo[2] && coord[2] < subhi[2]) proc_flag = 1; + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) proc_flag = 1; } else { if (lamda[0] >= sublo[0] && lamda[0] < subhi[0] && - lamda[1] >= sublo[1] && lamda[1] < subhi[1] && - lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; + lamda[1] >= sublo[1] && lamda[1] < subhi[1] && + lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; } if (proc_flag) { @@ -545,9 +535,7 @@ void FixWidom::attempt_atomic_insertion() double incr_chem_pot = (inst_chem_pot - ave_widom_chemical_potential); ave_widom_chemical_potential += incr_chem_pot / (imove + 1); } - } - } /* ---------------------------------------------------------------------- @@ -571,13 +559,13 @@ void FixWidom::attempt_molecule_insertion() com_coord[2] = region_zlo + random_equal->uniform() * (region_zhi-region_zlo); while (region->match(com_coord[0],com_coord[1], - com_coord[2]) == 0) { + com_coord[2]) == 0) { com_coord[0] = region_xlo + random_equal->uniform() * - (region_xhi-region_xlo); + (region_xhi-region_xlo); com_coord[1] = region_ylo + random_equal->uniform() * - (region_yhi-region_ylo); + (region_yhi-region_ylo); com_coord[2] = region_zlo + random_equal->uniform() * - (region_zhi-region_zlo); + (region_zhi-region_zlo); region_attempt++; if (region_attempt >= max_region_attempts) return; } @@ -622,7 +610,7 @@ void FixWidom::attempt_molecule_insertion() auto procflag = new bool[natoms_per_molecule]; for (int i = 0; i < natoms_per_molecule; i++) { - MathExtra::matvec(rotmat,onemols[imol]->x[i],molcoords[i]); + MathExtra::matvec(rotmat,onemol->x[i],molcoords[i]); molcoords[i][0] += com_coord[0]; molcoords[i][1] += com_coord[1]; molcoords[i][2] += com_coord[2]; @@ -641,40 +629,37 @@ void FixWidom::attempt_molecule_insertion() procflag[i] = false; if (triclinic == 0) { if (xtmp[0] >= sublo[0] && xtmp[0] < subhi[0] && - xtmp[1] >= sublo[1] && xtmp[1] < subhi[1] && - xtmp[2] >= sublo[2] && xtmp[2] < subhi[2]) procflag[i] = true; + xtmp[1] >= sublo[1] && xtmp[1] < subhi[1] && + xtmp[2] >= sublo[2] && xtmp[2] < subhi[2]) procflag[i] = true; } else { domain->x2lamda(xtmp,lamda); if (lamda[0] >= sublo[0] && lamda[0] < subhi[0] && - lamda[1] >= sublo[1] && lamda[1] < subhi[1] && - lamda[2] >= sublo[2] && lamda[2] < subhi[2]) procflag[i] = true; + lamda[1] >= sublo[1] && lamda[1] < subhi[1] && + lamda[2] >= sublo[2] && lamda[2] < subhi[2]) procflag[i] = true; } if (procflag[i]) { int ii = -1; - if (onemols[imol]->qflag == 1) { - ii = atom->nlocal + atom->nghost; - if (ii >= atom->nmax) atom->avec->grow(0); - atom->q[ii] = onemols[imol]->q[i]; + if (onemol->qflag == 1) { + ii = atom->nlocal + atom->nghost; + if (ii >= atom->nmax) atom->avec->grow(0); + atom->q[ii] = onemol->q[i]; } - insertion_energy += energy(ii,onemols[imol]->type[i],-1,xtmp); + insertion_energy += energy(ii,onemol->type[i],-1,xtmp); } } double insertion_energy_sum = 0.0; MPI_Allreduce(&insertion_energy,&insertion_energy_sum,1, - MPI_DOUBLE,MPI_SUM,world); + MPI_DOUBLE,MPI_SUM,world); // the insertion_energy_sum is the variable with the energy of inserting one molecule double inst_chem_pot = exp(-insertion_energy_sum*beta); double incr_chem_pot = (inst_chem_pot - ave_widom_chemical_potential); ave_widom_chemical_potential += incr_chem_pot / (imove + 1); - delete[] procflag; - } - } /* ---------------------------------------------------------------------- @@ -727,12 +712,12 @@ void FixWidom::attempt_atomic_insertion_full() if (!domain->inside(coord)) error->one(FLERR,"Fix widom put atom outside box"); if (coord[0] >= sublo[0] && coord[0] < subhi[0] && - coord[1] >= sublo[1] && coord[1] < subhi[1] && - coord[2] >= sublo[2] && coord[2] < subhi[2]) proc_flag = 1; + coord[1] >= sublo[1] && coord[1] < subhi[1] && + coord[2] >= sublo[2] && coord[2] < subhi[2]) proc_flag = 1; } else { if (lamda[0] >= sublo[0] && lamda[0] < subhi[0] && - lamda[1] >= sublo[1] && lamda[1] < subhi[1] && - lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; + lamda[1] >= sublo[1] && lamda[1] < subhi[1] && + lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; } if (proc_flag) { @@ -770,11 +755,7 @@ void FixWidom::attempt_atomic_insertion_full() if (proc_flag) atom->nlocal--; if (force->kspace) force->kspace->qsum_qsq(); if (force->pair->tail_flag) force->pair->reinit(); - - update_gas_atoms_list(); - } - } /* ---------------------------------------------------------------------- @@ -803,20 +784,13 @@ void FixWidom::attempt_molecule_insertion_full() double com_coord[3]; if (region) { int region_attempt = 0; - com_coord[0] = region_xlo + random_equal->uniform() * - (region_xhi-region_xlo); - com_coord[1] = region_ylo + random_equal->uniform() * - (region_yhi-region_ylo); - com_coord[2] = region_zlo + random_equal->uniform() * - (region_zhi-region_zlo); - while (region->match(com_coord[0],com_coord[1], - com_coord[2]) == 0) { - com_coord[0] = region_xlo + random_equal->uniform() * - (region_xhi-region_xlo); - com_coord[1] = region_ylo + random_equal->uniform() * - (region_yhi-region_ylo); - com_coord[2] = region_zlo + random_equal->uniform() * - (region_zhi-region_zlo); + com_coord[0] = region_xlo + random_equal->uniform() * (region_xhi-region_xlo); + com_coord[1] = region_ylo + random_equal->uniform() * (region_yhi-region_ylo); + com_coord[2] = region_zlo + random_equal->uniform() * (region_zhi-region_zlo); + while (region->match(com_coord[0],com_coord[1], com_coord[2]) == 0) { + com_coord[0] = region_xlo + random_equal->uniform() * (region_xhi-region_xlo); + com_coord[1] = region_ylo + random_equal->uniform() * (region_yhi-region_ylo); + com_coord[2] = region_zlo + random_equal->uniform() * (region_zhi-region_zlo); region_attempt++; if (region_attempt >= max_region_attempts) return; } @@ -861,7 +835,7 @@ void FixWidom::attempt_molecule_insertion_full() for (int i = 0; i < natoms_per_molecule; i++) { double xtmp[3]; - MathExtra::matvec(rotmat,onemols[imol]->x[i],xtmp); + MathExtra::matvec(rotmat,onemol->x[i],xtmp); xtmp[0] += com_coord[0]; xtmp[1] += com_coord[1]; xtmp[2] += com_coord[2]; @@ -876,40 +850,39 @@ void FixWidom::attempt_molecule_insertion_full() int proc_flag = 0; if (triclinic == 0) { if (xtmp[0] >= sublo[0] && xtmp[0] < subhi[0] && - xtmp[1] >= sublo[1] && xtmp[1] < subhi[1] && - xtmp[2] >= sublo[2] && xtmp[2] < subhi[2]) proc_flag = 1; + xtmp[1] >= sublo[1] && xtmp[1] < subhi[1] && + xtmp[2] >= sublo[2] && xtmp[2] < subhi[2]) proc_flag = 1; } else { domain->x2lamda(xtmp,lamda); if (lamda[0] >= sublo[0] && lamda[0] < subhi[0] && - lamda[1] >= sublo[1] && lamda[1] < subhi[1] && - lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; + lamda[1] >= sublo[1] && lamda[1] < subhi[1] && + lamda[2] >= sublo[2] && lamda[2] < subhi[2]) proc_flag = 1; } if (proc_flag) { - atom->avec->create_atom(onemols[imol]->type[i],xtmp); + atom->avec->create_atom(onemol->type[i],xtmp); int m = atom->nlocal - 1; atom->image[m] = imagetmp; atom->molecule[m] = insertion_molecule; if (maxtag_all+i+1 >= MAXTAGINT) - error->all(FLERR,"Fix widom ran out of available atom IDs"); + error->all(FLERR,"Fix widom ran out of available atom IDs"); atom->tag[m] = maxtag_all + i + 1; atom->v[m][0] = 0; atom->v[m][1] = 0; atom->v[m][2] = 0; - atom->add_molecule_atom(onemols[imol],i,m,maxtag_all); + atom->add_molecule_atom(onemol,i,m,maxtag_all); modify->create_attribute(m); } } atom->natoms += natoms_per_molecule; - if (atom->natoms < 0) - error->all(FLERR,"Too many total atoms"); - atom->nbonds += onemols[imol]->nbonds; - atom->nangles += onemols[imol]->nangles; - atom->ndihedrals += onemols[imol]->ndihedrals; - atom->nimpropers += onemols[imol]->nimpropers; + if (atom->natoms < 0) error->all(FLERR,"Too many total atoms"); + atom->nbonds += onemol->nbonds; + atom->nangles += onemol->nangles; + atom->ndihedrals += onemol->ndihedrals; + atom->nimpropers += onemol->nimpropers; if (atom->map_style != Atom::MAP_NONE) atom->map_init(); atom->nghost = 0; if (triclinic) domain->x2lamda(atom->nlocal); @@ -924,10 +897,10 @@ void FixWidom::attempt_molecule_insertion_full() double incr_chem_pot = (inst_chem_pot - ave_widom_chemical_potential); ave_widom_chemical_potential += incr_chem_pot / (imove + 1); - atom->nbonds -= onemols[imol]->nbonds; - atom->nangles -= onemols[imol]->nangles; - atom->ndihedrals -= onemols[imol]->ndihedrals; - atom->nimpropers -= onemols[imol]->nimpropers; + atom->nbonds -= onemol->nbonds; + atom->nangles -= onemol->nangles; + atom->ndihedrals -= onemol->ndihedrals; + atom->nimpropers -= onemol->nimpropers; atom->natoms -= natoms_per_molecule; int i = 0; @@ -939,9 +912,6 @@ void FixWidom::attempt_molecule_insertion_full() } if (force->kspace) force->kspace->qsum_qsq(); if (force->pair->tail_flag) force->pair->reinit(); - - update_gas_atoms_list(); - } } @@ -1061,92 +1031,6 @@ double FixWidom::energy_full() return total_energy; } -/* ---------------------------------------------------------------------- - update the list of gas atoms -------------------------------------------------------------------------- */ - -void FixWidom::update_gas_atoms_list() -{ - int nlocal = atom->nlocal; - int *mask = atom->mask; - tagint *molecule = atom->molecule; - double **x = atom->x; - - if (atom->nmax > widom_nmax) { - memory->sfree(local_gas_list); - widom_nmax = atom->nmax; - local_gas_list = (int *) memory->smalloc(widom_nmax*sizeof(int), - "Widom:local_gas_list"); - } - - ngas_local = 0; - - if (region) { - - if (exchmode == EXCHMOL) { - - tagint maxmol = 0; - for (int i = 0; i < nlocal; i++) maxmol = MAX(maxmol,molecule[i]); - tagint maxmol_all; - MPI_Allreduce(&maxmol,&maxmol_all,1,MPI_LMP_TAGINT,MPI_MAX,world); - auto comx = new double[maxmol_all]; - auto comy = new double[maxmol_all]; - auto comz = new double[maxmol_all]; - for (int imolecule = 0; imolecule < maxmol_all; imolecule++) { - for (int i = 0; i < nlocal; i++) { - if (molecule[i] == imolecule) { - mask[i] |= molecule_group_bit; - } else { - mask[i] &= molecule_group_inversebit; - } - } - double com[3]; - com[0] = com[1] = com[2] = 0.0; - group->xcm(molecule_group,gas_mass,com); - - // remap unwrapped com into periodic box - - domain->remap(com); - comx[imolecule] = com[0]; - comy[imolecule] = com[1]; - comz[imolecule] = com[2]; - } - - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - if (region->match(comx[molecule[i]], - comy[molecule[i]],comz[molecule[i]]) == 1) { - local_gas_list[ngas_local] = i; - ngas_local++; - } - } - } - delete[] comx; - delete[] comy; - delete[] comz; - } else { - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - if (region->match(x[i][0],x[i][1],x[i][2]) == 1) { - local_gas_list[ngas_local] = i; - ngas_local++; - } - } - } - } - - } else { - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - local_gas_list[ngas_local] = i; - ngas_local++; - } - } - } - - MPI_Allreduce(&ngas_local,&ngas,1,MPI_INT,MPI_SUM,world); -} - /* ---------------------------------------------------------------------- return acceptance ratios ------------------------------------------------------------------------- */ diff --git a/src/MC/fix_widom.h b/src/MC/fix_widom.h index dd388ec8e5..cf9a54fe02 100644 --- a/src/MC/fix_widom.h +++ b/src/MC/fix_widom.h @@ -40,7 +40,6 @@ class FixWidom : public Fix { double energy(int, int, tagint, double *); double molecule_energy(tagint); double energy_full(); - void update_gas_atoms_list(); double compute_vector(int) override; double memory_usage() override; void write_restart(FILE *) override; @@ -53,10 +52,7 @@ class FixWidom : public Fix { int exclusion_group, exclusion_group_bit; int nwidom_type, nevery, seed; int ninsertions; - int ngas; // # of gas atoms on all procs - int ngas_local; // # of gas atoms on this proc int exchmode; // exchange ATOM or MOLECULE - int movemode; // move ATOM or MOLECULE class Region *region; // widom region char *idregion; // widom region id bool charge_flag; // true if user specified atomic charge @@ -71,14 +67,13 @@ class FixWidom : public Fix { int max_region_attempts; double gas_mass; double insertion_temperature; - double beta, sigma, volume; + double beta, volume; double charge; double xlo, xhi, ylo, yhi, zlo, zhi; double region_xlo, region_xhi, region_ylo, region_yhi, region_zlo, region_zhi; double region_volume; double energy_stored; // full energy of old/current configuration double *sublo, *subhi; - int *local_gas_list; double **cutsq; double **molcoords; double *molq; @@ -93,8 +88,7 @@ class FixWidom : public Fix { class Atom *model_atom; - class Molecule **onemols; - int imol, nmol; + class Molecule *onemol; int triclinic; // 0 = orthog box, 1 = triclinic class Compute *c_pe; From 4a072d10db599969662d5adaa4f8a115a332aa5c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 12:24:09 -0400 Subject: [PATCH 153/364] make sure array is initialized --- src/MC/fix_charge_regulation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MC/fix_charge_regulation.cpp b/src/MC/fix_charge_regulation.cpp index e97b8ccafb..18f812dc05 100644 --- a/src/MC/fix_charge_regulation.cpp +++ b/src/MC/fix_charge_regulation.cpp @@ -376,7 +376,7 @@ void FixChargeRegulation::forward_acid() { double energy_before = energy_stored; double factor; - double dummyp[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; double pos[3] = {0.0, 0.0, 0.0}; // acid/base particle position double pos_all[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; From 4f0caca9d84490b932a348ac042bf0717da662a0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 13:05:32 -0400 Subject: [PATCH 154/364] make sure data is initialized --- src/COLVARS/group_ndx.cpp | 5 ++--- src/EFF/fix_nvt_sllod_eff.cpp | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/COLVARS/group_ndx.cpp b/src/COLVARS/group_ndx.cpp index a45c0c1bf0..0e9da8cce3 100644 --- a/src/COLVARS/group_ndx.cpp +++ b/src/COLVARS/group_ndx.cpp @@ -47,7 +47,7 @@ static int cmptagint(const void *p1, const void *p2) void Group2Ndx::command(int narg, char **arg) { - FILE *fp; + FILE *fp = nullptr; if (narg < 1) error->all(FLERR,"Illegal group2ndx command"); @@ -57,8 +57,7 @@ void Group2Ndx::command(int narg, char **arg) if (comm->me == 0) { fp = fopen(arg[0], "w"); if (fp == nullptr) - error->one(FLERR,"Cannot open index file for writing: {}", - utils::getsyserror()); + error->one(FLERR,"Cannot open index file for writing: {}", utils::getsyserror()); utils::logmesg(lmp,"Writing groups to index file {}:\n",arg[0]); } diff --git a/src/EFF/fix_nvt_sllod_eff.cpp b/src/EFF/fix_nvt_sllod_eff.cpp index 8b7c6bac9b..333c98668c 100644 --- a/src/EFF/fix_nvt_sllod_eff.cpp +++ b/src/EFF/fix_nvt_sllod_eff.cpp @@ -51,6 +51,7 @@ FixNVTSllodEff::FixNVTSllodEff(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} {} tmp/deform/eff", id_temp,group->names[igroup])); tcomputeflag = 1; + nondeformbias = 0; } /* ---------------------------------------------------------------------- */ From 96f04237c179cab6a1c469886981174831ba3cc2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 13:12:15 -0400 Subject: [PATCH 155/364] fix memory leak and avoid uninitialized data access --- src/MC/fix_charge_regulation.cpp | 79 +++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/src/MC/fix_charge_regulation.cpp b/src/MC/fix_charge_regulation.cpp index 18f812dc05..c1bcba007f 100644 --- a/src/MC/fix_charge_regulation.cpp +++ b/src/MC/fix_charge_regulation.cpp @@ -140,6 +140,8 @@ FixChargeRegulation::FixChargeRegulation(LAMMPS *lmp, int narg, char **arg) : nsalt_successes = 0; } +/* ---------------------------------------------------------------------- */ + FixChargeRegulation::~FixChargeRegulation() { memory->destroy(ptype_ID); @@ -153,14 +155,23 @@ FixChargeRegulation::~FixChargeRegulation() { int igroupall = group->find("all"); neighbor->exclusion_group_group_delete(exclusion_group, igroupall); } + + if (groupstrings) { + for (int i = 0; i < ngroups; ++i) delete[] groupstrings[i]; + memory->destroy(groupstrings); + } } +/* ---------------------------------------------------------------------- */ + int FixChargeRegulation::setmask() { int mask = 0; mask |= PRE_EXCHANGE; return mask; } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::init() { triclinic = domain->triclinic; @@ -246,6 +257,8 @@ void FixChargeRegulation::init() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::pre_exchange() { if (next_reneighbor != update->ntimestep) return; @@ -372,6 +385,8 @@ void FixChargeRegulation::pre_exchange() { next_reneighbor = update->ntimestep + nevery; } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::forward_acid() { double energy_before = energy_stored; @@ -429,17 +444,16 @@ void FixChargeRegulation::forward_acid() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::backward_acid() { double energy_before = energy_stored; double factor; int mask_tmp; - double dummyp[3]; - double pos[3]; - pos[0] = 0; - pos[1] = 0; - pos[2] = 0; // acid/base particle position - double pos_all[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; + double pos[3] = {0.0, 0.0, 0.0}; // acid/base particle position + double pos_all[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; m1 = get_random_particle(acid_type, -1, 0, dummyp); @@ -507,16 +521,15 @@ void FixChargeRegulation::backward_acid() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::forward_base() { double energy_before = energy_stored; double factor; - double dummyp[3]; - double pos[3]; - pos[0] = 0; - pos[1] = 0; - pos[2] = 0; // acid/base particle position - double pos_all[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; + double pos[3] = {0.0, 0.0, 0.0}; // acid/base particle position + double pos_all[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; m1 = get_random_particle(base_type, 0, 0, dummyp); @@ -567,17 +580,16 @@ void FixChargeRegulation::forward_base() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::backward_base() { double energy_before = energy_stored; double factor; - double dummyp[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; + double pos[3] = {0.0, 0.0, 0.0}; // acid/base particle position + double pos_all[3] = {0.0, 0.0, 0.0}; int mask_tmp; - double pos[3]; - pos[0] = 0; - pos[1] = 0; - pos[2] = 0; // acid/base particle position - double pos_all[3]; int m1 = -1, m2 = -1; m1 = get_random_particle(base_type, 1, 0, dummyp); @@ -644,11 +656,13 @@ void FixChargeRegulation::backward_base() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::forward_ions() { double energy_before = energy_stored; double factor; - double dummyp[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; factor = volume_rx * volume_rx * c10pI_plus * c10pI_minus / ((1 + ncation) * (1 + nanion)); @@ -679,13 +693,14 @@ void FixChargeRegulation::forward_ions() { } } +/* ---------------------------------------------------------------------- */ void FixChargeRegulation::backward_ions() { double energy_before = energy_stored; double factor; int mask1_tmp = 0, mask2_tmp = 0; - double dummyp[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; int m1 = -1, m2 = -1; m1 = get_random_particle(cation_type, +1, 0, dummyp); @@ -761,11 +776,13 @@ void FixChargeRegulation::backward_ions() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::forward_ions_multival() { double energy_before = energy_stored; double factor = 1; - double dummyp[3]; + double dummyp[3] = {0.0, 0.0, 0.0}; // particle ID array for all ions to be inserted auto mm = std::unique_ptr(new int[salt_charge_ratio + 1]); @@ -819,11 +836,13 @@ void FixChargeRegulation::forward_ions_multival() { } } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::backward_ions_multival() { double energy_before = energy_stored; double factor = 1; - double dummyp[3]; // dummy particle + double dummyp[3] = {0.0, 0.0, 0.0}; // dummy particle // particle ID array for all deleted ions auto mm = std::unique_ptr(new int[salt_charge_ratio + 1]); // charge array for all deleted ions @@ -940,6 +959,8 @@ void FixChargeRegulation::backward_ions_multival() { } } +/* ---------------------------------------------------------------------- */ + int FixChargeRegulation::insert_particle(int ptype, double charge, double rd, double *target) { // insert a particle of type (ptype) with charge (charge) within distance (rd) of (target) @@ -1010,6 +1031,8 @@ int FixChargeRegulation::insert_particle(int ptype, double charge, double rd, do return m; } +/* ---------------------------------------------------------------------- */ + int FixChargeRegulation::get_random_particle(int ptype, double charge, double rd, double *target) { // returns a randomly chosen particle of type (ptype) with charge (charge) @@ -1074,6 +1097,8 @@ int FixChargeRegulation::get_random_particle(int ptype, double charge, double rd return -1; } +/* ---------------------------------------------------------------------- */ + double FixChargeRegulation::energy_full() { if (triclinic) domain->x2lamda(atom->nlocal); domain->pbc(); @@ -1133,6 +1158,8 @@ double FixChargeRegulation::energy_full() { return total_energy; } +/* ---------------------------------------------------------------------- */ + int FixChargeRegulation::particle_number_xrd(int ptype, double charge, double rd, double *target) { int count = 0; @@ -1162,6 +1189,8 @@ int FixChargeRegulation::particle_number_xrd(int ptype, double charge, double rd return count_sum; } +/* ---------------------------------------------------------------------- */ + int FixChargeRegulation::particle_number(int ptype, double charge) { int count = 0; @@ -1174,6 +1203,8 @@ int FixChargeRegulation::particle_number(int ptype, double charge) { return count_sum; } +/* ---------------------------------------------------------------------- */ + double FixChargeRegulation::compute_vector(int n) { if (n == 0) { return nacid_attempts + nbase_attempts + nsalt_attempts; @@ -1250,6 +1281,8 @@ void FixChargeRegulation::restart(char *buf) error->all(FLERR,"Must not reset timestep when restarting fix gcmc"); } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::setThermoTemperaturePointer() { int ifix = -1; ifix = modify->find_fix(idftemp); @@ -1263,6 +1296,8 @@ void FixChargeRegulation::setThermoTemperaturePointer() { } +/* ---------------------------------------------------------------------- */ + void FixChargeRegulation::assign_tags() { // Assign tags to ions with zero tags if (atom->tag_enable) { From 24fd02725ce8fa456f840556ecf3cc87d2ef08c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 13:21:33 -0400 Subject: [PATCH 156/364] make operator precedence explicit --- src/KSPACE/ewald_disp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KSPACE/ewald_disp.cpp b/src/KSPACE/ewald_disp.cpp index cff419de76..d5ebc4dd36 100644 --- a/src/KSPACE/ewald_disp.cpp +++ b/src/KSPACE/ewald_disp.cpp @@ -398,7 +398,7 @@ void EwaldDisp::reallocate() h[0] = unit[0]*ix; h[1] = unit[5]*ix+unit[1]*iy; h[2] = unit[4]*ix+unit[3]*iy+unit[2]*iz; - if ((*(flag++) = h[0]*h[0]+h[1]*h[1]+h[2]*h[2]<=gsqmx)) ++nkvec; + if ((*(flag++) = (h[0]*h[0]+h[1]*h[1]+h[2]*h[2]<=gsqmx))) ++nkvec; } if (nkvec>nkvec_max) { From 3c5e44616572d1682de20ace65edf29af5937af1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 13:21:54 -0400 Subject: [PATCH 157/364] avoid null pointer dereference --- src/atom.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index f66570e57b..3d843cbbbc 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -779,9 +779,11 @@ std::string Atom::get_style() std::string retval = atom_style; if (retval == "hybrid") { auto avec_hybrid = dynamic_cast(avec); - for (int i = 0; i < avec_hybrid->nstyles; i++) { - retval += ' '; - retval += avec_hybrid->keywords[i]; + if (avec_hybrid) { + for (int i = 0; i < avec_hybrid->nstyles; i++) { + retval += ' '; + retval += avec_hybrid->keywords[i]; + } } } return retval; From aff5200ded78c5b29c6fea1faf5a994f3393937a Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 22 Sep 2022 19:16:15 -0500 Subject: [PATCH 158/364] Implemented extract_atom, updated docs, added some unit tests --- doc/src/Fortran.rst | 124 +++++++++++++++++++++++++------- fortran/lammps.f90 | 110 ++++++++++++++++++++++++++-- unittest/fortran/CMakeLists.txt | 4 ++ 3 files changed, 210 insertions(+), 28 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 28436c813f..74863d484b 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -179,7 +179,6 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f c_ptr handle: reference to the LAMMPS class :f subroutine close: :f:func:`close` - :f function version: :f:func:`version` :f subroutine file: :f:func:`file` :f subroutine command: :f:func:`command` :f subroutine commands_list: :f:func:`commands_list` @@ -191,6 +190,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f subroutine memory_usage: :f:func:`memory_usage` :f function extract_setting: :f:func:`extract_setting` :f function extract_global: :f:func:`extract_global` + :f function version: :f:func:`version` + :f function is_running: :f:func:`is_running` -------- @@ -223,10 +224,10 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. .. code-block:: Fortran PROGRAM testmpi - USE LIBLAMMPS - USE MPI_F08 - TYPE(lammps) :: lmp - lmp = lammps(MPI_COMM_SELF%MPI_VAL) + USE LIBLAMMPS + USE MPI_F08 + TYPE(lammps) :: lmp + lmp = lammps(MPI_COMM_SELF%MPI_VAL) END PROGRAM testmpi Procedures Bound to the lammps Derived Type @@ -236,18 +237,11 @@ Procedures Bound to the lammps Derived Type This method will close down the LAMMPS instance through calling :cpp:func:`lammps_close`. If the *finalize* argument is present and - has a value of ``.true.``, then this subroutine also calls + has a value of ``.TRUE.``, then this subroutine also calls :cpp:func:`lammps_mpi_finalize`. - :o logical finalize [optional]: shut down the MPI environment of the LAMMPS library if true. - --------- - -.. f:function:: version() - - This method returns the numeric LAMMPS version like :cpp:func:`lammps_version` - - :r integer: LAMMPS version + :o logical finalize [optional]: shut down the MPI environment of the LAMMPS + library if true. -------- @@ -422,8 +416,8 @@ Procedures Bound to the lammps Derived Type associates the pointer on the left side of the assignment to point to internal LAMMPS data (with the exception of string data, which are copied and returned as ordinary Fortran strings). Pointers must be of the - correct data type to point to said data (typically INTEGER(c_int), - INTEGER(c_int64_t), or REAL(c_double)) and have compatible kind and rank. + correct data type to point to said data (typically integer(C_int), + integer(C_int64_t), or real(C_double)) and have compatible kind and rank. The pointer being associated with LAMMPS data is type-, kind-, and rank-checked at run-time via an overloaded assignment operator. The pointers returned by this function are generally persistent; therefore @@ -436,7 +430,7 @@ Procedures Bound to the lammps Derived Type .. code-block:: fortran PROGRAM demo - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_int64_t, C_double USE LIBLAMMPS TYPE(lammps) :: lmp INTEGER(C_int), POINTER :: nlocal @@ -457,13 +451,15 @@ Procedures Bound to the lammps Derived Type the size of the current time step, and the units being used into the variables *nlocal*, *ntimestep*, *dt*, and *units*, respectively. - *Note*: if this function returns a string, the string must have - length greater than or equal to the length of the string (not including the - terminal NULL character) that LAMMPS returns. If the variable's length is - too short, the string will be truncated. As usual in Fortran, strings - are padded with spaces at the end. + .. note:: - :p character(len=\*) name: string with the name of the extracted property + If :f:func:`extract_global` returns a string, the string must have length + greater than or equal to the length of the string (not including the + terminal ``NULL`` character) that LAMMPS returns. If the variable's + length is too short, the string will be truncated. As usual in Fortran, + strings are padded with spaces at the end. + + :p character(len=\*) name: string with the name of the property to extract :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment should be either a string (if expecting string data) or a C-interoperable pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted @@ -477,3 +473,83 @@ Procedures Bound to the lammps Derived Type to use a LAMMPS input command that sets or changes these parameters. Those will take care of all side effects and necessary updates of settings derived from such settings. + +-------- + +.. f:function:: extract_atom(name) + + This function calls :c:func:`lammps_extract_atom` and returns a pointer to + LAMMPS data tied to the :cpp:class:`Atom` class, depending on the data + requested through *name*. + + Note that this function actually does not return a pointer, but rather + associates the pointer on the left side of the assignment to point + to internal LAMMPS data. Pointers must be of the correct type, kind, and + rank (e.g., integer(C_int), dimension(:) for "type" or "mask"; + integer(C_int64_t), dimension(:) for "tag", assuming LAMMPS was not compiled + with the -DLAMMPS_SMALL_SMALL flag; real(C_double), dimension(:,:) for "x" + or "f"; and so forth). The pointer being associated with LAMMPS data is + type-, kind-, and rank-checked at run-time. Pointers returned by this + function are generally persistent; therefore, it is not necessary to call + the function again unless the underlying LAMMPS data are destroyed, such as + through the :doc:`clear` command. + + :p character(len=\*) name: string with the name of the property to extract + :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment + should be a C-interoperable pointer + (e.g., ``INTEGER (c_int), POINTER :: mask``) to the extracted + property. If expecting vector data, the pointer should have dimension ":"; + if expecting matrix data, the pointer should have dimension ":,:". + + .. note:: + + Two-dimensional arrays returned from :f:func:`extract_atom` will be + **transposed** from equivalent arrays in C, and they will be indexed + from 1 instead of 0. For example, in C, + + .. code-block:: C + + void *lmp; + double **x; + /* more code to setup, etc. */ + x = lammps_extract_atom(lmp, "x"); + printf("%f\n", x[5][1]); + + will print the *y*-coordinate of the sixth atom on this processor. + Conversely, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(C_double), DIMENSION(:,:), POINTER :: x + ! more code to setup, etc. + x = lmp%extract_atom("x") + print '(f0.6)', x(2,6) + + will print the *y*-coordinate of the third atom on this processor + (note the transposition of the two indices). This is not a choice, but + rather a consequence of the different conventions adopted by the Fortran + and C standards decades ago. + + If you would like the indices to start at 0 instead of 1 (which follows + typical notation in C and C++, but not Fortran), you can create another + pointer and associate it thus: + + .. code-block:: Fortran + + REAL(C_double), DIMENSION(:,:), POINTER :: x, x0 + x = lmp%extract_atom("x") + x0(0:,0:) => x + + The above would cause the dimensions of *x* to be (1:3, 1:nlocal) + and those of *x0* to be (0:2, 0:nlocal-1). + +-------- + +.. f:function:: version() + + This method returns the numeric LAMMPS version like + :cpp:func:`lammps_version` does. + + :r integer: LAMMPS version + diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7541bf7c0f..322d54687c 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -68,6 +68,7 @@ MODULE LIBLAMMPS PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm PROCEDURE :: extract_setting => lmp_extract_setting PROCEDURE :: extract_global => lmp_extract_global + PROCEDURE :: extract_atom => lmp_extract_atom PROCEDURE :: version => lmp_version PROCEDURE :: is_running => lmp_is_running END TYPE lammps @@ -94,6 +95,7 @@ MODULE LIBLAMMPS INTEGER(c_int64_t), DIMENSION(:), POINTER :: i64_vec REAL(c_double), POINTER :: r64 REAL(c_double), DIMENSION(:), POINTER :: r64_vec + REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat CHARACTER(LEN=:), ALLOCATABLE :: str END TYPE lammps_data @@ -105,8 +107,9 @@ MODULE LIBLAMMPS ! LAMMPS data (after checking type-compatibility) INTERFACE ASSIGNMENT(=) MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & - assign_intvec_to_lammps_data, & + assign_intvec_to_lammps_data, assign_int64vec_to_lammps_data, & assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & + assign_doublemat_to_lammps_data, & assign_string_to_lammps_data END INTERFACE @@ -246,9 +249,19 @@ MODULE LIBLAMMPS TYPE(c_ptr) :: lammps_extract_global END FUNCTION lammps_extract_global - !INTEGER (c_int) FUNCTION lammps_extract_atom_datatype + FUNCTION lammps_extract_atom_datatype(handle, name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_atom_datatype + END FUNCTION lammps_extract_atom_datatype - !(generic) lammps_extract_atom + FUNCTION lammps_extract_atom(handle, name) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr) :: lammps_extract_atom + END FUNCTION lammps_extract_atom !(generic) lammps_extract_compute @@ -632,6 +645,72 @@ CONTAINS END SELECT END FUNCTION + ! equivalent function to lammps_extract_atom + ! the assignment is actually overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_atom (self, name) RESULT (peratom_data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + TYPE(lammps_data) :: peratom_data + + INTEGER(c_int) :: datatype + TYPE(c_ptr) :: Cname, Cptr + INTEGER(c_int) :: ntypes, nmax + INTEGER :: nrows, ncols + REAL(c_double), DIMENSION(:), POINTER :: dummy + TYPE(c_ptr), DIMENSION(:), POINTER :: Catomptr + + nmax = lmp_extract_setting(self, 'nmax') + ntypes = lmp_extract_setting(self, 'ntypes') + Cname = f2c_string(name) + datatype = lammps_extract_atom_datatype(self%handle, Cname) + Cptr = lammps_extract_atom(self%handle, Cname) + CALL lammps_free(Cname) + + SELECT CASE (name) + CASE ('mass') + ncols = ntypes + 1 + nrows = 1 + CASE ('x','v','f','mu','omega','torque','angmom') + ncols = nmax + nrows = 3 + CASE DEFAULT + ncols = nmax + nrows = 1 + END SELECT + + SELECT CASE (datatype) + CASE (LAMMPS_INT) + peratom_data%datatype = DATA_INT_1D + CALL C_F_POINTER(Cptr, peratom_data%i32_vec, [ncols]) + CASE (LAMMPS_INT64) + peratom_data%datatype = DATA_INT64_1D + CALL C_F_POINTER(Cptr, peratom_data%i64_vec, [ncols]) + CASE (LAMMPS_DOUBLE) + peratom_data%datatype = DATA_DOUBLE_1D + IF ( name == 'mass' ) THEN + CALL C_F_POINTER(Cptr, dummy, [ncols]) + peratom_data%r64_vec(0:) => dummy + ELSE + CALL C_F_POINTER(Cptr, peratom_data%r64_vec, [ncols]) + END IF + CASE (LAMMPS_DOUBLE_2D) + peratom_data%datatype = DATA_DOUBLE_2D + ! First, we dereference the void** pointer to point to the void* + CALL C_F_POINTER(Cptr, Catomptr, [ncols]) + ! Catomptr(1) now points to the first element of the array + CALL C_F_POINTER(Catomptr(1), peratom_data%r64_mat, [nrows,ncols]) + CASE (-1) + WRITE(ERROR_UNIT,'(A)') 'ERROR: per-atom property "' // name // & + '" not found.' + STOP 2 + CASE DEFAULT + WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: return value ', datatype, & + ' from lammps_extract_atom_datatype not known' + STOP 1 + END SELECT + END FUNCTION lmp_extract_atom + ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) CLASS(lammps) :: self @@ -682,6 +761,17 @@ CONTAINS END IF END SUBROUTINE assign_intvec_to_lammps_data + SUBROUTINE assign_int64vec_to_lammps_data (lhs, rhs) + INTEGER(c_int64_t), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_INT64_1D ) THEN + lhs => rhs%i64_vec + ELSE + CALL assignment_error(rhs%datatype, 'vector of long ints') + END IF + END SUBROUTINE assign_int64vec_to_lammps_data + SUBROUTINE assign_double_to_lammps_data (lhs, rhs) REAL(c_double), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -704,6 +794,17 @@ CONTAINS END IF END SUBROUTINE assign_doublevec_to_lammps_data + SUBROUTINE assign_doublemat_to_lammps_data (lhs, rhs) + REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE_2D ) THEN + lhs => rhs%r64_mat + ELSE + CALL assignment_error(rhs%datatype, 'matrix of doubles') + END IF + END SUBROUTINE assign_doublemat_to_lammps_data + SUBROUTINE assign_string_to_lammps_data (lhs, rhs) CHARACTER(LEN=*), INTENT(OUT) :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -743,7 +844,8 @@ CONTAINS CASE DEFAULT str1 = 'that type' END SELECT - WRITE (ERROR_UNIT,'(A)') 'Cannot associate ' // str1 // ' with ' // type2 + WRITE (ERROR_UNIT,'(A)') 'ERROR (Fortran API): cannot associate ' & + // str1 // ' with ' // type2 STOP ERROR_CODE END SUBROUTINE assignment_error diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index c2bea82480..fea9d6aae9 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -57,6 +57,10 @@ if(CMAKE_Fortran_COMPILER) target_link_libraries(test_fortran_extract_global PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractGlobal COMMAND test_fortran_extract_global) + add_executable(test_fortran_extract_atom wrap_extract_atom.cpp test_fortran_extract_atom.f90) + target_link_libraries(test_fortran_extract_atom PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranExtractAtom COMMAND test_fortran_extract_atom) + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() From 43aabc798570b3db5c175e7a1bcf463809a51648 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Thu, 22 Sep 2022 18:29:45 -0600 Subject: [PATCH 159/364] Update comments and documentation --- doc/src/pair_mliap.rst | 8 +-- examples/mliap/README | 66 +++++++++++++++++++ examples/mliap/in.mliap.unified.hippynn.Al | 1 + .../in.mliap.unified.hippynn.Al.ghostneigh | 1 + examples/mliap/in.mliap.unified.hippynn.InP | 1 + src/ML-IAP/mliap_unified.cpp | 38 ++++++++++- src/ML-IAP/mliap_unified.h | 2 +- src/ML-IAP/mliap_unified_couple.pyx | 5 ++ 8 files changed, 115 insertions(+), 7 deletions(-) diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index b6f65a9525..54adb7d721 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -10,7 +10,7 @@ Syntax pair_style mliap ... keyword values ... -* two keyword/value pairs must be appended +* one or two keyword/value pairs must be appended * keyword = *model* or *descriptor* or *unified* .. parsed-literal:: @@ -122,10 +122,10 @@ The detail of *nn* module implementation can be found at :ref:`(Yanxon) @@ -38,9 +39,14 @@ MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *lmp) : MLIAPDummyDescriptor::~MLIAPDummyDescriptor() { memory->destroy(radelem); memory->destroy(cutsq); + // manually decrement borrowed reference from Python Py_DECREF(unified_interface); } +/* ---------------------------------------------------------------------- + invoke compute_descriptors from Cython interface + ---------------------------------------------------------------------- */ + void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) { PyGILState_STATE gstate = PyGILState_Ensure(); compute_descriptors_python(unified_interface, data); @@ -53,6 +59,10 @@ void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) { PyGILState_Release(gstate); } +/* ---------------------------------------------------------------------- + invoke compute_forces from Cython interface + ---------------------------------------------------------------------- */ + void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) { PyGILState_STATE gstate = PyGILState_Ensure(); compute_forces_python(unified_interface, data); @@ -65,10 +75,12 @@ void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) { PyGILState_Release(gstate); } +// not implemented void MLIAPDummyDescriptor::compute_force_gradients(class MLIAPData *) { error->all(FLERR, "compute_force_gradients not implemented"); } +// not implemented void MLIAPDummyDescriptor::compute_descriptor_gradients(class MLIAPData *) { error->all(FLERR, "compute_descriptor_gradients not implemented"); } @@ -113,7 +125,7 @@ MLIAPDummyModel::MLIAPDummyModel(LAMMPS *lmp, char *coefffilename) : } MLIAPDummyModel::~MLIAPDummyModel() { - // MLIAPPY_unload_model(this); + // manually decrement borrowed reference from Python Py_DECREF(unified_interface); } @@ -126,6 +138,10 @@ int MLIAPDummyModel::get_gamma_nnz(class MLIAPData *) { return 0; } +/* ---------------------------------------------------------------------- + invoke compute_gradients from Cython interface + ---------------------------------------------------------------------- */ + void MLIAPDummyModel::compute_gradients(class MLIAPData *data) { PyGILState_STATE gstate = PyGILState_Ensure(); compute_gradients_python(unified_interface, data); @@ -138,24 +154,33 @@ void MLIAPDummyModel::compute_gradients(class MLIAPData *data) { PyGILState_Release(gstate); } +// not implemented void MLIAPDummyModel::compute_gradgrads(class MLIAPData *) { error->all(FLERR, "compute_gradgrads not implemented"); } +// not implemented void MLIAPDummyModel::compute_force_gradients(class MLIAPData *) { error->all(FLERR, "compute_force_gradients not implemented"); } +/* ---------------------------------------------------------------------- + memory usage unclear due to Cython/Python implementation + ---------------------------------------------------------------------- */ + double MLIAPDummyModel::memory_usage() { // TODO: implement memory usage in Cython(?) return 0; } +// not implemented void MLIAPDummyModel::read_coeffs(char *) { error->all(FLERR, "read_coeffs not implemented"); } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + build the unified interface object, connect to dummy model and descriptor + ---------------------------------------------------------------------- */ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *data, LAMMPS *lmp, char *coefffilename) { @@ -190,6 +215,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat lmp->error->all(FLERR, "Running mliappy unified module failure."); } + // Borrowed references must be manually incremented model->unified_interface = unified_interface; Py_INCREF(unified_interface); descriptor->unified_interface = unified_interface; @@ -203,6 +229,10 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat /* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + set energy for ij atom pairs + ---------------------------------------------------------------------- */ + void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { double e_total = 0; for (int ii = 0; ii < data->nlistatoms; ii++) @@ -218,6 +248,10 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { data->energy = e_total; } +/* ---------------------------------------------------------------------- + set forces for ij atom pairs + ---------------------------------------------------------------------- */ + void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { double **f = data->f; for (int ii = 0; ii < data->npairs; ii++) { diff --git a/src/ML-IAP/mliap_unified.h b/src/ML-IAP/mliap_unified.h index cf39165353..dae4824d06 100644 --- a/src/ML-IAP/mliap_unified.h +++ b/src/ML-IAP/mliap_unified.h @@ -33,7 +33,7 @@ class MLIAPDummyDescriptor : public MLIAPDescriptor { virtual void init(); void set_elements(char **, int); - PyObject *unified_interface; + PyObject *unified_interface; // MLIAPUnifiedInterface double rcutfac; }; diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 6ec2de42f9..3fde99a25e 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -106,6 +106,8 @@ def write_only_property(fset): return property(fget=None, fset=fset) +# Cython implementation of MLIAPData +# Automatically converts between C arrays and numpy when needed cdef class MLIAPDataPy: cdef MLIAPData * data @@ -296,6 +298,7 @@ cdef class MLIAPDataPy: return self.data.vflag +# Interface between C and Python compute functions cdef class MLIAPUnifiedInterface: cdef MLIAPDummyModel * model cdef MLIAPDummyDescriptor * descriptor @@ -334,6 +337,7 @@ cdef public void compute_forces_python(unified_int, MLIAPData *data) except * wi unified_int.compute_forces(pydata) +# Create a MLIAPUnifiedInterface and connect it to the dummy model, descriptor cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, MLIAPDummyDescriptor * descriptor) with gil: str_fname = fname.decode('utf-8') @@ -383,6 +387,7 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, return unified_int +# For pre-loading a Python model def load_from_python(unified): global LOADED_MODEL LOADED_MODEL = unified From ae4404201f779adbdf55292a29c71a4b6306b84f Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 22 Sep 2022 19:55:10 -0500 Subject: [PATCH 160/364] Forgot to add the unit test files to the commit.... --- .../fortran/test_fortran_extract_atom.f90 | 130 ++++++++++++++++++ unittest/fortran/wrap_extract_atom.cpp | 99 +++++++++++++ 2 files changed, 229 insertions(+) create mode 100644 unittest/fortran/test_fortran_extract_atom.f90 create mode 100644 unittest/fortran/wrap_extract_atom.cpp diff --git a/unittest/fortran/test_fortran_extract_atom.f90 b/unittest/fortran/test_fortran_extract_atom.f90 new file mode 100644 index 0000000000..d3a49c56ec --- /dev/null +++ b/unittest/fortran/test_fortran_extract_atom.f90 @@ -0,0 +1,130 @@ +MODULE keepatom + USE liblammps + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 2.0' ] +END MODULE keepatom + +FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") + USE ISO_C_BINDING, ONLY: c_ptr + USE liblammps + USE keepatom, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepatom, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_extract_atom () BIND(C) + USE LIBLAMMPS + USE keepatom, ONLY : lmp, demo_input, cont_input, pair_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) +! CALL lmp%command('run 0') +END SUBROUTINE f_lammps_setup_extract_atom + +FUNCTION f_lammps_extract_atom_mass () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + REAL(C_double) :: f_lammps_extract_atom_mass + REAL(C_double), DIMENSION(:), POINTER :: mass + + mass = lmp%extract_atom('mass') + f_lammps_extract_atom_mass = mass(1) +END FUNCTION f_lammps_extract_atom_mass + +FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_tag_int + INTEGER(C_int), DIMENSION(:), POINTER :: tag + + tag = lmp%extract_atom('id') + f_lammps_extract_atom_tag_int = tag(i) +END FUNCTION f_lammps_extract_atom_tag_int + +FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int64_t), INTENT(IN), VALUE :: i + INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 + INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag + + tag = lmp%extract_atom('id') + f_lammps_extract_atom_tag_int64 = tag(i) +END FUNCTION f_lammps_extract_atom_tag_int64 + +FUNCTION f_lammps_extract_atom_type(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_type + INTEGER(C_int), DIMENSION(:), POINTER :: atype + + atype = lmp%extract_atom('type') + f_lammps_extract_atom_type = atype(i) +END FUNCTION f_lammps_extract_atom_type + +FUNCTION f_lammps_extract_atom_mask(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_mask + INTEGER(C_int), DIMENSION(:), POINTER :: mask + + mask = lmp%extract_atom('mask') + f_lammps_extract_atom_mask = mask(i) +END FUNCTION f_lammps_extract_atom_mask + +SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double), DIMENSION(3) :: x + REAL(C_double), DIMENSION(:,:), POINTER :: xptr + + xptr = lmp%extract_atom('x') + x = xptr(:,i) +END SUBROUTINE f_lammps_extract_atom_x diff --git a/unittest/fortran/wrap_extract_atom.cpp b/unittest/fortran/wrap_extract_atom.cpp new file mode 100644 index 0000000000..7cc5ff396f --- /dev/null +++ b/unittest/fortran/wrap_extract_atom.cpp @@ -0,0 +1,99 @@ +// unit tests for extracting Atom class data from a LAMMPS instance through the +// Fortran wrapper + +#include "lammps.h" +#include "library.h" +#include "lmptype.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_setup_extract_atom(); +double f_lammps_extract_atom_mass(); +int f_lammps_extract_atom_tag_int(int); +int64_t f_lammps_extract_atom_tag_int64(int64_t); +int f_lammps_extract_atom_type(int); +int f_lammps_extract_atom_mask(int); +void f_lammps_extract_atom_x(int,double*); +} + +class LAMMPS_extract_atom : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_extract_atom() = default; + ~LAMMPS_extract_atom() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_extract_atom, mass) +{ + f_lammps_setup_extract_atom(); + EXPECT_DOUBLE_EQ(f_lammps_extract_atom_mass(), 2.0); +}; + +TEST_F(LAMMPS_extract_atom, tag) +{ + f_lammps_setup_extract_atom(); +#ifdef LAMMPS_BIGBIG + EXPECT_EQ(f_lammps_extract_atom_tag_int64(1l), 1l); + EXPECT_EQ(f_lammps_extract_atom_tag_int64(2l), 2l); +#else + EXPECT_EQ(f_lammps_extract_atom_tag_int(1), 1); + EXPECT_EQ(f_lammps_extract_atom_tag_int(2), 2); +#endif +}; + +TEST_F(LAMMPS_extract_atom, type) +{ + f_lammps_setup_extract_atom(); + EXPECT_EQ(f_lammps_extract_atom_type(1), 1); + EXPECT_EQ(f_lammps_extract_atom_type(2), 1); +}; + +TEST_F(LAMMPS_extract_atom, mask) +{ + f_lammps_setup_extract_atom(); + EXPECT_EQ(f_lammps_extract_atom_mask(1), 1); + EXPECT_EQ(f_lammps_extract_atom_mask(2), 1); + lammps_command(lmp, "group 1 id 1"); + lammps_command(lmp, "group 2 id 2"); + EXPECT_EQ(f_lammps_extract_atom_mask(1), 3); + EXPECT_EQ(f_lammps_extract_atom_mask(2), 5); +}; + +TEST_F(LAMMPS_extract_atom, x) +{ + f_lammps_setup_extract_atom(); + double x1[3]; + double x2[3]; + f_lammps_extract_atom_x(1, x1); + EXPECT_DOUBLE_EQ(x1[0], 1.0); + EXPECT_DOUBLE_EQ(x1[1], 1.0); + EXPECT_DOUBLE_EQ(x1[2], 1.5); + f_lammps_extract_atom_x(2, x2); + EXPECT_DOUBLE_EQ(x2[0], 0.2); + EXPECT_DOUBLE_EQ(x2[1], 0.1); + EXPECT_DOUBLE_EQ(x2[2], 0.1); +} From ea8f08c2957377cf3de3ad897185d0540468980a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Sep 2022 22:44:45 -0400 Subject: [PATCH 161/364] update "make install" for cmake to correctly install LAMMPS python module. --- cmake/CMakeLists.txt | 9 +++++++-- python/pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 28c3d6c027..17bef6f8b8 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -840,6 +840,8 @@ if(BUILD_SHARED_LIBS OR PKG_PYTHON) find_package(PythonInterp) # Deprecated since version 3.12 if(PYTHONINTERP_FOUND) set(Python_EXECUTABLE ${PYTHON_EXECUTABLE}) + set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR}) + set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR}) endif() else() # backward compatibility @@ -849,8 +851,11 @@ if(BUILD_SHARED_LIBS OR PKG_PYTHON) find_package(Python COMPONENTS Interpreter) endif() if(Python_EXECUTABLE) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python) - install(CODE "execute_process(COMMAND ${Python_EXECUTABLE} setup.py build -b ${CMAKE_BINARY_DIR}/python install --prefix=${CMAKE_INSTALL_PREFIX} --root=\$ENV{DESTDIR}/ WORKING_DIRECTORY ${LAMMPS_PYTHON_DIR})") + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python/lib) + file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/python/src) + file(COPY ${LAMMPS_SOURCE_DIR}/version.h DESTINATION ${CMAKE_BINARY_DIR}/python/src) + file(COPY ${LAMMPS_PYTHON_DIR}/README ${LAMMPS_PYTHON_DIR}/pyproject.toml ${LAMMPS_PYTHON_DIR}/setup.py ${LAMMPS_PYTHON_DIR}/lammps DESTINATION ${CMAKE_BINARY_DIR}/python/lib) + install(CODE "execute_process(COMMAND ${Python_EXECUTABLE} -m pip install ${CMAKE_BINARY_DIR}/python/lib --target=${CMAKE_INSTALL_PREFIX}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages)") endif() endif() diff --git a/python/pyproject.toml b/python/pyproject.toml index b5c9a51ece..b40f62a6a9 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,3 +1,3 @@ [build-system] -requires = [ "setuptools>=42", "wheel" ] +requires = [ "setuptools>=42", "wheel", "build" ] build-backend = "setuptools.build_meta" From 5f5397f61b332d8cba97866b0196e0723a73f7be Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 22 Sep 2022 22:23:31 -0500 Subject: [PATCH 162/364] Added unit tests for x and v --- .../fortran/test_fortran_extract_atom.f90 | 25 ++++++++++++++----- unittest/fortran/wrap_extract_atom.cpp | 23 ++++++++++++++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/unittest/fortran/test_fortran_extract_atom.f90 b/unittest/fortran/test_fortran_extract_atom.f90 index d3a49c56ec..5f899f80e0 100644 --- a/unittest/fortran/test_fortran_extract_atom.f90 +++ b/unittest/fortran/test_fortran_extract_atom.f90 @@ -58,7 +58,7 @@ FUNCTION f_lammps_extract_atom_mass () BIND(C) USE keepatom, ONLY : lmp IMPLICIT NONE REAL(C_double) :: f_lammps_extract_atom_mass - REAL(C_double), DIMENSION(:), POINTER :: mass + REAL(C_double), DIMENSION(:), POINTER :: mass => NULL() mass = lmp%extract_atom('mass') f_lammps_extract_atom_mass = mass(1) @@ -71,7 +71,7 @@ FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_tag_int - INTEGER(C_int), DIMENSION(:), POINTER :: tag + INTEGER(C_int), DIMENSION(:), POINTER :: tag => NULL() tag = lmp%extract_atom('id') f_lammps_extract_atom_tag_int = tag(i) @@ -84,7 +84,7 @@ FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) IMPLICIT NONE INTEGER(C_int64_t), INTENT(IN), VALUE :: i INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 - INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag + INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag => NULL() tag = lmp%extract_atom('id') f_lammps_extract_atom_tag_int64 = tag(i) @@ -97,7 +97,7 @@ FUNCTION f_lammps_extract_atom_type(i) BIND(C) IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_type - INTEGER(C_int), DIMENSION(:), POINTER :: atype + INTEGER(C_int), DIMENSION(:), POINTER :: atype => NULL() atype = lmp%extract_atom('type') f_lammps_extract_atom_type = atype(i) @@ -110,7 +110,7 @@ FUNCTION f_lammps_extract_atom_mask(i) BIND(C) IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_mask - INTEGER(C_int), DIMENSION(:), POINTER :: mask + INTEGER(C_int), DIMENSION(:), POINTER :: mask => NULL() mask = lmp%extract_atom('mask') f_lammps_extract_atom_mask = mask(i) @@ -123,8 +123,21 @@ SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double), DIMENSION(3) :: x - REAL(C_double), DIMENSION(:,:), POINTER :: xptr + REAL(C_double), DIMENSION(:,:), POINTER :: xptr => NULL() xptr = lmp%extract_atom('x') x = xptr(:,i) END SUBROUTINE f_lammps_extract_atom_x + +SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double), DIMENSION(3) :: v + REAL(C_double), DIMENSION(:,:), POINTER :: vptr => NULL() + + vptr = lmp%extract_atom('v') + v = vptr(:,i) +END SUBROUTINE f_lammps_extract_atom_v diff --git a/unittest/fortran/wrap_extract_atom.cpp b/unittest/fortran/wrap_extract_atom.cpp index 7cc5ff396f..17116b11b9 100644 --- a/unittest/fortran/wrap_extract_atom.cpp +++ b/unittest/fortran/wrap_extract_atom.cpp @@ -3,7 +3,6 @@ #include "lammps.h" #include "library.h" -#include "lmptype.h" #include #include #include @@ -22,6 +21,7 @@ int64_t f_lammps_extract_atom_tag_int64(int64_t); int f_lammps_extract_atom_type(int); int f_lammps_extract_atom_mask(int); void f_lammps_extract_atom_x(int,double*); +void f_lammps_extract_atom_v(int,double*); } class LAMMPS_extract_atom : public ::testing::Test { @@ -97,3 +97,24 @@ TEST_F(LAMMPS_extract_atom, x) EXPECT_DOUBLE_EQ(x2[1], 0.1); EXPECT_DOUBLE_EQ(x2[2], 0.1); } + +TEST_F(LAMMPS_extract_atom, v) +{ + f_lammps_setup_extract_atom(); + double v1[3]; + double v2[3]; + f_lammps_extract_atom_v(1, v1); + EXPECT_DOUBLE_EQ(v1[0], 0.0); + EXPECT_DOUBLE_EQ(v1[1], 0.0); + EXPECT_DOUBLE_EQ(v1[2], 0.0); + f_lammps_extract_atom_v(2, v2); + EXPECT_DOUBLE_EQ(v2[0], 0.0); + EXPECT_DOUBLE_EQ(v2[1], 0.0); + EXPECT_DOUBLE_EQ(v2[2], 0.0); + lammps_command(lmp, "group one id 1"); + lammps_command(lmp, "velocity one set 1 2 3"); + f_lammps_extract_atom_v(1, v1); + EXPECT_DOUBLE_EQ(v1[0], 1.0); + EXPECT_DOUBLE_EQ(v1[1], 2.0); + EXPECT_DOUBLE_EQ(v1[2], 3.0); +} From 820fab454b1ad3880be4b5bd10ba028423061eef Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 05:47:41 -0400 Subject: [PATCH 163/364] style changes --- src/BPM/bond_bpm_rotational.cpp | 45 +++++++++++++++++---------------- src/BPM/bond_bpm_rotational.h | 2 -- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index 6aa851331c..d86caf0eb6 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -33,7 +33,19 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) : BondBPM(_lmp) +static double acos_limit(double c) +{ + if (c > 1.0) c = 1.0; + if (c < -1.0) c = -1.0; + return acos(c); +} + +/* ---------------------------------------------------------------------- */ + +BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) : + BondBPM(_lmp), Kr(nullptr), Ks(nullptr), Kt(nullptr), Kb(nullptr), gnorm(nullptr), + gslide(nullptr), groll(nullptr), gtwist(nullptr), Fcr(nullptr), Fcs(nullptr), Tct(nullptr), + Tcb(nullptr) { partial_flag = 1; smooth_flag = 1; @@ -65,15 +77,6 @@ BondBPMRotational::~BondBPMRotational() } } -/* ---------------------------------------------------------------------- */ - -double BondBPMRotational::acos_limit(double c) -{ - if (c > 1.0) c = 1.0; - if (c < -1.0) c = -1.0; - return acos(c); -} - /* ---------------------------------------------------------------------- Store data for a single bond - if bond added after LAMMPS init (e.g. pour) ------------------------------------------------------------------------- */ @@ -183,10 +186,9 @@ void BondBPMRotational::store_data() 2) P. Mora & Y. Wang Advances in Geomcomputing 2009 ---------------------------------------------------------------------- */ -double BondBPMRotational::elastic_forces(int i1, int i2, int type, double r_mag, - double r0_mag, double r_mag_inv, double * /*rhat*/, - double *r, double *r0, double *force1on2, - double *torque1on2, double *torque2on1) +double BondBPMRotational::elastic_forces(int i1, int i2, int type, double r_mag, double r0_mag, + double r_mag_inv, double * /*rhat*/, double *r, double *r0, + double *force1on2, double *torque1on2, double *torque2on1) { double breaking, temp, r0_dot_rb, c, gamma; double psi, theta, cos_phi, sin_phi; @@ -365,9 +367,8 @@ double BondBPMRotational::elastic_forces(int i1, int i2, int type, double r_mag, Note: n points towards 1 vs pointing towards 2 ---------------------------------------------------------------------- */ -void BondBPMRotational::damping_forces(int i1, int i2, int type, double *rhat, - double *r, double *force1on2, double *torque1on2, - double *torque2on1) +void BondBPMRotational::damping_forces(int i1, int i2, int type, double *rhat, double *r, + double *force1on2, double *torque1on2, double *torque2on1) { double v1dotr, v2dotr, w1dotr, w2dotr; double s1[3], s2[3], tdamp[3], tmp[3]; @@ -549,7 +550,9 @@ void BondBPMRotational::compute(int eflag, int vflag) torque[i2][2] += torque1on2[2] * smooth; } - if (evflag) ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth, -force1on2[2] * smooth, r[0], r[1], r[2]); + if (evflag) + ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth, + -force1on2[2] * smooth, r[0], r[1], r[2]); } } @@ -747,8 +750,7 @@ void BondBPMRotational::write_restart_settings(FILE *fp) void BondBPMRotational::read_restart_settings(FILE *fp) { - if (comm->me == 0) - utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); + if (comm->me == 0) utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); } @@ -788,7 +790,7 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo double force1on2[3], torque1on2[3], torque2on1[3]; double breaking = elastic_forces(i, j, type, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, - torque1on2, torque2on1); + torque1on2, torque2on1); damping_forces(i, j, type, rhat, r, force1on2, torque1on2, torque2on1); fforce = MathExtra::dot3(force1on2, r); fforce *= -1; @@ -819,6 +821,5 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo svector[6] = -force1on2[2] * smooth; } - return 0.0; } diff --git a/src/BPM/bond_bpm_rotational.h b/src/BPM/bond_bpm_rotational.h index e52b1a9182..8b9338d7db 100644 --- a/src/BPM/bond_bpm_rotational.h +++ b/src/BPM/bond_bpm_rotational.h @@ -43,8 +43,6 @@ class BondBPMRotational : public BondBPM { double *Fcr, *Fcs, *Tct, *Tcb; int smooth_flag; - double acos_limit(double); - double elastic_forces(int, int, int, double, double, double, double *, double *, double *, double *, double *, double *); void damping_forces(int, int, int, double *, double *, double *, double *, double *); From c3e7f8f25a8cc4f0ba759e000d2fd589c7900ba0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 06:01:25 -0400 Subject: [PATCH 164/364] remove unused NEWTON_PAIR template argument --- .../pair_lj_cut_coul_cut_dielectric_omp.cpp | 17 ++++------------- .../pair_lj_cut_coul_cut_dielectric_omp.h | 2 +- .../pair_lj_cut_coul_debye_dielectric_omp.cpp | 17 ++++------------- .../pair_lj_cut_coul_debye_dielectric_omp.h | 2 +- .../pair_lj_cut_coul_long_dielectric_omp.cpp | 17 ++++------------- .../pair_lj_cut_coul_long_dielectric_omp.h | 2 +- 6 files changed, 15 insertions(+), 42 deletions(-) diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp index 159dd27f41..8cf535469e 100644 --- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp @@ -72,21 +72,12 @@ void PairLJCutCoulCutDielectricOMP::compute(int eflag, int vflag) if (evflag) { if (eflag) { - if (force->newton_pair) - eval<1, 1, 1>(ifrom, ito, thr); - else - eval<1, 1, 0>(ifrom, ito, thr); + eval<1, 1>(ifrom, ito, thr); } else { - if (force->newton_pair) - eval<1, 0, 1>(ifrom, ito, thr); - else - eval<1, 0, 0>(ifrom, ito, thr); + eval<1, 0>(ifrom, ito, thr); } } else { - if (force->newton_pair) - eval<0, 0, 1>(ifrom, ito, thr); - else - eval<0, 0, 0>(ifrom, ito, thr); + eval<0, 0>(ifrom, ito, thr); } thr->timer(Timer::PAIR); @@ -96,7 +87,7 @@ void PairLJCutCoulCutDielectricOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -template +template void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const thr) { int i, j, ii, jj, jnum, itype, jtype; diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h index debb07744b..e663d81440 100644 --- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h +++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.h @@ -32,7 +32,7 @@ class PairLJCutCoulCutDielectricOMP : public PairLJCutCoulCutDielectric, public void compute(int, int) override; protected: - template + template void eval(int ifrom, int ito, ThrData *const thr); }; diff --git a/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.cpp index 113536408d..d26d3ca7c3 100644 --- a/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.cpp @@ -72,21 +72,12 @@ void PairLJCutCoulDebyeDielectricOMP::compute(int eflag, int vflag) if (evflag) { if (eflag) { - if (force->newton_pair) - eval<1, 1, 1>(ifrom, ito, thr); - else - eval<1, 1, 0>(ifrom, ito, thr); + eval<1, 1>(ifrom, ito, thr); } else { - if (force->newton_pair) - eval<1, 0, 1>(ifrom, ito, thr); - else - eval<1, 0, 0>(ifrom, ito, thr); + eval<1, 0>(ifrom, ito, thr); } } else { - if (force->newton_pair) - eval<0, 0, 1>(ifrom, ito, thr); - else - eval<0, 0, 0>(ifrom, ito, thr); + eval<0, 0>(ifrom, ito, thr); } thr->timer(Timer::PAIR); @@ -96,7 +87,7 @@ void PairLJCutCoulDebyeDielectricOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -template +template void PairLJCutCoulDebyeDielectricOMP::eval(int iifrom, int iito, ThrData *const thr) { int i, j, ii, jj, jnum, itype, jtype; diff --git a/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.h index e1232406f5..9aa8bb8291 100644 --- a/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.h +++ b/src/OPENMP/pair_lj_cut_coul_debye_dielectric_omp.h @@ -32,7 +32,7 @@ class PairLJCutCoulDebyeDielectricOMP : public PairLJCutCoulDebyeDielectric, pub void compute(int, int) override; protected: - template + template void eval(int ifrom, int ito, ThrData *const thr); }; diff --git a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp index b8a2695eae..86997c5670 100644 --- a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.cpp @@ -74,21 +74,12 @@ void PairLJCutCoulLongDielectricOMP::compute(int eflag, int vflag) if (evflag) { if (eflag) { - if (force->newton_pair) - eval<1, 1, 1>(ifrom, ito, thr); - else - eval<1, 1, 0>(ifrom, ito, thr); + eval<1, 1>(ifrom, ito, thr); } else { - if (force->newton_pair) - eval<1, 0, 1>(ifrom, ito, thr); - else - eval<1, 0, 0>(ifrom, ito, thr); + eval<1, 0>(ifrom, ito, thr); } } else { - if (force->newton_pair) - eval<0, 0, 1>(ifrom, ito, thr); - else - eval<0, 0, 0>(ifrom, ito, thr); + eval<0, 0>(ifrom, ito, thr); } thr->timer(Timer::PAIR); @@ -98,7 +89,7 @@ void PairLJCutCoulLongDielectricOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -template +template void PairLJCutCoulLongDielectricOMP::eval(int iifrom, int iito, ThrData *const thr) { int i, j, ii, jj, jnum, itype, jtype, itable; diff --git a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h index 2dcc7c97e7..1c928a4244 100644 --- a/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h +++ b/src/OPENMP/pair_lj_cut_coul_long_dielectric_omp.h @@ -33,7 +33,7 @@ class PairLJCutCoulLongDielectricOMP : public PairLJCutCoulLongDielectric, publi void compute(int, int) override; protected: - template + template void eval(int ifrom, int ito, ThrData *const thr); }; From 8183a4dfbbd5107900334ab14ca6b286217a87aa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 06:12:56 -0400 Subject: [PATCH 165/364] change logic to make coverity scan happy --- src/COLVARS/group_ndx.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/COLVARS/group_ndx.cpp b/src/COLVARS/group_ndx.cpp index 0e9da8cce3..c4c37c8d8b 100644 --- a/src/COLVARS/group_ndx.cpp +++ b/src/COLVARS/group_ndx.cpp @@ -77,7 +77,7 @@ void Group2Ndx::command(int narg, char **arg) } /* ---------------------------------------------------------------------- - write out one group to a Gromacs style index file + write out one group to a Gromacs style index file, fp is non-null only on MPI rank 0 ---------------------------------------------------------------------- */ void Group2Ndx::write_group(FILE *fp, int gid) { @@ -85,7 +85,7 @@ void Group2Ndx::write_group(FILE *fp, int gid) bigint gcount = group->count(gid); int lnum, width, cols; - if (comm->me == 0) { + if (fp) { utils::logmesg(lmp," writing group {}...",group->names[gid]); // the "all" group in LAMMPS is called "System" in Gromacs @@ -138,7 +138,7 @@ void Group2Ndx::write_group(FILE *fp, int gid) delete [] sendlist; } - if (comm->me == 0) { + if (fp) { int i, j; for (i=0, j=0; i < gcount; ++i) { fmt::print(fp,"{:>{}}",recvlist[i],width); From ac0080f2df60a4572c807c26be37d3912b167e23 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 23 Sep 2022 07:20:49 -0500 Subject: [PATCH 166/364] Reintroduced some stashed doc edits --- doc/src/Fortran.rst | 56 +++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 74863d484b..7039762bf8 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -76,7 +76,6 @@ the optional logical argument set to ``.true.``. Here is a simple example: PRINT*, 'LAMMPS Version: ', lmp%version() ! delete LAMMPS instance (and shuts down MPI) CALL lmp%close(.true.) - END PROGRAM testlib It is also possible to pass command line flags from Fortran to C/C++ and @@ -111,7 +110,6 @@ version of the previous example: ! delete LAMMPS instance (and shuts down MPI) CALL lmp%close(.TRUE.) DEALLOCATE(command_args) - END PROGRAM testlib2 -------------------- @@ -160,7 +158,6 @@ Below is a small demonstration of the uses of the different functions: 'create_atoms 1 single 1.0 1.0 ${zpos}' CALL lmp%commands_string(cmds) CALL lmp%close(.TRUE.) - END PROGRAM testcmd --------------- @@ -430,21 +427,21 @@ Procedures Bound to the lammps Derived Type .. code-block:: fortran PROGRAM demo - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_int64_t, C_double - USE LIBLAMMPS - TYPE(lammps) :: lmp - INTEGER(C_int), POINTER :: nlocal - INTEGER(C_int64_t), POINTER :: ntimestep - CHARACTER(LEN=10) :: units - REAL(C_double), POINTER :: dt - lmp = lammps() - ! other commands - nlocal = lmp%extract_global('nlocal') - ntimestep = lmp%extract_global('ntimestep') - dt = lmp%extract_global('dt') - units = lmp%extract_global('units') - ! more commands - lmp.close(.TRUE.) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE LIBLAMMPS + TYPE(lammps) :: lmp + INTEGER(C_int), POINTER :: nlocal + INTEGER(C_int64_t), POINTER :: ntimestep + CHARACTER(LEN=10) :: units + REAL(C_double), POINTER :: dt + lmp = lammps() + ! other commands + nlocal = lmp%extract_global('nlocal') + ntimestep = lmp%extract_global('ntimestep') + dt = lmp%extract_global('dt') + units = lmp%extract_global('units') + ! more commands + lmp.close(.TRUE.) END PROGRAM demo would extract the number of atoms on this processor, the current time step, @@ -468,11 +465,11 @@ Procedures Bound to the lammps Derived Type .. warning:: Modifying the data in the location pointed to by the returned pointer - may lead to inconsistent internal data and thus may cause failures or - crashes or bogus simulations. In general it is thus usually better + may lead to inconsistent internal data and thus may cause failures, + crashes, or bogus simulations. In general, it is much better to use a LAMMPS input command that sets or changes these parameters. - Those will take care of all side effects and necessary updates of - settings derived from such settings. + Using an input command will take care of all side effects and necessary + updates of settings derived from such settings. -------- @@ -485,9 +482,9 @@ Procedures Bound to the lammps Derived Type Note that this function actually does not return a pointer, but rather associates the pointer on the left side of the assignment to point to internal LAMMPS data. Pointers must be of the correct type, kind, and - rank (e.g., integer(C_int), dimension(:) for "type" or "mask"; - integer(C_int64_t), dimension(:) for "tag", assuming LAMMPS was not compiled - with the -DLAMMPS_SMALL_SMALL flag; real(C_double), dimension(:,:) for "x" + rank (e.g., integer(C_int), dimension(:) for "type", "mask", or "tag"; + integer(C_int64_t), dimension(:) for "tag" if LAMMPS was compiled + with the -DLAMMPS_BIGBIG flag; real(C_double), dimension(:,:) for "x", "v", or "f"; and so forth). The pointer being associated with LAMMPS data is type-, kind-, and rank-checked at run-time. Pointers returned by this function are generally persistent; therefore, it is not necessary to call @@ -496,8 +493,8 @@ Procedures Bound to the lammps Derived Type :p character(len=\*) name: string with the name of the property to extract :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment - should be a C-interoperable pointer - (e.g., ``INTEGER (c_int), POINTER :: mask``) to the extracted + should be a C-interoperable pointer of appropriate kind and rank + (e.g., ``INTEGER (c_int), POINTER :: mask(:)``) to the extracted property. If expecting vector data, the pointer should have dimension ":"; if expecting matrix data, the pointer should have dimension ":,:". @@ -541,8 +538,8 @@ Procedures Bound to the lammps Derived Type x = lmp%extract_atom("x") x0(0:,0:) => x - The above would cause the dimensions of *x* to be (1:3, 1:nlocal) - and those of *x0* to be (0:2, 0:nlocal-1). + The above would cause the dimensions of *x* to be (1:3, 1:nmax) + and those of *x0* to be (0:2, 0:nmax-1). -------- @@ -552,4 +549,3 @@ Procedures Bound to the lammps Derived Type :cpp:func:`lammps_version` does. :r integer: LAMMPS version - From 6532640362cd7b2a38b9d9f023f3574cfe17cb4e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 10:23:32 -0400 Subject: [PATCH 167/364] spelling --- doc/src/Fortran.rst | 6 +++--- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 28436c813f..b9c1d24ad9 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -330,7 +330,7 @@ Procedures Bound to the lammps Derived Type Note that a frequent use case of this function is to extract only one or more of the options rather than all seven. For example, assuming "lmp" - represents a properly-initalized LAMMPS instance, the following code will + represents a properly-initialized LAMMPS instance, the following code will extract the periodic box settings into the variable "periodic": .. code-block:: Fortran @@ -378,7 +378,7 @@ Procedures Bound to the lammps Derived Type .. note:: The C library interface currently returns type "int" instead of type - "MPI_Fint", which is the C type correspending to Fortran "INTEGER" + "MPI_Fint", which is the C type corresponding to Fortran "INTEGER" types of the default kind. On most compilers, these are the same anyway, but this interface exchanges values this way to avoid warning messages. @@ -465,7 +465,7 @@ Procedures Bound to the lammps Derived Type :p character(len=\*) name: string with the name of the extracted property :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment - should be either a string (if expecting string data) or a C-interoperable + should be either a string (if expecting string data) or a C-compatible pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted property. If expecting vector data, the pointer should have dimension ":". diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 15316b4f09..937836a9b9 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1081,6 +1081,7 @@ filesystems Fily Fincham Finchham +Fint fingerprintconstants fingerprintsperelement Finnis From 71c48762fbb24f08ce4c2a60b9509a192d006ede Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 10:33:44 -0400 Subject: [PATCH 168/364] correct inconsistent spelling of name --- doc/src/Bibliography.rst | 4 ++-- doc/src/compute_temp_cs.rst | 6 +++--- doc/src/pair_cs.rst | 6 +++--- doc/utils/sphinx-config/false_positives.txt | 1 - 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index dff457836c..cc7a448bc1 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -733,8 +733,8 @@ Bibliography **(Mishin)** Mishin, Mehl, and Papaconstantopoulos, Acta Mater, 53, 4029 (2005). -**(Mitchell and Finchham)** - Mitchell, Finchham, J Phys Condensed Matter, 5, 1031-1038 (1993). +**(Mitchell and Fincham)** + Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). **(Mitchell2011)** Mitchell. A non-local, ordinary-state-based viscoelasticity model for peridynamics. Sandia National Lab Report, 8064:1-28 (2011). diff --git a/doc/src/compute_temp_cs.rst b/doc/src/compute_temp_cs.rst index 45de17be89..a33fbf7ffb 100644 --- a/doc/src/compute_temp_cs.rst +++ b/doc/src/compute_temp_cs.rst @@ -29,7 +29,7 @@ Description Define a computation that calculates the temperature of a system based on the center-of-mass velocity of atom pairs that are bonded to each other. This compute is designed to be used with the adiabatic -core/shell model of :ref:`(Mitchell and Finchham) `. +core/shell model of :ref:`(Mitchell and Fincham) `. See the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. Specifically, this compute enables correct temperature calculation and thermostatting of @@ -127,7 +127,7 @@ none ---------- -.. _MitchellFinchham1: +.. _MitchellFincham1: -**(Mitchell and Finchham)** Mitchell, Finchham, J Phys Condensed Matter, +**(Mitchell and Fincham)** Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). diff --git a/doc/src/pair_cs.rst b/doc/src/pair_cs.rst index ef40eb310f..c021107fcc 100644 --- a/doc/src/pair_cs.rst +++ b/doc/src/pair_cs.rst @@ -114,7 +114,7 @@ Description """"""""""" These pair styles are designed to be used with the adiabatic -core/shell model of :ref:`(Mitchell and Finchham) `. See +core/shell model of :ref:`(Mitchell and Fincham) `. See the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. @@ -196,7 +196,7 @@ none ---------- -.. _MitchellFinchham2: +.. _MitchellFincham2: -**(Mitchell and Finchham)** Mitchell, Finchham, J Phys Condensed Matter, +**(Mitchell and Fincham)** Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 15316b4f09..ab2272635f 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1080,7 +1080,6 @@ filesystem filesystems Fily Fincham -Finchham fingerprintconstants fingerprintsperelement Finnis From 2a14397318db438df4600241d54ec31ed0edcdd6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 10:41:21 -0400 Subject: [PATCH 169/364] fix broken link --- doc/src/Fortran.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index b9c1d24ad9..aa599a3dbd 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -122,8 +122,8 @@ Executing LAMMPS commands Once a LAMMPS instance is created, it is possible to "drive" the LAMMPS simulation by telling LAMMPS to read commands from a file or to pass individual or multiple commands from strings or lists of strings. This -is done similarly to how it is implemented in the `C-library -` interface. Before handing off the calls to the +is done similarly to how it is implemented in the :doc:`C-library +interface `. Before handing off the calls to the C-library interface, the corresponding Fortran versions of the calls (:f:func:`file`, :f:func:`command`, :f:func:`commands_list`, and :f:func:`commands_string`) have to make a copy of the strings passed as From d9e2be4b75a112d65fc4af1b9f1eb82dc687d695 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 12:41:31 -0400 Subject: [PATCH 170/364] updates to the fortran module docs to make it more consistent, fix links, add example similar to C library docs --- doc/src/Fortran.rst | 185 +++++++++++++------- doc/src/Library_properties.rst | 30 ++-- doc/utils/sphinx-config/false_positives.txt | 1 + 3 files changed, 142 insertions(+), 74 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index aa599a3dbd..2dd04439a1 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -3,7 +3,9 @@ The ``LIBLAMMPS`` Fortran Module The ``LIBLAMMPS`` module provides an interface to call LAMMPS from a Fortran code. It is based on the LAMMPS C-library interface and -requires a Fortran 2003 compatible compiler to be compiled. +requires a Fortran 2003 compatible compiler to be compiled. It is +designed to be self-contained and not require any support functions +written in C, C++, or Fortran. While C libraries have a defined binary interface (ABI) and can thus be used from multiple compiler versions from different vendors for as long @@ -19,12 +21,20 @@ for a simple program using the Fortran interface would be: mpifort -o testlib.x lammps.f90 testlib.f90 -L. -llammps Please note, that the MPI compiler wrapper is only required when the -calling the library from an MPI parallel code. Please also note the -order of the source files: the ``lammps.f90`` file needs to be compiled -first, since it provides the ``LIBLAMMPS`` module that is imported by -the Fortran code using the interface. A working example code can be -found together with equivalent examples in C and C++ in the -``examples/COUPLE/simple`` folder of the LAMMPS distribution. +calling the library from an MPI parallel code. Otherwise, using the +fortran compiler (gfortran, ifort, flang, etc.) will suffice. It may be +necessary to link to additional libraries depending on how LAMMPS was +configured and whether the LAMMPS library :doc:`was compiled as a static +or shared library `. + +If the LAMMPS library itself has been compiled with MPI support, the +resulting executable will still be able to run LAMMPS in parallel with +``mpirun`` or equivalent. Please also note that the order of the source +files matters: the ``lammps.f90`` file needs to be compiled first, since +it provides the ``LIBLAMMPS`` module that is imported by the Fortran +code using the interface. A working example code can be found together +with equivalent examples in C and C++ in the ``examples/COUPLE/simple`` +folder of the LAMMPS distribution. .. versionadded:: 9Oct2020 @@ -57,9 +67,10 @@ LIBLAMMPS`` statement. Internally it will call either :cpp:func:`lammps_open_fortran` or :cpp:func:`lammps_open_no_mpi` from the C library API to create the class instance. All arguments are optional and :cpp:func:`lammps_mpi_init` will be called automatically, -if it is needed. Similarly, a possible call to :cpp:func:`lammps_finalize` -is integrated into the :f:func:`close` function and triggered with -the optional logical argument set to ``.true.``. Here is a simple example: +if it is needed. Similarly, a possible call to +:cpp:func:`lammps_mpi_finalize` is integrated into the :f:func:`close` +function and triggered with the optional logical argument set to +``.true.``. Here is a simple example: .. code-block:: fortran @@ -81,10 +92,10 @@ the optional logical argument set to ``.true.``. Here is a simple example: It is also possible to pass command line flags from Fortran to C/C++ and thus make the resulting executable behave similarly to the standalone -executable (it will ignore the `-in/-i` flag, though). This allows one to -use the command line to configure accelerator and suffix settings, +executable (it will ignore the `-in/-i` flag, though). This allows +using the command line to configure accelerator and suffix settings, configure screen and logfile output, or to set index style variables -from the command line and more. Here is a correspondingly adapted +from the command line and more. Here is a correspondingly adapted version of the previous example: .. code-block:: fortran @@ -165,6 +176,57 @@ Below is a small demonstration of the uses of the different functions: --------------- +Accessing system properties +=========================== + +The C-library interface allows the :doc:`extraction of different kinds +of information ` about the active simulation +instance and also - in some cases - to apply modifications to it. In +some cases, the C-library interface makes pointers to internal data +structures accessible, thus when accessing them from Fortran, special +care is needed to avoid data corruption and crashes. Thus please see +the documentation of the individual type bound procedures for details. + +Below is an example demonstrating some of the possible uses. + +.. code-block:: fortran + + PROGRAM testprop + USE LIBLAMMPS + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int64_t + TYPE(lammps) :: lmp + INTEGER(kind=8) :: natoms + REAL(c_double), POINTER :: dt + INTEGER(c_int64_t), POINTER :: ntimestep + REAL(kind=8) :: pe, ke + + lmp = lammps() + CALL lmp%file('in.sysinit') + natoms = INT(lmp%get_natoms(),8) + WRITE(6,'(A,I8,A)') 'Running a simulation with', natoms, ' atoms' + WRITE(6,'(I8,A,I8,A,I3,A)') lmp%extract_setting('nlocal'), ' local and', & + lmp%extract_setting('nghost'), ' ghost atom. ', & + lmp%extract_setting('ntypes'), ' atom types' + + CALL lmp%command('run 2 post no') + dt = lmp%extract_global('dt') + ntimestep = lmp%extract_global('ntimestep') + WRITE(6,'(A,I4,A,F4.1,A)') 'At step:', ntimestep, ' Changing timestep from', dt, ' to 0.5' + dt = 0.5 + CALL lmp%command('run 2 post no') + + WRITE(6,'(A,I4)') 'At step:', ntimestep + pe = lmp%get_thermo('pe') + ke = lmp%get_thermo('ke') + PRINT*, 'PE = ', pe + PRINT*, 'KE = ', ke + + CALL lmp%close(.TRUE.) + + END PROGRAM testprop + +--------------- + The ``LIBLAMMPS`` module API **************************** @@ -292,7 +354,7 @@ Procedures Bound to the lammps Derived Type This function will call :cpp:func:`lammps_get_natoms` and return the number of atoms in the system. - :r real(C_double): number of atoms + :r real(c_double): number of atoms -------- @@ -302,16 +364,17 @@ Procedures Bound to the lammps Derived Type of the corresponding thermodynamic keyword. :p character(len=\*) name: string with the name of the thermo keyword - :r real(C_double): value of the requested thermo property or 0.0_C_double + :r real(c_double): value of the requested thermo property or `0.0_c_double` -------- .. f:subroutine:: extract_box([boxlo][, boxhi][, xy][, yz][, xz][, pflags][, boxflag]) - This subroutine will call :cpp:func:`lammps_extract_box`. All parameters - are optional, though obviously at least one should be present. The - parameters *pflags* and *boxflag* are stored in LAMMPS as integers, but - should be declared as ``LOGICAL`` variables when calling from Fortran. + This subroutine will call :cpp:func:`lammps_extract_box`. All + parameters are optional, though obviously at least one should be + present. The parameters *pflags* and *boxflag* are stored in LAMMPS + as integers, but should be declared as ``LOGICAL`` variables when + calling from Fortran. :o real(c_double) boxlo [dimension(3),optional]: vector in which to store lower-bounds of simulation box @@ -377,17 +440,18 @@ Procedures Bound to the lammps Derived Type .. note:: - The C library interface currently returns type "int" instead of type - "MPI_Fint", which is the C type corresponding to Fortran "INTEGER" - types of the default kind. On most compilers, these are the same anyway, - but this interface exchanges values this way to avoid warning messages. + The C library interface currently returns type ``int`` instead of + type ``MPI_Fint``, which is the C type corresponding to Fortran + ``INTEGER`` types of the default kind. On most compilers, these + are the same anyway, but this interface exchanges values this way + to avoid warning messages. .. note:: - The MPI_F08 module, which defines Fortran 2008 bindings for MPI, is not - directly supported by this function. However, you should be able to - convert between the two using the MPI_VAL member of the communicator. - For example, + The `MPI_F08` module, which defines Fortran 2008 bindings for MPI, + is not directly supported by this function. However, you should be + able to convert between the two using the `MPI_VAL` member of the + communicator. For example, .. code-block:: fortran @@ -398,14 +462,14 @@ Procedures Bound to the lammps Derived Type ! ... [commands to set up LAMMPS/etc.] comm%MPI_VAL = lmp%get_mpi_comm() - should assign an MPI_F08 communicator properly. + should assign an `MPI_F08` communicator properly. -------- .. f:function:: extract_setting(keyword) Query LAMMPS about global settings. See the documentation for the - :c:func:`lammps_extract_setting` function from the C library. + :cpp:func:`lammps_extract_setting` function from the C library. :p character(len=\*) keyword: string containing the name of the thermo keyword :r integer(c_int): value of the queried setting or :math:`-1` if unknown @@ -414,35 +478,36 @@ Procedures Bound to the lammps Derived Type .. f:function:: extract_global(name) - This function calls :c:func:`lammps_extract_global` and returns either a - string or a pointer to internal global LAMMPS data, depending on the data - requested through *name*. + This function calls :cpp:func:`lammps_extract_global` and returns + either a string or a pointer to internal global LAMMPS data, + depending on the data requested through *name*. Note that this function actually does not return a value, but rather - associates the pointer on the left side of the assignment to point - to internal LAMMPS data (with the exception of string data, which are - copied and returned as ordinary Fortran strings). Pointers must be of the - correct data type to point to said data (typically INTEGER(c_int), - INTEGER(c_int64_t), or REAL(c_double)) and have compatible kind and rank. - The pointer being associated with LAMMPS data is type-, kind-, and - rank-checked at run-time via an overloaded assignment operator. - The pointers returned by this function are generally persistent; therefore - it is not necessary to call the function again, unless a :doc:`clear` - command has been issued, which wipes out and recreates the contents of - the :cpp:class:`LAMMPS ` class. + associates the pointer on the left side of the assignment to point to + internal LAMMPS data (with the exception of string data, which are + copied and returned as ordinary Fortran strings). Pointers must be of + the correct data type to point to said data (typically + ``INTEGER(c_int)``, ``INTEGER(c_int64_t)``, or ``REAL(c_double)``) + and have compatible kind and rank. The pointer being associated with + LAMMPS data is type-, kind-, and rank-checked at run-time via an + overloaded assignment operator. The pointers returned by this + function are generally persistent; therefore it is not necessary to + call the function again, unless a :doc:`clear` command has been + issued, which wipes out and recreates the contents of the + :cpp:class:`LAMMPS ` class. For example, .. code-block:: fortran PROGRAM demo - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE LIBLAMMPS TYPE(lammps) :: lmp - INTEGER(C_int), POINTER :: nlocal - INTEGER(C_int64_t), POINTER :: ntimestep + INTEGER(c_int), POINTER :: nlocal + INTEGER(c_int64_t), POINTER :: ntimestep CHARACTER(LEN=10) :: units - REAL(C_double), POINTER :: dt + REAL(c_double), POINTER :: dt lmp = lammps() ! other commands nlocal = lmp%extract_global('nlocal') @@ -457,11 +522,13 @@ Procedures Bound to the lammps Derived Type the size of the current time step, and the units being used into the variables *nlocal*, *ntimestep*, *dt*, and *units*, respectively. - *Note*: if this function returns a string, the string must have - length greater than or equal to the length of the string (not including the - terminal NULL character) that LAMMPS returns. If the variable's length is - too short, the string will be truncated. As usual in Fortran, strings - are padded with spaces at the end. + .. note:: + + if this function returns a string, the string must have + length greater than or equal to the length of the string (not including the + terminal NULL character) that LAMMPS returns. If the variable's length is + too short, the string will be truncated. As usual in Fortran, strings + are padded with spaces at the end. :p character(len=\*) name: string with the name of the extracted property :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment @@ -469,11 +536,11 @@ Procedures Bound to the lammps Derived Type pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted property. If expecting vector data, the pointer should have dimension ":". - .. warning:: +.. warning:: - Modifying the data in the location pointed to by the returned pointer - may lead to inconsistent internal data and thus may cause failures or - crashes or bogus simulations. In general it is thus usually better - to use a LAMMPS input command that sets or changes these parameters. - Those will take care of all side effects and necessary updates of - settings derived from such settings. + Modifying the data in the location pointed to by the returned pointer + may lead to inconsistent internal data and thus may cause failures or + crashes or bogus simulations. In general it is thus usually better + to use a LAMMPS input command that sets or changes these parameters. + Those will take care of all side effects and necessary updates of + settings derived from such settings. diff --git a/doc/src/Library_properties.rst b/doc/src/Library_properties.rst index e023c78185..a5c9c79c64 100644 --- a/doc/src/Library_properties.rst +++ b/doc/src/Library_properties.rst @@ -15,21 +15,21 @@ This section documents the following functions: -------------------- -The library interface allows extraction of different kinds of -information about the active simulation instance and also -modifications to it. This enables combining of a LAMMPS simulation -with other processing and simulation methods computed by the calling -code, or by another code that is coupled to LAMMPS via the library -interface. In some cases the data returned is direct reference to the -original data inside LAMMPS, cast to a void pointer. In that case the -data needs to be cast to a suitable pointer for the calling program to -access it, and you may need to know the correct dimensions and -lengths. This also means you can directly change those value(s) from -the calling program, e.g. to modify atom positions. Of course, this -should be done with care. When accessing per-atom data, please note -that this data is the per-processor **local** data and is indexed -accordingly. Per-atom data can change sizes and ordering at every -neighbor list rebuild or atom sort event as atoms migrate between +The library interface allows the extraction of different kinds of +information about the active simulation instance and also - in some +cases - to apply modifications to it. This enables combining of a +LAMMPS simulation with other processing and simulation methods computed +by the calling code, or by another code that is coupled to LAMMPS via +the library interface. In some cases the data returned is direct +reference to the original data inside LAMMPS, cast to a void pointer. +In that case the data needs to be cast to a suitable pointer for the +calling program to access it, and you may need to know the correct +dimensions and lengths. This also means you can directly change those +value(s) from the calling program, e.g. to modify atom positions. Of +course, this should be done with care. When accessing per-atom data, +please note that this data is the per-processor **local** data and is +indexed accordingly. Per-atom data can change sizes and ordering at +every neighbor list rebuild or atom sort event as atoms migrate between sub-domains and processors. .. code-block:: C diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 937836a9b9..aba474d257 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1094,6 +1094,7 @@ flagHI flaglog flagN flagVF +flang fld floralwhite Florez From 86d1aacf7ed750bda61b2917dd42fc7067ec4184 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 16:28:15 -0400 Subject: [PATCH 171/364] add function to dispatch LAMMPS errors to library interfaces --- doc/src/Fortran.rst | 17 +++++++- doc/src/Library_create.rst | 6 +++ fortran/lammps.f90 | 52 ++++++++++++++---------- python/lammps/constants.py | 44 +++++++++++--------- python/lammps/core.py | 26 +++++++++++- src/library.cpp | 83 ++++++++++++++++++++++++++++++++++++++ src/library.h | 14 +++++++ 7 files changed, 197 insertions(+), 45 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 2dd04439a1..e15555bc4e 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -128,7 +128,7 @@ version of the previous example: -------------------- Executing LAMMPS commands -========================= +************************* Once a LAMMPS instance is created, it is possible to "drive" the LAMMPS simulation by telling LAMMPS to read commands from a file or to pass @@ -177,7 +177,7 @@ Below is a small demonstration of the uses of the different functions: --------------- Accessing system properties -=========================== +*************************** The C-library interface allows the :doc:`extraction of different kinds of information ` about the active simulation @@ -241,6 +241,7 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f c_ptr handle: reference to the LAMMPS class :f subroutine close: :f:func:`close` + :f subroutine error: :f:func:`error` :f function version: :f:func:`version` :f subroutine file: :f:func:`file` :f subroutine command: :f:func:`command` @@ -305,6 +306,18 @@ Procedures Bound to the lammps Derived Type -------- +.. f:subroutine:: error(error_type, error_text) + + This method is a wrapper around the :cpp:func:`lammps_error` function and will dispatch + an error through the LAMMPS Error class. + + .. versionadded:: TBD + + :p integer error_type: constant to select which Error class function to call + :p character(len=\*) error_text: error message + +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like :cpp:func:`lammps_version` diff --git a/doc/src/Library_create.rst b/doc/src/Library_create.rst index 8043819891..8ccc2e80ce 100644 --- a/doc/src/Library_create.rst +++ b/doc/src/Library_create.rst @@ -11,6 +11,7 @@ This section documents the following functions: - :cpp:func:`lammps_mpi_finalize` - :cpp:func:`lammps_kokkos_finalize` - :cpp:func:`lammps_python_finalize` +- :cpp:func:`lammps_error` -------------------- @@ -115,3 +116,8 @@ calling program. .. doxygenfunction:: lammps_python_finalize :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_error + :project: progguide diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7541bf7c0f..98378c833a 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -56,6 +56,7 @@ MODULE LIBLAMMPS TYPE(c_ptr) :: handle CONTAINS PROCEDURE :: close => lmp_close + PROCEDURE :: error => lmp_error PROCEDURE :: file => lmp_file PROCEDURE :: command => lmp_command PROCEDURE :: commands_list => lmp_commands_list @@ -144,6 +145,14 @@ MODULE LIBLAMMPS SUBROUTINE lammps_kokkos_finalize() BIND(C) END SUBROUTINE lammps_kokkos_finalize + SUBROUTINE lammps_error(handle, error_type, error_text) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE :: error_type + TYPE(c_ptr), VALUE :: error_text + END SUBROUTINE lammps_error + SUBROUTINE lammps_file(handle, filename) BIND(C) IMPORT :: c_ptr IMPLICIT NONE @@ -417,6 +426,18 @@ CONTAINS END IF END SUBROUTINE lmp_close + ! equivalent function to lammps_error() + SUBROUTINE lmp_error(self, error_type, error_text) + CLASS(lammps) :: self + INTEGER :: error_type + CHARACTER(len=*) :: error_text + TYPE(c_ptr) :: str + + str = f2c_string(error_text) + CALL lammps_error(self%handle, error_type, str) + CALL lammps_free(str) + END SUBROUTINE lmp_error + ! equivalent function to lammps_file() SUBROUTINE lmp_file(self, filename) CLASS(lammps) :: self @@ -492,7 +513,7 @@ CONTAINS END FUNCTION lmp_get_thermo ! equivalent subroutine to lammps_extract_box - SUBROUTINE lmp_extract_box (self, boxlo, boxhi, xy, yz, xz, pflags, boxflag) + SUBROUTINE lmp_extract_box(self, boxlo, boxhi, xy, yz, xz, pflags, boxflag) CLASS(lammps), INTENT(IN) :: self REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: boxlo(3), boxhi(3) REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: xy, yz, xz @@ -515,11 +536,11 @@ CONTAINS END SUBROUTINE lmp_extract_box ! equivalent function to lammps_reset_box - SUBROUTINE lmp_reset_box (self, boxlo, boxhi, xy, yz, xz) + SUBROUTINE lmp_reset_box(self, boxlo, boxhi, xy, yz, xz) CLASS(lammps), INTENT(IN) :: self REAL(C_double), INTENT(IN) :: boxlo(3), boxhi(3), xy, yz, xz - CALL lammps_reset_box (self%handle, boxlo, boxhi, xy, yz, xz) + CALL lammps_reset_box(self%handle, boxlo, boxhi, xy, yz, xz) END SUBROUTINE lmp_reset_box ! equivalent function to lammps_memory_usage @@ -532,14 +553,14 @@ CONTAINS END SUBROUTINE lmp_memory_usage ! equivalent function to lammps_get_mpi_comm - INTEGER FUNCTION lmp_get_mpi_comm (self) + INTEGER FUNCTION lmp_get_mpi_comm(self) CLASS(lammps), INTENT(IN) :: self lmp_get_mpi_comm = lammps_get_mpi_comm(self%handle) END FUNCTION lmp_get_mpi_comm ! equivalent function to lammps_extract_setting - INTEGER (c_int) FUNCTION lmp_extract_setting (self, keyword) + INTEGER (c_int) FUNCTION lmp_extract_setting(self, keyword) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: keyword TYPE(c_ptr) :: Ckeyword @@ -549,22 +570,10 @@ CONTAINS CALL lammps_free(Ckeyword) END FUNCTION lmp_extract_setting -! FIXME Do we need this to be visible to the user? -! ! equivalent function to lammps_extract_global_datatype -! INTEGER (c_int) FUNCTION lmp_extract_global_datatype (name) -! CHARACTER(LEN=*), INTENT(IN) :: name -! TYPE(c_ptr) :: Cname -! -! Cname = f2c_string(name) -! lmp_extract_global_datatype -! = lammps_extract_global_datatype(c_null_ptr, Cname) -! CALL lammps_free(Cname) -! END FUNCTION lmp_extract_global_datatype - ! equivalent function to lammps_extract_global ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS - FUNCTION lmp_extract_global (self, name) RESULT (global_data) + FUNCTION lmp_extract_global(self, name) RESULT (global_data) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: global_data @@ -625,10 +634,9 @@ CONTAINS FORALL ( I=1:length ) global_data%str(i:i) = Fptr(i) END FORALL - CASE DEFAULT - WRITE(ERROR_UNIT,'(A)') 'ERROR: Unknown pointer type in& - & extract_global' - STOP 2 + CASE DEFAULT + ! FIXME convert to use symbolic constants later + CALL lmp_error(self, 6, 'Unknown pointer type in extract_global') END SELECT END FUNCTION diff --git a/python/lammps/constants.py b/python/lammps/constants.py index a50d58b28f..26bb92626a 100644 --- a/python/lammps/constants.py +++ b/python/lammps/constants.py @@ -13,29 +13,35 @@ # various symbolic constants to be used # in certain calls to select data formats -LAMMPS_AUTODETECT = None -LAMMPS_INT = 0 -LAMMPS_INT_2D = 1 -LAMMPS_DOUBLE = 2 -LAMMPS_DOUBLE_2D = 3 -LAMMPS_INT64 = 4 -LAMMPS_INT64_2D = 5 -LAMMPS_STRING = 6 +LAMMPS_AUTODETECT = None +LAMMPS_INT = 0 +LAMMPS_INT_2D = 1 +LAMMPS_DOUBLE = 2 +LAMMPS_DOUBLE_2D = 3 +LAMMPS_INT64 = 4 +LAMMPS_INT64_2D = 5 +LAMMPS_STRING = 6 # these must be kept in sync with the enums in library.h -LMP_STYLE_GLOBAL = 0 -LMP_STYLE_ATOM = 1 -LMP_STYLE_LOCAL = 2 +LMP_STYLE_GLOBAL = 0 +LMP_STYLE_ATOM = 1 +LMP_STYLE_LOCAL = 2 -LMP_TYPE_SCALAR = 0 -LMP_TYPE_VECTOR = 1 -LMP_TYPE_ARRAY = 2 -LMP_SIZE_VECTOR = 3 -LMP_SIZE_ROWS = 4 -LMP_SIZE_COLS = 5 +LMP_TYPE_SCALAR = 0 +LMP_TYPE_VECTOR = 1 +LMP_TYPE_ARRAY = 2 +LMP_SIZE_VECTOR = 3 +LMP_SIZE_ROWS = 4 +LMP_SIZE_COLS = 5 -LMP_VAR_EQUAL = 0 -LMP_VAR_ATOM = 1 +LMP_ERROR_WARNING = 0 +LMP_ERROR_ONE = 1 +LMP_ERROR_ALL = 2 +LMP_ERROR_WORLD = 4 +LMP_ERROR_UNIVERSE = 8 + +LMP_VAR_EQUAL = 0 +LMP_VAR_ATOM = 1 # ------------------------------------------------------------------------- diff --git a/python/lammps/core.py b/python/lammps/core.py index 930a40a4b0..aa4aae13db 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -167,6 +167,8 @@ class lammps(object): self.lib.lammps_flush_buffers.argtypes = [c_void_p] self.lib.lammps_free.argtypes = [c_void_p] + self.lib.lammps_error.argtypes = [c_void_p, c_int, c_char_p] + self.lib.lammps_file.argtypes = [c_void_p, c_char_p] self.lib.lammps_file.restype = None @@ -486,6 +488,26 @@ class lammps(object): # ------------------------------------------------------------------------- + def error(self, error_type, error_text): + """Forward error to the LAMMPS Error class. + + This is a wrapper around the :cpp:func:`lammps_error` function of the C-library interface. + + .. versionadded:: TBD + + :param error_type: + :type error_type: int + :param error_text: + :type error_text: string + """ + if error_text: error_text = error_text.encode() + else: error_text = "(unknown error)".encode() + + with ExceptionCheck(self): + self.lib.lammps_error(self.lmp, error_type, error_text) + + # ------------------------------------------------------------------------- + def version(self): """Return a numerical representation of the LAMMPS version in use. @@ -1622,8 +1644,8 @@ class lammps(object): """Return a string with detailed information about any devices that are usable by the GPU package. - This is a wrapper around the :cpp:func:`lammps_get_gpu_device_info` - function of the C-library interface. + This is a wrapper around the :cpp:func:`lammps_get_gpu_device_info` + function of the C-library interface. :return: GPU device info string :rtype: string diff --git a/src/library.cpp b/src/library.cpp index 8fa8b4c17b..cc547106f2 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -416,6 +416,89 @@ void lammps_python_finalize() Python::finalize(); } + +/* ---------------------------------------------------------------------- */ + +/** Call a LAMMPS Error class function + * +\verbatim embed:rst + +This function is a wrapper around functions in the ``Error`` to print an +error message and then stop LAMMPS. + +The *error_type* parameter selects which function to call. It is a sum +of constants from :cpp:enum:`_LMP_ERROR_CONST`. If the value does not +match any valid combination of constants a warning is printed and the +function returns. + +.. versionadded:: TBD + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance + * \param error_type parameter to select function in the Error class + * \param error_text error message */ + +void lammps_error(void *handle, int error_type, const char *error_text) +{ + auto lmp = (LAMMPS *) handle; + + BEGIN_CAPTURE + { + switch (error_type) { + case LMP_ERROR_WARNING: + lmp->error->warning("(library)", 0, error_text); + break; + case LMP_ERROR_ONE: + lmp->error->one("(library)", 0, error_text); + break; + case LMP_ERROR_ALL: + lmp->error->all("(library)", 0, error_text); + break; + case LMP_ERROR_WARNING|LMP_ERROR_WORLD: + lmp->error->warning("(library)", 0, error_text); + break; + case LMP_ERROR_ONE|LMP_ERROR_WORLD: + lmp->error->one("(library)", 0, error_text); + break; + case LMP_ERROR_ALL|LMP_ERROR_WORLD: + lmp->error->all("(library)", 0, error_text); + break; + case LMP_ERROR_WARNING|LMP_ERROR_UNIVERSE: + lmp->error->universe_warn("(library)", 0, error_text); + break; + case LMP_ERROR_ONE|LMP_ERROR_UNIVERSE: + lmp->error->universe_one("(library)", 0, error_text); + break; + case LMP_ERROR_ALL|LMP_ERROR_UNIVERSE: + lmp->error->universe_all("(library)", 0, error_text); + break; + default: + auto mesg = fmt::format("Unknown error type {} for message: {}", error_type, error_text); + lmp->error->warning("(library)", 0, mesg); + } + } + END_CAPTURE + +#if defined(LAMMPS_EXCEPTIONS) + // with enabled exceptions the above code will simply throw an + // exception and record the error message. So we have to explicitly + // stop here like we do in main.cpp + if (lammps_has_error(handle)) { + if (error_type & 1) { + lammps_kokkos_finalize(); + lammps_python_finalize(); + MPI_Abort(lmp->universe->uworld, 1); + } else if (error_type & 2) { + lammps_kokkos_finalize(); + lammps_python_finalize(); + lammps_mpi_finalize(); + exit(1); + } + } +#endif +} + // ---------------------------------------------------------------------- // Library functions to process commands // ---------------------------------------------------------------------- diff --git a/src/library.h b/src/library.h index 311219e5ba..4e50cbee84 100644 --- a/src/library.h +++ b/src/library.h @@ -75,6 +75,18 @@ enum _LMP_TYPE_CONST { LMP_SIZE_COLS = 5 /*!< return number of columns */ }; +/** Error codes to select the suitable function in the Error class + * + * Must be kept in sync with the equivalent constants in lammps/constants.py */ + +enum _LMP_ERROR_CONST { + LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ + LMP_ERROR_ONE = 1, /*!< called from one MPI rank */ + LMP_ERROR_ALL = 2, /*!< called from all MPI ranks */ + LMP_ERROR_WORLD = 4, /*!< error on Comm::world */ + LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ +}; + /* Ifdefs to allow this file to be included in C and C++ programs */ #ifdef __cplusplus @@ -97,6 +109,8 @@ void lammps_mpi_finalize(); void lammps_kokkos_finalize(); void lammps_python_finalize(); +void lammps_error(void *handle, int error_type, const char *error_text); + /* ---------------------------------------------------------------------- * Library functions to process commands * ---------------------------------------------------------------------- */ From cc0fc01d1c2aae9a3c6a448de49ebedd76ba655f Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 23 Sep 2022 16:23:51 -0500 Subject: [PATCH 172/364] Implemented extract_compute and started writing unit test for it --- fortran/lammps.f90 | 160 ++++++++++++++---- .../fortran/test_fortran_extract_compute.f90 | 149 ++++++++++++++++ 2 files changed, 275 insertions(+), 34 deletions(-) create mode 100644 unittest/fortran/test_fortran_extract_compute.f90 diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 322d54687c..dc9393699f 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -42,7 +42,7 @@ MODULE LIBLAMMPS ! Must be kept in sync with the equivalent declarations in ! src/library.h and python/lammps/constants.py ! - ! NOT part of the API (the part the user sees) + ! These are NOT part of the API (the part the user sees) INTEGER (c_int), PARAMETER :: & LAMMPS_INT = 0, & ! 32-bit integer (array) LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array @@ -50,10 +50,30 @@ MODULE LIBLAMMPS LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array LAMMPS_INT64 = 4, & ! 64-bit integer (array) LAMMPS_INT64_2D = 5, & ! two-dimensional 64-bit integer array - LAMMPS_STRING = 6 ! C-String + LAMMPS_STRING = 6, & ! C-String + LMP_STYLE_GLOBAL = 0, & ! request global compute/fix/etc. data + LMP_STYLE_ATOM = 1, & ! request per-atom compute/fix/etc. data + LMP_STYLE_LOCAL = 2, & ! request local compute/fix/etc. data + LMP_TYPE_SCALAR = 0, & ! request scalar + LMP_TYPE_VECTOR = 1, & ! request vector + LMP_TYPE_ARRAY = 2, & ! request array + LMP_SIZE_VECTOR = 3, & ! request size of vector + LMP_SIZE_ROWS = 4, & ! request rows (actually columns) + LMP_SIZE_COLS = 5 ! request colums (actually rows) + + ! "Constants" to use with extract_compute and friends + TYPE lammps_style + INTEGER(c_int) :: global, atom, local + END TYPE lammps_style + + TYPE lammps_type + INTEGER(c_int) :: scalar, vector, array + END TYPE lammps_type TYPE lammps TYPE(c_ptr) :: handle + TYPE(lammps_style) :: style + TYPE(lammps_type) :: type CONTAINS PROCEDURE :: close => lmp_close PROCEDURE :: file => lmp_file @@ -69,6 +89,8 @@ MODULE LIBLAMMPS PROCEDURE :: extract_setting => lmp_extract_setting PROCEDURE :: extract_global => lmp_extract_global PROCEDURE :: extract_atom => lmp_extract_atom + PROCEDURE :: extract_compute => lmp_extract_compute +! PROCEDURE :: version => lmp_version PROCEDURE :: is_running => lmp_is_running END TYPE lammps @@ -104,7 +126,7 @@ MODULE LIBLAMMPS ! nlocal = extract_global('nlocal') ! which are of the form "pointer to double = type(lammps_data)" result in ! re-associating the pointer on the left with the appropriate piece of - ! LAMMPS data (after checking type-compatibility) + ! LAMMPS data (after checking type-kind-rank compatibility) INTERFACE ASSIGNMENT(=) MODULE PROCEDURE assign_int_to_lammps_data, assign_int64_to_lammps_data, & assign_intvec_to_lammps_data, assign_int64vec_to_lammps_data, & @@ -157,29 +179,29 @@ MODULE LIBLAMMPS SUBROUTINE lammps_command(handle, cmd) BIND(C) IMPORT :: c_ptr IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: cmd + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: cmd END SUBROUTINE lammps_command SUBROUTINE lammps_commands_list(handle, ncmd, cmds) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - INTEGER(c_int), VALUE, INTENT(IN) :: ncmd + TYPE(c_ptr), INTENT(IN), VALUE :: handle + INTEGER(c_int), INTENT(IN), VALUE :: ncmd TYPE(c_ptr), DIMENSION(*), INTENT(IN) :: cmds END SUBROUTINE lammps_commands_list SUBROUTINE lammps_commands_string(handle, str) BIND(C) IMPORT :: c_ptr IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: str + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: str END SUBROUTINE lammps_commands_string FUNCTION lammps_get_natoms(handle) BIND(C) IMPORT :: c_ptr, c_double IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: handle REAL(c_double) :: lammps_get_natoms END FUNCTION lammps_get_natoms @@ -187,83 +209,89 @@ MODULE LIBLAMMPS IMPORT :: c_ptr, c_double IMPLICIT NONE REAL(c_double) :: lammps_get_thermo - TYPE(c_ptr), VALUE :: handle - TYPE(c_ptr), VALUE :: name + TYPE(c_ptr), INTENT(IN), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: name END FUNCTION lammps_get_thermo SUBROUTINE lammps_extract_box(handle,boxlo,boxhi,xy,yz,xz,pflags, & boxflag) BIND(C) IMPORT :: c_ptr, c_double, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, boxlo, boxhi, xy, yz, xz, pflags, & - boxflag + TYPE(c_ptr), INTENT(IN), VALUE :: handle, boxlo, boxhi, xy, yz, xz, & + pflags, boxflag END SUBROUTINE lammps_extract_box SUBROUTINE lammps_reset_box(handle,boxlo,boxhi,xy,yz,xz) BIND(C) IMPORT :: c_ptr, c_double IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - REAL(c_double), DIMENSION(3) :: boxlo, boxhi - REAL(c_double), VALUE :: xy, yz, xz + TYPE(c_ptr), INTENT(IN), VALUE :: handle + REAL(c_double), DIMENSION(3), INTENT(IN) :: boxlo, boxhi + REAL(c_double), INTENT(IN), VALUE :: xy, yz, xz END SUBROUTINE lammps_reset_box SUBROUTINE lammps_memory_usage(handle,meminfo) BIND(C) IMPORT :: c_ptr, c_double IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle - REAL(c_double), DIMENSION(*) :: meminfo + TYPE(c_ptr), INTENT(IN), VALUE :: handle + REAL(c_double), DIMENSION(*), INTENT(OUT) :: meminfo END SUBROUTINE lammps_memory_usage FUNCTION lammps_get_mpi_comm(handle) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle + TYPE(c_ptr), INTENT(IN), VALUE :: handle INTEGER(c_int) :: lammps_get_mpi_comm END FUNCTION lammps_get_mpi_comm FUNCTION lammps_extract_setting(handle,keyword) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, keyword + TYPE(c_ptr), INTENT(IN), VALUE :: handle, keyword INTEGER(c_int) :: lammps_extract_setting END FUNCTION lammps_extract_setting FUNCTION lammps_extract_global_datatype(handle,name) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name INTEGER(c_int) :: lammps_extract_global_datatype END FUNCTION lammps_extract_global_datatype FUNCTION c_strlen (str) BIND(C,name='strlen') IMPORT :: c_ptr, c_size_t IMPLICIT NONE - TYPE(c_ptr), VALUE :: str + TYPE(c_ptr), INTENT(IN), VALUE :: str INTEGER(c_size_t) :: c_strlen END FUNCTION c_strlen FUNCTION lammps_extract_global(handle, name) BIND(C) IMPORT :: c_ptr IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name TYPE(c_ptr) :: lammps_extract_global END FUNCTION lammps_extract_global FUNCTION lammps_extract_atom_datatype(handle, name) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name INTEGER(c_int) :: lammps_extract_atom_datatype END FUNCTION lammps_extract_atom_datatype FUNCTION lammps_extract_atom(handle, name) BIND(C) IMPORT :: c_ptr IMPLICIT NONE - TYPE(c_ptr), VALUE :: handle, name + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name TYPE(c_ptr) :: lammps_extract_atom END FUNCTION lammps_extract_atom - !(generic) lammps_extract_compute + FUNCTION lammps_extract_compute(handle, id, style, type) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, id + INTEGER(c_int), INTENT(IN), VALUE :: style, type + TYPE(c_ptr) :: lammps_extract_compute + END FUNCTION lammps_extract_compute !(generic) lammps_extract_fix @@ -413,11 +441,19 @@ CONTAINS CALL lammps_free(argv(i)) END DO DEALLOCATE(argv) + + ! Assign style and type members so lmp_open%style%global and such work + lmp_open%style%global = LMP_STYLE_GLOBAL + lmp_open%style%atom = LMP_STYLE_ATOM + lmp_open%style%local = LMP_STYLE_LOCAL + lmp_open%type%scalar = LMP_TYPE_SCALAR + lmp_open%type%vector = LMP_TYPE_VECTOR + lmp_open%type%array = LMP_TYPE_ARRAY END FUNCTION lmp_open ! Combined Fortran wrapper around lammps_close() and lammps_mpi_finalize() SUBROUTINE lmp_close(self, finalize) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self LOGICAL, INTENT(IN), OPTIONAL :: finalize CALL lammps_close(self%handle) @@ -432,7 +468,7 @@ CONTAINS ! equivalent function to lammps_file() SUBROUTINE lmp_file(self, filename) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: filename TYPE(c_ptr) :: str @@ -443,7 +479,7 @@ CONTAINS ! equivalent function to lammps_command() SUBROUTINE lmp_command(self, cmd) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: cmd TYPE(c_ptr) :: str @@ -454,7 +490,7 @@ CONTAINS ! equivalent function to lammps_commands_list() SUBROUTINE lmp_commands_list(self, cmds) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cmds(:) TYPE(c_ptr), ALLOCATABLE :: cmdv(:) INTEGER :: i, ncmd @@ -477,7 +513,7 @@ CONTAINS ! equivalent function to lammps_commands_string() SUBROUTINE lmp_commands_string(self, str) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self CHARACTER(len=*) :: str TYPE(c_ptr) :: tmp @@ -711,16 +747,72 @@ CONTAINS END SELECT END FUNCTION lmp_extract_atom + ! equivalent function to lammps_extract_compute + ! the assignment operator is overloaded so as to bind the pointers to + ! lammps data based on the information available from LAMMPS + FUNCTION lmp_extract_compute (self, id, style, type) RESULT (compute_data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN) :: style, type + TYPE(lammps_data) :: compute_data + + INTEGER(c_int) :: datatype + TYPE(c_ptr) :: Cid, Cptr, Ctemp + INTEGER :: nrows, ncols, length + INTEGER(c_int), POINTER :: temp + + Cid = f2c_string(id) + Cptr = lammps_extract_compute(self%handle, Cid, style, type) + + ! Remember that rows and columns in C are transposed in Fortran! + SELECT CASE (type) + CASE (LMP_TYPE_SCALAR) + length = 1 + nrows = 1 + ncols = 1 + CALL C_F_POINTER(Cptr, compute_data%r64) + CASE (LMP_TYPE_VECTOR) + IF (style == LMP_STYLE_ATOM) THEN + length = self%extract_setting('nmax') + ELSE + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_VECTOR) + CALL C_F_POINTER(Ctemp, temp) + length = temp + END IF + CALL C_F_POINTER(Cptr, compute_data%r64_vec, [length]) + CASE (LMP_TYPE_ARRAY) + IF (style == LMP_STYLE_ATOM) THEN + nrows = self%extract_setting('nmax') + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_ROWS) + CALL C_F_POINTER(Ctemp, temp) + ncols = temp + ELSE + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_ROWS) + CALL C_F_POINTER(Ctemp, temp) + ncols = temp + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_COLS) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + END IF + CALL C_F_POINTER(Cptr, compute_data%r64_mat, [nrows, ncols]) + CASE DEFAULT + WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: unknown type value ', type, & + 'passed to extract_compute' + STOP 1 + END SELECT + CALL lammps_free(Cid) + END FUNCTION lmp_extract_compute + ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self lmp_version = lammps_version(self%handle) END FUNCTION lmp_version ! equivalent function to lammps_is_running LOGICAL FUNCTION lmp_is_running(self) - CLASS(lammps) :: self + CLASS(lammps), INTENT(IN) :: self lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) END FUNCTION lmp_is_running diff --git a/unittest/fortran/test_fortran_extract_compute.f90 b/unittest/fortran/test_fortran_extract_compute.f90 new file mode 100644 index 0000000000..091572ace3 --- /dev/null +++ b/unittest/fortran/test_fortran_extract_compute.f90 @@ -0,0 +1,149 @@ +MODULE keepcompute + USE liblammps + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 2.0' ] +END MODULE keepcompute + +FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") + USE ISO_C_BINDING, ONLY: c_ptr + USE liblammps + USE keepatom, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepatom, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_extract_compute () BIND(C) + USE LIBLAMMPS + USE keepatom, ONLY : lmp, demo_input, cont_input, pair_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) + CALL lmp%command("compute peratompe all pe/atom") ! per-atom vector + call lmp%command("compute stress all stress/atom thermo_temp") ! per-atom array + CALL lmp%command("compute COM all com") ! global vector + CALL lmp%command("compute totalpe all reduce sum c_peratompe") ! global scalar + CALL lmp%command("compute 1 all rdf 100") ! global array + CALL lmp%command("compute pairdist all pair/local dist") ! local vector + CALL lmp%command("compute pairlocal all pair/local dist dx dy dz") ! local array +END SUBROUTINE f_lammps_setup_extract_atom + +FUNCTION f_lammps_extract_atom_mass () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + REAL(C_double) :: f_lammps_extract_atom_mass + REAL(C_double), DIMENSION(:), POINTER :: mass => NULL() + + mass = lmp%extract_atom('mass') + f_lammps_extract_atom_mass = mass(1) +END FUNCTION f_lammps_extract_atom_mass + +FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_tag_int + INTEGER(C_int), DIMENSION(:), POINTER :: tag => NULL() + + tag = lmp%extract_atom('id') + f_lammps_extract_atom_tag_int = tag(i) +END FUNCTION f_lammps_extract_atom_tag_int + +FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int64_t), INTENT(IN), VALUE :: i + INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 + INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag => NULL() + + tag = lmp%extract_atom('id') + f_lammps_extract_atom_tag_int64 = tag(i) +END FUNCTION f_lammps_extract_atom_tag_int64 + +FUNCTION f_lammps_extract_atom_type(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_type + INTEGER(C_int), DIMENSION(:), POINTER :: atype => NULL() + + atype = lmp%extract_atom('type') + f_lammps_extract_atom_type = atype(i) +END FUNCTION f_lammps_extract_atom_type + +FUNCTION f_lammps_extract_atom_mask(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + INTEGER(C_int) :: f_lammps_extract_atom_mask + INTEGER(C_int), DIMENSION(:), POINTER :: mask => NULL() + + mask = lmp%extract_atom('mask') + f_lammps_extract_atom_mask = mask(i) +END FUNCTION f_lammps_extract_atom_mask + +SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double), DIMENSION(3) :: x + REAL(C_double), DIMENSION(:,:), POINTER :: xptr => NULL() + + xptr = lmp%extract_atom('x') + x = xptr(:,i) +END SUBROUTINE f_lammps_extract_atom_x + +SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepatom, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double), DIMENSION(3) :: v + REAL(C_double), DIMENSION(:,:), POINTER :: vptr => NULL() + + vptr = lmp%extract_atom('v') + v = vptr(:,i) +END SUBROUTINE f_lammps_extract_atom_v From 9eee1bbb5f0698054dc5f9e648322339398bcf21 Mon Sep 17 00:00:00 2001 From: Steven Anaya Date: Fri, 23 Sep 2022 16:04:15 -0600 Subject: [PATCH 173/364] Fix MLIAP Unified LJ example logs --- ... => log.23Sep22.mliap.unified.lj.Ar.g++.1} | 59 ++++++++++++++----- ... => log.23Sep22.mliap.unified.lj.Ar.g++.4} | 57 +++++++++++++----- 2 files changed, 87 insertions(+), 29 deletions(-) rename examples/mliap/{log.15Sep22.mliap.unified.lj.Ar.g++.1 => log.23Sep22.mliap.unified.lj.Ar.g++.1} (63%) rename examples/mliap/{log.15Sep22.mliap.unified.lj.Ar.g++.4 => log.23Sep22.mliap.unified.lj.Ar.g++.4} (64%) diff --git a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 similarity index 63% rename from examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 rename to examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 index bba6fbb9df..ecbf4e3fa5 100644 --- a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.1 +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 @@ -1,12 +1,45 @@ LAMMPS (3 Aug 2022) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 1 box Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) 1 by 1 by 1 MPI processor grid +create_atoms 1 box Created 4000 atoms using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) - create_atoms CPU = 0.001 seconds + create_atoms CPU = 0.000 seconds +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 50 +run 250 Neighbor list info ... update: every = 20 steps, delay = 0 steps, check = no max neighbors/atom: 2000, page size: 100000 @@ -19,10 +52,6 @@ Neighbor list info ... pair build: full/bin/atomonly stencil: full/bin/3d bin: standard -Setting up Verlet run ... - Unit style : lj - Current step : 0 - Time step : 0.005 Per MPI rank memory allocation (min/avg/max) = 12.7 | 12.7 | 12.7 Mbytes Step Temp E_pair E_mol TotEng Press 0 3 -6.7733681 0 -2.2744931 -3.7033504 @@ -31,20 +60,20 @@ Per MPI rank memory allocation (min/avg/max) = 12.7 | 12.7 | 12.7 Mbytes 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 -Loop time of 2.37841 on 1 procs for 250 steps with 4000 atoms +Loop time of 2.3513 on 1 procs for 250 steps with 4000 atoms -Performance: 45408.415 tau/day, 105.112 timesteps/s -87.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 45932.056 tau/day, 106.324 timesteps/s +86.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 | 2.2535 | 2.2535 | 2.2535 | 0.0 | 94.75 -Neigh | 0.11137 | 0.11137 | 0.11137 | 0.0 | 4.68 -Comm | 0.0063093 | 0.0063093 | 0.0063093 | 0.0 | 0.27 -Output | 0.00014549 | 0.00014549 | 0.00014549 | 0.0 | 0.01 -Modify | 0.0055828 | 0.0055828 | 0.0055828 | 0.0 | 0.23 -Other | | 0.001505 | | | 0.06 +Pair | 2.2271 | 2.2271 | 2.2271 | 0.0 | 94.72 +Neigh | 0.11085 | 0.11085 | 0.11085 | 0.0 | 4.71 +Comm | 0.0062017 | 0.0062017 | 0.0062017 | 0.0 | 0.26 +Output | 0.00015504 | 0.00015504 | 0.00015504 | 0.0 | 0.01 +Modify | 0.0056096 | 0.0056096 | 0.0056096 | 0.0 | 0.24 +Other | | 0.001392 | | | 0.06 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -59,4 +88,4 @@ Total # of neighbors = 303576 Ave neighs/atom = 75.894 Neighbor list builds = 12 Dangerous builds not checked -Total wall time: 0:00:03 +Total wall time: 0:00:08 diff --git a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 similarity index 64% rename from examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 rename to examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 index 73dafb7c76..c23274830f 100644 --- a/examples/mliap/log.15Sep22.mliap.unified.lj.Ar.g++.4 +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 @@ -1,12 +1,45 @@ LAMMPS (3 Aug 2022) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 10 0 10 0 10 +create_box 1 box Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) 1 by 2 by 2 MPI processor grid +create_atoms 1 box Created 4000 atoms using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) create_atoms CPU = 0.000 seconds +mass 1 1.0 + +velocity all create 3.0 87287 loop geom + +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#dump 4 all custom 1 forces.xyz fx fy fz + +thermo 50 +run 250 Neighbor list info ... update: every = 20 steps, delay = 0 steps, check = no max neighbors/atom: 2000, page size: 100000 @@ -19,10 +52,6 @@ Neighbor list info ... pair build: full/bin/atomonly stencil: full/bin/3d bin: standard -Setting up Verlet run ... - Unit style : lj - Current step : 0 - Time step : 0.005 Per MPI rank memory allocation (min/avg/max) = 5.774 | 5.774 | 5.774 Mbytes Step Temp E_pair E_mol TotEng Press 0 3 -6.7733681 0 -2.2744931 -3.7033504 @@ -31,20 +60,20 @@ Per MPI rank memory allocation (min/avg/max) = 5.774 | 5.774 | 5.774 Mbytes 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 -Loop time of 0.729791 on 4 procs for 250 steps with 4000 atoms +Loop time of 0.695238 on 4 procs for 250 steps with 4000 atoms -Performance: 147987.652 tau/day, 342.564 timesteps/s -84.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 155342.376 tau/day, 359.589 timesteps/s +83.1% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.59736 | 0.64811 | 0.67755 | 3.8 | 88.81 -Neigh | 0.028786 | 0.029168 | 0.029619 | 0.2 | 4.00 -Comm | 0.018895 | 0.048858 | 0.10017 | 13.9 | 6.69 -Output | 0.00010361 | 0.00010602 | 0.00010794 | 0.0 | 0.01 -Modify | 0.0014584 | 0.0014907 | 0.0015097 | 0.1 | 0.20 -Other | | 0.002061 | | | 0.28 +Pair | 0.62236 | 0.63453 | 0.64608 | 1.4 | 91.27 +Neigh | 0.028102 | 0.02844 | 0.028769 | 0.2 | 4.09 +Comm | 0.017175 | 0.029078 | 0.041476 | 6.8 | 4.18 +Output | 0.00011382 | 0.00011668 | 0.00012178 | 0.0 | 0.02 +Modify | 0.0015878 | 0.0016298 | 0.0016762 | 0.1 | 0.23 +Other | | 0.001443 | | | 0.21 Nlocal: 1000 ave 1008 max 987 min Histogram: 1 0 0 0 0 0 1 0 1 1 @@ -59,4 +88,4 @@ Total # of neighbors = 303576 Ave neighs/atom = 75.894 Neighbor list builds = 12 Dangerous builds not checked -Total wall time: 0:00:01 +Total wall time: 0:00:09 From 5aad045686265c30de3a390d3c7964eb30d35805 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 23 Sep 2022 16:51:20 -0600 Subject: [PATCH 174/364] Improve incompatible python interpreter warning --- python/lammps/mliap/__init__.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/python/lammps/mliap/__init__.py b/python/lammps/mliap/__init__.py index c04734c86c..b888eb55ce 100644 --- a/python/lammps/mliap/__init__.py +++ b/python/lammps/mliap/__init__.py @@ -5,6 +5,7 @@ import sysconfig import ctypes import platform +import warnings py_ver = sysconfig.get_config_vars('VERSION')[0] OS_name = platform.system() @@ -25,8 +26,10 @@ except Exception as e: raise OSError("Unable to locate python shared library") from e if not pylib.Py_IsInitialized(): - raise RuntimeError("This interpreter is not compatible with python-based mliap for LAMMPS.") + warnings.warn("This interpreter is not compatible with python-based MLIAP for LAMMPS. " + "Attempting to activate the MLIAP-python coupling from python may result " + "in undefined behavior.") +else: + from .loader import load_model, load_unified, activate_mliappy del sysconfig, ctypes, library, pylib - -from .loader import load_model, load_unified, activate_mliappy From a94cfe175b887ec0bfa92110ceb646699db1ca27 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Sep 2022 18:59:29 -0400 Subject: [PATCH 175/364] add c/python unit tests for lammps_error() --- unittest/c-library/test_library_open.cpp | 29 ++++++++++++++++++++++++ unittest/python/python-open.py | 14 ++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/unittest/c-library/test_library_open.cpp b/unittest/c-library/test_library_open.cpp index c75fd3738b..1cd65d843d 100644 --- a/unittest/c-library/test_library_open.cpp +++ b/unittest/c-library/test_library_open.cpp @@ -198,3 +198,32 @@ TEST(lammps_open_fortran, no_args) if (verbose) std::cout << output; MPI_Comm_free(&mycomm); } + +TEST(lammps_open_no_mpi, lammps_error) +{ + const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + + ::testing::internal::CaptureStdout(); + void *alt_ptr; + void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_EQ(handle, alt_ptr); + LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle; + + EXPECT_EQ(lmp->world, MPI_COMM_WORLD); + EXPECT_EQ(lmp->infile, stdin); + EXPECT_NE(lmp->screen, nullptr); + EXPECT_EQ(lmp->logfile, nullptr); + EXPECT_EQ(lmp->citeme, nullptr); + EXPECT_EQ(lmp->suffix_enable, 0); + + EXPECT_STREQ(lmp->exename, "liblammps"); + EXPECT_EQ(lmp->num_package, 0); + ::testing::internal::CaptureStdout(); + lammps_error(handle, 0, "test_warning"); + output = ::testing::internal::GetCapturedStdout(); + EXPECT_THAT(output, HasSubstr("WARNING: test_warning")); +} + diff --git a/unittest/python/python-open.py b/unittest/python/python-open.py index 328745ded0..3c9165b8c8 100644 --- a/unittest/python/python-open.py +++ b/unittest/python/python-open.py @@ -45,11 +45,21 @@ class PythonOpen(unittest.TestCase): def testWithArgs(self): """Create LAMMPS instance with a few arguments""" - lmp=lammps(name=self.machine, - cmdargs=['-nocite','-sf','opt','-log','none']) + lmp=lammps(name=self.machine,cmdargs=['-nocite','-sf','opt','-log','none']) self.assertIsNot(lmp.lmp,None) self.assertEqual(lmp.opened,1) + def testError(self): + """Print warning message through LAMMPS Error class""" + lmp=lammps(name=self.machine,cmdargs=['-nocite','-log','none','-screen','tmp.error.output']) + lmp.error(0,'test_warning') + lmp.close() + with open('tmp.error.output','r') as f: + output = f.read() + self.assertTrue('LAMMPS' in output) + self.assertTrue('Total wall time' in output) + self.assertTrue('WARNING: test_warning' in output) + def testContextManager(self): """Automatically clean up LAMMPS instance""" with lammps(name=self.machine) as lmp: From a3326841ad6711780b08f0250926b3d51260ed66 Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 23 Sep 2022 17:01:59 -0600 Subject: [PATCH 176/364] Add MLIAP NumPy Ta06A example --- examples/mliap/mliap_numpy_Ta06A.py | 101 ++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 examples/mliap/mliap_numpy_Ta06A.py diff --git a/examples/mliap/mliap_numpy_Ta06A.py b/examples/mliap/mliap_numpy_Ta06A.py new file mode 100644 index 0000000000..25c928cd89 --- /dev/null +++ b/examples/mliap/mliap_numpy_Ta06A.py @@ -0,0 +1,101 @@ +before_loading =\ +"""# Demonstrate MLIAP/PyTorch interface to linear SNAP potential + +# Initialize simulation + +variable nsteps index 100 +variable nrep equal 4 +variable a equal 3.316 +units metal + +# generate the box and atom positions using a BCC lattice + +variable nx equal ${nrep} +variable ny equal ${nrep} +variable nz equal ${nrep} + +boundary p p p + +lattice bcc $a +region box block 0 ${nx} 0 ${ny} 0 ${nz} +create_box 1 box +create_atoms 1 box + +mass 1 180.88 + +# choose potential + +# DATE: 2014-09-05 UNITS: metal CONTRIBUTOR: Aidan Thompson athomps@sandia.gov CITATION: Thompson, Swiler, Trott, Foiles and Tucker, arxiv.org, 1409.3880 (2014) + +# Definition of SNAP potential Ta_Cand06A +# Assumes 1 LAMMPS atom type + +variable zblcutinner equal 4 +variable zblcutouter equal 4.8 +variable zblz equal 73 + +# Specify hybrid with SNAP, ZBL + +pair_style hybrid/overlay & +zbl ${zblcutinner} ${zblcutouter} & +mliap model mliappy LATER & +descriptor sna Ta06A.mliap.descriptor +pair_coeff 1 1 zbl ${zblz} ${zblz} +pair_coeff * * mliap Ta +""" +after_loading =\ +""" + +# Setup output + +compute eatom all pe/atom +compute energy all reduce sum c_eatom + +compute satom all stress/atom NULL +compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] +variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) + +thermo_style custom step temp epair c_energy etotal press v_press +thermo 10 +thermo_modify norm yes + +# Set up NVE run + +timestep 0.5e-3 +neighbor 1.0 bin +neigh_modify once no every 1 delay 0 check yes + +# Run MD + +velocity all create 300.0 4928459 loop geom +fix 1 all nve +run ${nsteps} +""" + +import numpy as np + +class LinearModel(): + def __init__(self,file): + coeffs = np.genfromtxt(file,skip_header=6) + self.bias = coeffs[0] + self.weights = coeffs[1:] + self.n_params = len(coeffs) + self.n_descriptors = len(self.weights) + self.n_elements = 1 + def __call__(self,elems,bispectrum,beta,energy): + energy[:] = bispectrum @ self.weights + self.bias + beta[:] = self.weights + + +mymodel = LinearModel("Ta06A.mliap.model") + +import lammps + +lmp = lammps.lammps(cmdargs=['-echo','both']) + +import lammps.mliap +lammps.mliap.activate_mliappy(lmp) +lmp.commands_string(before_loading) +lammps.mliap.load_model(mymodel) +lmp.commands_string(after_loading) + From 8ad478697e8d3a280e8cf0d5485ffb5a1e6f3c2a Mon Sep 17 00:00:00 2001 From: Steven Ray Anaya Date: Fri, 23 Sep 2022 17:20:27 -0600 Subject: [PATCH 177/364] Remove trailing whitespace --- doc/src/pair_mliap.rst | 2 +- src/ML-IAP/mliap_data.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 54adb7d721..480b46317a 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -171,7 +171,7 @@ to specify the path for these *model* and *descriptor* files. These can consume a significant amount of RAM for simulations of larger systems since their size depends on the total number of neighbors per MPI process. - + The *unified* keyword is followed by an argument specifying the filename containing the serialized unified Python object and the "ghostneigh" toggle (0/1) to disable/enable the construction of neighbors lists including diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index c433a9fde5..a91e66b211 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -147,7 +147,7 @@ void MLIAPData::generate_neighdata(NeighList* list_in, int eflag_in, int vflag_i memory->grow(eatoms,nlistatoms,"MLIAPData:eatoms"); nlistatoms_max = nlistatoms; } - + // grow gamma arrays if necessary if (gradgradflag == 1) { From 49a3be17cb35f9d0aefb64b9ad6c53e930bbf651 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 03:07:24 -0400 Subject: [PATCH 178/364] c-library functions should be always present, documented, and lowercase --- doc/src/Library_utility.rst | 7 +++++++ python/lammps/mliap/loader.py | 2 +- src/library.cpp | 28 ++++++++++++++++++++++++---- src/library.h | 4 +--- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/doc/src/Library_utility.rst b/doc/src/Library_utility.rst index da64e3b8f0..9d16daae0b 100644 --- a/doc/src/Library_utility.rst +++ b/doc/src/Library_utility.rst @@ -19,6 +19,7 @@ functions. They do not directly call the LAMMPS library. - :cpp:func:`lammps_force_timeout` - :cpp:func:`lammps_has_error` - :cpp:func:`lammps_get_last_error_message` +- :cpp:func:`lammps_python_api_version` The :cpp:func:`lammps_free` function is a clean-up function to free memory that the library had allocated previously via other function @@ -100,3 +101,9 @@ where such memory buffers were allocated that require the use of .. doxygenfunction:: lammps_get_last_error_message :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_python_api_version + :project: progguide + diff --git a/python/lammps/mliap/loader.py b/python/lammps/mliap/loader.py index b2d0079220..0e76568e2c 100644 --- a/python/lammps/mliap/loader.py +++ b/python/lammps/mliap/loader.py @@ -58,7 +58,7 @@ def activate_mliappy(lmp): try: library = lmp.lib module_names = ["mliap_model_python_couple", "mliap_unified_couple"] - api_version = library.lammps_PYTHON_API_VERSION() + api_version = library.lammps_python_api_version() for module_name in module_names: # Make Machinery diff --git a/src/library.cpp b/src/library.cpp index bba0d293f4..6b3d9f484c 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -57,6 +57,10 @@ #include "exceptions.h" #endif +#if defined(LMP_PYTHON) +#include +#endif + using namespace LAMMPS_NS; // for printing the non-null pointer argument warning only once @@ -5571,12 +5575,28 @@ int lammps_get_last_error_message(void *handle, char *buffer, int buf_size) { return 0; } -#ifdef LMP_PYTHON -#include -int lammps_PYTHON_API_VERSION(){ +/* ---------------------------------------------------------------------- */ + +/** Return API version of embedded Python interpreter + +\verbatim embed:rst +This function is used by the ML-IAP python code (mliappy) to verify +the API version of the embedded python interpreter of the PYTHON +package. It returns -1 if the PYTHON package is not enabled. + +.. versionadded:: TBD + +\endverbatim + * + * \return PYTHON_API_VERSION constant of the python interpreter or -1 */ + +int lammps_python_api_version() { +#if defined(LMP_PYTHON) return PYTHON_API_VERSION; -} +#else + return -1; #endif +} // Local Variables: // fill-column: 72 diff --git a/src/library.h b/src/library.h index 477091cd4c..bc59ada9df 100644 --- a/src/library.h +++ b/src/library.h @@ -256,9 +256,7 @@ void lammps_force_timeout(void *handle); int lammps_has_error(void *handle); int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); -#ifdef LMP_PYTHON -int lammps_PYTHON_API_VERSION(); -#endif +int lammps_python_api_version(); #ifdef __cplusplus } From c7b24cb1e3ba418f1be04374edc8e88472d0ba4c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 03:32:35 -0400 Subject: [PATCH 179/364] always accept "mliappy" and "unified" keywords, but print suitable error if not supported --- src/ML-IAP/pair_mliap.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 4134afe24e..0ed65b0b30 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -159,11 +159,13 @@ void PairMLIAP::settings(int narg, char ** arg) if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); model = new MLIAPModelNN(lmp,arg[iarg+2]); iarg += 3; -#ifdef MLIAP_PYTHON } else if (strcmp(arg[iarg+1],"mliappy") == 0) { +#ifdef MLIAP_PYTHON if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); model = new MLIAPModelPython(lmp,arg[iarg+2]); iarg += 3; +#else + error->all(FLERR,"Using pair_style mliap mliappy requires ML-IAP with python support"); #endif } else error->all(FLERR,"Illegal pair_style mliap command"); modelflag = 1; @@ -181,8 +183,8 @@ void PairMLIAP::settings(int narg, char ** arg) } else error->all(FLERR,"Illegal pair_style mliap command"); descriptorflag = 1; -#ifdef MLIAP_PYTHON } else if (strcmp(arg[iarg], "unified") == 0) { +#ifdef MLIAP_PYTHON if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); @@ -203,6 +205,8 @@ void PairMLIAP::settings(int narg, char ** arg) descriptor = build.descriptor; modelflag = 1; descriptorflag = 1; +#else + error->all(FLERR,"Using pair_style mliap unified requires ML-IAP with python support"); #endif } else error->all(FLERR,"Illegal pair_style mliap command"); From f1756eeeee370c6d7dffc9ac7194bba153a8a0e8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 03:33:19 -0400 Subject: [PATCH 180/364] update unified LJ Ar example to include creating the pickle in the input --- examples/mliap/README | 76 +++++++++++++-------------- examples/mliap/in.mliap.unified.lj.Ar | 53 +++++++++++-------- 2 files changed, 69 insertions(+), 60 deletions(-) diff --git a/examples/mliap/README b/examples/mliap/README index 20792d2c2c..d7778298d2 100644 --- a/examples/mliap/README +++ b/examples/mliap/README @@ -1,6 +1,6 @@ -This directory contains multiple examples of -machine-learning potentials defined using the -MLIAP package in LAMMPS. The input files +This directory contains multiple examples of +machine-learning potentials defined using the +ML-IAP package in LAMMPS. The input files are described below. in.mliap.snap.Ta06A @@ -21,14 +21,14 @@ Run EME-SNAP, equivalent to examples/snap/in.snap.InP.JCPA2020 in.mliap.snap.compute --------------------- -Generate the A matrix, the gradients (w.r.t. coefficients) -of total potential energy, forces, and stress tensor for +Generate the A matrix, the gradients (w.r.t. coefficients) +of total potential energy, forces, and stress tensor for linear SNAP, equivalent to in.snap.compute in.mliap.quadratic.compute -------------------------- -Generate the A matrix, the gradients (w.r.t. coefficients) -of total potential energy, forces, and stress tensor for +Generate the A matrix, the gradients (w.r.t. coefficients) +of total potential energy, forces, and stress tensor for for quadratic SNAP, equivalent to in.snap.compute.quadratic in.mliap.pytorch.Ta06A @@ -41,8 +41,8 @@ This example can be run in two different ways: 1: Running a LAMMPS executable: in.mliap.pytorch.Ta06A First run ``python convert_mliap_Ta06A.py``. It creates -a PyTorch energy model that replicates the -SNAP Ta06A potential and saves it in the file +a PyTorch energy model that replicates the +SNAP Ta06A potential and saves it in the file "Ta06A.mliap.pytorch.model.pt". You can then run the example as follows @@ -52,7 +52,7 @@ You can then run the example as follows The resultant log.lammps output should be identical to that generated by in.mliap.snap.Ta06A. -If this fails, see the instructions for building the MLIAP package +If this fails, see the instructions for building the ML-IAP package with Python support enabled. Also, confirm that the LAMMPS Python embedded Python interpreter is working by running ../examples/in.python. @@ -62,7 +62,7 @@ working by running ../examples/in.python. Before testing this, ensure that the previous method (running a LAMMPS executable) works. -You can run the example in serial: +You can run the example in serial: `python mliap_pytorch_Ta06A.py` @@ -80,25 +80,25 @@ the script will exit with an error message. in.mliap.pytorch.relu1hidden ---------------------------- This example demonstrates a simple neural network potential -using PyTorch and SNAP descriptors. +using PyTorch and SNAP descriptors. `lmp -in in.mliap.pytorch.relu1hidden -echo both` -It was trained on just the energy component (no forces) of -the data used in the original SNAP Ta06A potential for -tantalum (Thompson, Swiler, Trott, Foiles, Tucker, +It was trained on just the energy component (no forces) of +the data used in the original SNAP Ta06A potential for +tantalum (Thompson, Swiler, Trott, Foiles, Tucker, J Comp Phys, 285, 316 (2015).). Because of the very small amount -of energy training data, it uses just 1 hidden layer with -a ReLU activation function. It is not expected to be -very accurate for forces. +of energy training data, it uses just 1 hidden layer with +a ReLU activation function. It is not expected to be +very accurate for forces. -NOTE: Unlike the previous example, this example uses -a pre-built PyTorch file `Ta06A.mliap.pytorch.model.pt`. +NOTE: Unlike the previous example, this example uses +a pre-built PyTorch file `Ta06A.mliap.pytorch.model.pt`. It is read using `torch.load`, which implicitly uses the Python `pickle` module. -This is known to be insecure. It is possible to construct malicious -pickle data that will execute arbitrary code during unpickling. Never -load data that could have come from an untrusted source, or that +This is known to be insecure. It is possible to construct malicious +pickle data that will execute arbitrary code during unpickling. Never +load data that could have come from an untrusted source, or that could have been tampered with. Only load data you trust. in.mliap.nn.Ta06A @@ -112,36 +112,36 @@ Run a neural network potential for Cu, a combination of SNAP descriptors and the in.mliap.unified.lj.Ar ----------------------- This reproduces the output of examples/melt/in.melt, -but using the ``unified`` keyword and +but using the ``unified`` keyword and the Python coupling to PyTorch. This example can be run in two different ways: 1: Running a LAMMPS executable: in.mliap.unified.lj.Ar -First run ``python ./pickle_mliap_unified_lj_Ar.py``. It creates -an MLIAP unified model that replicates the ``lj/cut`` pair -style defined in examples/melt/in/melt -and saves it in the file "mliap_unified_lj_Ar.pkl". - -You can then run the example as follows +You can run the example as follows `lmp -in in.mliap.unified.lj.Ar -echo both` The resultant log.lammps output should be identical to that generated by in.melt. -If this fails, see the instructions for building the MLIAP package -with Python support enabled. Also, confirm that the -LAMMPS Python embedded Python interpreter is -working by running ../examples/in.python. +The input first runs ``python pickle_mliap_unified_lj_Ar.py`` and +thus creates an ML-IAP unified model that replicates the ``lj/cut`` +pair style defined in examples/melt/in/melt and saves it in the +file "mliap_unified_lj_Ar.pkl". + +If this fails, see the instructions for building the ML-IAP package +with Python support enabled. Also, confirm that the LAMMPS Python +embedded Python interpreter is working by running ../examples/in.python +and that the LAMMPS python module is installed and working. 2: Running a Python script: mliap_unified_lj_Ar.py Before testing this, ensure that the previous method (running a LAMMPS executable) works. -You can run the example in serial: +You can run the example in serial: `python mliap_unified_lj_Ar.py` @@ -155,17 +155,17 @@ by in.melt and in.mliap.unified.lj.Ar. in.mliap.unified.hippynn.Al --------------------------- -Demonstrate MLIAP interface to HIPNN Al potential. Requires the HIPNN code. +Demonstrate ML-IAP interface to HIPNN Al potential. Requires the HIPNN code. in.mliap.unified.hippynn.Al.ghostneigh -------------------------------------- -Demonstrate MLIAP interface to HIPNN Al potential with ghost neighbors. Requires the HIPNN code. +Demonstrate ML-IAP interface to HIPNN Al potential with ghost neighbors. Requires the HIPNN code. in.mliap.unified.hippynn.InP ---------------------------- -Demonstrate MLIAP interface to HIPNN InP potential. Requires the HIPNN code. +Demonstrate ML-IAP interface to HIPNN InP potential. Requires the HIPNN code. in.mliap.so3.Ni_Mo ------------------ diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 9ec447a812..3a9e593a7b 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -1,35 +1,44 @@ + +# create pickle of unified model + +shell rm mliap_unified_lj_Ar.pkl +shell python pickle_mliap_unified_lj_Ar.py + # 3d Lennard-Jones melt -units lj -atom_style atomic +units lj +atom_style atomic -lattice fcc 0.8442 -region box block 0 10 0 10 0 10 -create_box 1 box -create_atoms 1 box -mass 1 1.0 +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 -velocity all create 3.0 87287 loop geom +velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl -pair_coeff * * Ar +pair_style mliap unified mliap_unified_lj_Ar.pkl +pair_coeff * * Ar -neighbor 0.3 bin -neigh_modify every 20 delay 0 check no +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no -fix 1 all nve +fix 1 all nve -#dump id all atom 50 dump.melt +#dump id all atom 50 dump.melt -#dump 2 all image 25 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 1 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 1 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 #dump 4 all custom 1 forces.xyz fx fy fz -thermo 50 -run 250 +thermo 50 +run 250 + +# clean up +shell rm mliap_unified_lj_Ar.pkl From 5ddb0aeb1627ad2426103c49541858dc5970bd9f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 03:44:19 -0400 Subject: [PATCH 181/364] cosmetic changes --- doc/src/pair_mliap.rst | 33 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 480b46317a..69bde85c5b 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -66,11 +66,11 @@ basis :ref:`(Bartok) ` and :ref:`(Zagaceta) `. The available models are *linear* and *nn*. The pair_style *mliap* command must be followed by two keywords *model* -and *descriptor* in either order, or the one keyword *unified*. A single -*pair_coeff* command is also required. The first 2 arguments must be -\* \* so as to span all LAMMPS atom types. This is followed by a list -of N arguments that specify the mapping of MLIAP element names to LAMMPS -atom types, where N is the number of LAMMPS atom types. +and *descriptor* in either order, or the one keyword *unified*. A +single *pair_coeff* command is also required. The first 2 arguments +must be \* \* so as to span all LAMMPS atom types. This is followed by +a list of N arguments that specify the mapping of MLIAP element names to +LAMMPS atom types, where N is the number of LAMMPS atom types. The *model* keyword is followed by the model style. This is followed by a single argument specifying the model filename containing the @@ -118,14 +118,15 @@ The detail of *nn* module implementation can be found at :ref:`(Yanxon) Date: Sat, 24 Sep 2022 03:45:23 -0400 Subject: [PATCH 182/364] use upper case LAMMPS as the name of the package consistently --- doc/src/Install_conda.rst | 4 ++-- doc/src/Tools.rst | 2 +- doc/src/fix_nh_uef.rst | 3 ++- doc/src/fix_phonon.rst | 2 +- doc/src/pair_meam.rst | 14 +++++++------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/doc/src/Install_conda.rst b/doc/src/Install_conda.rst index efb7b6146a..34b45fcf8b 100644 --- a/doc/src/Install_conda.rst +++ b/doc/src/Install_conda.rst @@ -5,7 +5,7 @@ Binaries are available for MacOS or Linux via `Conda `_. First, one must setup the Conda package manager on your system. Follow the instructions to install `Miniconda `_, then create a conda -environment (named `my-lammps-env` or whatever you prefer) for your lammps +environment (named `my-lammps-env` or whatever you prefer) for your LAMMPS install: .. code-block:: bash @@ -13,7 +13,7 @@ install: % conda config --add channels conda-forge % conda create -n my-lammps-env -Then, you can install lammps on your system with the following command: +Then, you can install LAMMPS on your system with the following command: .. code-block:: bash diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index b57c91ffee..25b646d036 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -397,7 +397,7 @@ ipp tool ------------------ The tools/ipp directory contains a Perl script ipp which can be used -to facilitate the creation of a complicated file (say, a lammps input +to facilitate the creation of a complicated file (say, a LAMMPS input script or tools/createatoms input file) using a template file. ipp was created and is maintained by Reese Jones (Sandia), rjones at diff --git a/doc/src/fix_nh_uef.rst b/doc/src/fix_nh_uef.rst index 64d406ee64..83cf88b11f 100644 --- a/doc/src/fix_nh_uef.rst +++ b/doc/src/fix_nh_uef.rst @@ -210,7 +210,8 @@ use :doc:`change_box ` before invoking the fix. .. note:: - When resuming from restart files, you may need to use :doc:`box tilt large ` since lammps has internal criteria from lattice + When resuming from restart files, you may need to use :doc:`box tilt + large ` since LAMMPS has internal criteria from lattice reduction that are not the same as the criteria in the numerical lattice reduction algorithm. diff --git a/doc/src/fix_phonon.rst b/doc/src/fix_phonon.rst index d1b19173ce..c1885e9e9f 100644 --- a/doc/src/fix_phonon.rst +++ b/doc/src/fix_phonon.rst @@ -143,7 +143,7 @@ that the mapping info will be generated internally and a file is not needed. In this case, the dynamical matrix at only the gamma-point will/can be evaluated. Please keep in mind that fix-phonon is designed for cyrstals, it will be inefficient and even degrade the performance -of lammps in case the unit cell is too large. +of LAMMPS in case the unit cell is too large. The calculated dynamical matrix elements are written out in :doc:`energy/distance\^2/mass ` units. The coordinates for *q* diff --git a/doc/src/pair_meam.rst b/doc/src/pair_meam.rst index 987ff3a671..51175a071d 100644 --- a/doc/src/pair_meam.rst +++ b/doc/src/pair_meam.rst @@ -311,9 +311,9 @@ formulation of the partial electron density function. In recent literature, an extra term is included in the expression for the third-order density in order to make the densities orthogonal (see for example :ref:`(Wang) `, equation 3d); this term is included in the -MEAM implementation in lammps. However, in earlier published work +MEAM implementation in LAMMPS. However, in earlier published work this term was not included when deriving parameters, including most of -those provided in the ``library.meam`` file included with lammps, and to +those provided in the ``library.meam`` file included with LAMMPS, and to account for this difference the parameter *t1* must be augmented by 3/5\**t3*. If *augt1* = 1, the default, this augmentation is done automatically. When parameter values are fit using the modified @@ -321,16 +321,16 @@ density function, as in more recent literature, augt1 should be set to 0. The *mixture_ref_t* parameter is available to match results with those -of previous versions of lammps (before January 2011). Newer versions -of lammps, by default, use the single-element values of the *t* +of previous versions of LAMMPS (before January 2011). Newer versions +of LAMMPS, by default, use the single-element values of the *t* parameters to compute the background reference density. This is the -proper way to compute these parameters. Earlier versions of lammps +proper way to compute these parameters. Earlier versions of LAMMPS used an alloy mixture averaged value of *t* to compute the background reference density. Setting *mixture_ref_t* = 1 gives the old behavior. WARNING: using *mixture_ref_t* = 1 will give results that are demonstrably incorrect for second-neighbor MEAM, and non-standard for first-neighbor MEAM; this option is included only for matching with -previous versions of lammps and should be avoided if possible. +previous versions of LAMMPS and should be avoided if possible. The parameters *attrac* and *repuls*, along with the integer selection parameter *erose_form*, can be used to modify the Rose energy function @@ -361,7 +361,7 @@ recent published MEAM parameter sets, such as :ref:`(Valone) ` The default form of the *erose* expression in LAMMPS was corrected in March 2009. The current version is correct, but may show different - behavior compared with earlier versions of lammps with the attrac + behavior compared with earlier versions of LAMMPS with the attrac and/or repuls parameters are non-zero. To obtain the previous default form, use *erose_form* = 1 (this form does not seem to appear in the literature). An alternative form (see e.g. :ref:`(Lee2) `) is From 46820a90c5815c655c769c318a009a9d6950ff8b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 04:12:54 -0400 Subject: [PATCH 183/364] modernize and improve error message handling --- examples/mliap/in.mliap.unified.lj.Ar | 4 +- src/ML-IAP/pair_mliap.cpp | 54 +++++++++++---------------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index 3a9e593a7b..bd47c30cfb 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -1,7 +1,7 @@ # create pickle of unified model -shell rm mliap_unified_lj_Ar.pkl +shell rm -f mliap_unified_lj_Ar.pkl shell python pickle_mliap_unified_lj_Ar.py # 3d Lennard-Jones melt @@ -17,7 +17,7 @@ mass 1 1.0 velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 pair_coeff * * Ar neighbor 0.3 bin diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 0ed65b0b30..81908540c3 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -82,10 +82,12 @@ void PairMLIAP::compute(int eflag, int vflag) // consistency checks if (data->ndescriptors != model->ndescriptors) - error->all(FLERR, "Incompatible model and descriptor descriptor count"); + error->all(FLERR, "Inconsistent model and descriptor descriptor count: {} vs {}", + model->ndescriptors, data->ndescriptors); if (data->nelements != model->nelements) - error->all(FLERR, "Incompatible model and descriptor element count"); + error->all(FLERR, "Inconsistent model and descriptor element count: {} vs {}", + model->nelements, data->nelements); ev_init(eflag, vflag); data->generate_neighdata(list, eflag, vflag); @@ -129,8 +131,7 @@ void PairMLIAP::allocate() void PairMLIAP::settings(int narg, char ** arg) { - if (narg < 2) - error->all(FLERR,"Illegal pair_style command"); + if (narg < 2) utils::missing_cmd_args(FLERR, "pair_style mliap", error); // set flags for required keywords @@ -145,39 +146,39 @@ void PairMLIAP::settings(int narg, char ** arg) while (iarg < narg) { if (strcmp(arg[iarg],"model") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap model", error); if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); if (strcmp(arg[iarg+1],"linear") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap model linear", error); model = new MLIAPModelLinear(lmp,arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg+1],"quadratic") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap model quadratic", error); model = new MLIAPModelQuadratic(lmp,arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg+1],"nn") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap model nn", error); model = new MLIAPModelNN(lmp,arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg+1],"mliappy") == 0) { #ifdef MLIAP_PYTHON - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap mliappy", error); model = new MLIAPModelPython(lmp,arg[iarg+2]); iarg += 3; #else - error->all(FLERR,"Using pair_style mliap mliappy requires ML-IAP with python support"); + error->all(FLERR,"Using pair_style mliap model mliappy requires ML-IAP with python support"); #endif - } else error->all(FLERR,"Illegal pair_style mliap command"); + } else error->all(FLERR,"Unknown pair_style mliap model keyword: {}", arg[iarg]); modelflag = 1; } else if (strcmp(arg[iarg],"descriptor") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap descriptor", error); if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); if (strcmp(arg[iarg+1],"sna") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap descriptor sna", error); descriptor = new MLIAPDescriptorSNAP(lmp,arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg+1],"so3") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap descriptor so3", error); descriptor = new MLIAPDescriptorSO3(lmp,arg[iarg+2]); iarg += 3; @@ -185,19 +186,14 @@ void PairMLIAP::settings(int narg, char ** arg) descriptorflag = 1; } else if (strcmp(arg[iarg], "unified") == 0) { #ifdef MLIAP_PYTHON - if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definition"); - if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definition"); - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style mliap command"); + if (modelflag) error->all(FLERR,"Illegal multiple pair_style mliap model definitions"); + if (descriptorflag) error->all(FLERR,"Illegal multiple pair_style mliap descriptor definitions"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "pair_style mliap unified", error); MLIAPBuildUnified_t build = build_unified(arg[iarg+1], data, lmp); if (iarg+3 > narg) { ghostneigh = 0; } else { - if (strcmp(arg[iarg+2],"0") == 0) - ghostneigh = 0; - else if (strcmp(arg[iarg+2],"1") == 0) - ghostneigh = 1; - else - error->all(FLERR,"Illegal pair_style mliap command"); + ghostneigh = utils::logical(FLERR, arg[iarg+2], false, lmp); } iarg += 3; @@ -209,12 +205,11 @@ void PairMLIAP::settings(int narg, char ** arg) error->all(FLERR,"Using pair_style mliap unified requires ML-IAP with python support"); #endif } else - error->all(FLERR,"Illegal pair_style mliap command"); + error->all(FLERR,"Unknown pair_style mliap keyword: {}", arg[iarg]); } if (modelflag == 0 || descriptorflag == 0) - error->all(FLERR,"Illegal pair_style command"); - + error->all(FLERR,"Incomplete pair_style mliap setup: need model and descriptor, or unified"); } /* ---------------------------------------------------------------------- @@ -230,12 +225,7 @@ void PairMLIAP::coeff(int narg, char **arg) char* type2 = arg[1]; char** elemtypes = &arg[2]; - // insure I,J args are * * - - if (strcmp(type1,"*") != 0 || strcmp(type2,"*") != 0) - error->all(FLERR,"Incorrect args for pair coefficients"); - - // read args that map atom types to elements +q // read args that map atom types to elements // map[i] = which element the Ith atom type is, -1 if not mapped // map[0] is not used From a31977ca4cfcf05c5d565623bfa58a41d35c5f5a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 04:24:43 -0400 Subject: [PATCH 184/364] fix typo --- src/ML-IAP/pair_mliap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 81908540c3..af8768568e 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -225,7 +225,7 @@ void PairMLIAP::coeff(int narg, char **arg) char* type2 = arg[1]; char** elemtypes = &arg[2]; -q // read args that map atom types to elements + // read args that map atom types to elements // map[i] = which element the Ith atom type is, -1 if not mapped // map[0] is not used From e469c98e9dd68a51ab46b92e72a8e325b6b56eca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 04:39:02 -0400 Subject: [PATCH 185/364] apply clang-format --- src/ML-IAP/mliap_descriptor.h | 16 ++-- src/ML-IAP/mliap_unified.cpp | 134 ++++++++++++++++++---------------- src/ML-IAP/mliap_unified.h | 2 +- 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/src/ML-IAP/mliap_descriptor.h b/src/ML-IAP/mliap_descriptor.h index dd5e4e06a3..6db872ccaf 100644 --- a/src/ML-IAP/mliap_descriptor.h +++ b/src/ML-IAP/mliap_descriptor.h @@ -29,14 +29,14 @@ class MLIAPDescriptor : protected Pointers { virtual void init() = 0; virtual double memory_usage(); - int ndescriptors; // number of descriptors - int nelements; // # of unique elements - char **elements; // names of unique elements - double **cutsq; // nelem x nelem rcutsq values - double **cutghost; // cutoff for each ghost pair - double cutmax; // maximum cutoff needed - double *radelem; // element radii - double *wjelem; // elements weights + int ndescriptors; // number of descriptors + int nelements; // # of unique elements + char **elements; // names of unique elements + double **cutsq; // nelem x nelem rcutsq values + double **cutghost; // cutoff for each ghost pair + double cutmax; // maximum cutoff needed + double *radelem; // element radii + double *wjelem; // elements weights protected: }; diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 98befeb7c4..b64c2b0db4 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -17,12 +17,12 @@ #ifdef MLIAP_PYTHON -#include #include "mliap_unified.h" +#include #include "error.h" -#include "memory.h" #include "lmppython.h" +#include "memory.h" #include "mliap_data.h" #include "mliap_unified_couple.h" #include "pair_mliap.h" @@ -33,10 +33,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *lmp) : - MLIAPDescriptor(lmp) {} +MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *lmp) : MLIAPDescriptor(lmp) {} -MLIAPDummyDescriptor::~MLIAPDummyDescriptor() { +MLIAPDummyDescriptor::~MLIAPDummyDescriptor() +{ memory->destroy(radelem); memory->destroy(cutsq); // manually decrement borrowed reference from Python @@ -47,7 +47,8 @@ MLIAPDummyDescriptor::~MLIAPDummyDescriptor() { invoke compute_descriptors from Cython interface ---------------------------------------------------------------------- */ -void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) { +void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) +{ PyGILState_STATE gstate = PyGILState_Ensure(); compute_descriptors_python(unified_interface, data); if (PyErr_Occurred()) { @@ -63,7 +64,8 @@ void MLIAPDummyDescriptor::compute_descriptors(class MLIAPData *data) { invoke compute_forces from Cython interface ---------------------------------------------------------------------- */ -void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) { +void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) +{ PyGILState_STATE gstate = PyGILState_Ensure(); compute_forces_python(unified_interface, data); if (PyErr_Occurred()) { @@ -76,20 +78,21 @@ void MLIAPDummyDescriptor::compute_forces(class MLIAPData *data) { } // not implemented -void MLIAPDummyDescriptor::compute_force_gradients(class MLIAPData *) { +void MLIAPDummyDescriptor::compute_force_gradients(class MLIAPData *) +{ error->all(FLERR, "compute_force_gradients not implemented"); } // not implemented -void MLIAPDummyDescriptor::compute_descriptor_gradients(class MLIAPData *) { +void MLIAPDummyDescriptor::compute_descriptor_gradients(class MLIAPData *) +{ error->all(FLERR, "compute_descriptor_gradients not implemented"); } -void MLIAPDummyDescriptor::init() { +void MLIAPDummyDescriptor::init() +{ memory->create(radelem, nelements, "mliap_dummy_descriptor:radelem"); - for (int ielem = 0; ielem < nelements; ielem++) { - radelem[ielem] = 1; - } + for (int ielem = 0; ielem < nelements; ielem++) { radelem[ielem] = 1; } double cut; cutmax = 0.0; @@ -97,43 +100,45 @@ void MLIAPDummyDescriptor::init() { memory->create(cutghost, nelements, nelements, "mliap/descriptor/dummy:cutghost"); for (int ielem = 0; ielem < nelements; ielem++) { // rcutfac set from python, is global cutoff for all elements - cut = 2.0*radelem[ielem]*rcutfac; + cut = 2.0 * radelem[ielem] * rcutfac; if (cut > cutmax) cutmax = cut; - cutsq[ielem][ielem] = cut*cut; - cutghost[ielem][ielem] = cut*cut; - for (int jelem = ielem+1; jelem < nelements; jelem++) { - cut = (radelem[ielem]+radelem[jelem])*rcutfac; - cutsq[ielem][jelem] = cutsq[jelem][ielem] = cut*cut; - cutghost[ielem][jelem] = cutghost[jelem][ielem] = cut*cut; + cutsq[ielem][ielem] = cut * cut; + cutghost[ielem][ielem] = cut * cut; + for (int jelem = ielem + 1; jelem < nelements; jelem++) { + cut = (radelem[ielem] + radelem[jelem]) * rcutfac; + cutsq[ielem][jelem] = cutsq[jelem][ielem] = cut * cut; + cutghost[ielem][jelem] = cutghost[jelem][ielem] = cut * cut; } } } -void MLIAPDummyDescriptor::set_elements(char **elems, int nelems) { +void MLIAPDummyDescriptor::set_elements(char **elems, int nelems) +{ nelements = nelems; - elements = new char*[nelems]; - for (int i = 0; i < nelems; i++) { - elements[i] = utils::strdup(elems[i]); - } + elements = new char *[nelems]; + for (int i = 0; i < nelems; i++) { elements[i] = utils::strdup(elems[i]); } } /* ---------------------------------------------------------------------- */ -MLIAPDummyModel::MLIAPDummyModel(LAMMPS *lmp, char *coefffilename) : - MLIAPModel(lmp, coefffilename) { +MLIAPDummyModel::MLIAPDummyModel(LAMMPS *lmp, char *coefffilename) : MLIAPModel(lmp, coefffilename) +{ nonlinearflag = 1; } -MLIAPDummyModel::~MLIAPDummyModel() { +MLIAPDummyModel::~MLIAPDummyModel() +{ // manually decrement borrowed reference from Python Py_DECREF(unified_interface); } -int MLIAPDummyModel::get_nparams() { +int MLIAPDummyModel::get_nparams() +{ return nparams; } -int MLIAPDummyModel::get_gamma_nnz(class MLIAPData *) { +int MLIAPDummyModel::get_gamma_nnz(class MLIAPData *) +{ // TODO: get_gamma_nnz return 0; } @@ -142,7 +147,8 @@ int MLIAPDummyModel::get_gamma_nnz(class MLIAPData *) { invoke compute_gradients from Cython interface ---------------------------------------------------------------------- */ -void MLIAPDummyModel::compute_gradients(class MLIAPData *data) { +void MLIAPDummyModel::compute_gradients(class MLIAPData *data) +{ PyGILState_STATE gstate = PyGILState_Ensure(); compute_gradients_python(unified_interface, data); if (PyErr_Occurred()) { @@ -155,12 +161,14 @@ void MLIAPDummyModel::compute_gradients(class MLIAPData *data) { } // not implemented -void MLIAPDummyModel::compute_gradgrads(class MLIAPData *) { +void MLIAPDummyModel::compute_gradgrads(class MLIAPData *) +{ error->all(FLERR, "compute_gradgrads not implemented"); } // not implemented -void MLIAPDummyModel::compute_force_gradients(class MLIAPData *) { +void MLIAPDummyModel::compute_force_gradients(class MLIAPData *) +{ error->all(FLERR, "compute_force_gradients not implemented"); } @@ -168,13 +176,15 @@ void MLIAPDummyModel::compute_force_gradients(class MLIAPData *) { memory usage unclear due to Cython/Python implementation ---------------------------------------------------------------------- */ -double MLIAPDummyModel::memory_usage() { +double MLIAPDummyModel::memory_usage() +{ // TODO: implement memory usage in Cython(?) return 0; } // not implemented -void MLIAPDummyModel::read_coeffs(char *) { +void MLIAPDummyModel::read_coeffs(char *) +{ error->all(FLERR, "read_coeffs not implemented"); } @@ -183,7 +193,8 @@ void MLIAPDummyModel::read_coeffs(char *) { ---------------------------------------------------------------------- */ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *data, LAMMPS *lmp, - char *coefffilename) { + char *coefffilename) +{ lmp->python->init(); PyGILState_STATE gstate = PyGILState_Ensure(); @@ -233,41 +244,42 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat set energy for ij atom pairs ---------------------------------------------------------------------- */ -void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { - double e_total = 0; - for (int ii = 0; ii < data->nlistatoms; ii++) - data->eatoms[ii] = 0; +void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) +{ + double e_total = 0; + for (int ii = 0; ii < data->nlistatoms; ii++) data->eatoms[ii] = 0; - for (int ii = 0; ii < data->npairs; ii++) { - int i = data->pair_i[ii]; - double e = 0.5 * eij[ii]; + for (int ii = 0; ii < data->npairs; ii++) { + int i = data->pair_i[ii]; + double e = 0.5 * eij[ii]; - data->eatoms[i] += e; - e_total += e; - } - data->energy = e_total; + data->eatoms[i] += e; + e_total += e; + } + data->energy = e_total; } /* ---------------------------------------------------------------------- set forces for ij atom pairs ---------------------------------------------------------------------- */ -void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { - double **f = data->f; - for (int ii = 0; ii < data->npairs; ii++) { - int ii3 = ii * 3; - int i = data->pair_i[ii]; - int j = data->jatoms[ii]; +void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) +{ + double **f = data->f; + for (int ii = 0; ii < data->npairs; ii++) { + int ii3 = ii * 3; + int i = data->pair_i[ii]; + int j = data->jatoms[ii]; - f[i][0] += fij[ii3]; - f[i][1] += fij[ii3 + 1]; - f[i][2] += fij[ii3 + 2]; - f[j][0] -= fij[ii3]; - f[j][1] -= fij[ii3 + 1]; - f[j][2] -= fij[ii3 + 2]; + f[i][0] += fij[ii3]; + f[i][1] += fij[ii3 + 1]; + f[i][2] += fij[ii3 + 2]; + f[j][0] -= fij[ii3]; + f[j][1] -= fij[ii3 + 1]; + f[j][2] -= fij[ii3 + 2]; - if (data->vflag) data->pairmliap->v_tally(i, j, &fij[ii3], data->rij[ii]); - } + if (data->vflag) data->pairmliap->v_tally(i, j, &fij[ii3], data->rij[ii]); + } } #endif diff --git a/src/ML-IAP/mliap_unified.h b/src/ML-IAP/mliap_unified.h index dae4824d06..78987ad0d8 100644 --- a/src/ML-IAP/mliap_unified.h +++ b/src/ML-IAP/mliap_unified.h @@ -33,7 +33,7 @@ class MLIAPDummyDescriptor : public MLIAPDescriptor { virtual void init(); void set_elements(char **, int); - PyObject *unified_interface; // MLIAPUnifiedInterface + PyObject *unified_interface; // MLIAPUnifiedInterface double rcutfac; }; From a0caf34d717db27b96d727f4b8c327fcc4b25d6b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 05:00:31 -0400 Subject: [PATCH 186/364] update sjplimp's email and homepage --- doc/src/Intro_authors.rst | 4 ++-- doc/src/Intro_nonfeatures.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst index a0902ccda1..b76e2486de 100644 --- a/doc/src/Intro_authors.rst +++ b/doc/src/Intro_authors.rst @@ -4,13 +4,13 @@ Authors of LAMMPS The primary LAMMPS developers are at Sandia National Labs and Temple University: -* `Steve Plimpton `_, sjplimp at sandia.gov +* `Steve Plimpton `_, sjplimp at gmail.com * Aidan Thompson, athomps at sandia.gov * Stan Moore, stamoor at sandia.gov * Axel Kohlmeyer, akohlmey at gmail.com * Richard Berger, richard.berger at outlook.com -.. _sjp: http://www.cs.sandia.gov/~sjplimp +.. _sjp: https://sjplimp.github.io .. _lws: https://www.lammps.org Past developers include Paul Crozier and Mark Stevens, both at Sandia, diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index d9a977196f..3ff0507ee5 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -80,5 +80,5 @@ Here are suggestions on how to perform these tasks: `Pizza.py `_ which can do certain kinds of setup, analysis, plotting, and visualization (via OpenGL) for LAMMPS simulations. It thus provides some functionality for several of the - above bullets. Pizza.py is written in `Python `_ - and is available for download from `this page `_. + above bullets. Pizza.py is written in `Python `_ + and is available for download from `this page `_. From b37c1453522f0b590ca2ef8a468b76e75b0c5dba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 08:02:18 -0400 Subject: [PATCH 187/364] convert URLs to https where possible, check URLs for bit rot and update or remove --- doc/src/Bibliography.rst | 6 ++-- doc/src/Build_development.rst | 2 +- doc/src/Build_extras.rst | 6 ++-- doc/src/Build_manual.rst | 2 +- doc/src/Build_settings.rst | 29 ++++++++------- doc/src/Errors_debug.rst | 2 +- doc/src/Howto_amoeba.rst | 2 +- doc/src/Howto_bioFF.rst | 33 ++++++++--------- doc/src/Howto_github.rst | 2 +- doc/src/Howto_manifold.rst | 2 +- doc/src/Howto_spc.rst | 2 +- doc/src/Howto_tip3p.rst | 2 +- doc/src/Howto_tip4p.rst | 2 +- doc/src/Howto_viz.rst | 7 ++-- doc/src/Install_windows.rst | 2 +- doc/src/Intro_citing.rst | 2 +- doc/src/Intro_features.rst | 4 +-- doc/src/Intro_nonfeatures.rst | 2 +- doc/src/Intro_opensource.rst | 4 +-- doc/src/Packages_details.rst | 18 +++++----- doc/src/Python_examples.rst | 20 ++++------- doc/src/Python_head.rst | 10 +++--- doc/src/Run_windows.rst | 4 +-- doc/src/Speed_gpu.rst | 2 +- doc/src/Speed_intel.rst | 2 +- doc/src/Speed_omp.rst | 2 +- doc/src/Tools.rst | 10 +++--- doc/src/compute_damage_atom.rst | 15 +++++--- doc/src/compute_dilatation_atom.rst | 14 +++++--- doc/src/compute_voronoi_atom.rst | 32 ++++++++--------- doc/src/dump.rst | 2 +- doc/src/dump_h5md.rst | 6 ++-- doc/src/dump_image.rst | 4 +-- doc/src/dump_modify.rst | 2 +- doc/src/dump_molfile.rst | 2 +- doc/src/dump_netcdf.rst | 14 +++----- doc/src/dump_vtk.rst | 26 +++++++------- doc/src/fix_external.rst | 2 +- doc/src/fix_gle.rst | 2 +- doc/src/fix_imd.rst | 55 +++++++++++++---------------- doc/src/fix_ipi.rst | 2 +- doc/src/fix_nve_manifold_rattle.rst | 2 +- doc/src/fix_nvt_manifold_rattle.rst | 2 +- doc/src/fix_phonon.rst | 2 +- doc/src/fix_qmmm.rst | 2 +- doc/src/kspace_style.rst | 7 ++-- doc/src/pair_adp.rst | 2 +- doc/src/pair_charmm.rst | 2 +- doc/src/pair_eam.rst | 12 +++---- doc/src/pair_gromacs.rst | 2 +- doc/src/pair_meam.rst | 2 ++ doc/src/pair_peri.rst | 12 ++++--- doc/src/pair_quip.rst | 11 +++--- doc/src/read_dump.rst | 2 +- 54 files changed, 207 insertions(+), 212 deletions(-) diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index cc7a448bc1..27d5d3eef4 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -368,7 +368,7 @@ Bibliography Frenkel and Smit, Understanding Molecular Simulation, Academic Press, London, 2002. **(GLE4MD)** - `http://gle4md.org/ `_ + `https://gle4md.org/ `_ **(Gao)** Gao and Weber, Nuclear Instruments and Methods in Physics Research B 191 (2012) 504. @@ -461,7 +461,7 @@ Bibliography Hunt, Mol Simul, 42, 347 (2016). **(IPI)** - `http://epfl-cosmo.github.io/gle4md/index.html?page=ipi `_ + `https://ipi-code.org/ ` **(IPI-CPC)** Ceriotti, More and Manolopoulos, Comp Phys Comm, 185, 1019-1026 (2014). @@ -875,7 +875,7 @@ Bibliography G.A. Tribello, M. Bonomi, D. Branduardi, C. Camilloni and G. Bussi, Comp. Phys. Comm 185, 604 (2014) **(Paquay)** - Paquay and Kusters, Biophys. J., 110, 6, (2016). preprint available at `arXiv:1411.3019 `_. + Paquay and Kusters, Biophys. J., 110, 6, (2016). preprint available at `arXiv:1411.3019 `_. **(Park)** Park, Schulten, J. Chem. Phys. 120 (13), 5946 (2004) diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst index 66e12a0d69..1644c7ea86 100644 --- a/doc/src/Build_development.rst +++ b/doc/src/Build_development.rst @@ -140,7 +140,7 @@ of the LAMMPS project on GitHub. The unit testing facility is integrated into the CMake build process of the LAMMPS source code distribution itself. It can be enabled by setting ``-D ENABLE_TESTING=on`` during the CMake configuration step. -It requires the `YAML `_ library and development +It requires the `YAML `_ library and development headers (if those are not found locally a recent version will be downloaded and compiled along with LAMMPS and the test program) to compile and will download and compile a specific recent version of the diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 0f5f5f8064..2535b9010f 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -314,7 +314,7 @@ detailed information is available at: In addition to installing the KIM API, it is also necessary to install the library of KIM models (interatomic potentials). -See `Obtaining KIM Models `_ to +See `Obtaining KIM Models `_ to learn how to install a pre-build binary of the OpenKIM Repository of Models. See the list of all KIM models here: https://openkim.org/browse/models @@ -432,7 +432,7 @@ Enabling the extra unit tests have some requirements, ``EAM_Dynamo_MendelevAckland_2007v3_Zr__MO_004835508849_000``, ``EAM_Dynamo_ErcolessiAdams_1994_Al__MO_123629422045_005``, and ``LennardJones612_UniversalShifted__MO_959249795837_003`` KIM models. - See `Obtaining KIM Models `_ + See `Obtaining KIM Models `_ to learn how to install a pre-built binary of the OpenKIM Repository of Models or see `Installing KIM Models `_ @@ -1053,7 +1053,7 @@ VORONOI package ----------------------------- To build with this package, you must download and build the -`Voro++ library `_ or install a +`Voro++ library `_ or install a binary package provided by your operating system. .. tabs:: diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index d91ac94be5..1ef0a80549 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -176,7 +176,7 @@ math expressions transparently into embedded images. For converting the generated ePUB file to a MOBI format file (for e-book readers, like Kindle, that cannot read ePUB), you also need to have the ``ebook-convert`` tool from the "calibre" software -installed. `http://calibre-ebook.com/ `_ +installed. `https://calibre-ebook.com/ `_ Typing ``make mobi`` will first create the ePUB file and then convert it. On the Kindle readers in particular, you also have support for PDF files, so you could download and view the PDF version as an alternative. diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index 7e627a052f..2d83908bb1 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -111,26 +111,25 @@ LAMMPS can use them if they are available on your system. files in its default search path. You must specify ``FFT_LIB`` with the appropriate FFT libraries to include in the link. -The `KISS FFT library `_ is included in the LAMMPS -distribution. It is portable across all platforms. Depending on the size -of the FFTs and the number of processors used, the other libraries listed -here can be faster. +The `KISS FFT library `_ is +included in the LAMMPS distribution. It is portable across all +platforms. Depending on the size of the FFTs and the number of +processors used, the other libraries listed here can be faster. However, note that long-range Coulombics are only a portion of the -per-timestep CPU cost, FFTs are only a portion of long-range -Coulombics, and 1d FFTs are only a portion of the FFT cost (parallel -communication can be costly). A breakdown of these timings is printed -to the screen at the end of a run when using the -:doc:`kspace_style pppm ` command. The -:doc:`Screen and logfile output ` -page gives more details. A more detailed (and time consuming) -report of the FFT performance is generated with the +per-timestep CPU cost, FFTs are only a portion of long-range Coulombics, +and 1d FFTs are only a portion of the FFT cost (parallel communication +can be costly). A breakdown of these timings is printed to the screen +at the end of a run when using the :doc:`kspace_style pppm +` command. The :doc:`Screen and logfile output +` page gives more details. A more detailed (and time +consuming) report of the FFT performance is generated with the :doc:`kspace_modify fftbench yes ` command. FFTW is a fast, portable FFT library that should also work on any -platform and can be faster than the KISS FFT library. You can -download it from `www.fftw.org `_. LAMMPS requires -version 3.X; the legacy version 2.1.X is no longer supported. +platform and can be faster than the KISS FFT library. You can download +it from `www.fftw.org `_. LAMMPS requires version +3.X; the legacy version 2.1.X is no longer supported. Building FFTW for your box should be as simple as ``./configure; make; make install``. The install command typically requires root privileges diff --git a/doc/src/Errors_debug.rst b/doc/src/Errors_debug.rst index 786a21ecae..787f3f6b34 100644 --- a/doc/src/Errors_debug.rst +++ b/doc/src/Errors_debug.rst @@ -75,7 +75,7 @@ Using the GDB debugger to get a stack trace There are two options to use the GDB debugger for identifying the origin of the segmentation fault or similar crash. The GDB debugger has many more features and options, as can be seen for example its `online -documentation `_. +documentation `_. Run LAMMPS from within the debugger ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/src/Howto_amoeba.rst b/doc/src/Howto_amoeba.rst index c6df8a9b5c..6b84fc9f00 100644 --- a/doc/src/Howto_amoeba.rst +++ b/doc/src/Howto_amoeba.rst @@ -281,7 +281,7 @@ Here is more information about the extended XYZ format defined and used by Tinker, and links to programs that convert standard PDB files to the extended XYZ format: -* `http://openbabel.org/docs/current/FileFormats/Tinker_XYZ_format.html `_ +* `https://openbabel.org/docs/current/FileFormats/Tinker_XYZ_format.html `_ * `https://github.com/emleddin/pdbxyz-xyzpdb `_ * `https://github.com/TinkerTools/tinker/blob/release/source/pdbxyz.f `_ diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 172ba3da3a..8899f7520c 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -3,24 +3,20 @@ CHARMM, AMBER, COMPASS, and DREIDING force fields A force field has 2 parts: the formulas that define it and the coefficients used for a particular system. Here we only discuss -formulas implemented in LAMMPS that correspond to formulas commonly -used in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting +formulas implemented in LAMMPS that correspond to formulas commonly used +in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting coefficients is done either from special sections in an input data file via the :doc:`read_data ` command or in the input script with -commands like :doc:`pair_coeff ` or -:doc:`bond_coeff ` and so on. See the :doc:`Tools ` doc -page for additional tools that can use CHARMM, AMBER, or Materials -Studio generated files to assign force field coefficients and convert -their output into LAMMPS input. +commands like :doc:`pair_coeff ` or :doc:`bond_coeff +` and so on. See the :doc:`Tools ` doc page for +additional tools that can use CHARMM, AMBER, or Materials Studio +generated files to assign force field coefficients and convert their +output into LAMMPS input. -See :ref:`(MacKerell) ` for a description of the CHARMM force -field. See :ref:`(Cornell) ` for a description of the AMBER -force field. See :ref:`(Sun) ` for a description of the COMPASS -force field. - -.. _charmm: http://www.scripps.edu/brooks - -.. _amber: http://amber.scripps.edu +See :ref:`(MacKerell) ` for a description of the CHARMM +force field. See :ref:`(Cornell) ` for a description of +the AMBER force field. See :ref:`(Sun) ` for a description +of the COMPASS force field. The interaction styles listed below compute force field formulas that are consistent with common options in CHARMM or AMBER. See each @@ -41,9 +37,10 @@ command's documentation for the formula it computes. .. note:: - For CHARMM, newer *charmmfsw* or *charmmfsh* styles were released - in March 2017. We recommend they be used instead of the older *charmm* - styles. See discussion of the differences on the :doc:`pair charmm ` and :doc:`dihedral charmm ` doc + For CHARMM, newer *charmmfsw* or *charmmfsh* styles were released in + March 2017. We recommend they be used instead of the older *charmm* + styles. See discussion of the differences on the :doc:`pair charmm + ` and :doc:`dihedral charmm ` doc pages. COMPASS is a general force field for atomistic simulation of common diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index 315bacac69..9209477986 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -10,7 +10,7 @@ changes or additions you have made to LAMMPS into the official LAMMPS distribution. It uses the process of updating this very tutorial as an example to describe the individual steps and options. You need to be familiar with git and you may want to have a look at the `git book -`_ to familiarize yourself with some of the +`_ to familiarize yourself with some of the more advanced git features used below. As of fall 2016, submitting contributions to LAMMPS via pull requests diff --git a/doc/src/Howto_manifold.rst b/doc/src/Howto_manifold.rst index 8c2cbadc42..67c9d70ea6 100644 --- a/doc/src/Howto_manifold.rst +++ b/doc/src/Howto_manifold.rst @@ -47,4 +47,4 @@ to the relevant fixes. .. _Paquay1: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/Howto_spc.rst b/doc/src/Howto_spc.rst index d334b09b4a..520942547e 100644 --- a/doc/src/Howto_spc.rst +++ b/doc/src/Howto_spc.rst @@ -38,7 +38,7 @@ the partial charge assignments change: See the :ref:`(Berendsen) ` reference for more details on both the SPC and SPC/E models. -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_tip3p.rst b/doc/src/Howto_tip3p.rst index 7f7ddbdf2a..5571b3291a 100644 --- a/doc/src/Howto_tip3p.rst +++ b/doc/src/Howto_tip3p.rst @@ -49,7 +49,7 @@ details: | :math:`\theta` of HOH angle = 104.52\ :math:`^{\circ}` | -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst index 9856b8fbe7..4e0a63adc6 100644 --- a/doc/src/Howto_tip4p.rst +++ b/doc/src/Howto_tip4p.rst @@ -97,7 +97,7 @@ This leads to slightly larger cost for the long-range calculation, so you can test the trade-off for your model. The OM distance and the LJ and Coulombic cutoffs are set in the :doc:`pair_style lj/cut/tip4p/long ` command. -Wikipedia also has a nice article on `water models `_. +Wikipedia also has a nice article on `water models `_. ---------- diff --git a/doc/src/Howto_viz.rst b/doc/src/Howto_viz.rst index 7c74aab8bf..28ecbfb838 100644 --- a/doc/src/Howto_viz.rst +++ b/doc/src/Howto_viz.rst @@ -17,9 +17,10 @@ formats. See the :doc:`Tools ` page for details. A Python-based toolkit distributed by our group can read native LAMMPS dump files, including custom dump files with additional columns of -user-specified atom information, and convert them to various formats -or pipe them into visualization software directly. See the `Pizza.py WWW site `_ for details. Specifically, Pizza.py can convert -LAMMPS dump files into PDB, XYZ, `EnSight `_, and VTK formats. +user-specified atom information, and convert them to various formats or +pipe them into visualization software directly. See the `Pizza.py WWW +site `_ for details. Specifically, Pizza.py can convert LAMMPS +dump files into PDB, XYZ, `EnSight `_, and VTK formats. Pizza.py can pipe LAMMPS dump files directly into the Raster3d and RasMol visualization programs. Pizza.py has tools that do interactive 3d OpenGL visualization and one that creates SVG images of dump file diff --git a/doc/src/Install_windows.rst b/doc/src/Install_windows.rst index 108c03c249..fc167d7e68 100644 --- a/doc/src/Install_windows.rst +++ b/doc/src/Install_windows.rst @@ -6,7 +6,7 @@ Windows system can be downloaded from this site: .. parsed-literal:: - `http://packages.lammps.org/windows.html `_ + `https://packages.lammps.org/windows.html `_ Note that each installer package has a date in its name, which corresponds to the LAMMPS version of the same date. Installers for diff --git a/doc/src/Intro_citing.rst b/doc/src/Intro_citing.rst index aaf62028ae..56955cae3a 100644 --- a/doc/src/Intro_citing.rst +++ b/doc/src/Intro_citing.rst @@ -27,7 +27,7 @@ namely https://www.lammps.org. The original publication describing the parallel algorithms used in the initial versions of LAMMPS is: - `S. Plimpton, Fast Parallel Algorithms for Short-Range Molecular Dynamics, J Comp Phys, 117, 1-19 (1995). `_ + `S. Plimpton, Fast Parallel Algorithms for Short-Range Molecular Dynamics, J Comp Phys, 117, 1-19 (1995). `_ DOI for the LAMMPS source code diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst index 2b0409b007..9344710a16 100644 --- a/doc/src/Intro_features.rst +++ b/doc/src/Intro_features.rst @@ -95,7 +95,7 @@ commands) * metal-organic framework potentials (QuickFF, MO-FF) * implicit solvent potentials: hydrodynamic lubrication, Debye * force-field compatibility with common CHARMM, AMBER, DREIDING, OPLS, GROMACS, COMPASS options -* access to the `OpenKIM Repository `_ of potentials via :doc:`kim command ` +* access to the `OpenKIM Repository `_ of potentials via the :doc:`kim command ` * hybrid potentials: multiple pair, bond, angle, dihedral, improper potentials can be used in one simulation * overlaid potentials: superposition of multiple pair potentials (including many-body) with optional scale factor @@ -205,7 +205,7 @@ Pre- and post-processing .. _pizza: https://lammps.github.io/pizza -.. _python: http://www.python.org +.. _python: https://www.python.org .. _special: diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index 3ff0507ee5..b1d68c8594 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -33,7 +33,7 @@ Here are suggestions on how to perform these tasks: linear bead-spring polymer chains. The moltemplate program is a true molecular builder that will generate complex molecular models. See the :doc:`Tools ` page for details on tools packaged with - LAMMPS. The `Pre/post processing page `_ of the LAMMPS website + LAMMPS. The `Pre/post processing page `_ of the LAMMPS website describes a variety of third party tools for this task. Furthermore, some LAMMPS internal commands allow to reconstruct, or selectively add topology information, as well as provide the option to insert molecule diff --git a/doc/src/Intro_opensource.rst b/doc/src/Intro_opensource.rst index a1baaf5185..fba0a78189 100644 --- a/doc/src/Intro_opensource.rst +++ b/doc/src/Intro_opensource.rst @@ -23,9 +23,9 @@ applies to LAMMPS is in the LICENSE file included in the LAMMPS distribution. .. _lgpl: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html -.. _gnuorg: http://www.gnu.org +.. _gnuorg: https://www.gnu.org -.. _opensource: http://www.opensource.org +.. _opensource: https://www.opensource.org Here is a more specific summary of what the GPL means for LAMMPS users: diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index f89ab00039..dea49034a3 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -1071,7 +1071,7 @@ H5MD is a format for molecular simulations, built on top of HDF5. This package implements a :doc:`dump h5md ` command to output LAMMPS snapshots in this format. -.. _HDF5: http://www.hdfgroup.org/HDF5 +.. _HDF5: https://www.hdfgroup.org/solutions/hdf5 To use this package you must have the HDF5 library available on your system. @@ -1954,7 +1954,7 @@ support for new file formats can be added to LAMMPS (or VMD or other programs that use them) without having to re-compile the application itself. More information about the VMD molfile plugins can be found at -`http://www.ks.uiuc.edu/Research/vmd/plugins/molfile `_. +`https://www.ks.uiuc.edu/Research/vmd/plugins/molfile `_. **Author:** Axel Kohlmeyer (Temple U). @@ -2045,7 +2045,7 @@ NETCDF package Dump styles for writing NetCDF formatted dump files. NetCDF is a portable, binary, self-describing file format developed on top of HDF5. The file contents follow the AMBER NetCDF trajectory conventions -(http://ambermd.org/netcdf/nctraj.xhtml), but include extensions. +(https://ambermd.org/netcdf/nctraj.xhtml), but include extensions. To use this package you must have the NetCDF library available on your system. @@ -2056,7 +2056,7 @@ tools: * `Ovito `_ (Ovito supports the AMBER convention and the extensions mentioned above) * `VMD `_ -.. _ovito: http://www.ovito.org +.. _ovito: https://www.ovito.org .. _vmd-home: https://www.ks.uiuc.edu/Research/vmd/ @@ -2417,7 +2417,7 @@ A :doc:`fix qmmm ` command which allows LAMMPS to be used as the MM code in a QM/MM simulation. This is currently only available in combination with the `Quantum ESPRESSO `_ package. -.. _espresso: http://www.quantum-espresso.org +.. _espresso: https://www.quantum-espresso.org To use this package you must have Quantum ESPRESSO (QE) available on your system and include its coupling library in the compilation and @@ -2829,7 +2829,7 @@ collection of atoms by wrapping the `Voro++ library `_. This can be used to calculate the local volume or each atoms or its near neighbors. -.. _voro-home: http://math.lbl.gov/voro++ +.. _voro-home: https://math.lbl.gov/voro++ To use this package you must have the Voro++ library available on your system. @@ -2863,9 +2863,9 @@ A :doc:`dump vtk ` command which outputs snapshot info in the `VTK format `_, enabling visualization by `Paraview `_ or other visualization packages. -.. _vtk: http://www.vtk.org +.. _vtk: https://www.vtk.org -.. _paraview: http://www.paraview.org +.. _paraview: https://www.paraview.org To use this package you must have VTK library available on your system. @@ -2902,7 +2902,7 @@ which discuss the `QuickFF `_ methodology. .. _vanduyfhuys2015: https://doi.org/10.1002/jcc.23877 .. _vanduyfhuys2018: https://doi.org/10.1002/jcc.25173 -.. _quickff: http://molmod.github.io/QuickFF +.. _quickff: https://molmod.github.io/QuickFF .. _yaff: https://github.com/molmod/yaff **Author:** Steven Vandenbrande. diff --git a/doc/src/Python_examples.rst b/doc/src/Python_examples.rst index fe5fe812c5..f795827230 100644 --- a/doc/src/Python_examples.rst +++ b/doc/src/Python_examples.rst @@ -43,26 +43,18 @@ Note that for AtomEye, you need version 3, and there is a line in the scripts that specifies the path and name of the executable. See the AtomEye web pages for more details: -* `http://li.mit.edu/Archive/Graphics/A/ `_ -* `http://li.mit.edu/Archive/Graphics/A3/A3.html `_ +* `http://li.mit.edu/Archive/Graphics/A/ `_ +* `http://li.mit.edu/Archive/Graphics/A3/A3.html `_ -.. _atomeye: http://li.mit.edu/Archive/Graphics/A/ - -.. _atomeye3: http://li.mit.edu/Archive/Graphics/A3/A3.html - -The latter link is to AtomEye 3 which has the scripting -capability needed by these Python scripts. +The latter link is to AtomEye 3 which has the scripting capability +needed by these Python scripts. Note that for PyMol, you need to have built and installed the open-source version of PyMol in your Python, so that you can import it from a Python script. See the PyMol web pages for more details: - * `https://www.pymol.org `_ - * `https://github.com/schrodinger/pymol-open-source `_ - -.. _pymolhome: https://www.pymol.org - -.. _pymolopen: https://github.com/schrodinger/pymol-open-source + * `https://www.pymol.org `_ + * `https://github.com/schrodinger/pymol-open-source `_ The latter link is to the open-source version. diff --git a/doc/src/Python_head.rst b/doc/src/Python_head.rst index 3e84ed4506..3aab3a0d4b 100644 --- a/doc/src/Python_head.rst +++ b/doc/src/Python_head.rst @@ -18,17 +18,17 @@ together. Python_error Python_trouble -If you are not familiar with `Python `_, it is a +If you are not familiar with `Python `_, it is a powerful scripting and programming language which can do almost everything that compiled languages like C, C++, or Fortran can do in fewer lines of code. It also comes with a large collection of add-on modules for many purposes (either bundled or easily installed from Python code repositories). The major drawback is slower execution speed of the script code compared to compiled programming languages. But when -the script code is interfaced to optimized compiled code, performance can -be on par with a standalone executable, for as long as the scripting is -restricted to high-level operations. Thus Python is also convenient to -use as a "glue" language to "drive" a program through its library +the script code is interfaced to optimized compiled code, performance +can be on par with a standalone executable, for as long as the scripting +is restricted to high-level operations. Thus Python is also convenient +to use as a "glue" language to "drive" a program through its library interface, or to hook multiple pieces of software together, such as a simulation code and a visualization tool, or to run a coupled multi-scale or multi-physics model. diff --git a/doc/src/Run_windows.rst b/doc/src/Run_windows.rst index f29155a839..d36864b454 100644 --- a/doc/src/Run_windows.rst +++ b/doc/src/Run_windows.rst @@ -25,8 +25,8 @@ in parallel, follow these steps. Download and install a compatible MPI library binary package: -* for 32-bit Windows: `mpich2-1.4.1p1-win-ia32.msi `_ -* for 64-bit Windows: `mpich2-1.4.1p1-win-x86-64.msi `_ +* for 32-bit Windows: `mpich2-1.4.1p1-win-ia32.msi `_ +* for 64-bit Windows: `mpich2-1.4.1p1-win-x86-64.msi `_ The LAMMPS Windows installer packages will automatically adjust your path for the default location of this MPI package. After the diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index 9015bff9ef..883bc9c7e3 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -39,7 +39,7 @@ toolkit software on your system (this is only tested on Linux and unsupported on Windows): * Check if you have an NVIDIA GPU: cat /proc/driver/nvidia/gpus/\*/information -* Go to http://www.nvidia.com/object/cuda_get.html +* Go to https://developer.nvidia.com/cuda-downloads * Install a driver and toolkit appropriate for your system (SDK is not necessary) * Run lammps/lib/gpu/nvc_get_devices (after building the GPU library, see below) to list supported devices and properties diff --git a/doc/src/Speed_intel.rst b/doc/src/Speed_intel.rst index 2b53af8698..e3c3fc01f7 100644 --- a/doc/src/Speed_intel.rst +++ b/doc/src/Speed_intel.rst @@ -537,5 +537,5 @@ References """""""""" * Brown, W.M., Carrillo, J.-M.Y., Mishra, B., Gavhane, N., Thakkar, F.M., De Kraker, A.R., Yamada, M., Ang, J.A., Plimpton, S.J., "Optimizing Classical Molecular Dynamics in LAMMPS", in Intel Xeon Phi Processor High Performance Programming: Knights Landing Edition, J. Jeffers, J. Reinders, A. Sodani, Eds. Morgan Kaufmann. -* Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. `Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. `_ 2016 High Performance Computing, Networking, Storage and Analysis, SC16: International Conference (pp. 82-95). +* Brown, W. M., Semin, A., Hebenstreit, M., Khvostov, S., Raman, K., Plimpton, S.J. `Increasing Molecular Dynamics Simulation Rates with an 8-Fold Increase in Electrical Power Efficiency. `_ 2016 High Performance Computing, Networking, Storage and Analysis, SC16: International Conference (pp. 82-95). * Brown, W.M., Carrillo, J.-M.Y., Gavhane, N., Thakkar, F.M., Plimpton, S.J. Optimizing Legacy Molecular Dynamics Software with Directive-Based Offload. Computer Physics Communications. 2015. 195: p. 95-101. diff --git a/doc/src/Speed_omp.rst b/doc/src/Speed_omp.rst index 3d9cbe19e0..29c55df62f 100644 --- a/doc/src/Speed_omp.rst +++ b/doc/src/Speed_omp.rst @@ -97,7 +97,7 @@ sub-section. A description of the multi-threading strategy used in the OPENMP package and some performance examples are -`presented here `_. +`presented here `_. Guidelines for best performance """"""""""""""""""""""""""""""" diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 25b646d036..f8c8bd7240 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -512,8 +512,8 @@ with an ``.inputrc`` file in the home directory. For application specific customization, the LAMMPS shell uses the name "lammps-shell". For more information about using and customizing an application using readline, please see the available documentation at: -`http://www.gnu.org/s/readline/#Documentation -`_ +https://www.gnu.org/software/readline/ + Additional commands ^^^^^^^^^^^^^^^^^^^ @@ -715,7 +715,7 @@ See the README.pdf file for more information. These scripts were written by Arun Subramaniyan at Purdue Univ (asubrama at purdue.edu). -.. _matlabhome: http://www.mathworks.com +.. _matlabhome: https://www.mathworks.com ---------- @@ -1046,7 +1046,7 @@ the binary file. This usually is a so-called little endian hardware SWIG interface -------------- -The `SWIG tool `_ offers a mostly automated way to +The `SWIG tool `_ offers a mostly automated way to incorporate compiled code modules into scripting languages. It processes the function prototypes in C and generates wrappers for a wide variety of scripting languages from it. Thus it can also be applied to @@ -1126,7 +1126,7 @@ data passed or returned as pointers are included in the ``lammps.i`` file. So most of the functionality of the library interface should be accessible. What works and what does not depends a bit on the individual language for which the wrappers are built and how well SWIG -supports those. The `SWIG documentation `_ +supports those. The `SWIG documentation `_ has very detailed instructions and recommendations. Usage examples diff --git a/doc/src/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst index b75a3ebc57..cecce56255 100644 --- a/doc/src/compute_damage_atom.rst +++ b/doc/src/compute_damage_atom.rst @@ -24,14 +24,18 @@ Description """"""""""" Define a computation that calculates the per-atom damage for each atom -in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ -for an overview of LAMMPS commands for Peridynamics modeling. +in a group. This is a quantity relevant for :doc:`Peridynamics models +`. See `this document `_ for an +overview of LAMMPS commands for Peridynamics modeling. The "damage" of a Peridynamics particles is based on the bond breakage between the particle and its neighbors. If all the bonds are broken the particle is considered to be fully damaged. -See the `PDLAMMPS user guide `_ for a formal +.. TODO the link below is broken + +See the `PDLAMMPS user guide +`_ for a formal definition of "damage" and more details about Peridynamics as it is implemented in LAMMPS. @@ -53,8 +57,9 @@ The per-atom vector values are unitless numbers (damage) :math:`\ge 0.0`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst index 8e3c86a4af..a1037c6358 100644 --- a/doc/src/compute_dilatation_atom.rst +++ b/doc/src/compute_dilatation_atom.rst @@ -24,12 +24,15 @@ Description """"""""""" Define a computation that calculates the per-atom dilatation for each -atom in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ +atom in a group. This is a quantity relevant for :doc:`Peridynamics +models `. See `this document `_ for an overview of LAMMPS commands for Peridynamics modeling. For small deformation, dilatation of is the measure of the volumetric strain. +.. TODO the link below is broken + The dilatation :math:`\theta` for each peridynamic particle :math:`i` is calculated as a sum over its neighbors with unbroken bonds, where the contribution of the :math:`ij` pair is a function of the change in bond length @@ -38,7 +41,8 @@ fraction of the particles and an influence function. See the `PDLAMMPS user guide `_ for a formal definition of dilatation. -This command can only be used with a subset of the Peridynamic :doc:`pair styles `: peri/lps, peri/ves and peri/eps. +This command can only be used with a subset of the Peridynamic +:doc:`pair styles `: peri/lps, peri/ves and peri/eps. The dilatation value will be 0.0 for atoms not in the specified compute group. @@ -56,9 +60,9 @@ The per-atom vector values are unitless numbers :math:`(\theta \ge 0.0)`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the -:doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 699d3f2aaa..19914997a3 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -154,25 +154,25 @@ which must be installed on your system when building LAMMPS for use with this compute. See instructions on obtaining and installing the Voro++ software in the src/VORONOI/README file. -.. _voronoi: http://math.lbl.gov/voro++/ +.. _voronoi: https://math.lbl.gov/voro++/ .. note:: - The calculation of Voronoi volumes is performed by each - processor for the atoms it owns, and includes the effect of ghost - atoms stored by the processor. This assumes that the Voronoi cells of - owned atoms are not affected by atoms beyond the ghost atom cut-off - distance. This is usually a good assumption for liquid and solid - systems, but may lead to underestimation of Voronoi volumes in low - density systems. By default, the set of ghost atoms stored by each - processor is determined by the cutoff used for - :doc:`pair_style ` interactions. The cutoff can be set - explicitly via the :doc:`comm_modify cutoff ` command. The - Voronoi cells for atoms adjacent to empty regions will extend into - those regions up to the communication cutoff in :math:`x`, :math:`y`, or - :math:`z`. In that situation, an exterior face is created at the cutoff - distance normal to the :math:`x`, :math:`y`, or :math:`z` direction. - For triclinic systems, the exterior face is parallel to the corresponding + The calculation of Voronoi volumes is performed by each processor for + the atoms it owns, and includes the effect of ghost atoms stored by + the processor. This assumes that the Voronoi cells of owned atoms + are not affected by atoms beyond the ghost atom cut-off distance. + This is usually a good assumption for liquid and solid systems, but + may lead to underestimation of Voronoi volumes in low density + systems. By default, the set of ghost atoms stored by each processor + is determined by the cutoff used for :doc:`pair_style ` + interactions. The cutoff can be set explicitly via the + :doc:`comm_modify cutoff ` command. The Voronoi cells + for atoms adjacent to empty regions will extend into those regions up + to the communication cutoff in :math:`x`, :math:`y`, or :math:`z`. + In that situation, an exterior face is created at the cutoff distance + normal to the :math:`x`, :math:`y`, or :math:`z` direction. For + triclinic systems, the exterior face is parallel to the corresponding reciprocal lattice vector. .. note:: diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 21b82de4f0..f069911096 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -480,7 +480,7 @@ style. ---------- Note that *atom*, *custom*, *dcd*, *xtc*, and *xyz* style dump files -can be read directly by `VMD `_, a +can be read directly by `VMD `_, a popular molecular viewing program. ---------- diff --git a/doc/src/dump_h5md.rst b/doc/src/dump_h5md.rst index 37fc7ad600..41d6dc7594 100644 --- a/doc/src/dump_h5md.rst +++ b/doc/src/dump_h5md.rst @@ -64,7 +64,7 @@ stored within the same file by defining several dumps. A dump that refers (via *file_from*) to an already open dump ID and that concerns another particle group must specify *create_group yes*. -.. _h5md: http://nongnu.org/h5md/ +.. _h5md: https://nongnu.org/h5md/ Each data element is written every N\*N_element steps. For *image*, no sub-interval is needed as it must be present at the same interval as @@ -113,7 +113,7 @@ the `HDF5 `_ library installed (C bindings are sufficient) on your system. The library ch5md is compiled with the h5cc wrapper provided by the HDF5 library. -.. _HDF5-ws: http://www.hdfgroup.org/HDF5/ +.. _HDF5-ws: https://www.hdfgroup.org/solutions/hdf5/ ---------- @@ -129,4 +129,4 @@ Related commands **(de Buyl)** de Buyl, Colberg and Hofling, H5MD: A structured, efficient, and portable file format for molecular data, Comp. Phys. Comm. 185(6), 1546-1553 (2014) - -`[arXiv:1308.6382] `_. +`[arXiv:1308.6382] `_. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index c395f6ef06..bc2373afac 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -212,7 +212,7 @@ is used. Similarly, the format of the resulting movie is chosen with the *movie* dump style. This is handled by the underlying FFmpeg converter and thus details have to be looked up in the `FFmpeg documentation -`_. Typical examples are: .avi, .mpg, +`_. Typical examples are: .avi, .mpg, .m4v, .mp4, .mkv, .flv, .mov, .gif Additional settings of the movie compression like bitrate and framerate can be set using the dump_modify command as described below. @@ -642,7 +642,7 @@ MPEG or other movie file you can use: cat snap.*.ppm | ffmpeg -y -f image2pipe -c:v ppm -i - -b:v 2400k movie.avi Front ends for FFmpeg exist for multiple platforms. For more - information see the `FFmpeg homepage `_ + information see the `FFmpeg homepage `_ ---------- diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 29f59ffaef..0d059581eb 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -881,7 +881,7 @@ levels that sacrifice compression for performance. 0 is the default, positive levels are 1 to 22, with 22 being the most expensive compression. Zstd promises higher compression/decompression speeds for similar compression ratios. For more details see -`http://facebook.github.io/zstd/`. +`https://facebook.github.io/zstd/`. In addition, Zstd compressed files can include a checksum of the entire contents. The Zstd enabled dump styles enable this feature by diff --git a/doc/src/dump_molfile.rst b/doc/src/dump_molfile.rst index c1f0b48fe6..f8cc06d039 100644 --- a/doc/src/dump_molfile.rst +++ b/doc/src/dump_molfile.rst @@ -34,7 +34,7 @@ Dump a snapshot of atom coordinates and selected additional quantities to one or more files every N timesteps in one of several formats. Only information for atoms in the specified group is dumped. This specific dump style uses molfile plugins that are bundled with the -`VMD `_ molecular visualization and +`VMD `_ molecular visualization and analysis program. Unless the filename contains a \* character, the output will be written diff --git a/doc/src/dump_netcdf.rst b/doc/src/dump_netcdf.rst index 04790f4986..296b725e20 100644 --- a/doc/src/dump_netcdf.rst +++ b/doc/src/dump_netcdf.rst @@ -48,21 +48,17 @@ rank. NetCDF files can be directly visualized via the following tools: -Ovito (http://www.ovito.org/). Ovito supports the AMBER convention and -all extensions of this dump style. - -* VMD (http://www.ks.uiuc.edu/Research/vmd/). -* AtomEye (http://www.libatoms.org/). The libAtoms version of AtomEye - contains a NetCDF reader that is not present in the standard - distribution of AtomEye. +* Ovito (https://www.ovito.org/). Ovito supports the AMBER convention and + all extensions of this dump style. +* VMD (https://www.ks.uiuc.edu/Research/vmd/). In addition to per-atom data, :doc:`thermo ` data can be included in the dump file. The data included in the dump file is identical to the data specified by :doc:`thermo_style `. -.. _netcdf-home: http://www.unidata.ucar.edu/software/netcdf/ +.. _netcdf-home: https://www.unidata.ucar.edu/software/netcdf/ -.. _pnetcdf-home: http://trac.mcs.anl.gov/projects/parallel-netcdf/ +.. _pnetcdf-home: https://trac.mcs.anl.gov/projects/parallel-netcdf/ ---------- diff --git a/doc/src/dump_vtk.rst b/doc/src/dump_vtk.rst index 89437bab76..4ec872cb89 100644 --- a/doc/src/dump_vtk.rst +++ b/doc/src/dump_vtk.rst @@ -29,8 +29,9 @@ Description """"""""""" Dump a snapshot of atom quantities to one or more files every :math:`N` -timesteps in a format readable by the `VTK visualization toolkit `_ or other visualization tools that use it, -such as `ParaView `_. The time steps on which dump +timesteps in a format readable by the `VTK visualization toolkit +`_ or other visualization tools that use it, such +as `ParaView `_. The time steps on which dump output is written can also be controlled by a variable; see the :doc:`dump_modify every ` command for details. @@ -38,8 +39,8 @@ This dump style is similar to :doc:`dump_style custom ` but uses the VTK library to write data to VTK simple legacy or XML format, depending on the filename extension specified for the dump file. This can be either *\*.vtk* for the legacy format or *\*.vtp* and *\*.vtu*, -respectively, for XML format; see the -`VTK homepage `_ for a detailed +respectively, for XML format; see the `VTK homepage +`_ for a detailed description of these formats. Since this naming convention conflicts with the way binary output is usually specified (see below), the :doc:`dump_modify binary ` command allows setting of a @@ -61,14 +62,15 @@ determine the kind of output. .. warning:: - Unless the :doc:`dump_modify sort ` option - is invoked, the lines of atom information written to dump files will - be in an indeterminate order for each snapshot. This is even true - when running on a single processor, if the :doc:`atom_modify sort ` option is on, which it is by default. In this - case atoms are re-ordered periodically during a simulation, due to - spatial sorting. It is also true when running in parallel, because - data for a single snapshot is collected from multiple processors, each - of which owns a subset of the atoms. + Unless the :doc:`dump_modify sort ` option is invoked, + the lines of atom information written to dump files will be in an + indeterminate order for each snapshot. This is even true when + running on a single processor, if the :doc:`atom_modify sort + ` option is on, which it is by default. In this case + atoms are re-ordered periodically during a simulation, due to spatial + sorting. It is also true when running in parallel, because data for + a single snapshot is collected from multiple processors, each of + which owns a subset of the atoms. For the *vtk* style, sorting is off by default. See the :doc:`dump_modify ` page for details. diff --git a/doc/src/fix_external.rst b/doc/src/fix_external.rst index d251eb65e9..3b46e81c2c 100644 --- a/doc/src/fix_external.rst +++ b/doc/src/fix_external.rst @@ -78,7 +78,7 @@ example of how this is done. This sample application performs classical MD using quantum forces computed by a density functional code `Quest `_. -.. _quest: http://dft.sandia.gov/Quest +.. _quest: https://dft.sandia.gov/Quest ---------- diff --git a/doc/src/fix_gle.rst b/doc/src/fix_gle.rst index a42fddf7f5..03add9d354 100644 --- a/doc/src/fix_gle.rst +++ b/doc/src/fix_gle.rst @@ -159,7 +159,7 @@ Related commands .. _GLE4MD: -**(GLE4MD)** `http://gle4md.org/ `_ +**(GLE4MD)** `https://gle4md.org/ `_ .. _Ceriotti2: diff --git a/doc/src/fix_imd.rst b/doc/src/fix_imd.rst index 004bc0b614..06d8787b1b 100644 --- a/doc/src/fix_imd.rst +++ b/doc/src/fix_imd.rst @@ -51,16 +51,11 @@ from the main execution thread and potentially lower the inferred latencies for slow communication links. This feature has only been tested under linux. -There are example scripts for using this package with LAMMPS in -examples/PACKAGES/imd. Additional examples and a driver for use with the -Novint Falcon game controller as haptic device can be found at: -http://sites.google.com/site/akohlmey/software/vrpn-icms. - -The source code for this fix includes code developed by the -Theoretical and Computational Biophysics Group in the Beckman -Institute for Advanced Science and Technology at the University of -Illinois at Urbana-Champaign. We thank them for providing a software -interface that allows codes like LAMMPS to hook to `VMD `_. +The source code for this fix includes code developed by the Theoretical +and Computational Biophysics Group in the Beckman Institute for Advanced +Science and Technology at the University of Illinois at +Urbana-Champaign. We thank them for providing a software interface that +allows codes like LAMMPS to hook to `VMD `_. Upon initialization of the fix, it will open a communication port on the node with MPI task 0 and wait for an incoming connection. As soon @@ -117,40 +112,40 @@ VMD are the following: In the Mouse menu of the VMD Main window, select "Mouse -> Force -> Atom". You may alternately select "Residue", or "Fragment" to apply forces to whole residues or fragments. Your mouse can now be used to -apply forces to your simulation. Click on an atom, residue, or -fragment and drag to apply a force. Click quickly without moving the -mouse to turn the force off. You can also use a variety of 3D position -trackers to apply forces to your simulation. Game controllers or haptic -devices with force-feedback such as the Novint Falcon or Sensable -PHANTOM allow you to feel the resistance due to inertia or interactions -with neighbors that the atoms experience you are trying to move, as if -they were real objects. See the `VMD IMD Homepage `_ and the -`VRPN-ICMS Homepage `_ for more details. +apply forces to your simulation. Click on an atom, residue, or fragment +and drag to apply a force. Click quickly without moving the mouse to +turn the force off. You can also use a variety of 3D position trackers +to apply forces to your simulation. Game controllers or haptic devices +with force-feedback such as the Novint Falcon or Sensable PHANTOM allow +you to feel the resistance due to inertia or interactions with neighbors +that the atoms experience you are trying to move, as if they were real +objects. See the `VMD IMD Homepage `_ for more details. If IMD control messages are received, a line of text describing the message and its effect will be printed to the LAMMPS output screen, if screen output is active. -.. _VMD: http://www.ks.uiuc.edu/Research/vmd +.. _VMD: https://www.ks.uiuc.edu/Research/vmd -.. _imdvmd: http://www.ks.uiuc.edu/Research/vmd/imd/ - -.. _vrpnicms: http://sites.google.com/site/akohlmey/software/vrpn-icms +.. _imdvmd: https://www.ks.uiuc.edu/Research/vmd/imd/ Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -No information about this fix is written to :doc:`binary restart files `. None of the :doc:`fix_modify ` options -are relevant to this fix. No global scalar or vector or per-atom -quantities are stored by this fix for access by various :doc:`output commands `. No parameter of this fix can be used -with the *start/stop* keywords of the :doc:`run ` command. This -fix is not invoked during :doc:`energy minimization `. +No information about this fix is written to :doc:`binary restart files +`. None of the :doc:`fix_modify ` options are +relevant to this fix. No global scalar or vector or per-atom quantities +are stored by this fix for access by various :doc:`output commands +`. No parameter of this fix can be used with the +*start/stop* keywords of the :doc:`run ` command. This fix is not +invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This fix is part of the MISC package. It is only enabled if LAMMPS was +built with that package. See the :doc:`Build package ` +page for more info. When used in combination with VMD, a topology or coordinate file has to be loaded, which matches (in number and ordering of atoms) the diff --git a/doc/src/fix_ipi.rst b/doc/src/fix_ipi.rst index 6ddd6976a2..6a6ff9aa87 100644 --- a/doc/src/fix_ipi.rst +++ b/doc/src/fix_ipi.rst @@ -111,4 +111,4 @@ Related commands .. _ipihome: **(IPI)** -`http://epfl-cosmo.github.io/gle4md/index.html?page=ipi `_ +`https://ipi-code.org `_ diff --git a/doc/src/fix_nve_manifold_rattle.rst b/doc/src/fix_nve_manifold_rattle.rst index a9bf07de60..63632ebac0 100644 --- a/doc/src/fix_nve_manifold_rattle.rst +++ b/doc/src/fix_nve_manifold_rattle.rst @@ -108,4 +108,4 @@ every = 0, tchain = 3 .. _Paquay2: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/fix_nvt_manifold_rattle.rst b/doc/src/fix_nvt_manifold_rattle.rst index fe889bda79..91a5f28649 100644 --- a/doc/src/fix_nvt_manifold_rattle.rst +++ b/doc/src/fix_nvt_manifold_rattle.rst @@ -82,4 +82,4 @@ Related commands .. _Paquay3: **(Paquay)** Paquay and Kusters, Biophys. J., 110, 6, (2016). -preprint available at `arXiv:1411.3019 `_. +preprint available at `arXiv:1411.3019 `_. diff --git a/doc/src/fix_phonon.rst b/doc/src/fix_phonon.rst index c1885e9e9f..527498bb21 100644 --- a/doc/src/fix_phonon.rst +++ b/doc/src/fix_phonon.rst @@ -134,7 +134,7 @@ for other systems, *nasr* = 10 is typically sufficient. The *map_file* contains the mapping information between the lattice indices and the atom IDs, which tells the code which atom sits at which lattice point; the lattice indices start from 0. An auxiliary -code, `latgen `_, can be employed to +code, `latgen `_, can be employed to generate the compatible map file for various crystals. In case one simulates a non-periodic system, where the whole simulation diff --git a/doc/src/fix_qmmm.rst b/doc/src/fix_qmmm.rst index a62bd5ab1e..546635520c 100644 --- a/doc/src/fix_qmmm.rst +++ b/doc/src/fix_qmmm.rst @@ -31,7 +31,7 @@ wave DFT package. Electrostatic coupling is in preparation and the interface has been written in a manner that coupling to other QM codes should be possible without changes to LAMMPS itself. -.. _espresso: http://www.quantum-espresso.org +.. _espresso: https://www.quantum-espresso.org The interface code for this is in the lib/qmmm directory of the LAMMPS distribution and is being made available at this early stage of diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index 30f3e550c5..0852a728a4 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -314,9 +314,10 @@ pressure simulation with MSM will cause the code to run slower. ---------- -The *scafacos* style is a wrapper on the `ScaFaCoS Coulomb solver library `_ which provides a variety of solver -methods which can be used with LAMMPS. The paper by :ref:`(Sutman) ` -gives an overview of ScaFaCoS. +The *scafacos* style is a wrapper on the `ScaFaCoS Coulomb solver +library `_ which provides a variety of solver +methods which can be used with LAMMPS. The paper by :ref:`(Sutman) +` gives an overview of ScaFaCoS. ScaFaCoS was developed by a consortium of German research facilities with a BMBF (German Ministry of Science and Education) funded project diff --git a/doc/src/pair_adp.rst b/doc/src/pair_adp.rst index 63045a4792..9a3ce240cd 100644 --- a/doc/src/pair_adp.rst +++ b/doc/src/pair_adp.rst @@ -54,7 +54,7 @@ command to specify them. **ADP potentials are available from:** -* The NIST WWW site at http://www.ctcms.nist.gov/potentials. +* The NIST WWW site at https://www.ctcms.nist.gov/potentials. Note that ADP potentials obtained from NIST must be converted into the extended DYNAMO *setfl* format discussed below. * The OpenKIM Project at diff --git a/doc/src/pair_charmm.rst b/doc/src/pair_charmm.rst index e1469ae323..768ede1320 100644 --- a/doc/src/pair_charmm.rst +++ b/doc/src/pair_charmm.rst @@ -110,7 +110,7 @@ These pair styles compute Lennard Jones (LJ) and Coulombic interactions with additional switching or shifting functions that ramp the energy and/or force smoothly to zero between an inner and outer cutoff. They are implementations of the widely used CHARMM force -field used in the `CHARMM `_ MD code (and +field used in the `CHARMM `_ MD code (and others). See :ref:`(MacKerell) ` for a description of the CHARMM force field. diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index af936a6bc9..a7141c3849 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -122,15 +122,11 @@ are parameterized in terms of LAMMPS :doc:`metal units `. EAM potential files list atomic masses; thus you do not need to use the :doc:`mass ` command to specify them. -There are several WWW sites that distribute and document EAM -potentials stored in DYNAMO or other formats: +There are web sites that distribute and document EAM potentials stored +in DYNAMO or other formats: -.. parsed-literal:: - - http://www.ctcms.nist.gov/potentials - http://cst-www.nrl.navy.mil/ccm6/ap - http://enpub.fulton.asu.edu/cms/potentials/main/main.htm - https://openkim.org +* https://www.ctcms.nist.gov/potentials +* https://openkim.org These potentials should be usable with LAMMPS, though the alternate formats would need to be converted to the DYNAMO format used by LAMMPS diff --git a/doc/src/pair_gromacs.rst b/doc/src/pair_gromacs.rst index ed24b481f9..cb5f223b23 100644 --- a/doc/src/pair_gromacs.rst +++ b/doc/src/pair_gromacs.rst @@ -53,7 +53,7 @@ Description The *lj/gromacs* styles compute shifted LJ and Coulombic interactions with an additional switching function S(r) that ramps the energy and force smoothly to zero between an inner and outer cutoff. It is a commonly -used potential in the `GROMACS `_ MD code and for +used potential in the `GROMACS `_ MD code and for the coarse-grained models of :ref:`(Marrink) `. .. math:: diff --git a/doc/src/pair_meam.rst b/doc/src/pair_meam.rst index 51175a071d..8227938581 100644 --- a/doc/src/pair_meam.rst +++ b/doc/src/pair_meam.rst @@ -426,6 +426,8 @@ none **(Gullet)** Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). This report may be accessed on-line via `this link `_. +.. TODO the following URL is not accessible + .. _sandreport: http://infoserve.sandia.gov/sand_doc/2003/038782.pdf .. _Lee: diff --git a/doc/src/pair_peri.rst b/doc/src/pair_peri.rst index 45b406dd61..22661d99d6 100644 --- a/doc/src/pair_peri.rst +++ b/doc/src/pair_peri.rst @@ -66,10 +66,14 @@ peridynamic viscoelastic solid (VES) model. Style *peri/eps* implements the Peridynamic state-based elastic-plastic solid (EPS) model. -The canonical papers on Peridynamics are :ref:`(Silling 2000) ` -and :ref:`(Silling 2007) `. The implementation of Peridynamics -in LAMMPS is described in :ref:`(Parks) `. Also see the `PDLAMMPS user guide `_ for -more details about its implementation. +.. TODO the following URL is not valid + +The canonical papers on Peridynamics are :ref:`(Silling 2000) +` and :ref:`(Silling 2007) `. The +implementation of Peridynamics in LAMMPS is described in :ref:`(Parks) +`. Also see the `PDLAMMPS user guide +`_ for more details +about its implementation. The peridynamic VES and EPS models in PDLAMMPS were implemented by R. Rahman and J. T. Foster at University of Texas at San Antonio. The diff --git a/doc/src/pair_quip.rst b/doc/src/pair_quip.rst index c150561cb1..1cb6cf6f08 100644 --- a/doc/src/pair_quip.rst +++ b/doc/src/pair_quip.rst @@ -49,11 +49,12 @@ A QUIP potential is fully specified by the filename which contains the parameters of the potential in XML format, the initialization string, and the map of atomic numbers. -GAP potentials can be obtained from the Data repository section of -`http://www.libatoms.org `_, where the -appropriate initialization strings are also advised. The list of -atomic numbers must be matched to the LAMMPS atom types specified in -the LAMMPS data file or elsewhere. +GAP potentials can be obtained from the `GAP models and databases page +on the libAtoms homepage `https://libatoms.github.io +`_, where the appropriate +initialization strings are also advised. The list of atomic numbers must +be matched to the LAMMPS atom types specified in the LAMMPS data file or +elsewhere. Two examples input scripts are provided in the examples/PACKAGES/quip directory. diff --git a/doc/src/read_dump.rst b/doc/src/read_dump.rst index c98347914b..311727f2c6 100644 --- a/doc/src/read_dump.rst +++ b/doc/src/read_dump.rst @@ -397,4 +397,4 @@ Default The option defaults are box = yes, timestep = yes, replace = yes, purge = no, trim = no, add = no, scaled = no, wrapped = yes, and format = native. -.. _vmd: http://www.ks.uiuc.edu/Research/vmd +.. _vmd: https://www.ks.uiuc.edu/Research/vmd From 26e269aacd06f136ff82828b3b254df105309039 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sat, 24 Sep 2022 12:04:27 -0500 Subject: [PATCH 188/364] continued ork on extract_compute unit tests --- doc/src/Fortran.rst | 6 +- doc/src/Library_properties.rst | 10 +- unittest/fortran/CMakeLists.txt | 4 + .../fortran/test_fortran_extract_compute.f90 | 103 +++--------------- 4 files changed, 25 insertions(+), 98 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 312ef3a671..7726a43f6e 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -508,10 +508,10 @@ Procedures Bound to the lammps Derived Type USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE LIBLAMMPS TYPE(lammps) :: lmp - INTEGER(C_int), POINTER :: nlocal - INTEGER(C_int64_t), POINTER :: ntimestep + INTEGER(C_int), POINTER :: nlocal => NULL() + INTEGER(C_int64_t), POINTER :: ntimestep => NULL() + REAL(C_double), POINTER :: dt => NULL() CHARACTER(LEN=10) :: units - REAL(C_double), POINTER :: dt lmp = lammps() ! other commands nlocal = lmp%extract_global('nlocal') diff --git a/doc/src/Library_properties.rst b/doc/src/Library_properties.rst index a5c9c79c64..dfd72adc95 100644 --- a/doc/src/Library_properties.rst +++ b/doc/src/Library_properties.rst @@ -16,8 +16,8 @@ This section documents the following functions: -------------------- The library interface allows the extraction of different kinds of -information about the active simulation instance and also - in some -cases - to apply modifications to it. This enables combining of a +information about the active simulation instance and also---in some +cases---to apply modifications to it. This enables combining of a LAMMPS simulation with other processing and simulation methods computed by the calling code, or by another code that is coupled to LAMMPS via the library interface. In some cases the data returned is direct @@ -25,9 +25,9 @@ reference to the original data inside LAMMPS, cast to a void pointer. In that case the data needs to be cast to a suitable pointer for the calling program to access it, and you may need to know the correct dimensions and lengths. This also means you can directly change those -value(s) from the calling program, e.g. to modify atom positions. Of -course, this should be done with care. When accessing per-atom data, -please note that this data is the per-processor **local** data and is +value(s) from the calling program (e.g., to modify atom positions). Of +course, changing values should be done with care. When accessing per-atom +data, please note that these data are the per-processor **local** data and are indexed accordingly. Per-atom data can change sizes and ordering at every neighbor list rebuild or atom sort event as atoms migrate between sub-domains and processors. diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 44f4f86d89..672333c529 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -61,6 +61,10 @@ if(CMAKE_Fortran_COMPILER) target_link_libraries(test_fortran_extract_atom PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractAtom COMMAND test_fortran_extract_atom) + add_executable(test_fortran_extract_compute wrap_extract_compute.cpp test_fortran_extract_compute.f90) + target_link_libraries(test_fortran_extract_compute PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranExtractCompute COMMAND test_fortran_extract_compute) + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/test_fortran_extract_compute.f90 b/unittest/fortran/test_fortran_extract_compute.f90 index 091572ace3..f358ec9d2c 100644 --- a/unittest/fortran/test_fortran_extract_compute.f90 +++ b/unittest/fortran/test_fortran_extract_compute.f90 @@ -17,10 +17,10 @@ MODULE keepcompute 'mass 1 2.0' ] END MODULE keepcompute -FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") +FUNCTION f_lammps_with_args() BIND(C) USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepatom, ONLY: lmp + USE keepcompute, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & @@ -31,10 +31,10 @@ FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") f_lammps_with_args = lmp%handle END FUNCTION f_lammps_with_args -SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") +SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepatom, ONLY: lmp + USE keepcompute, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -43,7 +43,7 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_compute () BIND(C) USE LIBLAMMPS - USE keepatom, ONLY : lmp, demo_input, cont_input, pair_input + USE keepcompute, ONLY : lmp, demo_input, cont_input, pair_input IMPLICIT NONE CALL lmp%commands_list(demo_input) @@ -56,94 +56,17 @@ SUBROUTINE f_lammps_setup_extract_compute () BIND(C) CALL lmp%command("compute 1 all rdf 100") ! global array CALL lmp%command("compute pairdist all pair/local dist") ! local vector CALL lmp%command("compute pairlocal all pair/local dist dx dy dz") ! local array -END SUBROUTINE f_lammps_setup_extract_atom +END SUBROUTINE f_lammps_setup_extract_compute -FUNCTION f_lammps_extract_atom_mass () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - REAL(C_double) :: f_lammps_extract_atom_mass - REAL(C_double), DIMENSION(:), POINTER :: mass => NULL() - - mass = lmp%extract_atom('mass') - f_lammps_extract_atom_mass = mass(1) -END FUNCTION f_lammps_extract_atom_mass - -FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) +FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepcompute, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_tag_int - INTEGER(C_int), DIMENSION(:), POINTER :: tag => NULL() + REAL(C_double) :: f_lammps_extract_compute_peratom_vector + REAL(C_double), DIMENSION(:), POINTER :: vector => NULL() - tag = lmp%extract_atom('id') - f_lammps_extract_atom_tag_int = tag(i) -END FUNCTION f_lammps_extract_atom_tag_int - -FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - INTEGER(C_int64_t), INTENT(IN), VALUE :: i - INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 - INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag => NULL() - - tag = lmp%extract_atom('id') - f_lammps_extract_atom_tag_int64 = tag(i) -END FUNCTION f_lammps_extract_atom_tag_int64 - -FUNCTION f_lammps_extract_atom_type(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_type - INTEGER(C_int), DIMENSION(:), POINTER :: atype => NULL() - - atype = lmp%extract_atom('type') - f_lammps_extract_atom_type = atype(i) -END FUNCTION f_lammps_extract_atom_type - -FUNCTION f_lammps_extract_atom_mask(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_mask - INTEGER(C_int), DIMENSION(:), POINTER :: mask => NULL() - - mask = lmp%extract_atom('mask') - f_lammps_extract_atom_mask = mask(i) -END FUNCTION f_lammps_extract_atom_mask - -SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double), DIMENSION(3) :: x - REAL(C_double), DIMENSION(:,:), POINTER :: xptr => NULL() - - xptr = lmp%extract_atom('x') - x = xptr(:,i) -END SUBROUTINE f_lammps_extract_atom_x - -SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int - USE LIBLAMMPS - USE keepatom, ONLY : lmp - IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double), DIMENSION(3) :: v - REAL(C_double), DIMENSION(:,:), POINTER :: vptr => NULL() - - vptr = lmp%extract_atom('v') - v = vptr(:,i) -END SUBROUTINE f_lammps_extract_atom_v + vector = lmp%extract_compute('peratompe', lmp%style%atom, lmp%type%vector) + f_lammps_extract_compute_peratom_vector = vector(i) +END FUNCTION f_lammps_extract_compute_peratom_vector From 058e49696a83c30c0e3e202ef6c489ab032e17df Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sat, 24 Sep 2022 12:12:24 -0500 Subject: [PATCH 189/364] Added "New in version TBD" to new functions --- doc/src/Fortran.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index e15555bc4e..77ab447c7c 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -376,6 +376,8 @@ Procedures Bound to the lammps Derived Type This function will call :cpp:func:`lammps_get_thermo` and return the value of the corresponding thermodynamic keyword. + .. versionadded:: TBD + :p character(len=\*) name: string with the name of the thermo keyword :r real(c_double): value of the requested thermo property or `0.0_c_double` @@ -389,6 +391,8 @@ Procedures Bound to the lammps Derived Type as integers, but should be declared as ``LOGICAL`` variables when calling from Fortran. + .. versionadded:: TBD + :o real(c_double) boxlo [dimension(3),optional]: vector in which to store lower-bounds of simulation box :o real(c_double) boxhi [dimension(3),optional]: vector in which to store @@ -423,6 +427,8 @@ Procedures Bound to the lammps Derived Type This subroutine will call :cpp:func:`lammps_reset_box`. All parameters are required. + .. versionadded:: TBD + :p real(c_double) boxlo [dimension(3)]: vector of three doubles containing the lower box boundary :p real(c_double) boxhi [dimension(3)]: vector of three doubles containing @@ -438,6 +444,8 @@ Procedures Bound to the lammps Derived Type This subroutine will call :cpp:func:`lammps_memory_usage` and store the result in the three-element array *meminfo*. + .. versionadded:: TBD + :p real(c_double) meminfo [dimension(3)]: vector of three doubles in which to store memory usage data @@ -448,6 +456,8 @@ Procedures Bound to the lammps Derived Type This function returns a Fortran representation of the LAMMPS "world" communicator. + .. versionadded:: TBD + :r integer: Fortran integer equivalent to the MPI communicator LAMMPS is using @@ -484,6 +494,8 @@ Procedures Bound to the lammps Derived Type Query LAMMPS about global settings. See the documentation for the :cpp:func:`lammps_extract_setting` function from the C library. + .. versionadded:: TBD + :p character(len=\*) keyword: string containing the name of the thermo keyword :r integer(c_int): value of the queried setting or :math:`-1` if unknown @@ -495,6 +507,8 @@ Procedures Bound to the lammps Derived Type either a string or a pointer to internal global LAMMPS data, depending on the data requested through *name*. + .. versionadded:: TBD + Note that this function actually does not return a value, but rather associates the pointer on the left side of the assignment to point to internal LAMMPS data (with the exception of string data, which are From 1ad782c050ed4db5913cdb908d4613d55d061061 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 14:47:41 -0400 Subject: [PATCH 190/364] initialize and (conditionally) free cutghost pointer in base class --- src/ML-IAP/mliap_descriptor.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ML-IAP/mliap_descriptor.cpp b/src/ML-IAP/mliap_descriptor.cpp index ff8cfb43a9..ce8abf4e56 100644 --- a/src/ML-IAP/mliap_descriptor.cpp +++ b/src/ML-IAP/mliap_descriptor.cpp @@ -25,7 +25,7 @@ using namespace LAMMPS_NS; MLIAPDescriptor::MLIAPDescriptor(LAMMPS *lmp) : Pointers(lmp), ndescriptors(0), nelements(0), elements(nullptr), cutsq(nullptr), - radelem(nullptr), wjelem(nullptr) + cutghost(nullptr), radelem(nullptr), wjelem(nullptr) { cutmax = 0.0; } @@ -37,6 +37,7 @@ MLIAPDescriptor::~MLIAPDescriptor() for (int i = 0; i < nelements; i++) delete[] elements[i]; delete[] elements; memory->destroy(cutsq); + memory->destroy(cutghost); memory->destroy(radelem); memory->destroy(wjelem); } From 1885f7e42d368985b1b1ecd2504b0808e446fc54 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 14:48:13 -0400 Subject: [PATCH 191/364] delete redundant memory deallocation --- src/ML-IAP/mliap_unified.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index b64c2b0db4..fef32a5293 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -33,12 +33,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *lmp) : MLIAPDescriptor(lmp) {} +MLIAPDummyDescriptor::MLIAPDummyDescriptor(LAMMPS *_lmp) : MLIAPDescriptor(_lmp) {} MLIAPDummyDescriptor::~MLIAPDummyDescriptor() { - memory->destroy(radelem); - memory->destroy(cutsq); // manually decrement borrowed reference from Python Py_DECREF(unified_interface); } From bab115e993f4d08894aab6baef82a67d455c7848 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 14:48:31 -0400 Subject: [PATCH 192/364] apply C++11 virtual/override conventions --- src/ML-IAP/mliap_model_python.h | 16 ++++++++-------- src/ML-IAP/mliap_unified.h | 30 +++++++++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/ML-IAP/mliap_model_python.h b/src/ML-IAP/mliap_model_python.h index 4243c67332..915e79e53c 100644 --- a/src/ML-IAP/mliap_model_python.h +++ b/src/ML-IAP/mliap_model_python.h @@ -21,20 +21,20 @@ namespace LAMMPS_NS { class MLIAPModelPython : public MLIAPModel { public: MLIAPModelPython(LAMMPS *, char * = nullptr); - ~MLIAPModelPython(); - virtual int get_nparams(); - virtual int get_gamma_nnz(class MLIAPData *); - virtual void compute_gradients(class MLIAPData *); - virtual void compute_gradgrads(class MLIAPData *); - virtual void compute_force_gradients(class MLIAPData *); - virtual double memory_usage(); + ~MLIAPModelPython() override; + int get_nparams() override; + int get_gamma_nnz(class MLIAPData *) override; + void compute_gradients(class MLIAPData *) override; + void compute_gradgrads(class MLIAPData *) override; + void compute_force_gradients(class MLIAPData *) override; + double memory_usage() override; void connect_param_counts(); // If possible convert this to protected/private and // and figure out how to declare cython fn // load_from_python as a friend. int model_loaded; protected: - virtual void read_coeffs(char *); + void read_coeffs(char *) override; private: }; diff --git a/src/ML-IAP/mliap_unified.h b/src/ML-IAP/mliap_unified.h index 78987ad0d8..adc900d8c1 100644 --- a/src/ML-IAP/mliap_unified.h +++ b/src/ML-IAP/mliap_unified.h @@ -25,12 +25,12 @@ namespace LAMMPS_NS { class MLIAPDummyDescriptor : public MLIAPDescriptor { public: MLIAPDummyDescriptor(LAMMPS *); - ~MLIAPDummyDescriptor(); - virtual void compute_descriptors(class MLIAPData *); - virtual void compute_forces(class MLIAPData *); - virtual void compute_force_gradients(class MLIAPData *); - virtual void compute_descriptor_gradients(class MLIAPData *); - virtual void init(); + ~MLIAPDummyDescriptor() override; + void compute_descriptors(class MLIAPData *) override; + void compute_forces(class MLIAPData *) override; + void compute_force_gradients(class MLIAPData *) override; + void compute_descriptor_gradients(class MLIAPData *) override; + void init() override; void set_elements(char **, int); PyObject *unified_interface; // MLIAPUnifiedInterface @@ -39,19 +39,19 @@ class MLIAPDummyDescriptor : public MLIAPDescriptor { class MLIAPDummyModel : public MLIAPModel { public: - MLIAPDummyModel(LAMMPS *, char * = NULL); - ~MLIAPDummyModel(); - virtual int get_nparams(); - virtual int get_gamma_nnz(class MLIAPData *); - virtual void compute_gradients(class MLIAPData *); - virtual void compute_gradgrads(class MLIAPData *); - virtual void compute_force_gradients(class MLIAPData *); - virtual double memory_usage(); + MLIAPDummyModel(LAMMPS *, char * = nullptr); + ~MLIAPDummyModel() override; + int get_nparams() override; + int get_gamma_nnz(class MLIAPData *) override; + void compute_gradients(class MLIAPData *) override; + void compute_gradgrads(class MLIAPData *) override; + void compute_force_gradients(class MLIAPData *) override; + double memory_usage() override; PyObject *unified_interface; protected: - virtual void read_coeffs(char *); + void read_coeffs(char *) override; }; struct MLIAPBuildUnified_t { From ef8090fdd1a667dbc3a6d014405ae59cdfb9fc75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 15:31:47 -0400 Subject: [PATCH 193/364] flag *unified* keyword as newly added in the next patch release --- doc/src/pair_mliap.rst | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 69bde85c5b..dd021eb84c 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -40,15 +40,17 @@ Description """"""""""" Pair style *mliap* provides a general interface to families of -machine-learning interatomic potentials. It allows separate definitions +machine-learning interatomic potentials. It allows separate definitions of the interatomic potential functional form (*model*) and the geometric -quantities that characterize the atomic positions (*descriptor*). By -defining *model* and *descriptor* separately, it is possible to use many -different models with a given descriptor, or many different descriptors -with a given model. The pair style currently supports only *sna* and *so3* -descriptor styles, but it is straightforward to add new descriptor -styles. By using the *unified* pair style, it is possible to define a -Python model that combines functionalities of both *model* and *descriptor*. +quantities that characterize the atomic positions (*descriptor*). + +By defining *model* and *descriptor* separately, it is possible to use +many different models with a given descriptor, or many different +descriptors with a given model. The pair style currently supports only +*sna* and *so3* descriptor styles, but it is straightforward to add new +descriptor styles. By using the *unified* keyword, it is possible to +define a Python model that combines functionalities of both *model* and +*descriptor*. The SNAP descriptor style *sna* is the same as that used by :doc:`pair_style snap `, including the linear, quadratic, and @@ -173,6 +175,8 @@ to specify the path for these *model* and *descriptor* files. larger systems since their size depends on the total number of neighbors per MPI process. +.. versionadded:: TBD + The *unified* keyword is followed by an argument specifying the filename containing the serialized unified Python object and the "ghostneigh" toggle (0/1) to disable/enable the construction of neighbors lists including From a02ab6eaa10a80a5c4e4889c8f332bc839b3855e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 15:32:25 -0400 Subject: [PATCH 194/364] avoid memory corruption when using mliap unified with ghostneigh_flag == 1 --- src/ML-IAP/mliap_unified.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index fef32a5293..8c2955d559 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -245,14 +245,18 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { double e_total = 0; - for (int ii = 0; ii < data->nlistatoms; ii++) data->eatoms[ii] = 0; + const auto nlistatoms = data->nlistatoms; + for (int ii = 0; ii < nlistatoms; ii++) data->eatoms[ii] = 0; for (int ii = 0; ii < data->npairs; ii++) { int i = data->pair_i[ii]; double e = 0.5 * eij[ii]; - data->eatoms[i] += e; - e_total += e; + // TODO: the if avoids memory corruption with ghostneigh_flag = 1, + if (i < nlistatoms) { + data->eatoms[i] += e; + e_total += e; + } } data->energy = e_total; } From 59ca352e48f64081c4d866f8c6d30415bba8314c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 15:34:41 -0400 Subject: [PATCH 195/364] whitespace --- python/lammps/core.py | 4 ++-- python/lammps/mliap/loader.py | 8 ++++---- python/lammps/mliap/mliap_unified_lj.py | 6 +++--- python/lammps/mliap/pytorch.py | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 930a40a4b0..5cd112ed2d 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1622,8 +1622,8 @@ class lammps(object): """Return a string with detailed information about any devices that are usable by the GPU package. - This is a wrapper around the :cpp:func:`lammps_get_gpu_device_info` - function of the C-library interface. + This is a wrapper around the :cpp:func:`lammps_get_gpu_device_info` + function of the C-library interface. :return: GPU device info string :rtype: string diff --git a/python/lammps/mliap/loader.py b/python/lammps/mliap/loader.py index 0e76568e2c..e1e60c4f50 100644 --- a/python/lammps/mliap/loader.py +++ b/python/lammps/mliap/loader.py @@ -29,7 +29,7 @@ from ctypes import pythonapi, c_int, c_void_p, py_object class DynamicLoader(importlib.abc.Loader): def __init__(self,module_name,library,api_version=1013): self.api_version = api_version - + attr = "PyInit_"+module_name initfunc = getattr(library,attr) # c_void_p is standin for PyModuleDef * @@ -44,7 +44,7 @@ class DynamicLoader(importlib.abc.Loader): createfunc.restype = py_object module = createfunc(self.module_def, spec, self.api_version) return module - + def exec_module(self, module): execfunc = pythonapi.PyModule_ExecDef # c_void_p is standin for PyModuleDef * @@ -59,12 +59,12 @@ def activate_mliappy(lmp): library = lmp.lib module_names = ["mliap_model_python_couple", "mliap_unified_couple"] api_version = library.lammps_python_api_version() - + for module_name in module_names: # Make Machinery loader = DynamicLoader(module_name,library,api_version) spec = importlib.util.spec_from_loader(module_name,loader) - + # Do the import module = importlib.util.module_from_spec(spec) sys.modules[module_name] = module diff --git a/python/lammps/mliap/mliap_unified_lj.py b/python/lammps/mliap/mliap_unified_lj.py index 87925e1e39..37e7170d4a 100644 --- a/python/lammps/mliap/mliap_unified_lj.py +++ b/python/lammps/mliap/mliap_unified_lj.py @@ -19,16 +19,16 @@ class MLIAPUnifiedLJ(MLIAPUnified): def compute_gradients(self, data): """Test compute_gradients.""" - + def compute_descriptors(self, data): """Test compute_descriptors.""" - + def compute_forces(self, data): """Test compute_forces.""" eij, fij = self.compute_pair_ef(data) data.update_pair_energy(eij) data.update_pair_forces(fij) - + def compute_pair_ef(self, data): rij = data.rij diff --git a/python/lammps/mliap/pytorch.py b/python/lammps/mliap/pytorch.py index d699c239b0..51b953fd61 100644 --- a/python/lammps/mliap/pytorch.py +++ b/python/lammps/mliap/pytorch.py @@ -80,10 +80,10 @@ class TorchWrapper(torch.nn.Module): n_params : torch.nn.Module (None) Number of NN model parameters - + device : torch.nn.Module (None) Accelerator device - + dtype : torch.dtype (torch.float64) Dtype to use on device """ @@ -325,6 +325,6 @@ class ElemwiseModels(torch.nn.Module): per_atom_attributes = torch.zeros(elems.size(dim=0), dtype=self.dtype) given_elems, elem_indices = torch.unique(elems, return_inverse=True) for i, elem in enumerate(given_elems): - self.subnets[elem].to(self.dtype) + self.subnets[elem].to(self.dtype) per_atom_attributes[elem_indices == i] = self.subnets[elem](descriptors[elem_indices == i]).flatten() return per_atom_attributes From 0ed0d757ecc56ac9b9e72c2c7b3e6d4f87e555df Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 21:08:43 -0400 Subject: [PATCH 196/364] refactor unified LJ example input to embed the python code into the input --- examples/mliap/README | 9 +-- examples/mliap/in.mliap.unified.lj.Ar | 15 +++- .../log.23Sep22.mliap.unified.lj.Ar.g++.1 | 80 +++++++++++-------- .../log.23Sep22.mliap.unified.lj.Ar.g++.4 | 78 +++++++++++------- examples/mliap/pickle_mliap_unified_lj_Ar.py | 9 --- 5 files changed, 111 insertions(+), 80 deletions(-) delete mode 100644 examples/mliap/pickle_mliap_unified_lj_Ar.py diff --git a/examples/mliap/README b/examples/mliap/README index d7778298d2..cbe33f4c07 100644 --- a/examples/mliap/README +++ b/examples/mliap/README @@ -123,13 +123,12 @@ You can run the example as follows `lmp -in in.mliap.unified.lj.Ar -echo both` -The resultant log.lammps output should be identical to that generated +The resultant thermo output should be identical to that generated by in.melt. -The input first runs ``python pickle_mliap_unified_lj_Ar.py`` and -thus creates an ML-IAP unified model that replicates the ``lj/cut`` -pair style defined in examples/melt/in/melt and saves it in the -file "mliap_unified_lj_Ar.pkl". +The input first runs some python code that creates an ML-IAP unified model +that replicates the ``lj/cut`` pair style with parameters as defined in +examples/melt/in/melt and saves it in the file "mliap_unified_lj_Ar.pkl". If this fails, see the instructions for building the ML-IAP package with Python support enabled. Also, confirm that the LAMMPS Python diff --git a/examples/mliap/in.mliap.unified.lj.Ar b/examples/mliap/in.mliap.unified.lj.Ar index bd47c30cfb..190ea1288f 100644 --- a/examples/mliap/in.mliap.unified.lj.Ar +++ b/examples/mliap/in.mliap.unified.lj.Ar @@ -1,8 +1,17 @@ # create pickle of unified model -shell rm -f mliap_unified_lj_Ar.pkl -shell python pickle_mliap_unified_lj_Ar.py +python create_pickle here """ +import lammps +import lammps.mliap + +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ + +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke # 3d Lennard-Jones melt @@ -41,4 +50,4 @@ thermo 50 run 250 # clean up -shell rm mliap_unified_lj_Ar.pkl +shell rm -f mliap_unified_lj_Ar.pkl diff --git a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 index ecbf4e3fa5..1059b65538 100644 --- a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.1 @@ -1,45 +1,58 @@ -LAMMPS (3 Aug 2022) +LAMMPS (15 Sep 2022) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task + +# create pickle of unified model + +python create_pickle here """ +import lammps +import lammps.mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke + # 3d Lennard-Jones melt -units lj -atom_style atomic +units lj +atom_style atomic -lattice fcc 0.8442 +lattice fcc 0.8442 Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 -region box block 0 10 0 10 0 10 -create_box 1 box +region box block 0 10 0 10 0 10 +create_box 1 box Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) 1 by 1 by 1 MPI processor grid -create_atoms 1 box +create_atoms 1 box Created 4000 atoms using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) - create_atoms CPU = 0.000 seconds -mass 1 1.0 + create_atoms CPU = 0.001 seconds +mass 1 1.0 -velocity all create 3.0 87287 loop geom +velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl 0 -pair_coeff * * Ar +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar -neighbor 0.3 bin -neigh_modify every 20 delay 0 check no +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no -fix 1 all nve +fix 1 all nve -#dump id all atom 50 dump.melt +#dump id all atom 50 dump.melt -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 #dump 4 all custom 1 forces.xyz fx fy fz -thermo 50 -run 250 +thermo 50 +run 250 Neighbor list info ... update: every = 20 steps, delay = 0 steps, check = no max neighbors/atom: 2000, page size: 100000 @@ -60,20 +73,20 @@ Per MPI rank memory allocation (min/avg/max) = 12.7 | 12.7 | 12.7 Mbytes 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 -Loop time of 2.3513 on 1 procs for 250 steps with 4000 atoms +Loop time of 3.48563 on 1 procs for 250 steps with 4000 atoms -Performance: 45932.056 tau/day, 106.324 timesteps/s -86.4% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 30984.374 tau/day, 71.723 timesteps/s +79.5% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.2271 | 2.2271 | 2.2271 | 0.0 | 94.72 -Neigh | 0.11085 | 0.11085 | 0.11085 | 0.0 | 4.71 -Comm | 0.0062017 | 0.0062017 | 0.0062017 | 0.0 | 0.26 -Output | 0.00015504 | 0.00015504 | 0.00015504 | 0.0 | 0.01 -Modify | 0.0056096 | 0.0056096 | 0.0056096 | 0.0 | 0.24 -Other | | 0.001392 | | | 0.06 +Pair | 3.3348 | 3.3348 | 3.3348 | 0.0 | 95.67 +Neigh | 0.13055 | 0.13055 | 0.13055 | 0.0 | 3.75 +Comm | 0.0089845 | 0.0089845 | 0.0089845 | 0.0 | 0.26 +Output | 0.00018194 | 0.00018194 | 0.00018194 | 0.0 | 0.01 +Modify | 0.0090026 | 0.0090026 | 0.0090026 | 0.0 | 0.26 +Other | | 0.002151 | | | 0.06 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -88,4 +101,7 @@ Total # of neighbors = 303576 Ave neighs/atom = 75.894 Neighbor list builds = 12 Dangerous builds not checked -Total wall time: 0:00:08 + +# clean up +shell rm -f mliap_unified_lj_Ar.pkl +Total wall time: 0:00:03 diff --git a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 index c23274830f..236e415ae6 100644 --- a/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 +++ b/examples/mliap/log.23Sep22.mliap.unified.lj.Ar.g++.4 @@ -1,45 +1,58 @@ -LAMMPS (3 Aug 2022) +LAMMPS (15 Sep 2022) OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task + +# create pickle of unified model + +python create_pickle here """ +import lammps +import lammps.mliap +from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ +def create_pickle(): + unified = MLIAPUnifiedLJ(["Ar"]) + unified.pickle('mliap_unified_lj_Ar.pkl') +""" +python create_pickle invoke + # 3d Lennard-Jones melt -units lj -atom_style atomic +units lj +atom_style atomic -lattice fcc 0.8442 +lattice fcc 0.8442 Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 -region box block 0 10 0 10 0 10 -create_box 1 box +region box block 0 10 0 10 0 10 +create_box 1 box Created orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) 1 by 2 by 2 MPI processor grid -create_atoms 1 box +create_atoms 1 box Created 4000 atoms using lattice units in orthogonal box = (0 0 0) to (16.795962 16.795962 16.795962) create_atoms CPU = 0.000 seconds -mass 1 1.0 +mass 1 1.0 -velocity all create 3.0 87287 loop geom +velocity all create 3.0 87287 loop geom -pair_style mliap unified mliap_unified_lj_Ar.pkl 0 -pair_coeff * * Ar +pair_style mliap unified mliap_unified_lj_Ar.pkl 0 +pair_coeff * * Ar -neighbor 0.3 bin -neigh_modify every 20 delay 0 check no +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no -fix 1 all nve +fix 1 all nve -#dump id all atom 50 dump.melt +#dump id all atom 50 dump.melt -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 1 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 #dump 4 all custom 1 forces.xyz fx fy fz -thermo 50 -run 250 +thermo 50 +run 250 Neighbor list info ... update: every = 20 steps, delay = 0 steps, check = no max neighbors/atom: 2000, page size: 100000 @@ -60,20 +73,20 @@ Per MPI rank memory allocation (min/avg/max) = 5.774 | 5.774 | 5.774 Mbytes 150 1.6444751 -4.7471034 0 -2.2810074 5.8614211 200 1.6471542 -4.7509053 0 -2.2807916 5.8805431 250 1.6645597 -4.7774327 0 -2.2812174 5.7526089 -Loop time of 0.695238 on 4 procs for 250 steps with 4000 atoms +Loop time of 1.18059 on 4 procs for 250 steps with 4000 atoms -Performance: 155342.376 tau/day, 359.589 timesteps/s -83.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 91479.359 tau/day, 211.758 timesteps/s +78.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.62236 | 0.63453 | 0.64608 | 1.4 | 91.27 -Neigh | 0.028102 | 0.02844 | 0.028769 | 0.2 | 4.09 -Comm | 0.017175 | 0.029078 | 0.041476 | 6.8 | 4.18 -Output | 0.00011382 | 0.00011668 | 0.00012178 | 0.0 | 0.02 -Modify | 0.0015878 | 0.0016298 | 0.0016762 | 0.1 | 0.23 -Other | | 0.001443 | | | 0.21 +Pair | 1.0795 | 1.1007 | 1.1197 | 1.7 | 93.23 +Neigh | 0.035618 | 0.03627 | 0.037413 | 0.4 | 3.07 +Comm | 0.019611 | 0.038646 | 0.060389 | 9.4 | 3.27 +Output | 0.00013034 | 0.0001421 | 0.00017083 | 0.0 | 0.01 +Modify | 0.0037233 | 0.0037641 | 0.0038121 | 0.1 | 0.32 +Other | | 0.001086 | | | 0.09 Nlocal: 1000 ave 1008 max 987 min Histogram: 1 0 0 0 0 0 1 0 1 1 @@ -88,4 +101,7 @@ Total # of neighbors = 303576 Ave neighs/atom = 75.894 Neighbor list builds = 12 Dangerous builds not checked -Total wall time: 0:00:09 + +# clean up +shell rm -f mliap_unified_lj_Ar.pkl +Total wall time: 0:00:01 diff --git a/examples/mliap/pickle_mliap_unified_lj_Ar.py b/examples/mliap/pickle_mliap_unified_lj_Ar.py deleted file mode 100644 index f44c283f5a..0000000000 --- a/examples/mliap/pickle_mliap_unified_lj_Ar.py +++ /dev/null @@ -1,9 +0,0 @@ -import lammps -import lammps.mliap - -from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ - - -if __name__ == '__main__': - unified = MLIAPUnifiedLJ(["Ar"]) - unified.pickle('mliap_unified_lj_Ar.pkl') From ebf69f2e79d50119ad309b909180133ee6480367 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 21:09:27 -0400 Subject: [PATCH 197/364] avoid incorrect results with ghostneigh_flag on by skipping contributions from non-local i atoms --- src/ML-IAP/mliap_unified.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 8c2955d559..6bcdc88289 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -244,7 +244,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) { - double e_total = 0; + double e_total = 0.0; const auto nlistatoms = data->nlistatoms; for (int ii = 0; ii < nlistatoms; ii++) data->eatoms[ii] = 0; @@ -252,7 +252,7 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) int i = data->pair_i[ii]; double e = 0.5 * eij[ii]; - // TODO: the if avoids memory corruption with ghostneigh_flag = 1, + // must not count any contribution where i is not a local atom if (i < nlistatoms) { data->eatoms[i] += e; e_total += e; @@ -267,20 +267,24 @@ void LAMMPS_NS::update_pair_energy(MLIAPData *data, double *eij) void LAMMPS_NS::update_pair_forces(MLIAPData *data, double *fij) { + const auto nlistatoms = data->nlistatoms; double **f = data->f; for (int ii = 0; ii < data->npairs; ii++) { int ii3 = ii * 3; int i = data->pair_i[ii]; int j = data->jatoms[ii]; - f[i][0] += fij[ii3]; - f[i][1] += fij[ii3 + 1]; - f[i][2] += fij[ii3 + 2]; - f[j][0] -= fij[ii3]; - f[j][1] -= fij[ii3 + 1]; - f[j][2] -= fij[ii3 + 2]; + // must not count any contribution where i is not a local atom + if (i < nlistatoms) { + f[i][0] += fij[ii3]; + f[i][1] += fij[ii3 + 1]; + f[i][2] += fij[ii3 + 2]; + f[j][0] -= fij[ii3]; + f[j][1] -= fij[ii3 + 1]; + f[j][2] -= fij[ii3 + 2]; - if (data->vflag) data->pairmliap->v_tally(i, j, &fij[ii3], data->rij[ii]); + if (data->vflag) data->pairmliap->v_tally(i, j, &fij[ii3], data->rij[ii]); + } } } From 19a0747aeb697b26450f252d1fcdc6971baba33b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 22:15:29 -0400 Subject: [PATCH 198/364] add unit test for MLIAP unified --- unittest/force-styles/CMakeLists.txt | 8 ++ .../force-styles/test_mliappy_unified.cpp | 116 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 unittest/force-styles/test_mliappy_unified.cpp diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index d2345ceaa7..66c4ddd2ce 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -251,3 +251,11 @@ foreach(TEST ${IMPROPER_TESTS}) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() + +if(MLIAP_ENABLE_PYTHON AND (NOT WIN32)) + add_executable(test_mliappy_unified test_mliappy_unified.cpp) + target_link_libraries(test_mliappy_unified PRIVATE lammps GTest::GMockMain) + add_test(NAME TestMliapPyUnified COMMAND test_mliappy_unified) + set_tests_properties(TestMliapPyUnified PROPERTIES ENVIRONMENT "PYTHONPATH=${LAMMPS_PYTHON_DIR}:${LAMMPS_LIB_DIR}/cython") +endif() + diff --git a/unittest/force-styles/test_mliappy_unified.cpp b/unittest/force-styles/test_mliappy_unified.cpp new file mode 100644 index 0000000000..1eb800a954 --- /dev/null +++ b/unittest/force-styles/test_mliappy_unified.cpp @@ -0,0 +1,116 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "library.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +const char pickle[] = "python create_pickle here \"\"\"\n" + "import lammps\n" + "import lammps.mliap\n" + "from lammps.mliap.mliap_unified_lj import MLIAPUnifiedLJ\n" + "def create_pickle():\n" + " unified = MLIAPUnifiedLJ(['Ar'])\n" + " unified.pickle('mliap_unified_lj_Ar.pkl')\n" + "\"\"\"\n"; + +const char first[] = "units lj\n" + "atom_style atomic\n" + "lattice fcc 0.8442\n" + "region box block 0 2 0 2 0 2\n" + "create_box 1 box\n" + "create_atoms 1 box\n" + "mass 1 1.0\n" + "velocity all create 3.0 87287 loop geom\n"; + +const char second[] = "neighbor 0.3 bin\n" + "neigh_modify every 20 delay 0 check no\n" + "fix 1 all nve\n" + "run 2 post no\n"; + +namespace LAMMPS_NS { + +TEST(MliapUnified, VersusLJMelt) +{ + const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; + int lmpargc = sizeof(lmpargv) / sizeof(const char *); + + void *ljmelt = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + void *mliap = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + + lammps_commands_string(ljmelt, first); + lammps_command(ljmelt, "pair_style lj/cut 2.5"); + lammps_command(ljmelt, "pair_coeff * * 1.0 1.0"); + lammps_commands_string(ljmelt, second); + + lammps_command(mliap, pickle); + lammps_command(mliap, "python create_pickle invoke"); + + lammps_commands_string(mliap, first); + lammps_command(mliap, "pair_style mliap unified mliap_unified_lj_Ar.pkl 0"); + lammps_command(mliap, "pair_coeff * * Ar"); + lammps_commands_string(mliap, second); + + double lj_pe = lammps_get_thermo(ljmelt, "pe"); + double ml_pe = lammps_get_thermo(mliap, "pe"); + EXPECT_NEAR(lj_pe, ml_pe, 1.0e-14); + double lj_ke = lammps_get_thermo(ljmelt, "ke"); + double ml_ke = lammps_get_thermo(mliap, "ke"); + EXPECT_NEAR(lj_ke, ml_ke, 1.0e-14); + double lj_press = lammps_get_thermo(ljmelt, "press"); + double ml_press = lammps_get_thermo(mliap, "press"); + EXPECT_NEAR(lj_press, ml_press, 1.0e-14); + + lammps_command(mliap, "shell rm mliap_unified_lj_Ar.pkl"); + lammps_close(ljmelt); + lammps_close(mliap); +} + +TEST(MliapUnified, VersusLJMeltGhost) +{ + const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; + int lmpargc = sizeof(lmpargv) / sizeof(const char *); + + void *ljmelt = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + void *mliap = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + + lammps_commands_string(ljmelt, first); + lammps_command(ljmelt, "pair_style lj/cut 2.5"); + lammps_command(ljmelt, "pair_coeff * * 1.0 1.0"); + lammps_commands_string(ljmelt, second); + + lammps_command(mliap, pickle); + lammps_command(mliap, "python create_pickle invoke"); + + lammps_commands_string(mliap, first); + lammps_command(mliap, "pair_style mliap unified mliap_unified_lj_Ar.pkl 1"); + lammps_command(mliap, "pair_coeff * * Ar"); + lammps_commands_string(mliap, second); + + double lj_pe = lammps_get_thermo(ljmelt, "pe"); + double ml_pe = lammps_get_thermo(mliap, "pe"); + EXPECT_NEAR(lj_pe, ml_pe, 1.0e-14); + double lj_ke = lammps_get_thermo(ljmelt, "ke"); + double ml_ke = lammps_get_thermo(mliap, "ke"); + EXPECT_NEAR(lj_ke, ml_ke, 1.0e-14); + double lj_press = lammps_get_thermo(ljmelt, "press"); + double ml_press = lammps_get_thermo(mliap, "press"); + EXPECT_NEAR(lj_press, ml_press, 1.0e-14); + + lammps_command(mliap, "shell rm mliap_unified_lj_Ar.pkl"); + lammps_close(ljmelt); + lammps_close(mliap); +} + +} // namespace LAMMPS_NS From 7b7237bdafa5ab79e0f32941b5f4c51b0bf0da9b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Sep 2022 22:27:22 -0400 Subject: [PATCH 199/364] try to suppress creating __pycache__ folders in the python source dirs --- unittest/force-styles/CMakeLists.txt | 9 +++++---- unittest/python/CMakeLists.txt | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 66c4ddd2ce..294ece3a1f 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -79,6 +79,7 @@ else() set(FORCE_TEST_ENVIRONMENT PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}) endif() list(APPEND FORCE_TEST_ENVIRONMENT "PYTHONUNBUFFERED=1") +list(APPEND FORCE_TEST_ENVIRONMENT "PYTHONDONTWRITEBYTECODE=1") list(APPEND FORCE_TEST_ENVIRONMENT "OMP_PROC_BIND=false") list(APPEND FORCE_TEST_ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") get_property(BUILD_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) @@ -213,7 +214,7 @@ foreach(TEST ${FIX_TIMESTEP_TESTS}) if(WIN32) set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}\\\;${LAMMPS_PYTHON_DIR}") else() - set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH};PYTHONDONTWRITEBYTECODE=1") endif() set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() @@ -231,7 +232,7 @@ foreach(TEST ${DIHEDRAL_TESTS}) continue() endif() add_test(NAME ${TNAME} COMMAND test_dihedral_style ${TEST}) - set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH};PYTHONDONTWRITEBYTECODE=1") set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() @@ -248,7 +249,7 @@ foreach(TEST ${IMPROPER_TESTS}) continue() endif() add_test(NAME ${TNAME} COMMAND test_improper_style ${TEST}) - set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH}") + set_tests_properties(${TNAME} PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR};PYTHONPATH=${TEST_INPUT_FOLDER}:$ENV{PYTHONPATH};PYTHONDONTWRITEBYTECODE=1") set_tests_properties(${TNAME} PROPERTIES LABELS "${TEST_TAGS}") endforeach() @@ -256,6 +257,6 @@ if(MLIAP_ENABLE_PYTHON AND (NOT WIN32)) add_executable(test_mliappy_unified test_mliappy_unified.cpp) target_link_libraries(test_mliappy_unified PRIVATE lammps GTest::GMockMain) add_test(NAME TestMliapPyUnified COMMAND test_mliappy_unified) - set_tests_properties(TestMliapPyUnified PROPERTIES ENVIRONMENT "PYTHONPATH=${LAMMPS_PYTHON_DIR}:${LAMMPS_LIB_DIR}/cython") + set_tests_properties(TestMliapPyUnified PROPERTIES ENVIRONMENT "PYTHONPATH=${LAMMPS_PYTHON_DIR};PYTHONDONTWRITEBYTECODE=1") endif() diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index 0aebc6fc7c..78b0d18446 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -44,6 +44,7 @@ else() endif() list(APPEND PYTHON_TEST_ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") list(APPEND PYTHON_TEST_ENVIRONMENT "PYTHONUNBUFFERED=1") +list(APPEND PYTHON_TEST_ENVIRONMENT "PYTHONDONTWRITEBYTECODE=1") if(APPLE) list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${LAMMPS_LIB_PATH}:$ENV{DYLD_LIBRARY_PATH}") elseif(WIN32) From 64b88f2e138533d2fb700331d787cd5cec5d8f18 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 03:20:29 -0400 Subject: [PATCH 200/364] add versionadded/versionchanged markers for features from 15Sep2022 and 3Aug2022 --- doc/src/compute_sna_atom.rst | 24 +++++++++++++----------- doc/src/fix_latte.rst | 2 ++ doc/src/fix_shake.rst | 11 +++++++---- doc/src/pair_modify.rst | 2 ++ doc/src/pair_srp.rst | 2 ++ doc/src/pair_sw.rst | 2 ++ doc/src/read_dump.rst | 2 ++ 7 files changed, 30 insertions(+), 15 deletions(-) diff --git a/doc/src/compute_sna_atom.rst b/doc/src/compute_sna_atom.rst index 1b6b200685..ac55aebd08 100644 --- a/doc/src/compute_sna_atom.rst +++ b/doc/src/compute_sna_atom.rst @@ -228,18 +228,20 @@ command: See section below on output for a detailed explanation of the data layout in the global array. +.. versionadded:: 3Aug2022 + The compute *sna/grid* and *sna/grid/local* commands calculate -bispectrum components for a regular grid of points. -These are calculated from the local density of nearby atoms *i'* -around each grid point, as if there was a central atom *i* -at the grid point. This is useful for characterizing fine-scale -structure in a configuration of atoms, and it is used -in the `MALA package `_ -to build machine-learning surrogates for finite-temperature Kohn-Sham -density functional theory (:ref:`Ellis et al. `) -Neighbor atoms not in the group do not contribute to the -bispectrum components of the grid points. The distance cutoff :math:`R_{ii'}` -assumes that *i* has the same type as the neighbor atom *i'*. +bispectrum components for a regular grid of points. These are +calculated from the local density of nearby atoms *i'* around each grid +point, as if there was a central atom *i* at the grid point. This is +useful for characterizing fine-scale structure in a configuration of +atoms, and it is used in the `MALA package +`_ to build machine-learning surrogates +for finite-temperature Kohn-Sham density functional theory (:ref:`Ellis +et al. `) Neighbor atoms not in the group do not contribute +to the bispectrum components of the grid points. The distance cutoff +:math:`R_{ii'}` assumes that *i* has the same type as the neighbor atom +*i'*. Compute *sna/grid* calculates a global array containing bispectrum components for a regular grid of points. diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index 202f8cf374..de3ac5adde 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -81,6 +81,8 @@ The *coulomb* argument is not yet supported by fix latte (as of Sept Coulomb potential as an alternative to LATTE performing the calculation. +.. versionadded:: 15Sep2022 + The *exclude* argument allows this fix to work in tandem with another fix which may decide to delete one or more atoms of molecules. The specified fixID is the ID of the other fix. diff --git a/doc/src/fix_shake.rst b/doc/src/fix_shake.rst index f5742b8f9f..e6fbad7fdc 100644 --- a/doc/src/fix_shake.rst +++ b/doc/src/fix_shake.rst @@ -58,10 +58,13 @@ Description Apply bond and angle constraints to specified bonds and angles in the simulation by either the SHAKE or RATTLE algorithms. This typically -enables a longer timestep. The SHAKE or RATTLE algorithms, however, can -*only* be applied during molecular dynamics runs. When this fix is used -during a minimization, the constraints are *approximated* by strong -harmonic restraints. +enables a longer timestep. The SHAKE or RATTLE constraint algorithms, +however, can *only* be applied during molecular dynamics runs. + +.. versionchanged:: 15Sep2022 + +These fixes may still be used during minimization. In that case the +constraints are *approximated* by strong harmonic restraints. **SHAKE vs RATTLE:** diff --git a/doc/src/pair_modify.rst b/doc/src/pair_modify.rst index 6d4171fbc9..f08fb7a82f 100644 --- a/doc/src/pair_modify.rst +++ b/doc/src/pair_modify.rst @@ -284,6 +284,8 @@ the *pair* keyword. Use *no* to disable, or *yes* to enable. The "pair_modify pair compute/tally" command must be issued **before** the corresponding compute style is defined. +.. versionadded:: 3Aug2022 + The *neigh/trim* keyword controls whether an explicit cutoff is set for each neighbor list request issued by individual pair sub-styles when using :doc:`pair hybrid/overlay `. When this keyword is diff --git a/doc/src/pair_srp.rst b/doc/src/pair_srp.rst index 6c9a128447..7122c40c1e 100644 --- a/doc/src/pair_srp.rst +++ b/doc/src/pair_srp.rst @@ -132,6 +132,8 @@ at the cutoff distance :math:`r_c`. ---------- +.. versionadded:: 3Aug2022 + Pair style *srp/react* interfaces the pair style *srp* with the bond breaking and formation mechanisms provided by fix *bond/break* and fix *bond/create*, respectively. When using this pair style, whenever a diff --git a/doc/src/pair_sw.rst b/doc/src/pair_sw.rst index 438eabc711..579e4c6f3f 100644 --- a/doc/src/pair_sw.rst +++ b/doc/src/pair_sw.rst @@ -130,6 +130,8 @@ terms. so the inconsistency between potential and force can be neglected in actual simulations. +.. versionadded:: 3Aug2022 + The *threebody* keyword is optional and determines whether or not the three-body term of the potential is calculated. The default value is "on" and it is only available for the plain *sw* pair style variants, diff --git a/doc/src/read_dump.rst b/doc/src/read_dump.rst index 311727f2c6..bee4629dfd 100644 --- a/doc/src/read_dump.rst +++ b/doc/src/read_dump.rst @@ -266,6 +266,8 @@ replace properties of the current system. There are various options for how this is done, determined by the specified fields and optional keywords. +.. versionchanged:: 3Aug2022 + The timestep of the snapshot becomes the current timestep for the simulation unless the *timestep* keyword is specified with a *no* value (default setting is *yes*). See the :doc:`reset_timestep ` From 3a95a7b9731f5a8bdf5652b100ea4582cb891687 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 03:51:54 -0400 Subject: [PATCH 201/364] add utility to detect pending version tags in .. versionadded/changed:: --- doc/src/Tools.rst | 1 + src/Makefile | 5 +- tools/coding_standard/README | 1 + tools/coding_standard/versiontags.py | 120 +++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 tools/coding_standard/versiontags.py diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index f8c8bd7240..b70c7677e0 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -205,6 +205,7 @@ scripts are available: whitespace.py # detects TAB characters and trailing whitespace homepage.py # detects outdated LAMMPS homepage URLs (pointing to sandia.gov instead of lammps.org) errordocs.py # detects deprecated error docs in header files + versiontags.py # detects .. versionadded:: or .. versionchanged:: with pending version date The tools need to be given the main folder of the LAMMPS distribution or individual file names as argument and will by default check them diff --git a/src/Makefile b/src/Makefile index 3074b0f6b8..923cc535fd 100644 --- a/src/Makefile +++ b/src/Makefile @@ -477,7 +477,7 @@ tar: @cd STUBS; $(MAKE) @echo "Created $(ROOT)_src.tar.gz" -check: check-whitespace check-permissions check-homepage check-errordocs +check: check-whitespace check-permissions check-homepage check-errordocs check-version check-whitespace: $(PYTHON) ../tools/coding_standard/whitespace.py .. @@ -503,6 +503,9 @@ check-errordocs: fix-errordocs: $(PYTHON) ../tools/coding_standard/errordocs.py .. -f +check-version: + $(PYTHON) ../tools/coding_standard/versiontags.py .. + format-src: clang-format -i --verbose --style=file *.cpp *.h */*.cpp */*.h diff --git a/tools/coding_standard/README b/tools/coding_standard/README index b5e483f38e..b19d7241f4 100644 --- a/tools/coding_standard/README +++ b/tools/coding_standard/README @@ -5,3 +5,4 @@ permissions.py detects if sources have executable permissions and scripts have whitespace.py detects TAB characters and trailing whitespace homepage.py detects outdated LAMMPS homepage URLs (pointing to sandia.gov instead of lammps.org) errordocs.py detects deprecated error docs in header files +versiontags.py detects .. versionadded:: and .. versionchanged:: with pending version date diff --git a/tools/coding_standard/versiontags.py b/tools/coding_standard/versiontags.py new file mode 100644 index 0000000000..583c242b9c --- /dev/null +++ b/tools/coding_standard/versiontags.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +# Utility for detecting and setting `.. versionadded::` and `.. versionchanged::`` +# +from __future__ import print_function +import sys + +if sys.version_info.major < 3: + sys.exit('This script must be run with Python 3.5 or later') + +if sys.version_info.minor < 5: + sys.exit('This script must be run with Python 3.5 or later') + +import os +import glob +import re +import yaml +import argparse +import shutil + +DEFAULT_CONFIG = """ +recursive: true +include: + - doc/src/** + - python + - src/** +exclude: + - src/Make.sh +patterns: + - "*.c" + - "*.cpp" + - "*.h" + - "*.md" + - "*.py" + - "*.rst" + - "*.f90" +""" + +def check_pending_tag(f): + pattern = re.compile(r'\.\. +version(changed|added):: +TBD') + last_line = "\n" + lineno = 1 + errors = set() + + for line in f: + if pattern.match(line): + errors.add(lineno) + last_line = line + lineno += 1 + + return errors, last_line + +def check_file(path): + encoding = 'UTF-8' + pending_tags = set() + try: + with open(path, 'r') as f: + pending_tags, last_line = check_pending_tag(f) + except UnicodeDecodeError: + encoding = 'ISO-8859-1' + try: + with open(path, 'r', encoding=encoding) as f: + pending_tags, last_line = check_pending_tag(f) + except Exception: + encoding = 'unknown' + + return { + 'pending_tags': pending_tags, + 'encoding': encoding + } + +def check_folder(directory, config, verbose=False): + success = True + files = [] + + for base_path in config['include']: + for pattern in config['patterns']: + path = os.path.join(directory, base_path, pattern) + files += glob.glob(path, recursive=config['recursive']) + for exclude in config['exclude']: + files = [f for f in files if not f.startswith(os.path.join(directory,exclude))] + + for f in files: + path = os.path.normpath(f) + + if verbose: + print("Checking file:", path) + + result = check_file(path) + + for lineno in result['pending_tags']: + print("[Error] Pending version tag @ {}:{}".format(path, lineno)) + success = False + + if result['encoding'] == 'unknown': + print("[Error] Unknown text encoding @ {}".format(path)) + success = False + elif result['encoding'] == 'ISO-8859-1': + print("[Error] Found ISO-8859-1 encoding instead of UTF-8 @ {}".format(path)) + + return success + +def main(): + parser = argparse.ArgumentParser(description='Utility for detecting pending version markers in LAMMPS') + parser.add_argument('-c', '--config', metavar='CONFIG_FILE', help='location of a optional configuration file') + parser.add_argument('-v', '--verbose', action='store_true', help='verbose output') + parser.add_argument('DIRECTORY', help='directory that should be checked') + args = parser.parse_args() + lammpsdir = os.path.abspath(os.path.expanduser(args.DIRECTORY)) + + if args.config: + with open(args.config, 'r') as cfile: + config = yaml.load(cfile, Loader=yaml.FullLoader) + else: + config = yaml.load(DEFAULT_CONFIG, Loader=yaml.FullLoader) + + if not check_folder(lammpsdir, config, args.verbose): + sys.exit(1) + +if __name__ == "__main__": + main() From 51624fa78ded93a6ea8bbbdd10c01b8195afe77f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 03:55:45 -0400 Subject: [PATCH 202/364] whitespace --- tools/coding_standard/versiontags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/coding_standard/versiontags.py b/tools/coding_standard/versiontags.py index 583c242b9c..ecaa681b13 100644 --- a/tools/coding_standard/versiontags.py +++ b/tools/coding_standard/versiontags.py @@ -90,7 +90,7 @@ def check_folder(directory, config, verbose=False): for lineno in result['pending_tags']: print("[Error] Pending version tag @ {}:{}".format(path, lineno)) success = False - + if result['encoding'] == 'unknown': print("[Error] Unknown text encoding @ {}".format(path)) success = False From 084024cdc39f9b2e625627365ee0cdfc383db7f2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 06:41:37 -0400 Subject: [PATCH 203/364] format --- src/dump.h | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/dump.h b/src/dump.h index ce2025fe79..ecff27f7dd 100644 --- a/src/dump.h +++ b/src/dump.h @@ -45,15 +45,9 @@ class Dump : protected Pointers { void init(); virtual void write(); - virtual int pack_forward_comm(int, int *, double *, int, int *) - { - return 0; - } + virtual int pack_forward_comm(int, int *, double *, int, int *) { return 0; } virtual void unpack_forward_comm(int, int, double *) {} - virtual int pack_reverse_comm(int, int, double *) - { - return 0; - } + virtual int pack_reverse_comm(int, int, double *) { return 0; } virtual void unpack_reverse_comm(int, int *, double *) {} void modify_params(int, char **); @@ -157,17 +151,11 @@ class Dump : protected Pointers { virtual void init_style() = 0; virtual void openfile(); - virtual int modify_param(int, char **) - { - return 0; - } + virtual int modify_param(int, char **) { return 0; } virtual void write_header(bigint) = 0; virtual int count(); virtual void pack(tagint *) = 0; - virtual int convert_string(int, double *) - { - return 0; - } + virtual int convert_string(int, double *) { return 0; } virtual void write_data(int, double *) = 0; virtual void write_footer() {} From 67a210e6d8043d0afc61ab8586663de98850df9c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 06:41:51 -0400 Subject: [PATCH 204/364] no need to include pair.h --- src/CLASS2/bond_class2.cpp | 6 +++--- src/EXTRA-MOLECULE/dihedral_fourier.cpp | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/CLASS2/bond_class2.cpp b/src/CLASS2/bond_class2.cpp index 8aec47c394..2b33039a13 100644 --- a/src/CLASS2/bond_class2.cpp +++ b/src/CLASS2/bond_class2.cpp @@ -16,18 +16,18 @@ Contributing author: Eric Simon (Cray) ------------------------------------------------------------------------- */ -#include #include "bond_class2.h" -#include #include "atom.h" #include "neighbor.h" #include "comm.h" #include "force.h" -#include "pair.h" #include "memory.h" #include "error.h" +#include +#include + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ diff --git a/src/EXTRA-MOLECULE/dihedral_fourier.cpp b/src/EXTRA-MOLECULE/dihedral_fourier.cpp index 666b5e91a1..afc309ee17 100644 --- a/src/EXTRA-MOLECULE/dihedral_fourier.cpp +++ b/src/EXTRA-MOLECULE/dihedral_fourier.cpp @@ -26,7 +26,6 @@ #include "math_const.h" #include "memory.h" #include "neighbor.h" -#include "pair.h" #include From 971f5672c98e4231a45ebea674ba6b9842b58971 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 07:11:25 -0400 Subject: [PATCH 205/364] add missing sllod initialization fixes --- src/INTEL/fix_nvt_sllod_intel.cpp | 1 + src/KOKKOS/fix_nvt_sllod_kokkos.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/INTEL/fix_nvt_sllod_intel.cpp b/src/INTEL/fix_nvt_sllod_intel.cpp index eb11c8a7bb..aa85d74310 100644 --- a/src/INTEL/fix_nvt_sllod_intel.cpp +++ b/src/INTEL/fix_nvt_sllod_intel.cpp @@ -51,6 +51,7 @@ FixNVTSllodIntel::FixNVTSllodIntel(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(fmt::format("{} {} temp/deform", id_temp,group->names[igroup])); tcomputeflag = 1; + nondeformbias = 0; } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp index 5ba0e6b666..8f3d830507 100644 --- a/src/KOKKOS/fix_nvt_sllod_kokkos.cpp +++ b/src/KOKKOS/fix_nvt_sllod_kokkos.cpp @@ -56,6 +56,7 @@ FixNVTSllodKokkos::FixNVTSllodKokkos(LAMMPS *lmp, int narg, char **a this->id_temp = utils::strdup(std::string(this->id)+"_temp"); this->modify->add_compute(fmt::format("{} all temp/deform/kk",this->id_temp)); this->tcomputeflag = 1; + this->nondeformbias = 0; } /* ---------------------------------------------------------------------- */ From af3da50bda9aeb897f3a1a163acffbe41bca9e9d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 09:36:27 -0400 Subject: [PATCH 206/364] add some more versionadded tags, now mostly complete for 2022 --- doc/src/Packages_details.rst | 24 ++++++++++++++++++++++++ doc/src/compute_ave_sphere_atom.rst | 2 ++ doc/src/compute_fep_ta.rst | 2 ++ doc/src/create_atoms.rst | 4 ++++ doc/src/delete_atoms.rst | 2 ++ doc/src/fix_adapt.rst | 2 ++ doc/src/fix_mdi_qm.rst | 2 ++ doc/src/fix_numdiff_virial.rst | 2 ++ doc/src/pair_harmonic_cut.rst | 2 ++ doc/src/pair_ilp_tmd.rst | 2 ++ doc/src/pair_mliap.rst | 2 ++ doc/src/pair_saip_metal.rst | 2 ++ doc/src/plugin.rst | 2 ++ doc/src/region.rst | 2 ++ 14 files changed, 52 insertions(+) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index dea49034a3..85857a4e1d 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -134,6 +134,8 @@ commands to write and read data using the ADIOS library. **Authors:** Norbert Podhorszki (ORNL) from the ADIOS developer team. +.. versionadded:: 28Feb2019 + **Install:** This package has :ref:`specific installation instructions ` on the :doc:`Build extras ` page. @@ -364,6 +366,8 @@ and also support self-propelled particles. **Authors:** Sam Cameron (University of Bristol), Stefan Paquay (while at Brandeis University) (initial version of fix propel/self) +.. versionadded:: 14May2021 + Example inputs are in the examples/PACKAGES/brownian folder. ---------- @@ -592,6 +596,8 @@ To use this package, also the :ref:`KSPACE ` and **Author:** Trung Nguyen and Monica Olvera de la Cruz (Northwestern U) +.. versionadded:: 2Jul2021 + **Supporting info:** * src/DIELECTRIC: filenames -> commands @@ -1512,6 +1518,8 @@ workflows via the `MolSSI Driver Interface **Author:** Taylor Barnes - MolSSI, taylor.a.barnes at gmail.com +.. versionadded:: 14May2021 + **Install:** This package has :ref:`specific installation instructions ` on @@ -1596,6 +1604,8 @@ of Alabama), Leonid V. Zhigilei (University of Virginia) **Author of the *mesocnt* styles:** Philipp Kloza (U Cambridge) +.. versionadded:: 15Jun2020 + **Supporting info:** * src/MESONT: filenames -> commands @@ -1688,6 +1698,8 @@ compiled on your system. **Author:** Andreas Singraber +.. versionadded:: 27May2021 + **Install:** This package has :ref:`specific installation instructions ` on the @@ -1722,6 +1734,10 @@ must be installed. **Author:** Aidan Thompson (Sandia), Nicholas Lubbers (LANL). +.. versionadded:: 30Jun2020 + + .. versionadded:: 30Jun2020 + **Supporting info:** * src/ML-IAP: filenames -> commands @@ -1766,6 +1782,8 @@ Aidan Thompson^3, Gabor Csanyi^2, Christoph Ortner^4, Ralf Drautz^1. ^4: University of British Columbia, Vancouver, BC, Canada +.. versionadded:: 14May2021 + **Install:** This package has :ref:`specific installation instructions ` on the @@ -1829,6 +1847,8 @@ of a neural network. This package was written by Christopher Barrett with contributions by Doyl Dickel, Mississippi State University. +.. versionadded:: 27May2021 + **Supporting info:** * src/ML-RANN: filenames -> commands @@ -2264,6 +2284,8 @@ try to load the contained plugins automatically at start-up. **Authors:** Axel Kohlmeyer (Temple U) +.. versionadded:: 8Apr2021 + **Supporting info:** * src/PLUGIN: filenames -> commands @@ -2907,6 +2929,8 @@ which discuss the `QuickFF `_ methodology. **Author:** Steven Vandenbrande. +.. versionadded:: 1Feb2019 + **Supporting info:** * src/YAFF/README diff --git a/doc/src/compute_ave_sphere_atom.rst b/doc/src/compute_ave_sphere_atom.rst index e5ed7e1437..ecb67ae7b5 100644 --- a/doc/src/compute_ave_sphere_atom.rst +++ b/doc/src/compute_ave_sphere_atom.rst @@ -35,6 +35,8 @@ Examples Description """"""""""" +.. versionadded:: 7Jan2022 + Define a computation that calculates the local mass density and temperature for each atom based on its neighbors inside a spherical cutoff. If an atom has :math:`M` neighbors, then its local mass density is diff --git a/doc/src/compute_fep_ta.rst b/doc/src/compute_fep_ta.rst index 1fe89194ca..5b08d08718 100644 --- a/doc/src/compute_fep_ta.rst +++ b/doc/src/compute_fep_ta.rst @@ -34,6 +34,8 @@ Examples Description """"""""""" +.. versionadded:: 4May2022 + Define a computation that calculates the change in the free energy due to a test-area (TA) perturbation :ref:`(Gloor) `. The test-area approach can be used to determine the interfacial tension of the system diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index c8f94f7d5e..17df11a5bf 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -189,6 +189,10 @@ to the area of that triangle. beneficial to exclude computing interactions between the created particles using :doc:`neigh_modify exclude `. +.. versionchanged:: 2Jun2022 + +The *porosity* style has been renamed to *random* with added functionality. + For the *random* style, *N* particles are added to the system at randomly generated coordinates, which can be useful for generating an amorphous system. The particles are created one by one using the diff --git a/doc/src/delete_atoms.rst b/doc/src/delete_atoms.rst index 749fc298b9..2fdd152196 100644 --- a/doc/src/delete_atoms.rst +++ b/doc/src/delete_atoms.rst @@ -116,6 +116,8 @@ must be in both the specified group and region. If *group-ID* = all, there is effectively no group criterion. If *region-ID* is specified as NULL, no region criterion is imposed. +.. versionadded:: 4May2022 + For style *variable*, all atoms for which the atom-style variable with the given name evaluates to non-zero will be deleted. Additional atoms can be deleted if they are in a molecule for which one or more atoms diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index a0c9c5edea..18caa3d54f 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -319,6 +319,8 @@ with fix_adapt are ---------- +.. versionadded:: 4May2022 + The *angle* keyword uses the specified variable to change the value of an angle coefficient over time, very similar to how the *pair* keyword operates. The only difference is that now an angle coefficient for a diff --git a/doc/src/fix_mdi_qm.rst b/doc/src/fix_mdi_qm.rst index fd0c6f13af..667dea710a 100644 --- a/doc/src/fix_mdi_qm.rst +++ b/doc/src/fix_mdi_qm.rst @@ -43,6 +43,8 @@ Examples Description """"""""""" +.. versionadded:: 3Aug2022 + This command enables LAMMPS to act as a client with another server code that will compute the total energy, per-atom forces, and total virial for atom conformations and simulation box size/shapes that diff --git a/doc/src/fix_numdiff_virial.rst b/doc/src/fix_numdiff_virial.rst index 647a0e592a..f909d41111 100644 --- a/doc/src/fix_numdiff_virial.rst +++ b/doc/src/fix_numdiff_virial.rst @@ -25,6 +25,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + Calculate the virial stress tensor through a finite difference calculation of energy versus strain. These values can be compared to the analytic virial tensor computed by pair styles, bond styles, etc. This can be useful for diff --git a/doc/src/pair_harmonic_cut.rst b/doc/src/pair_harmonic_cut.rst index 6b28db5fda..d91c3cf550 100644 --- a/doc/src/pair_harmonic_cut.rst +++ b/doc/src/pair_harmonic_cut.rst @@ -27,6 +27,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + Style *harmonic/cut* computes pairwise repulsive-only harmonic interactions with the formula .. math:: diff --git a/doc/src/pair_ilp_tmd.rst b/doc/src/pair_ilp_tmd.rst index a509b10cc3..77fa8bbfd5 100644 --- a/doc/src/pair_ilp_tmd.rst +++ b/doc/src/pair_ilp_tmd.rst @@ -32,6 +32,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + The *ilp/tmd* style computes the registry-dependent interlayer potential (ILP) potential for transition metal dichalcogenides (TMD) as described in :ref:`(Ouyang7) `. diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 900a2c2e6a..32737eaf50 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -55,6 +55,8 @@ useful to know the gradient or derivative of energy, force, and stress w.r.t. model parameters. This information can be accessed using the related :doc:`compute mliap ` command. +.. versionadded:: 2Jun2022 + The descriptor style *so3* is a descriptor that is derived from the the smooth SO(3) power spectrum with the explicit inclusion of a radial basis :ref:`(Bartok) ` and :ref:`(Zagaceta) `. diff --git a/doc/src/pair_saip_metal.rst b/doc/src/pair_saip_metal.rst index 0acf519a0e..21bfeb0aa9 100644 --- a/doc/src/pair_saip_metal.rst +++ b/doc/src/pair_saip_metal.rst @@ -32,6 +32,8 @@ Examples Description """"""""""" +.. versionadded:: 17Feb2022 + The *saip/metal* style computes the registry-dependent interlayer potential (ILP) potential for hetero-junctions formed with hexagonal 2D materials and metal surfaces, as described in :ref:`(Ouyang6) `. diff --git a/doc/src/plugin.rst b/doc/src/plugin.rst index 1a10ab84ad..41e2621fef 100644 --- a/doc/src/plugin.rst +++ b/doc/src/plugin.rst @@ -59,6 +59,8 @@ The *clear* command will unload all currently loaded plugins. .. admonition:: Automatic loading of plugins :class: note + .. versionadded:: 4May2022 + When the environment variable ``LAMMPS_PLUGIN_PATH`` is set, then LAMMPS will search the directory (or directories) listed in this path for files with names that end in ``plugin.so`` diff --git a/doc/src/region.rst b/doc/src/region.rst index db09bcfd42..4ebd731073 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -162,6 +162,8 @@ Thus the third example above specifies a cylinder with its axis in the y-direction located at x = 2.0 and z = 3.0, with a radius of 5.0, and extending in the y-direction from -5.0 to the upper box boundary. +.. versionadded:: 4May2022 + For style *ellipsoid*, an axis-aligned ellipsoid is defined. The ellipsoid has its center at (x,y,z) and is defined by 3 axis-aligned vectors given by A = (a,0,0); B = (0,b,0); C = (0,0,c). Note that From e38d7cf192ce7f1efb12b4fa2d88665f31b840b4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 10:37:59 -0400 Subject: [PATCH 207/364] update explanations for version updates in security policy file --- SECURITY.md | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index f06b781d11..7b0ed1f560 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,14 +14,14 @@ and tested by the LAMMPS developers, so it is easy to import bad behavior from calling functions in one of those libraries. Thus is is quite easy to crash LAMMPS through malicious input and do all -kinds of filesystem manipulations. And because of that LAMMPS should +kinds of file system manipulations. And because of that LAMMPS should **NEVER** be compiled or **run** as superuser, either from a "root" or "administrator" account directly or indirectly via "sudo" or "su". Therefore what could be seen as a security vulnerability is usually -either a user mistake or a bug in the code. Bugs can be reported in -the LAMMPS project -[issue tracker on GitHub](https://github.com/lammps/lammps/issues). +either a user mistake or a bug in the code. Bugs can be reported in the +LAMMPS project [issue tracker on +GitHub](https://github.com/lammps/lammps/issues). To mitigate issues with using homoglyphs or bidirectional reordering in unicode, which have been demonstrated as a vector to obfuscate and hide @@ -30,10 +30,18 @@ for unicode characters and only all-ASCII source code is accepted. # Version Updates -LAMMPS follows continuous release development model. We aim to keep all -release versions (stable or patch) fully functional and employ a variety -of automatic testing procedures to detect failures of existing -functionality from adding new features before releases are made. Thus -bugfixes and updates are only integrated into the current development -branch and thus the next (patch) release and users are recommended to -update regularly. +LAMMPS follows continuous release development model. We aim to keep to +keep the development version (develop branch) always fully functional +and employ a variety of automatic testing procedures to detect failures +of existing functionality from adding or modifying features. Most of +those tests are run on pull requests *before* merging to the development +branch. The develop branch is protected, so all changes *must* be +submitted as a pull request and thus cannot avoid the automated tests. + +Additional tests are run *after* merging. Before releases are made +*all* tests must have cleared. Then a release tag is applied and the +release branch fast-forwarded to that tag. Bug fixes and updates are +applied to the current development branch and thus will be available in +the next (patch) release. For stable releases, selected bug fixes are +back-ported and occasionally published as update releases. There are +only updates to the latest stable release. From e1bc3a4ade972387736092e09fd6a9025ecb9044 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 16:02:56 -0400 Subject: [PATCH 208/364] apply clang-format --- src/ML-PACE/pair_pace_extrapolation.cpp | 580 ++++++++++++------------ 1 file changed, 295 insertions(+), 285 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 053918ee82..907609b90f 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -47,384 +47,393 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau //#include "compute_pace_extrapolation.h" namespace LAMMPS_NS { - struct ACEALImpl { - ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} +struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} - ~ACEALImpl() { - delete basis_set; - delete ace; + ~ACEALImpl() + { + delete basis_set; + delete ace; - delete ctilde_basis_set; - delete rec_ace; - } + delete ctilde_basis_set; + delete rec_ace; + } - ACEBBasisSet *basis_set; - ACEBEvaluator *ace; - ACECTildeBasisSet *ctilde_basis_set; - ACERecursiveEvaluator *rec_ace; - }; + ACEBBasisSet *basis_set; + ACEBEvaluator *ace; + ACECTildeBasisSet *ctilde_basis_set; + ACERecursiveEvaluator *rec_ace; +}; } // namespace LAMMPS_NS using namespace LAMMPS_NS; using namespace MathConst; static char const *const elements_pace_al[] = { - "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", - "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", - "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", - "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", - "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", - "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", - "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; + "X", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", + "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", + "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", + "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", + "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", + "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", + "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; static constexpr int elements_num_pace_al = sizeof(elements_pace_al) / sizeof(const char *); -int AtomicNumberByName_pace_al(char *elname) { - for (int i = 1; i < elements_num_pace_al; i++) - if (strcmp(elname, elements_pace_al[i]) == 0) return i; - return -1; +int AtomicNumberByName_pace_al(char *elname) +{ + for (int i = 1; i < elements_num_pace_al; i++) + if (strcmp(elname, elements_pace_al[i]) == 0) return i; + return -1; } /* ---------------------------------------------------------------------- */ -PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) { - single_enable = 0; - restartinfo = 0; - one_coeff = 1; - manybody_flag = 1; +PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; - nmax = 0; + nmax = 0; - aceimpl = new ACEALImpl; - scale = nullptr; - extrapolation_grade_gamma = nullptr; + aceimpl = new ACEALImpl; + scale = nullptr; + extrapolation_grade_gamma = nullptr; } /* ---------------------------------------------------------------------- check if allocated, since class can be destructed when incomplete ------------------------------------------------------------------------- */ -PairPACEExtrapolation::~PairPACEExtrapolation() { - if (copymode) return; +PairPACEExtrapolation::~PairPACEExtrapolation() +{ + if (copymode) return; - delete aceimpl; + delete aceimpl; - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(scale); - memory->destroy(map); - memory->destroy(extrapolation_grade_gamma); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(scale); + memory->destroy(map); + memory->destroy(extrapolation_grade_gamma); + } } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::compute(int eflag, int vflag) { - int i, j, ii, jj, inum, jnum; - double delx, dely, delz, evdwl; - double fij[3]; - int *ilist, *jlist, *numneigh, **firstneigh; - ev_init(eflag, vflag); +void PairPACEExtrapolation::compute(int eflag, int vflag) +{ + int i, j, ii, jj, inum, jnum; + double delx, dely, delz, evdwl; + double fij[3]; + int *ilist, *jlist, *numneigh, **firstneigh; + ev_init(eflag, vflag); - // downwards modified by YL + // downwards modified by YL - double **x = atom->x; - double **f = atom->f; - tagint *tag = atom->tag; - int *type = atom->type; - // number of atoms in cell - int nlocal = atom->nlocal; + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + // number of atoms in cell + int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; + int newton_pair = force->newton_pair; - // number of atoms including ghost atoms - int nall = nlocal + atom->nghost; + // number of atoms including ghost atoms + int nall = nlocal + atom->nghost; - // inum: length of the neighborlists list - inum = list->inum; + // inum: length of the neighborlists list + inum = list->inum; - // ilist: list of "i" atoms for which neighbor lists exist - ilist = list->ilist; + // ilist: list of "i" atoms for which neighbor lists exist + ilist = list->ilist; - //numneigh: the length of each these neigbor list - numneigh = list->numneigh; + //numneigh: the length of each these neigbor list + numneigh = list->numneigh; - // the pointer to the list of neighbors of "i" - firstneigh = list->firstneigh; + // the pointer to the list of neighbors of "i" + firstneigh = list->firstneigh; - // this happens when used as substyle in pair style hybrid. - // So this check and error effectively disallows use with pair style hybrid. - if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } + // this happens when used as substyle in pair style hybrid. + // So this check and error effectively disallows use with pair style hybrid. + if (inum != nlocal) { error->all(FLERR, "inum: {} nlocal: {} are different", inum, nlocal); } - //if flag_compute_extrapolation_grade at this iteration then - // grow extrapolation_grade_gamma array, that store per-atom extrapolation grades - if (flag_compute_extrapolation_grade && atom->nlocal > nmax) { - memory->destroy(extrapolation_grade_gamma); - nmax = atom->nlocal; - memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); - //zeroify array - memset(extrapolation_grade_gamma, 0, nmax * sizeof(*extrapolation_grade_gamma)); + //if flag_compute_extrapolation_grade at this iteration then + // grow extrapolation_grade_gamma array, that store per-atom extrapolation grades + if (flag_compute_extrapolation_grade && atom->nlocal > nmax) { + memory->destroy(extrapolation_grade_gamma); + nmax = atom->nlocal; + memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); + //zeroify array + memset(extrapolation_grade_gamma, 0, nmax * sizeof(*extrapolation_grade_gamma)); + } + + //determine the maximum number of neighbours + int max_jnum = 0; + int nei = 0; + for (ii = 0; ii < list->inum; ii++) { + i = ilist[ii]; + jnum = numneigh[i]; + nei = nei + jnum; + if (jnum > max_jnum) max_jnum = jnum; + } + + if (flag_compute_extrapolation_grade) + aceimpl->ace->resize_neighbours_cache(max_jnum); + else + aceimpl->rec_ace->resize_neighbours_cache(max_jnum); + + //loop over atoms + for (ii = 0; ii < list->inum; ii++) { + i = list->ilist[ii]; + const int itype = type[i]; + + const double xtmp = x[i][0]; + const double ytmp = x[i][1]; + const double ztmp = x[i][2]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // checking if neighbours are actually within cutoff range is done inside compute_atom + // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom + // by using 'ace->element_type_mapping' array + // x: [r0 ,r1, r2, ..., r100] + // i = 0 ,1 + // jnum(0) = 50 + // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] + try { + if (flag_compute_extrapolation_grade) + aceimpl->ace->compute_atom(i, x, type, jnum, jlist); + else + aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); + } catch (std::exception &e) { + error->one(FLERR, e.what()); + } + // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade + + if (flag_compute_extrapolation_grade) { + extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; + ; } - //determine the maximum number of neighbours - int max_jnum = 0; - int nei = 0; - for (ii = 0; ii < list->inum; ii++) { - i = ilist[ii]; - jnum = numneigh[i]; - nei = nei + jnum; - if (jnum > max_jnum) max_jnum = jnum; + Array2D &neighbours_forces = + (flag_compute_extrapolation_grade ? aceimpl->ace->neighbours_forces + : aceimpl->rec_ace->neighbours_forces); + //optionally assign global forces arrays + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + const int jtype = type[j]; + j &= NEIGHMASK; + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + + fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); + fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); + fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); + + f[i][0] += fij[0]; + f[i][1] += fij[1]; + f[i][2] += fij[2]; + f[j][0] -= fij[0]; + f[j][1] -= fij[1]; + f[j][2] -= fij[2]; + + // tally per-atom virial contribution + if (vflag) + ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, + -delz); } - - if (flag_compute_extrapolation_grade) - aceimpl->ace->resize_neighbours_cache(max_jnum); - else - aceimpl->rec_ace->resize_neighbours_cache(max_jnum); - - //loop over atoms - for (ii = 0; ii < list->inum; ii++) { - i = list->ilist[ii]; - const int itype = type[i]; - - const double xtmp = x[i][0]; - const double ytmp = x[i][1]; - const double ztmp = x[i][2]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // checking if neighbours are actually within cutoff range is done inside compute_atom - // mapping from LAMMPS atom types ('type' array) to ACE species is done inside compute_atom - // by using 'ace->element_type_mapping' array - // x: [r0 ,r1, r2, ..., r100] - // i = 0 ,1 - // jnum(0) = 50 - // jlist(neigh ind of 0-atom) = [1,2,10,7,99,25, .. 50 element in total] - try { - if (flag_compute_extrapolation_grade) - aceimpl->ace->compute_atom(i, x, type, jnum, jlist); - else - aceimpl->rec_ace->compute_atom(i, x, type, jnum, jlist); - } catch (std::exception &e) { - error->one(FLERR, e.what()); - } - // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade - - if (flag_compute_extrapolation_grade) { - extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade;; - } - - Array2D &neighbours_forces = - (flag_compute_extrapolation_grade ? aceimpl->ace->neighbours_forces - : aceimpl->rec_ace->neighbours_forces); - //optionally assign global forces arrays - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - const int jtype = type[j]; - j &= NEIGHMASK; - delx = x[j][0] - xtmp; - dely = x[j][1] - ytmp; - delz = x[j][2] - ztmp; - - fij[0] = scale[itype][jtype] * neighbours_forces(jj, 0); - fij[1] = scale[itype][jtype] * neighbours_forces(jj, 1); - fij[2] = scale[itype][jtype] * neighbours_forces(jj, 2); - - f[i][0] += fij[0]; - f[i][1] += fij[1]; - f[i][2] += fij[2]; - f[j][0] -= fij[0]; - f[j][1] -= fij[1]; - f[j][2] -= fij[2]; - - // tally per-atom virial contribution - if (vflag) - ev_tally_xyz(i, j, nlocal, newton_pair, 0.0, 0.0, fij[0], fij[1], fij[2], -delx, -dely, - -delz); - } - - - // tally energy contribution - if (eflag) { - // evdwl = energy of atom I - DOUBLE_TYPE e_atom; - if (flag_compute_extrapolation_grade) - e_atom = aceimpl->ace->e_atom; - else - e_atom = aceimpl->rec_ace->e_atom; - evdwl = scale[itype][itype] * e_atom; - ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); - } + // tally energy contribution + if (eflag) { + // evdwl = energy of atom I + DOUBLE_TYPE e_atom; + if (flag_compute_extrapolation_grade) + e_atom = aceimpl->ace->e_atom; + else + e_atom = aceimpl->rec_ace->e_atom; + evdwl = scale[itype][itype] * e_atom; + ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); } + } - if (vflag_fdotr) virial_fdotr_compute(); + if (vflag_fdotr) virial_fdotr_compute(); - // end modifications YL + // end modifications YL } /* ---------------------------------------------------------------------- */ -void PairPACEExtrapolation::allocate() { - allocated = 1; - int n = atom->ntypes; +void PairPACEExtrapolation::allocate() +{ + allocated = 1; + int n = atom->ntypes; - memory->create(setflag, n + 1, n + 1, "pair:setflag"); - memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(map, n + 1, "pair:map"); - memory->create(scale, n + 1, n + 1, "pair:scale"); + memory->create(setflag, n + 1, n + 1, "pair:setflag"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(map, n + 1, "pair:map"); + memory->create(scale, n + 1, n + 1, "pair:scale"); } /* ---------------------------------------------------------------------- global settings ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::settings(int narg, char **arg) { - if (narg > 0) { - error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/extrapolation "); - } +void PairPACEExtrapolation::settings(int narg, char **arg) +{ + if (narg > 0) { + error->all(FLERR, + "Illegal pair_style command. Correct form:\n\tpair_style pace/extrapolation "); + } - if (comm->me == 0) { - utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - } + if (comm->me == 0) { + utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); + } } /* ---------------------------------------------------------------------- set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::coeff(int narg, char **arg) { +void PairPACEExtrapolation::coeff(int narg, char **arg) +{ - if (narg < 5) - error->all(FLERR, - "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " - " elem1 elem2 ..."); + if (narg < 5) + error->all(FLERR, + "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " + " elem1 elem2 ..."); - if (!allocated) allocate(); + if (!allocated) allocate(); - map_element2type(narg - 4, arg + 4); + map_element2type(narg - 4, arg + 4); - auto potential_file_name = utils::get_potential_file_path(arg[2]); - auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); - char **elemtypes = &arg[4]; + auto potential_file_name = utils::get_potential_file_path(arg[2]); + auto active_set_inv_filename = utils::get_potential_file_path(arg[3]); + char **elemtypes = &arg[4]; - delete aceimpl->basis_set; - delete aceimpl->ctilde_basis_set; + delete aceimpl->basis_set; + delete aceimpl->ctilde_basis_set; - //load potential file - aceimpl->basis_set = new ACEBBasisSet(); - if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); - aceimpl->basis_set->load(potential_file_name); + //load potential file + aceimpl->basis_set = new ACEBBasisSet(); + if (comm->me == 0) utils::logmesg(lmp, "Loading {}\n", potential_file_name); + aceimpl->basis_set->load(potential_file_name); - //convert the basis set to CTilde format - aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); - *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); + //convert the basis set to CTilde format + aceimpl->ctilde_basis_set = new ACECTildeBasisSet(); + *aceimpl->ctilde_basis_set = aceimpl->basis_set->to_ACECTildeBasisSet(); - if (comm->me == 0) { - utils::logmesg(lmp, "Total number of basis functions\n"); + if (comm->me == 0) { + utils::logmesg(lmp, "Total number of basis functions\n"); - for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { - int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; - int n = aceimpl->basis_set->total_basis_size[mu]; - utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, - n); - } + for (SPECIES_TYPE mu = 0; mu < aceimpl->basis_set->nelements; mu++) { + int n_r1 = aceimpl->basis_set->total_basis_size_rank1[mu]; + int n = aceimpl->basis_set->total_basis_size[mu]; + utils::logmesg(lmp, "\t{}: {} (r=1) {} (r>1)\n", aceimpl->basis_set->elements_name[mu], n_r1, + n); } + } - // read args that map atom types to PACE elements - // map[i] = which element the Ith atom type is, -1 if not mapped - // map[0] is not used - delete aceimpl->ace; - delete aceimpl->rec_ace; + // read args that map atom types to PACE elements + // map[i] = which element the Ith atom type is, -1 if not mapped + // map[0] is not used + delete aceimpl->ace; + delete aceimpl->rec_ace; - aceimpl->ace = new ACEBEvaluator(); - aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->ace = new ACEBEvaluator(); + aceimpl->ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->rec_ace = new ACERecursiveEvaluator(); - aceimpl->rec_ace->set_recursive(true); - aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); - aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential + aceimpl->rec_ace = new ACERecursiveEvaluator(); + aceimpl->rec_ace->set_recursive(true); + aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); + aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential - FILE *species_type_file = nullptr; + FILE *species_type_file = nullptr; - const int n = atom->ntypes; - element_names.resize(n); - for (int i = 1; i <= n; i++) { - char *elemname = elemtypes[i - 1]; - element_names[i - 1] = elemname; - if (strcmp(elemname, "NULL") == 0) { - // species_type=-1 value will not reach ACE Evaluator::compute_atom, - // but if it will ,then error will be thrown there - aceimpl->ace->element_type_mapping(i) = -1; - map[i] = -1; - if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); - } else { - // dump species types for reconstruction of atomic configurations - int atomic_number = AtomicNumberByName_pace_al(elemname); - if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); - SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); - if (mu != -1) { - if (comm->me == 0) - utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, - elemname, mu); - map[i] = mu; - // set up LAMMPS atom type to ACE species mapping for ace evaluators - aceimpl->ace->element_type_mapping(i) = mu; - aceimpl->rec_ace->element_type_mapping(i) = mu; - } else { - error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, - potential_file_name); - } - } + const int n = atom->ntypes; + element_names.resize(n); + for (int i = 1; i <= n; i++) { + char *elemname = elemtypes[i - 1]; + element_names[i - 1] = elemname; + if (strcmp(elemname, "NULL") == 0) { + // species_type=-1 value will not reach ACE Evaluator::compute_atom, + // but if it will ,then error will be thrown there + aceimpl->ace->element_type_mapping(i) = -1; + map[i] = -1; + if (comm->me == 0) utils::logmesg(lmp, "Skipping LAMMPS atom type #{}(NULL)\n", i); + } else { + // dump species types for reconstruction of atomic configurations + int atomic_number = AtomicNumberByName_pace_al(elemname); + if (atomic_number == -1) error->all(FLERR, "'{}' is not a valid element\n", elemname); + SPECIES_TYPE mu = aceimpl->basis_set->get_species_index_by_name(elemname); + if (mu != -1) { + if (comm->me == 0) + utils::logmesg(lmp, "Mapping LAMMPS atom type #{}({}) -> ACE species type #{}\n", i, + elemname, mu); + map[i] = mu; + // set up LAMMPS atom type to ACE species mapping for ace evaluators + aceimpl->ace->element_type_mapping(i) = mu; + aceimpl->rec_ace->element_type_mapping(i) = mu; + } else { + error->all(FLERR, "Element {} is not supported by ACE-potential from file {}", elemname, + potential_file_name); + } } + } - aceimpl->ace->set_basis(*aceimpl->basis_set); - aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); + aceimpl->ace->set_basis(*aceimpl->basis_set); + aceimpl->rec_ace->set_basis(*aceimpl->ctilde_basis_set); - if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); - aceimpl->ace->load_active_set(active_set_inv_filename); + if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); + aceimpl->ace->load_active_set(active_set_inv_filename); - // clear setflag since coeff() called once with I,J = * * - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) scale[i][j] = 1.0; + // clear setflag since coeff() called once with I,J = * * + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) scale[i][j] = 1.0; } /* ---------------------------------------------------------------------- init specific to this pair style ------------------------------------------------------------------------- */ -void PairPACEExtrapolation::init_style() { - if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); - if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); +void PairPACEExtrapolation::init_style() +{ + if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); - // request a full neighbor list - neighbor->add_request(this, NeighConst::REQ_FULL); + // request a full neighbor list + neighbor->add_request(this, NeighConst::REQ_FULL); } /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairPACEExtrapolation::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - //cutoff from the basis set's radial functions settings - scale[j][i] = scale[i][j]; - return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); +double PairPACEExtrapolation::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + //cutoff from the basis set's radial functions settings + scale[j][i] = scale[i][j]; + return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); } -/* ---------------------------------------------------------------------- +/* ---------------------------------------------------------------------- extract method for extracting value of scale variable ---------------------------------------------------------------------- */ -void *PairPACEExtrapolation::extract(const char *str, int &dim) { - //check if str=="gamma_flag" then compute extrapolation grades on this iteration - dim = 0; - if (strcmp(str, "gamma_flag")==0) - return (void *) &flag_compute_extrapolation_grade; +void *PairPACEExtrapolation::extract(const char *str, int &dim) +{ + //check if str=="gamma_flag" then compute extrapolation grades on this iteration + dim = 0; + if (strcmp(str, "gamma_flag") == 0) return (void *) &flag_compute_extrapolation_grade; - dim = 2; - if (strcmp(str, "scale") == 0) return (void *) scale; - return nullptr; + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return nullptr; } /* ---------------------------------------------------------------------- @@ -435,11 +444,12 @@ void *PairPACEExtrapolation::extract(const char *str, int &dim) { 1 or more = # of columns in per-atom array return NULL if str is not recognized ---------------------------------------------------------------------- */ -void *PairPACEExtrapolation::extract_peratom(const char *str, int &ncol) { - if (strcmp(str, "gamma") == 0) { - ncol = 0; - return (void *) extrapolation_grade_gamma; - } +void *PairPACEExtrapolation::extract_peratom(const char *str, int &ncol) +{ + if (strcmp(str, "gamma") == 0) { + ncol = 0; + return (void *) extrapolation_grade_gamma; + } - return nullptr; -} \ No newline at end of file + return nullptr; +} From 23b15ac4ca5f19fe4e9d41b6d43498ad7732e955 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 16:58:47 -0400 Subject: [PATCH 209/364] temporarily comment out code that breaks compilation --- src/ML-PACE/pair_pace_extrapolation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 907609b90f..26de937ddb 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -215,8 +215,8 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade if (flag_compute_extrapolation_grade) { - extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; - ; + //FIXME: need an updated PACE library URL since this currently fails compiling + // extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; } Array2D &neighbours_forces = From ca6733c345fd814201e9b5f985c9a5da7513fa41 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 16:59:01 -0400 Subject: [PATCH 210/364] remove unused lines --- src/ML-PACE/pair_pace_extrapolation.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 26de937ddb..0ffafb21fc 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -25,7 +25,6 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "atom.h" #include "comm.h" -#include "dump_custom.h" #include "error.h" #include "force.h" #include "math_const.h" @@ -44,7 +43,6 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "ace_b_evaluator.h" #include "ace_recursive.h" #include "ace_version.h" -//#include "compute_pace_extrapolation.h" namespace LAMMPS_NS { struct ACEALImpl { From fc830d13978e3950b85da7dd531bab746655411b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 17:00:12 -0400 Subject: [PATCH 211/364] restore original ML-PACE CMake code and update for new dependencies --- cmake/Modules/Packages/ML-PACE.cmake | 53 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 98a9496154..3f4731eac3 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,36 +1,37 @@ -if(NOT DEFINED LOCAL_ML-PACE) - # standard user scenario: get latest ML-PACE from github - set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.06.27.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.06.27.tar.gz" CACHE STRING "URL for PACE evaluator library sources") - set(PACELIB_MD5 "400f0a4b44c1ce64ae47796e6de4bba8" CACHE STRING "MD5 checksum of PACE evaluator library tarball") - mark_as_advanced(PACELIB_URL) - mark_as_advanced(PACELIB_MD5) +set(PACELIB_MD5 "400f0a4b44c1ce64ae47796e6de4bba8" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +mark_as_advanced(PACELIB_URL) +mark_as_advanced(PACELIB_MD5) -# message("-- [ML-PACE]: Downloading from ${PACELIB_URL}") - # download library sources to build folder - file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS +# download library sources to build folder +file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz EXPECTED_HASH MD5=${PACELIB_MD5}) #SHOW_PROGRESS - # 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} - ) - get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) -else() - # developer scenario: use local ML-PACE +# 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} +) +get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) - if(EXISTS ${LOCAL_ML-PACE}) - set(lib-pace ${LOCAL_ML-PACE}) - message("-- [ML-PACE]: Using local folder ${lib-pace}") - else() - message(FATAL_ERROR "-- [ML-PACE]: ERROR! Folder ${LOCAL_ML-PACE} does not exist") - endif() -endif() -add_subdirectory(${lib-pace} build-pace) +# enforce building libyaml-cpp as static library and turn off optional features +set(YAML_BUILD_SHARED_LIBS OFF) +set(YAML_CPP_BUILD_CONTRIB OFF) +set(YAML_CPP_BUILD_TOOLS OFF) +add_subdirectory(${lib-pace}/yaml-cpp build-yaml-cpp) +set(YAML_CPP_INCLUDE_DIR ${lib-pace}/yaml-cpp/include) + +set(PACE_INCLUDE_DIRS "${lib-pace}/ML-PACE/ace" "${lib-pace}/ML-PACE/ace-evaluator" "${lib-pace}/wigner-cpp/include/wigner") +file(GLOB PACE_SOURCES ${lib-pace}/ML-PACE/ace/*.cpp ${lib-pace}/ML-PACE/ace-evaluator/*.cpp) +list(FILTER PACE_SOURCES EXCLUDE REGEX pair_pace.cpp) + +add_library(pace STATIC ${PACE_SOURCES} ${lib-pace}/cnpy/cnpy.cpp) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) +target_include_directories(pace PUBLIC ${PACE_INCLUDE_DIRS} ${YAML_CPP_INCLUDE_DIR} ${lib-pace}/cnpy) +target_link_libraries(pace PRIVATE yaml-cpp-pace) if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) endif() From d205d4a6df2e66833c258cb9a89aa8369dbdb1ad Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Thu, 22 Sep 2022 17:05:13 +0200 Subject: [PATCH 212/364] remove docs for unexisting command `compute pace/extrapolation` --- doc/src/Commands_compute.rst | 1 - doc/src/compute.rst | 1 - doc/src/compute_pace_extrapolation.rst | 69 -------------------------- doc/src/dump_pace_extrapolation.rst | 45 ----------------- doc/src/pair_pace.rst | 60 ++++++++-------------- 5 files changed, 22 insertions(+), 154 deletions(-) delete mode 100644 doc/src/compute_pace_extrapolation.rst delete mode 100644 doc/src/dump_pace_extrapolation.rst diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 38c4f204c8..682a75f201 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -96,7 +96,6 @@ KOKKOS, o = OPENMP, t = OPT. * :doc:`nbond/atom ` * :doc:`omega/chunk ` * :doc:`orientorder/atom (k) ` - * :doc:`pace/extrapolation ` * :doc:`pair ` * :doc:`pair/local ` * :doc:`pe ` diff --git a/doc/src/compute.rst b/doc/src/compute.rst index cb5e319736..7d1e423e93 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -240,7 +240,6 @@ The individual style names on the :doc:`Commands compute ` pag * :doc:`nbond/atom ` - calculates number of bonds per atom * :doc:`omega/chunk ` - angular velocity for each chunk * :doc:`orientorder/atom ` - Steinhardt bond orientational order parameters Ql -* :doc:`pace/extrapolation ` - calculate extrapolation grade for pair style pace/extrapolation * :doc:`pair ` - values computed by a pair style * :doc:`pair/local ` - distance/energy/force of each pairwise interaction * :doc:`pe ` - potential energy diff --git a/doc/src/compute_pace_extrapolation.rst b/doc/src/compute_pace_extrapolation.rst deleted file mode 100644 index b983f983e9..0000000000 --- a/doc/src/compute_pace_extrapolation.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. index:: compute pace/extrapolation - -compute pace/extrapolation command -================================== - -Syntax -"""""" - -.. parsed-literal:: - - compute ID all pace/extrapolation - -* ID is documented in :doc:`compute ` command -* pace/extrapolation = style name of this compute command - -Examples -"""""""" - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - -Description -""""""""""" - -Define a computation that calculates both per-atom and per-structure extrapolation grades for PACE interatomic potential. -Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. -Extrapolation grades are computed by `pair_style pace/extrapolation` every *gamma_freq* steps (see :doc:`pair_style pace/extrapolation `), -but `compute pace/extrapolation` will invoke extra calculations with this pair style if necessary. -For better performance, it is recommended to use the same values of *gamma_freq* and -the frequency of compute style callers, i.e. `dump` or `thermo`. - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - - # per-structure extrapolation grade c_pace_gamma - thermo_style custom step etotal temp press c_pace_gamma - - # per-atom extrapolation grade c_pace_gamma - dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma - - -Output info -""""""""""" - -This compute calculates both per-atom vector and per-structure scalar, -which can be accessed by any command that uses per-atom and/or per-structure values from a compute as input. -See the :doc:`Howto output ` page for an overview of -LAMMPS output options. - -All values are unitless. - -Restrictions -"""""""""""" - - Pair style :doc:`pair_style pace/extrapolation ` must be instantiated before. - - group-ID always corresponds to the group atoms used by `pair_style pace/extrapolation` and by default is `all`. - -Related commands -"""""""""""""""" - -:doc:`pair_style pace/extrapolation `, :doc:`dump custom `, :doc:`thermo custom ` - -Default -""""""" - -`compute pace_gamma all pace/extrapolation` diff --git a/doc/src/dump_pace_extrapolation.rst b/doc/src/dump_pace_extrapolation.rst deleted file mode 100644 index 0b14222c42..0000000000 --- a/doc/src/dump_pace_extrapolation.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. index:: dump pace/extrapolation - -dump pace/extrapolation command -================================ - -Syntax -"""""" - -.. parsed-literal:: - - dump ID group-ID pace/extrapolation N file args - - -* ID = user-assigned name for the dump -* group-ID = ID of the group of atoms to be dumped -* N = dump every this many timesteps (use 1 to potentially dump on every step, see below) -* file = name of file to write dump info to -* args = list of arguments (see :doc:`dump custom `) - -Examples -"""""""" - -.. code-block:: LAMMPS - - dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma - dump pace all pace/extrapolation 1 extrapolation.lammpsbin id type mass x y z c_pace_gamma - -Description -""""""""""" - -Dump a snapshot of atom coordinates if extrapolation grade, computed by -:doc:`compute pace/extrapolation `, exceeds *gamma_lower_bound* threshold, -provided in :doc:`pair_style pace/extrapolation `. - -.. note:: - - To be able to use this dump, you need to setup :doc:`pair_style pace/extrapolation ` - and :doc:`compute pace/extrapolation ` beforehand - ----------- - -Related commands -"""""""""""""""" - -:doc:`pair_style pace/extrapolation `, :doc:`compute pace/extrapolation ` diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index c2d33240db..91851d54f3 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -28,14 +28,7 @@ Syntax .. code-block:: LAMMPS - pair_style pace/extrapolation gamma_lower_bound gamma_upper_bound gamma_freq - -* one or more arguments may be appended - - .. parsed-literal:: - *gamma_lower_bound* = minimal value of extrapolation grade considered as moderate extrapolation - *gamma_upper_bound* = maximal value of extrapolation grade considered as moderate extrapolation - *gamma_freq* value = frequency of computing extrapolation grade (in steps) + pair_style pace/extrapolation Examples """""""" @@ -46,7 +39,7 @@ Examples pair_style pace product chunksize 2048 pair_coeff * * Cu-PBE-core-rep.ace Cu - pair_style pace/extrapolation 1.5 10 20 + pair_style pace/extrapolation pair_coeff * * Cu.yaml Cu.asi Cu Description @@ -106,37 +99,32 @@ In order to compute extrapolation grade one needs to provide: #. Active Set Inverted (ASI) file for corresponding potential (`.asi` format) Calculation of extrapolation grades requires matrix-vector multiplication for each atom -and can be slower than the usual `pair_style pace recursive`, -therefore it make sense *not* to do it on every step. -Extrapolation grade calculation frequency is controlled by *gamma_freq* parameter. -On all other steps `pair_style pace recursive` is used. - -The maximal value of *gamma* for all atoms in a structure determines the extrapolation grade for structure. -Both per-atom and per-structure extrapolation grades are accessible via `compute pace/extrapolation`: +and is slower than the usual `pair_style pace recursive`, therefore it is *not* computed by default. +Extrapolation grade calculation is involved by `fix pair`, which requests to compute `gamma`, as shown in example below: .. code-block:: LAMMPS - compute pace_gamma all pace/extrapolation + pair_style pace/extrapolation + pair_coeff * * Cu.yaml Cu.asi Cu - # show maximal extrapolation grade per-structure - thermo_style custom step etotal temp press c_pace_gamma + fix pace_gamma all pair 10 pace/extrapolation gamma 1 - # dump structure with per-atom extrapolation grades - dump 1 all custom 100 my.dump id type mass x y z c_pace_gamma - -If maximal extrapolation grade per-structure exceeds *gamma_lower_bound* but less than *gamma_upper_bound*, -the structure is considered as extrapolative and can be stored with `dump pace/extrapolation`: - -.. code-block:: LAMMPS - - compute pace_gamma all pace/extrapolation - dump pace all pace/extrapolation 1 extrapolation.dat id type mass x y z c_pace_gamma - -Please note, that even if you provide dump frequency equal to one, dump will write structure -only if extrapolation grades are computed on current timestep *and* maximal extrapolation grade exceeds *gamma_lower_bound*. -If extrapolation grade exceeds *gamma_upper_bound*, simulation will be aborted. + compute max_pace_gamma all reduce max f_pace_gamma + variable dump_skip equal "c_max_pace_gamma < 5" + dump pace_dump all custom 20 extrapolative_structures.dump id x y z f_pace_gamma + dump_modify pace_dump skip v_dump_skip + + variable max_pace_gamma equal c_max_pace_gamma + fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25 + +Here extrapolation grade gamma is computed every 10 steps and is stored in `f_pace_gamma` per-atom variable. +The largest value of extrapolation grade among all atoms in a structure is reduced to `c_max_pace_gamma` variable. +Only if this value exceeds extrapolation threshold 5, then the structure will be dumped into `extrapolative_structures.dump` +file, but not more often than every 20 steps. + +On all other steps `pair_style pace recursive` will be used. ---------- @@ -179,16 +167,12 @@ Related commands """""""""""""""" :doc:`pair_style snap `, -:doc:`compute pace/extrapolation `, -:doc:`dump pace/extrapolation `, +:doc:`fix pair ` Default """"""" recursive, chunksize = 4096, -gamma_lower_bound = 1.5, -gamma_upper_bound = 10, -gamma_freq = 1 .. _Drautz20191: From a6f8ea32a73b9defafdb4158b483847e9ae5761d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 17:10:05 -0400 Subject: [PATCH 213/364] reformat docs and fix spelling issues --- doc/src/pair_pace.rst | 91 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 2 + 2 files changed, 49 insertions(+), 44 deletions(-) diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index 91851d54f3..b54e585f69 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -47,60 +47,60 @@ 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) `. -The *pace* pair style -provides an efficient implementation that -is described in this paper :ref:`(Lysogorskiy) `. +multi-body basis functions. :ref:`(Drautz) `. The *pace* +pair style provides an efficient implementation that is described in +this paper :ref:`(Lysogorskiy) `. -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. +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: +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. +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 the 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*. +*product* or *recursive*, which determines which of two algorithms is +used for the calculation of basis functions and derivatives. The +default is *recursive*. -The keyword *chunksize* is only applicable when -using the pair style *pace* with the KOKKOS package on GPUs and is -ignored otherwise. This keyword controls the number of atoms -in each pass used to compute the atomic cluster expansion and is used to -avoid running out of memory. For example if there are 8192 atoms in the -simulation and the *chunksize* is set to 4096, the ACE -calculation will be broken up into two passes (running on a single GPU). +The keyword *chunksize* is only applicable when using the pair style +*pace* with the KOKKOS package on GPUs and is ignored otherwise. This +keyword controls the number of atoms in each pass used to compute the +atomic cluster expansion and is used to avoid running out of memory. +For example if there are 8192 atoms in the simulation and the +*chunksize* is set to 4096, the ACE calculation will be broken up into +two passes (running on a single GPU). Extrapolation grade """"""""""""""""""" -Calculation of extrapolation grade in PACE is implemented in `pair_style pace/extrapolation`. -It is based on the MaxVol algorithm similar to Moment Tensor Potential (MTP) by Shapeev et al. -and is described in :ref:`(Lysogorskiy2) `. -In order to compute extrapolation grade one needs to provide: +Calculation of extrapolation grade in PACE is implemented in `pair_style +pace/extrapolation`. It is based on the MaxVol algorithm similar to +Moment Tensor Potential (MTP) by Shapeev et al. and is described in +:ref:`(Lysogorskiy2) `. In order to compute +extrapolation grade one needs to provide: #. ACE potential in B-basis form (`.yaml` format) and #. Active Set Inverted (ASI) file for corresponding potential (`.asi` format) -Calculation of extrapolation grades requires matrix-vector multiplication for each atom -and is slower than the usual `pair_style pace recursive`, therefore it is *not* computed by default. -Extrapolation grade calculation is involved by `fix pair`, which requests to compute `gamma`, as shown in example below: +Calculation of extrapolation grades requires matrix-vector +multiplication for each atom and is slower than the usual `pair_style +pace recursive`, therefore it is *not* computed by default. +Extrapolation grade calculation is involved by `fix pair`, which +requests to compute `gamma`, as shown in example below: .. code-block:: LAMMPS @@ -119,10 +119,12 @@ Extrapolation grade calculation is involved by `fix pair`, which requests to com variable max_pace_gamma equal c_max_pace_gamma fix extreme_extrapolation all halt 10 v_max_pace_gamma > 25 -Here extrapolation grade gamma is computed every 10 steps and is stored in `f_pace_gamma` per-atom variable. -The largest value of extrapolation grade among all atoms in a structure is reduced to `c_max_pace_gamma` variable. -Only if this value exceeds extrapolation threshold 5, then the structure will be dumped into `extrapolative_structures.dump` -file, but not more often than every 20 steps. +Here extrapolation grade gamma is computed every 10 steps and is stored +in `f_pace_gamma` per-atom variable. The largest value of extrapolation +grade among all atoms in a structure is reduced to `c_max_pace_gamma` +variable. Only if this value exceeds extrapolation threshold 5, then +the structure will be dumped into `extrapolative_structures.dump` file, +but not more often than every 20 steps. On all other steps `pair_style pace recursive` will be used. @@ -142,9 +144,10 @@ specify a pair_coeff command with I != J arguments for this style. This pair style does not support the :doc:`pair_modify ` shift, table, and tail options. -This pair style does not write its information to :doc:`binary restart files `, since it is stored in potential files. Thus, you -need to re-specify the pair_style and pair_coeff commands in an input -script that reads a restart file. +This pair style does not write its information to :doc:`binary restart +files `, since it is stored in potential files. Thus, you need +to re-specify the pair_style and pair_coeff commands in an input script +that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the @@ -159,9 +162,9 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -This pair style is part of the ML-PACE package. It is only enabled if LAMMPS -was built with that package. -See the :doc:`Build package ` page for more info. +This pair style is part of the ML-PACE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 15316b4f09..99fe278c45 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2381,6 +2381,7 @@ Nmols nn nnodes npits +npj nO Nocedal nocite @@ -3154,6 +3155,7 @@ sfree Sg Shan Shanno +Shapeev shapex shapey shapez From cb92a1553cf1f383f156cd8b4ac6909ec4073756 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 17:36:31 -0400 Subject: [PATCH 214/364] improve error messages --- src/ML-PACE/pair_pace.cpp | 8 +++---- src/ML-PACE/pair_pace_extrapolation.cpp | 28 ++++++++++--------------- src/fix_pair.cpp | 2 +- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 4e4f226f0a..a08d6d9cdc 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -239,7 +239,7 @@ void PairPACE::allocate() void PairPACE::settings(int narg, char **arg) { - if (narg > 3) error->all(FLERR, "Illegal pair_style command."); + if (narg > 3) utils::missing_cmd_args(FLERR, "pair_style pace", error); // ACE potentials are parameterized in metal units if (strcmp("metal", update->unit_style) != 0) @@ -259,7 +259,7 @@ void PairPACE::settings(int narg, char **arg) chunksize = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); iarg += 2; } else - error->all(FLERR, "Illegal pair_style command"); + error->all(FLERR, "Unknown pair_style pace keyword: {}", arg[iarg]); } if (comm->me == 0) { @@ -350,8 +350,8 @@ void PairPACE::coeff(int narg, char **arg) void PairPACE::init_style() { - if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); - if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); + if (atom->tag_enable == 0) error->all(FLERR, "Pair style pace requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style pace requires newton pair on"); // request a full neighbor list neighbor->add_request(this, NeighConst::REQ_FULL); diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 0ffafb21fc..b07a904292 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -270,12 +270,12 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) void PairPACEExtrapolation::allocate() { allocated = 1; - int n = atom->ntypes; + int np1 = atom->ntypes + 1; - memory->create(setflag, n + 1, n + 1, "pair:setflag"); - memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(map, n + 1, "pair:map"); - memory->create(scale, n + 1, n + 1, "pair:scale"); + memory->create(setflag, np1, np1, "pair:setflag"); + memory->create(cutsq, np1, np1, "pair:cutsq"); + memory->create(map, np1, "pair:map"); + memory->create(scale, np1, np1, "pair:scale"); } /* ---------------------------------------------------------------------- @@ -284,14 +284,10 @@ void PairPACEExtrapolation::allocate() void PairPACEExtrapolation::settings(int narg, char **arg) { - if (narg > 0) { - error->all(FLERR, - "Illegal pair_style command. Correct form:\n\tpair_style pace/extrapolation "); - } + if (narg > 0) error->all(FLERR, "Pair style pace/extrapolation supports no keywords"); - if (comm->me == 0) { + if (comm->me == 0) utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); - } } /* ---------------------------------------------------------------------- @@ -301,10 +297,7 @@ void PairPACEExtrapolation::settings(int narg, char **arg) void PairPACEExtrapolation::coeff(int narg, char **arg) { - if (narg < 5) - error->all(FLERR, - "Incorrect args for pair coefficients. Correct form:\npair_coeff * * " - " elem1 elem2 ..."); + if (narg < 5) utils::missing_cmd_args(FLERR, "pair_coeff", error); if (!allocated) allocate(); @@ -401,8 +394,9 @@ void PairPACEExtrapolation::coeff(int narg, char **arg) void PairPACEExtrapolation::init_style() { - if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); - if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); + if (atom->tag_enable == 0) error->all(FLERR, "Pair style pace/extrapolation requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR, "Pair style pace/extrapolation requires newton pair on"); // request a full neighbor list neighbor->add_request(this, NeighConst::REQ_FULL); diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 1f32866d63..d33324805d 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -363,7 +363,7 @@ int FixPair::modify_param(int narg, char **arg) { while (iarg < narg) { if (strcmp(arg[iarg], "every") == 0) { nevery = utils::inumeric(FLERR, arg[iarg+1], false, lmp); - if (nevery < 1) error->all(FLERR, "Illegal fix_modify pair command"); + if (nevery < 1) error->all(FLERR, "Illegal fix_modify pair every value: {}", nevery); iarg += 2; processed_args+=2; } else From d34d5139cba777cb35ab0586b3e683ab3853bf18 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Sep 2022 17:55:11 -0400 Subject: [PATCH 215/364] use CMakeLists.txt file that ships with PACE library this sets the necessary define so that the compilation hack is no longer needed --- cmake/Modules/Packages/ML-PACE.cmake | 16 +--------------- src/ML-PACE/pair_pace_extrapolation.cpp | 6 ++---- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 3f4731eac3..11b2b92481 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -15,23 +15,9 @@ execute_process( ) get_newest_file(${CMAKE_BINARY_DIR}/lammps-user-pace-* lib-pace) - -# enforce building libyaml-cpp as static library and turn off optional features -set(YAML_BUILD_SHARED_LIBS OFF) -set(YAML_CPP_BUILD_CONTRIB OFF) -set(YAML_CPP_BUILD_TOOLS OFF) -add_subdirectory(${lib-pace}/yaml-cpp build-yaml-cpp) -set(YAML_CPP_INCLUDE_DIR ${lib-pace}/yaml-cpp/include) - -set(PACE_INCLUDE_DIRS "${lib-pace}/ML-PACE/ace" "${lib-pace}/ML-PACE/ace-evaluator" "${lib-pace}/wigner-cpp/include/wigner") -file(GLOB PACE_SOURCES ${lib-pace}/ML-PACE/ace/*.cpp ${lib-pace}/ML-PACE/ace-evaluator/*.cpp) -list(FILTER PACE_SOURCES EXCLUDE REGEX pair_pace.cpp) - -add_library(pace STATIC ${PACE_SOURCES} ${lib-pace}/cnpy/cnpy.cpp) +add_subdirectory(${lib-pace} build-pace) set_target_properties(pace PROPERTIES CXX_EXTENSIONS ON OUTPUT_NAME lammps_pace${LAMMPS_MACHINE}) -target_include_directories(pace PUBLIC ${PACE_INCLUDE_DIRS} ${YAML_CPP_INCLUDE_DIR} ${lib-pace}/cnpy) -target_link_libraries(pace PRIVATE yaml-cpp-pace) if(CMAKE_PROJECT_NAME STREQUAL "lammps") target_link_libraries(lammps PRIVATE pace) endif() diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index b07a904292..5fc01f5f66 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -212,10 +212,8 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) } // 'compute_atom' will update the `ace->e_atom` and `ace->neighbours_forces(jj, alpha)` arrays and max_gamma_grade - if (flag_compute_extrapolation_grade) { - //FIXME: need an updated PACE library URL since this currently fails compiling - // extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; - } + if (flag_compute_extrapolation_grade) + extrapolation_grade_gamma[i] = aceimpl->ace->max_gamma_grade; Array2D &neighbours_forces = (flag_compute_extrapolation_grade ? aceimpl->ace->neighbours_forces From bada1fb348b5a1bbd1d608b98d68f3db8c7053d6 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sun, 25 Sep 2022 23:54:18 -0500 Subject: [PATCH 216/364] Finished extract_compute and its unit tests and documentation --- doc/src/Fortran.rst | 143 +++++++++++++++--- fortran/lammps.f90 | 110 +++++++++----- .../fortran/test_fortran_extract_compute.f90 | 88 ++++++++++- 3 files changed, 276 insertions(+), 65 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 7726a43f6e..b24eb30d83 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -452,7 +452,7 @@ Procedures Bound to the lammps Derived Type .. note:: - The `MPI_F08` module, which defines Fortran 2008 bindings for MPI, + The ``MPI_F08`` module, which defines Fortran 2008 bindings for MPI, is not directly supported by this function. However, you should be able to convert between the two using the `MPI_VAL` member of the communicator. For example, @@ -461,12 +461,12 @@ Procedures Bound to the lammps Derived Type USE MPI_F08 USE LIBLAMMPS - TYPE (LAMMPS) :: lmp + TYPE (lammps) :: lmp TYPE (MPI_Comm) :: comm ! ... [commands to set up LAMMPS/etc.] comm%MPI_VAL = lmp%get_mpi_comm() - should assign an `MPI_F08` communicator properly. + should assign an ``MPI_F08`` communicator properly. -------- @@ -505,12 +505,12 @@ Procedures Bound to the lammps Derived Type .. code-block:: fortran PROGRAM demo - USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t, c_int, c_double USE LIBLAMMPS TYPE(lammps) :: lmp - INTEGER(C_int), POINTER :: nlocal => NULL() - INTEGER(C_int64_t), POINTER :: ntimestep => NULL() - REAL(C_double), POINTER :: dt => NULL() + INTEGER(c_int), POINTER :: nlocal => NULL() + INTEGER(c_int64_t), POINTER :: ntimestep => NULL() + REAL(c_double), POINTER :: dt => NULL() CHARACTER(LEN=10) :: units lmp = lammps() ! other commands @@ -540,7 +540,7 @@ Procedures Bound to the lammps Derived Type pointer (e.g., ``INTEGER (c_int), POINTER :: nlocal``) to the extracted property. If expecting vector data, the pointer should have dimension ":". -.. warning:: + .. warning:: Modifying the data in the location pointed to by the returned pointer may lead to inconsistent internal data and thus may cause failures, @@ -560,14 +560,14 @@ Procedures Bound to the lammps Derived Type Note that this function actually does not return a pointer, but rather associates the pointer on the left side of the assignment to point to internal LAMMPS data. Pointers must be of the correct type, kind, and - rank (e.g., integer(C_int), dimension(:) for "type", "mask", or "tag"; - integer(C_int64_t), dimension(:) for "tag" if LAMMPS was compiled - with the -DLAMMPS_BIGBIG flag; real(C_double), dimension(:,:) for "x", "v", - or "f"; and so forth). The pointer being associated with LAMMPS data is - type-, kind-, and rank-checked at run-time. Pointers returned by this - function are generally persistent; therefore, it is not necessary to call - the function again unless the underlying LAMMPS data are destroyed, such as - through the :doc:`clear` command. + rank (e.g., ``INTEGER(c_int), DIMENSION(:)`` for "type", "mask", or "tag"; + ``INTEGER(c_int64_t), DIMENSION(:)`` for "tag" if LAMMPS was compiled + with the ``-DLAMMPS_BIGBIG`` flag; ``REAL(c_double), DIMENSION(:,:)`` for + "x", "v", or "f"; and so forth). The pointer being associated with LAMMPS + data is type-, kind-, and rank-checked at run-time. Pointers returned by + this function are generally persistent; therefore, it is not necessary to + call the function again unless the underlying LAMMPS data are destroyed, + such as through the :doc:`clear` command. :p character(len=\*) name: string with the name of the property to extract :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment @@ -576,7 +576,7 @@ Procedures Bound to the lammps Derived Type property. If expecting vector data, the pointer should have dimension ":"; if expecting matrix data, the pointer should have dimension ":,:". - .. note:: + .. admonition:: Array index order Two-dimensional arrays returned from :f:func:`extract_atom` will be **transposed** from equivalent arrays in C, and they will be indexed @@ -596,12 +596,12 @@ Procedures Bound to the lammps Derived Type .. code-block:: Fortran TYPE(lammps) :: lmp - REAL(C_double), DIMENSION(:,:), POINTER :: x + REAL(c_double), DIMENSION(:,:), POINTER :: x => NULL() ! more code to setup, etc. x = lmp%extract_atom("x") print '(f0.6)', x(2,6) - will print the *y*-coordinate of the third atom on this processor + will print the *y*-coordinate of the sixth atom on this processor (note the transposition of the two indices). This is not a choice, but rather a consequence of the different conventions adopted by the Fortran and C standards decades ago. @@ -612,7 +612,7 @@ Procedures Bound to the lammps Derived Type .. code-block:: Fortran - REAL(C_double), DIMENSION(:,:), POINTER :: x, x0 + REAL(c_double), DIMENSION(:,:), POINTER :: x, x0 x = lmp%extract_atom("x") x0(0:,0:) => x @@ -621,6 +621,109 @@ Procedures Bound to the lammps Derived Type -------- +.. f:function:: extract_compute(id, style, type) + + This function calls :c:func:`lammps_extract_compute` and returns a pointer + to LAMMPS data tied to the :cpp:class:`Compute` class, specifically data + provided by the compute identified by *id*. Computes may provide global, + per-atom, or local data, and those data may be a scalar, a vector, or an + array. Since computes may provide multiple kinds of data, the user is + required to specify which set of data is to be returned through the + *style* and *type* variables. + + Note that this function actually does not return a value, but rather + associates the pointer on the left side of the assignment to point to + internal LAMMPS data. Pointers must be of the correct data type to point to + said data (i.e., ``REAL(c_double)``) and have compatible rank. The pointer + being associated with LAMMPS data is type-, kind-, and rank-checked at + run-time via an overloaded assignment operator. + + For example, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: COM + ! code to setup, create atoms, etc. + CALL lmp%compute('compute COM all com') + COM = lmp%extract_compute('COM', lmp%style%global, lmp%style%type) + + will bind the variable *COM* to the center of mass of the atoms created in + your simulation. The vector in this case has length 3; the length (or, in + the case of array data, the number of rows and columns) is determined for + you based on data from the :cpp:class:`Compute` class. + + .. admonition:: Array index order + + Two-dimensional arrays returned from :f:func:`extract_compute` will be + **transposed** from equivalent arrays in C, and they will be indexed + from 1 instead of 0. See the similar note under + :f:func:`extract_atom` for further details. + + The following combinations are possible (assuming ``lmp`` is the name of + your LAMMPS instance): + + .. list-table:: + :header-rows: 1 + :widths: auto + + * - Style + - Type + - Pointer type to assign to + - Returned data + * - ``lmp%style%global`` + - ``lmp%type%scalar`` + - ``REAL(c_double), POINTER`` + - Global scalar + * - ``lmp%style%global`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Global vector + * - ``lmp%style%global`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Global array + * - ``lmp%style%atom`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%atom`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array + * - ``lmp%style%local`` + - ``lmp%type%vector`` + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Local vector + * - ``lmp%style%local`` + - ``lmp%type%array`` + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Local array + + :p character(len=\*) id: compute ID from which to extract data + :p integer(c_int) style: value indicating the style of data to extract + (global, per-atom, or local) + :p integer(c_int) type: value indicating the type of data to extract + (scalar, vector, or array) + + .. note:: + + If the compute's data are not already computed for the current step, the + compute will be invoked. LAMMPS cannot easily check at that time if it is + valid to invoke a compute, so it may fail with an error. The caller has + to check to avoid such an error. + + .. warning:: + + The pointers returned by this function are generally not persistent, + since the computed data may be re-distributed, re-allocated, and + re-ordered at every invocation. It is advisable to re-invoke this + function before the data are accessed or make a copy if the data are to + be used after other LAMMPS commands have been issued. Do **not** modify + the data returned by this function. + +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index d06de746d5..4486bd87c1 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -29,8 +29,9 @@ ! MODULE LIBLAMMPS - USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_loc, & - c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, c_f_pointer + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_associated, & + c_loc, c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, & + c_f_pointer USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : ERROR_UNIT IMPLICIT NONE @@ -44,22 +45,27 @@ MODULE LIBLAMMPS ! ! These are NOT part of the API (the part the user sees) INTEGER (c_int), PARAMETER :: & - LAMMPS_INT = 0, & ! 32-bit integer (array) - LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array - LAMMPS_DOUBLE = 2, & ! 64-bit double (array) - LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array - LAMMPS_INT64 = 4, & ! 64-bit integer (array) - LAMMPS_INT64_2D = 5, & ! two-dimensional 64-bit integer array - LAMMPS_STRING = 6, & ! C-String - LMP_STYLE_GLOBAL = 0, & ! request global compute/fix/etc. data - LMP_STYLE_ATOM = 1, & ! request per-atom compute/fix/etc. data - LMP_STYLE_LOCAL = 2, & ! request local compute/fix/etc. data - LMP_TYPE_SCALAR = 0, & ! request scalar - LMP_TYPE_VECTOR = 1, & ! request vector - LMP_TYPE_ARRAY = 2, & ! request array - LMP_SIZE_VECTOR = 3, & ! request size of vector - LMP_SIZE_ROWS = 4, & ! request rows (actually columns) - LMP_SIZE_COLS = 5 ! request colums (actually rows) + LAMMPS_INT = 0, & ! 32-bit integer (array) + LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array + LAMMPS_DOUBLE = 2, & ! 64-bit double (array) + LAMMPS_DOUBLE_2D = 3, & ! two-dimensional 64-bit double array + LAMMPS_INT64 = 4, & ! 64-bit integer (array) + LAMMPS_INT64_2D = 5, & ! two-dimensional 64-bit integer array + LAMMPS_STRING = 6, & ! C-String + LMP_STYLE_GLOBAL = 0, & ! request global compute/fix/etc. data + LMP_STYLE_ATOM = 1, & ! request per-atom compute/fix/etc. data + LMP_STYLE_LOCAL = 2, & ! request local compute/fix/etc. data + LMP_TYPE_SCALAR = 0, & ! request scalar + LMP_TYPE_VECTOR = 1, & ! request vector + LMP_TYPE_ARRAY = 2, & ! request array + LMP_SIZE_VECTOR = 3, & ! request size of vector + LMP_SIZE_ROWS = 4, & ! request rows (actually columns) + LMP_SIZE_COLS = 5, & ! request colums (actually rows) + LMP_ERROR_WARNING = 0, & ! call Error::warning() + LMP_ERROR_ONE = 1, & ! call Error::one() (from this MPI rank) + LMP_ERROR_ALL = 2, & ! call Error::all() (from all MPI ranks) + LMP_ERROR_WORLD = 4, & ! error on comm->world + LMP_ERROR_UNIVERSE = 8 ! error on comm->universe ! "Constants" to use with extract_compute and friends TYPE lammps_style @@ -112,13 +118,13 @@ MODULE LIBLAMMPS ! pointers) TYPE lammps_data INTEGER(c_int) :: datatype - INTEGER(c_int), POINTER :: i32 - INTEGER(c_int), DIMENSION(:), POINTER :: i32_vec - INTEGER(c_int64_t), POINTER :: i64 - INTEGER(c_int64_t), DIMENSION(:), POINTER :: i64_vec - REAL(c_double), POINTER :: r64 - REAL(c_double), DIMENSION(:), POINTER :: r64_vec - REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat + INTEGER(c_int), POINTER :: i32 => NULL() + INTEGER(c_int), DIMENSION(:), POINTER :: i32_vec => NULL() + INTEGER(c_int64_t), POINTER :: i64 => NULL() + INTEGER(c_int64_t), DIMENSION(:), POINTER :: i64_vec => NULL() + REAL(c_double), POINTER :: r64 => NULL() + REAL(c_double), DIMENSION(:), POINTER :: r64_vec => NULL() + REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat => NULL() CHARACTER(LEN=:), ALLOCATABLE :: str END TYPE lammps_data @@ -683,9 +689,9 @@ CONTAINS FORALL ( I=1:length ) global_data%str(i:i) = Fptr(i) END FORALL - CASE DEFAULT - ! FIXME convert to use symbolic constants later - CALL lmp_error(self, 6, 'Unknown pointer type in extract_global') + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unknown pointer type in extract_global') END SELECT END FUNCTION @@ -703,6 +709,7 @@ CONTAINS INTEGER :: nrows, ncols REAL(c_double), DIMENSION(:), POINTER :: dummy TYPE(c_ptr), DIMENSION(:), POINTER :: Catomptr + CHARACTER(LEN=:), ALLOCATABLE :: error_msg nmax = lmp_extract_setting(self, 'nmax') ntypes = lmp_extract_setting(self, 'ntypes') @@ -745,13 +752,18 @@ CONTAINS ! Catomptr(1) now points to the first element of the array CALL C_F_POINTER(Catomptr(1), peratom_data%r64_mat, [nrows,ncols]) CASE (-1) - WRITE(ERROR_UNIT,'(A)') 'ERROR: per-atom property "' // name // & - '" not found.' - STOP 2 + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'per-atom property ' // name // 'not found in extract_setting') +! WRITE(ERROR_UNIT,'(A)') 'ERROR: per-atom property "' // name // & +! '" not found.' +! STOP 2 CASE DEFAULT - WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: return value ', datatype, & - ' from lammps_extract_atom_datatype not known' - STOP 1 + WRITE(error_msg,'(A,I0,A)') 'return value ', datatype, & + ' from lammps_extract_atom_datatype not known [Fortran/extract_atom]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) +! WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: return value ', datatype, & +! ' from lammps_extract_atom_datatype not known' +! STOP 1 END SELECT END FUNCTION lmp_extract_atom @@ -768,18 +780,26 @@ CONTAINS TYPE(c_ptr) :: Cid, Cptr, Ctemp INTEGER :: nrows, ncols, length INTEGER(c_int), POINTER :: temp + TYPE(c_ptr), DIMENSION(:), POINTER :: Ccomputeptr Cid = f2c_string(id) Cptr = lammps_extract_compute(self%handle, Cid, style, type) + IF ( .NOT. C_ASSOCIATED(Cptr) ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Pointer from LAMMPS is NULL [Fortran/extract_compute]') + END IF + ! Remember that rows and columns in C are transposed in Fortran! SELECT CASE (type) CASE (LMP_TYPE_SCALAR) + compute_data%datatype = DATA_DOUBLE length = 1 nrows = 1 ncols = 1 CALL C_F_POINTER(Cptr, compute_data%r64) CASE (LMP_TYPE_VECTOR) + compute_data%datatype = DATA_DOUBLE_1D IF (style == LMP_STYLE_ATOM) THEN length = self%extract_setting('nmax') ELSE @@ -789,11 +809,12 @@ CONTAINS END IF CALL C_F_POINTER(Cptr, compute_data%r64_vec, [length]) CASE (LMP_TYPE_ARRAY) + compute_data%datatype = DATA_DOUBLE_2D IF (style == LMP_STYLE_ATOM) THEN - nrows = self%extract_setting('nmax') - Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_ROWS) + ncols = self%extract_setting('nmax') + Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_COLS) CALL C_F_POINTER(Ctemp, temp) - ncols = temp + nrows = temp ELSE Ctemp = lammps_extract_compute(self%handle,Cid,style,LMP_SIZE_ROWS) CALL C_F_POINTER(Ctemp, temp) @@ -802,11 +823,16 @@ CONTAINS CALL C_F_POINTER(Ctemp, temp) nrows = temp END IF - CALL C_F_POINTER(Cptr, compute_data%r64_mat, [nrows, ncols]) + ! First, we dereference the void** pointer to point to a void* pointer + CALL C_F_POINTER(Cptr, Ccomputeptr, [ncols]) + ! Ccomputeptr(1) now points to the first element of the array + CALL C_F_POINTER(Ccomputeptr(1), compute_data%r64_mat, [nrows, ncols]) CASE DEFAULT - WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: unknown type value ', type, & - 'passed to extract_compute' - STOP 1 + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown type value passed to extract_compute') + !WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: unknown type value ', type, & + ! 'passed to extract_compute' + !STOP 1 END SELECT CALL lammps_free(Cid) END FUNCTION lmp_extract_compute @@ -944,6 +970,8 @@ CONTAINS CASE DEFAULT str1 = 'that type' END SELECT + !CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'cannot associate ' & + ! // str1 // ' with ' // type2 // ' [Fortran API]') WRITE (ERROR_UNIT,'(A)') 'ERROR (Fortran API): cannot associate ' & // str1 // ' with ' // type2 STOP ERROR_CODE diff --git a/unittest/fortran/test_fortran_extract_compute.f90 b/unittest/fortran/test_fortran_extract_compute.f90 index f358ec9d2c..64b5068171 100644 --- a/unittest/fortran/test_fortran_extract_compute.f90 +++ b/unittest/fortran/test_fortran_extract_compute.f90 @@ -6,10 +6,11 @@ MODULE keepcompute 'region box block 0 $x 0 3 0 4', & 'create_box 1 box', & 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & [ CHARACTER(len=40) :: & 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] + ' 0.2 0.1 0.1', & + 'create_atoms 1 single 0.5 0.5 0.5' ] CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & [ CHARACTER(LEN=40) :: & 'pair_style lj/cut 2.5', & @@ -51,11 +52,13 @@ SUBROUTINE f_lammps_setup_extract_compute () BIND(C) CALL lmp%commands_list(pair_input) CALL lmp%command("compute peratompe all pe/atom") ! per-atom vector call lmp%command("compute stress all stress/atom thermo_temp") ! per-atom array - CALL lmp%command("compute COM all com") ! global vector CALL lmp%command("compute totalpe all reduce sum c_peratompe") ! global scalar - CALL lmp%command("compute 1 all rdf 100") ! global array + CALL lmp%command("compute COM all com") ! global vector + CALL lmp%command("compute RDF all rdf 100") ! global array CALL lmp%command("compute pairdist all pair/local dist") ! local vector CALL lmp%command("compute pairlocal all pair/local dist dx dy dz") ! local array + CALL lmp%command("thermo_style custom step pe c_totalpe c_COM[1]") + CALL lmp%command("run 0") ! must be here, otherwise will SEGFAULT END SUBROUTINE f_lammps_setup_extract_compute FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C) @@ -70,3 +73,80 @@ FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C) vector = lmp%extract_compute('peratompe', lmp%style%atom, lmp%type%vector) f_lammps_extract_compute_peratom_vector = vector(i) END FUNCTION f_lammps_extract_compute_peratom_vector + +FUNCTION f_lammps_extract_compute_peratom_array (i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i, j + REAL(C_double) :: f_lammps_extract_compute_peratom_array + REAL(C_double), DIMENSION(:,:), POINTER :: array => NULL() + + array = lmp%extract_compute('stress', lmp%style%atom, lmp%type%array) + f_lammps_extract_compute_peratom_array = array(i,j) +END FUNCTION f_lammps_extract_compute_peratom_array + +FUNCTION f_lammps_extract_compute_global_scalar () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + REAL(C_double) :: f_lammps_extract_compute_global_scalar + REAL(C_double), POINTER :: scalar + + scalar = lmp%extract_compute('totalpe', lmp%style%global, lmp%type%scalar) + f_lammps_extract_compute_global_scalar = scalar +END FUNCTION f_lammps_extract_compute_global_scalar + +FUNCTION f_lammps_extract_compute_global_vector (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(C_double) :: f_lammps_extract_compute_global_vector + REAL(C_double), DIMENSION(:), POINTER :: vector + + vector = lmp%extract_compute('COM', lmp%style%global, lmp%type%vector) + f_lammps_extract_compute_global_vector = vector(i) +END FUNCTION f_lammps_extract_compute_global_vector + +FUNCTION f_lammps_extract_compute_global_array (i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i, j + REAL(C_double) :: f_lammps_extract_compute_global_array + REAL(C_double), DIMENSION(:,:), POINTER :: array + + array = lmp%extract_compute('RDF', lmp%style%global, lmp%type%array) + f_lammps_extract_compute_global_array = array(i,j) +END FUNCTION f_lammps_extract_compute_global_array + +FUNCTION f_lammps_extract_compute_local_vector (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(C_double) :: f_lammps_extract_compute_local_vector + REAL(C_double), DIMENSION(:), POINTER :: vector + + vector = lmp%extract_compute('pairdist', lmp%style%local, lmp%type%vector) + f_lammps_extract_compute_local_vector = vector(i) +END FUNCTION f_lammps_extract_compute_local_vector + +FUNCTION f_lammps_extract_compute_local_array (i, j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepcompute, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i, j + REAL(C_double) :: f_lammps_extract_compute_local_array + REAL(C_double), DIMENSION(:,:), POINTER :: array + + array = lmp%extract_compute('pairlocal', lmp%style%local, lmp%type%array) + f_lammps_extract_compute_local_array = array(i,j) +END FUNCTION f_lammps_extract_compute_local_array From 90f26f05fce1abc249ad092408c686d82d2d028e Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Mon, 26 Sep 2022 07:43:19 +0200 Subject: [PATCH 217/364] Correcting some aspects of the SPIN package documentation. --- doc/src/Howto_spins.rst | 16 ++++++++++------ doc/src/fix_langevin_spin.rst | 4 ++-- doc/src/min_modify.rst | 8 ++++---- doc/src/min_spin.rst | 2 +- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/doc/src/Howto_spins.rst b/doc/src/Howto_spins.rst index 87e30a5f6f..63d5d8f4e7 100644 --- a/doc/src/Howto_spins.rst +++ b/doc/src/Howto_spins.rst @@ -30,9 +30,11 @@ can be coupled to another Langevin thermostat applied to the atoms using :doc:`fix langevin ` in order to simulate thermostatted spin-lattice systems. -The magnetic Gilbert damping can also be applied using :doc:`fix langevin/spin `. It allows to either dissipate -the thermal energy of the Langevin thermostat, or to perform a -relaxation of the magnetic configuration toward an equilibrium state. +The magnetic damping can also be applied +using :doc:`fix langevin/spin `. +It allows to either dissipate the thermal energy of the Langevin +thermostat, or to perform a relaxation of the magnetic configuration +toward an equilibrium state. The command :doc:`fix setforce/spin ` allows to set the components of the magnetic precession vectors (while erasing and @@ -52,9 +54,11 @@ All the computed magnetic properties can be output by two main commands. The first one is :doc:`compute spin `, that enables to evaluate magnetic averaged quantities, such as the total magnetization of the system along x, y, or z, the spin temperature, or -the magnetic energy. The second command is :doc:`compute property/atom `. It enables to output all the -per atom magnetic quantities. Typically, the orientation of a given -magnetic spin, or the magnetic force acting on this spin. +the magnetic energy. The second command +is :doc:`compute property/atom `. +It enables to output all the per atom magnetic quantities. Typically, +the orientation of a given magnetic spin, or the magnetic force +acting on this spin. ---------- diff --git a/doc/src/fix_langevin_spin.rst b/doc/src/fix_langevin_spin.rst index 0926881eef..0ca291a732 100644 --- a/doc/src/fix_langevin_spin.rst +++ b/doc/src/fix_langevin_spin.rst @@ -40,7 +40,7 @@ the following stochastic differential equation: \times\left( \vec{\omega}_{i} \times\vec{s}_{i} \right) \right) with :math:`\lambda` the transverse damping, and :math:`\eta` a random vector. -This equation is referred to as the stochastic Landau-Lifshitz-Gilbert (sLLG) +This equation is referred to as the stochastic Landau-Lifshitz (sLL) equation. The components of :math:`\eta` are drawn from a Gaussian probability @@ -49,7 +49,7 @@ the external thermostat T (in K in metal units). More details about this implementation are reported in :ref:`(Tranchida) `. -Note: due to the form of the sLLG equation, this fix has to be defined just +Note: due to the form of the sLL equation, this fix has to be defined just before the nve/spin fix (and after all other magnetic fixes). As an example: diff --git a/doc/src/min_modify.rst b/doc/src/min_modify.rst index 6b416a9b6a..8ef89fa16c 100644 --- a/doc/src/min_modify.rst +++ b/doc/src/min_modify.rst @@ -24,7 +24,7 @@ Syntax inf = max force component across all 3-vectors max = max force norm across all 3-vectors *alpha_damp* value = damping - damping = fictitious Gilbert damping for spin minimization (adim) + damping = fictitious magnetic damping for spin minimization (adim) *discrete_factor* value = factor factor = discretization factor for adaptive spin timestep (adim) *integrator* value = *eulerimplicit* or *verlet* @@ -109,9 +109,9 @@ norm is replaced by the spin-torque norm. Keywords *alpha_damp* and *discrete_factor* only make sense when a :doc:`min_spin ` command is declared. -Keyword *alpha_damp* defines an analog of a magnetic Gilbert -damping. It defines a relaxation rate toward an equilibrium for -a given magnetic system. +Keyword *alpha_damp* defines an analog of a magnetic damping. +It defines a relaxation rate toward an equilibrium for a given +magnetic system. Keyword *discrete_factor* defines a discretization factor for the adaptive timestep used in the *spin* minimization. See :doc:`min_spin ` for more information about those diff --git a/doc/src/min_spin.rst b/doc/src/min_spin.rst index d9572f4463..9b6841ae8c 100644 --- a/doc/src/min_spin.rst +++ b/doc/src/min_spin.rst @@ -39,7 +39,7 @@ timestep, according to: \frac{d \vec{s}_{i}}{dt} = \lambda\, \vec{s}_{i} \times\left( \vec{\omega}_{i} \times\vec{s}_{i} \right) -with :math:`\lambda` a damping coefficient (similar to a Gilbert +with :math:`\lambda` a damping coefficient (similar to a magnetic damping). :math:`\lambda` can be defined by setting the *alpha_damp* keyword with the :doc:`min_modify ` command. From ac6cb062e688161be8e78a02315515eb31369c3b Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Mon, 26 Sep 2022 07:44:32 +0200 Subject: [PATCH 218/364] Completing the correction in fix langevin/spin. --- src/SPIN/fix_langevin_spin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index 88af6d8dfd..397c3c618f 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -109,7 +109,6 @@ void FixLangevinSpin::init() double hbar = force->hplanck/MY_2PI; // eV/(rad.THz) double kb = force->boltz; // eV/K - //D = (alpha_t*gil_factor*kb*temp); D = (alpha_t*(1.0+(alpha_t)*(alpha_t))*kb*temp); D /= (hbar*dts); sigma = sqrt(2.0*D); From e24b4bec01a9390a1336906800aac2da607b0bfe Mon Sep 17 00:00:00 2001 From: Julien Tranchida Date: Mon, 26 Sep 2022 07:49:51 +0200 Subject: [PATCH 219/364] Adding a new test problem for large damping in the LL equation. --- examples/SPIN/test_problems/README | 4 +- examples/SPIN/test_problems/run_all.sh | 12 +++-- .../langevin.py | 0 .../plot_precession.py | 0 .../run-test-prec.sh | 0 .../test-prec-spin.template | 0 .../langevin.py | 22 +++++++++ .../plot_precession.py | 37 ++++++++++++++ .../run-test-prec.sh | 33 +++++++++++++ .../test-prec-spin.template | 48 +++++++++++++++++++ 10 files changed, 152 insertions(+), 4 deletions(-) rename examples/SPIN/test_problems/{validation_langevin_precession => validation_langevin_precession_d0.01}/langevin.py (100%) rename examples/SPIN/test_problems/{validation_langevin_precession => validation_langevin_precession_d0.01}/plot_precession.py (100%) rename examples/SPIN/test_problems/{validation_langevin_precession => validation_langevin_precession_d0.01}/run-test-prec.sh (100%) rename examples/SPIN/test_problems/{validation_langevin_precession => validation_langevin_precession_d0.01}/test-prec-spin.template (100%) create mode 100755 examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py create mode 100755 examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py create mode 100755 examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh create mode 100644 examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template diff --git a/examples/SPIN/test_problems/README b/examples/SPIN/test_problems/README index 17e0935a35..66de9fa88e 100644 --- a/examples/SPIN/test_problems/README +++ b/examples/SPIN/test_problems/README @@ -44,7 +44,9 @@ directory. energy versus temperature. Comparison to the Langevin function results (computed by the python script). Note: This example is a reworked version of a test problem - provided by Martin Kroger (ETHZ). + provided by Martin Kroger (ETHZ). + Note 2: Two versions of this test are deployed, one at low + damping (0.01) and one at large damping (1.0). - validation_nve: simulates a small assembly of magnetic atoms (54). The atoms are diff --git a/examples/SPIN/test_problems/run_all.sh b/examples/SPIN/test_problems/run_all.sh index fb682e3ef5..51f11dc6d6 100755 --- a/examples/SPIN/test_problems/run_all.sh +++ b/examples/SPIN/test_problems/run_all.sh @@ -12,13 +12,19 @@ cd validation_damped_precession/ rm res_lammps.dat res_llg.dat cd .. -# test 3: langevin, damping and Zeeman -cd validation_langevin_precession/ +# test 3: langevin, damping and Zeeman, low damping (0.01) +cd validation_langevin_precession_d0.01/ ./run-test-prec.sh rm average_spin test-prec-spin.in res_lammps.dat res_langevin.dat cd .. -# test 4: NVE run, test Etot preservation +# test 4: langevin, damping and Zeeman, large damping (1.0) +cd validation_langevin_precession_d1.0/ +./run-test-prec.sh +rm average_spin test-prec-spin.in res_lammps.dat res_langevin.dat +cd .. + +# test 5: NVE run, test Etot preservation cd validation_nve/ ./run-test-nve.sh rm nve_spin_lattice.pdf res_lammps.dat diff --git a/examples/SPIN/test_problems/validation_langevin_precession/langevin.py b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/langevin.py similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/langevin.py rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/langevin.py diff --git a/examples/SPIN/test_problems/validation_langevin_precession/plot_precession.py b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/plot_precession.py similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/plot_precession.py rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/plot_precession.py diff --git a/examples/SPIN/test_problems/validation_langevin_precession/run-test-prec.sh b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/run-test-prec.sh similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/run-test-prec.sh rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/run-test-prec.sh diff --git a/examples/SPIN/test_problems/validation_langevin_precession/test-prec-spin.template b/examples/SPIN/test_problems/validation_langevin_precession_d0.01/test-prec-spin.template similarity index 100% rename from examples/SPIN/test_problems/validation_langevin_precession/test-prec-spin.template rename to examples/SPIN/test_problems/validation_langevin_precession_d0.01/test-prec-spin.template diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py new file mode 100755 index 0000000000..0e9b634eeb --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/langevin.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +import mpmath as mp + +mub=5.78901e-5 # Bohr magneton (eV/T) +kb=8.617333262145e-5 # Boltzman constant (eV/K) +g=2.0 # Lande factor (adim) + +Hz=10.0 # mag. field (T) + +#Definition of the Langevin function +def func(t): + return mp.coth(g*mub*Hz/(kb*t))-1.0/(g*mub*Hz/(kb*t)) + +npoints=200 +ti=0.01 +tf=20.0 +for i in range (0,npoints): + temp=ti+i*(tf-ti)/npoints + print('%lf %lf %lf' % (temp,func(temp),-g*mub*Hz*func(temp))) diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py new file mode 100755 index 0000000000..0141af56a0 --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/plot_precession.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +#Program fitting the exchange interaction +#Model curve: Bethe-Slater function +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +from scipy.optimize import curve_fit +from decimal import * +import sys, string, os + + +argv = sys.argv +if len(argv) != 3: + print("Syntax: ./plot_precession.py res_lammps.dat res_langevin.dat") + sys.exit() + +lammps_file = sys.argv[1] +langevin_file = sys.argv[2] + +T_lmp,S_lmp,E_lmp = np.loadtxt(lammps_file, skiprows=0, usecols=(0,2,3),unpack=True) +T_lan,S_lan,E_lan = np.loadtxt(langevin_file, skiprows=0, usecols=(0,1,2),unpack=True) + +plt.figure() +plt.subplot(211) +plt.ylabel('') +plt.plot(T_lmp, S_lmp, 'b-', label='LAMMPS') +plt.plot(T_lan, S_lan, 'r--', label='Langevin') + +plt.subplot(212) +plt.ylabel('E (in eV)') +plt.plot(T_lmp, E_lmp, 'b-', label='LAMMPS') +plt.plot(T_lan, E_lan, 'r--', label='Langevin') + +plt.xlabel('T (in K)') +pylab.xlim([0,20.0]) +plt.legend() +plt.show() diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh new file mode 100755 index 0000000000..ecdbb2c156 --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/run-test-prec.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +tempi=0.0 +tempf=20.0 + +rm res_*.dat + +# compute Lammps +N=20 +for (( i=0; i<$N; i++ )) +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}')" + echo $temp $Hz $sz $en >> res_lammps.dat +done + +# compute Langevin +python3 langevin.py > res_langevin.dat + +# plot results +python3 plot_precession.py res_lammps.dat res_langevin.dat diff --git a/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template new file mode 100644 index 0000000000..94e7a02fee --- /dev/null +++ b/examples/SPIN/test_problems/validation_langevin_precession_d1.0/test-prec-spin.template @@ -0,0 +1,48 @@ +#LAMMPS in.run + +units metal +atom_style spin +# atom_style spin/kk +atom_modify map array +boundary p p p + +# read_data singlespin.data + +lattice sc 3.0 +region box block 0.0 1.0 0.0 1.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +mass 1 1.0 +set type 1 spin 1.0 0.0 0.0 1.0 + +# defines a pair/style for neighbor list, but do not use it +pair_style spin/exchange 4.0 +pair_coeff * * exchange 1.0 0.0 0.0 1.0 + +group bead type 1 + +variable H equal 10.0 +variable Kan equal 0.0 +variable Temperature equal temperature +variable RUN equal 1000000 + +fix 1 all nve/spin lattice no +fix 2 all precession/spin zeeman ${H} 0.0 0.0 1.0 anisotropy ${Kan} 0.0 0.0 1.0 +fix_modify 2 energy yes +# fix 3 all langevin/spin ${Temperature} 0.01 12345 +fix 3 all langevin/spin ${Temperature} 1.0 12345 + +compute compute_spin all spin +compute outsp all property/atom spx spy spz sp +compute magsz all reduce ave c_outsp[3] + +thermo 50000 +thermo_style custom step time temp vol pe c_compute_spin[5] etotal + +variable magnetic_energy equal c_compute_spin[5] + +fix avespin all ave/time 1 ${RUN} ${RUN} v_Temperature v_H v_Kan c_magsz v_magnetic_energy file average_spin + +timestep 0.1 +run ${RUN} From 7cd5d7b357946fb77a1fa3ddcec935dbc932325d Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 26 Sep 2022 08:57:03 -0500 Subject: [PATCH 220/364] Added lammps_has_error --- fortran/lammps.f90 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 4486bd87c1..371e4073bc 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -414,7 +414,11 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_force_timeout - !LOGICAL FUNCTION lammps_has_error + INTEGER (C_int) FUNCTION lammps_has_error (handle) BIND(C) + IMPORT :: C_ptr, C_int + IMPLICIT NONE + TYPE(C_ptr), VALUE :: handle + END FUNCTION lammps_has_error !INTEGER (c_int) FUNCTION lammps_get_last_error_message @@ -844,6 +848,15 @@ CONTAINS lmp_version = lammps_version(self%handle) END FUNCTION lmp_version + ! equivalent function to lammps_has_error + LOGICAL FUNCTION lmp_has_error(self) + CLASS(lammps), INTENT(IN) :: self + INTEGER(C_int) :: has_error + + has_error = lammps_has_error(self%handle) + lmp_has_error = (has_error /= 0_C_int) + END FUNCTION lmp_has_error + ! equivalent function to lammps_is_running LOGICAL FUNCTION lmp_is_running(self) CLASS(lammps), INTENT(IN) :: self From 28d84b4fcbe1317e57c926be631b3a29bb802fc3 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 26 Sep 2022 08:57:32 -0500 Subject: [PATCH 221/364] Missed wrap_extract_compute.cpp in prior commit --- unittest/fortran/wrap_extract_compute.cpp | 174 ++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 unittest/fortran/wrap_extract_compute.cpp diff --git a/unittest/fortran/wrap_extract_compute.cpp b/unittest/fortran/wrap_extract_compute.cpp new file mode 100644 index 0000000000..2325b1540f --- /dev/null +++ b/unittest/fortran/wrap_extract_compute.cpp @@ -0,0 +1,174 @@ +// unit tests for extracting compute data from a LAMMPS instance through the +// Fortran wrapper + +#include "lammps.h" +#include "library.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_setup_extract_compute(); +double f_lammps_extract_compute_peratom_vector(int); +double f_lammps_extract_compute_peratom_array(int,int); +double f_lammps_extract_compute_global_scalar(); +double f_lammps_extract_compute_global_vector(int); +double f_lammps_extract_compute_global_array(int,int); +double f_lammps_extract_compute_local_vector(int); +double f_lammps_extract_compute_local_array(int,int); +} + +class LAMMPS_extract_compute : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_extract_compute() = default; + ~LAMMPS_extract_compute() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_extract_compute, peratom_vector) +{ + f_lammps_setup_extract_compute(); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(1), -0.599703102447981); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(2), 391.817623795857); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(3), 391.430665759871); + +}; + +TEST_F(LAMMPS_extract_compute, peratom_array) +{ + f_lammps_setup_extract_compute(); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,1), 0.8837067009319107); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,1), 0.3588584939803668); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,1), 1.2799807127711049); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,1), 0.20477632346642258); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,1), 0.400429511840588); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,1), 0.673995757699694); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,2), -1070.0291234709418); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,2), -1903.651817128683); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,2), -1903.5121520875714); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,2), -1427.867483013); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,2), -1427.8560790941347); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,2), -1903.5971655908565); +}; + +TEST_F(LAMMPS_extract_compute, global_scalar) +{ + f_lammps_setup_extract_compute(); + double *scalar; + scalar = (double*) lammps_extract_compute(lmp, "totalpe", LMP_STYLE_GLOBAL, + LMP_TYPE_SCALAR); + //EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), 782.64858645328); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), *scalar); +}; + +TEST_F(LAMMPS_extract_compute, global_vector) +{ + f_lammps_setup_extract_compute(); + double *vector; + vector = (double*) lammps_extract_compute(lmp, "COM", LMP_STYLE_GLOBAL, + LMP_TYPE_VECTOR); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(1), vector[0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(2), vector[1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(3), vector[2]); +}; + +TEST_F(LAMMPS_extract_compute, global_array) +{ + f_lammps_setup_extract_compute(); + double **array; + array = (double**) lammps_extract_compute(lmp, "RDF", LMP_STYLE_GLOBAL, + LMP_TYPE_ARRAY); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,1), array[0][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,1), array[0][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,2), array[1][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,2), array[1][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,3), array[2][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,4), array[3][0]); +}; +TEST_F(LAMMPS_extract_compute, local_vector) +{ + f_lammps_setup_extract_compute(); + double *vector; + vector = (double*) lammps_extract_compute(lmp, "pairdist", LMP_STYLE_LOCAL, + LMP_TYPE_VECTOR); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(1), vector[0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(2), vector[1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(3), vector[2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(4), vector[3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(5), vector[4]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(6), vector[5]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(7), vector[6]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(8), vector[7]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(9), vector[8]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(10), vector[9]); +}; + +TEST_F(LAMMPS_extract_compute, local_array) +{ + f_lammps_setup_extract_compute(); + double **array; + array = (double**) lammps_extract_compute(lmp, "pairlocal", LMP_STYLE_LOCAL, + LMP_TYPE_ARRAY); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,1), array[0][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,1), array[0][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,1), array[0][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,1), array[0][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,2), array[1][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,2), array[1][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,2), array[1][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,2), array[1][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,3), array[2][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,3), array[2][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,3), array[2][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,3), array[2][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,4), array[3][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,4), array[3][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,4), array[3][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,4), array[3][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,5), array[4][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,5), array[4][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,5), array[4][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,5), array[4][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,6), array[5][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,6), array[5][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,6), array[5][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,6), array[5][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,7), array[6][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,7), array[6][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,7), array[6][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,7), array[6][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,8), array[7][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,8), array[7][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,8), array[7][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,8), array[7][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,9), array[8][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,9), array[8][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,9), array[8][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,9), array[8][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,10), array[9][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,10), array[9][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,10), array[9][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,10), array[9][3]); +}; From 1072a5bda2b334114a874b2b27da9a465e3b75c9 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 26 Sep 2022 09:21:41 -0500 Subject: [PATCH 222/364] Added unit test for has_error --- fortran/lammps.f90 | 1 + unittest/fortran/test_fortran_properties.f90 | 14 ++++++++++++++ unittest/fortran/wrap_properties.cpp | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 371e4073bc..506a560613 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -100,6 +100,7 @@ MODULE LIBLAMMPS ! PROCEDURE :: version => lmp_version PROCEDURE :: is_running => lmp_is_running + PROCEDURE :: has_error => lmp_has_error END TYPE lammps INTERFACE lammps diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 00e083b301..9719e5c136 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -50,3 +50,17 @@ FUNCTION f_lammps_extract_setting (Cstr) BIND(C) f_lammps_extract_setting = lmp%extract_setting(Fstr) deallocate (Fstr) END FUNCTION f_lammps_extract_setting + +FUNCTION f_lammps_has_error () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE keepcmds, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER(C_int) :: f_lammps_has_error + + IF ( lmp%has_error() ) THEN + f_lammps_has_error = 1_C_int + ELSE + f_lammps_has_error = 0_C_int + END IF +END FUNCTION f_lammps_has_error diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index 8ecd9346dc..b4dffeed3a 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -16,6 +16,7 @@ int f_lammps_version(); void f_lammps_memory_usage(double*); int f_lammps_get_mpi_comm(); int f_lammps_extract_setting(const char*); +int f_lammps_has_error(); } class LAMMPS_properties : public ::testing::Test { @@ -107,3 +108,8 @@ TEST_F(LAMMPS_properties, extract_setting) EXPECT_EQ(f_lammps_extract_setting("UNKNOWN"), -1); }; + +TEST_F(LAMMPS_properties, has_error) +{ + EXPECT_EQ(f_lammps_has_error(), 0); +}; From 6262f3c537959eb35fcf76bfbaeb3684bc4652d9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 10:23:15 -0400 Subject: [PATCH 223/364] improve error message --- src/KIM/pair_kim.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index d496ffde04..bc4e9faec8 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -587,7 +587,7 @@ void PairKIM::init_style() // make sure comm_reverse expects (at most) 9 values when newton is off if (!lmps_using_newton) comm_reverse_off = 9; - // request full neighbor + // request full neighbor list for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { int neighflags = NeighConst::REQ_FULL | NeighConst::REQ_NEWTON_OFF; if (!modelWillNotRequestNeighborsOfNoncontributingParticles[i]) @@ -597,7 +597,8 @@ void PairKIM::init_style() // set cutoff if (kim_cutoff_values[i] <= neighbor->skin) - error->all(FLERR,"Illegal neighbor request (force cutoff <= skin)"); + error->all(FLERR,"Illegal neighbor request (force cutoff {:.3} <= skin {:.3})", + kim_cutoff_values[i], neighbor->skin); req->set_cutoff(kim_cutoff_values[i] + neighbor->skin); } // increment instance_me in case of need to change the neighbor list From 543e7b8b5693ed26fe9ed30220d5810442cef35e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 11:41:22 -0400 Subject: [PATCH 224/364] format DOI tags consistently --- doc/src/Bibliography.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index 27d5d3eef4..2d27d2e6f9 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -314,7 +314,7 @@ Bibliography Espanol, Revenga, Physical Review E, 67, 026705 (2003). **(Espanol1997)** - Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI: 10.1209/epl/i1997-00515-8 + Espanol, Europhys Lett, 40(6): 631-636 (1997). DOI:10.1209/epl/i1997-00515-8 **(Evans and Morriss)** Evans and Morriss, Phys Rev A, 30, 1528 (1984). @@ -401,13 +401,13 @@ Bibliography Hayre, and Farago, Comp Phys Comm, 185, 524 (2014) **(Groot)** - Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI: 10.1063/1.474784 + Groot and Warren, J Chem Phys, 107: 4423-4435 (1997). DOI:10.1063/1.474784 **(Guenole)** Guenole, Noehring, Vaid, Houlle, Xie, Prakash, Bitzek, Comput Mater Sci, 175, 109584 (2020). **(Gullet)** - Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). + Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). DOI:10.2172/918395 **(Guo)** Guo and Thirumalai, Journal of Molecular Biology, 263, 323-43 (1996). @@ -605,16 +605,16 @@ Bibliography I.\ Leven et al, J. Chem.Theory Comput. 12, 2896-905 (2016). **(Li2013_POF)** - Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013). DOI: 10.1063/1.4812366. + Li, Hu, Wang, Ma, Zhou, Phys Fluids, 25: 072103 (2013). DOI:10.1063/1.4812366. **(Li2014_JCP)** - Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265: 113-127 (2014). DOI: 10.1016/j.jcp.2014.02.003. + Li, Tang, Lei, Caswell, Karniadakis, J Comput Phys, 265: 113-127 (2014). DOI:10.1016/j.jcp.2014.02.003. **(Li2015_CC)** - Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040 (2015). DOI: 10.1039/C5CC01684C. + Li, Tang, Li, Karniadakis, Chem Commun, 51: 11038-11040 (2015). DOI:10.1039/C5CC01684C. **(Li2015_JCP)** - Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143: 014101 (2015). DOI: 10.1063/1.4923254. + Li, Yazdani, Tartakovsky, Karniadakis, J Chem Phys, 143: 014101 (2015). DOI:10.1063/1.4923254. **(Lisal)** M.\ Lisal, J.K. Brennan, J. Bonet Avalos, "Dissipative particle dynamics at isothermal, isobaric, isoenergetic, and isoenthalpic conditions using Shardlow-like splitting algorithms.", From a4e92ed4a909ab627ffcdd2e044c8876fb0409d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 11:41:54 -0400 Subject: [PATCH 225/364] update broken URLs --- doc/src/compute_damage_atom.rst | 8 +++----- doc/src/compute_dilatation_atom.rst | 12 +++++------- doc/src/pair_cs.rst | 4 ++-- doc/src/pair_meam.rst | 8 ++------ doc/src/pair_peri.rst | 21 +++++++++++---------- 5 files changed, 23 insertions(+), 30 deletions(-) diff --git a/doc/src/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst index cecce56255..c4ccaca196 100644 --- a/doc/src/compute_damage_atom.rst +++ b/doc/src/compute_damage_atom.rst @@ -32,12 +32,10 @@ The "damage" of a Peridynamics particles is based on the bond breakage between the particle and its neighbors. If all the bonds are broken the particle is considered to be fully damaged. -.. TODO the link below is broken - See the `PDLAMMPS user guide -`_ for a formal -definition of "damage" and more details about Peridynamics as it is -implemented in LAMMPS. +`_ for a +formal definition of "damage" and more details about Peridynamics as it +is implemented in LAMMPS. This command can be used with all the Peridynamic pair styles. diff --git a/doc/src/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst index a1037c6358..5eed50ed20 100644 --- a/doc/src/compute_dilatation_atom.rst +++ b/doc/src/compute_dilatation_atom.rst @@ -31,15 +31,13 @@ for an overview of LAMMPS commands for Peridynamics modeling. For small deformation, dilatation of is the measure of the volumetric strain. -.. TODO the link below is broken - The dilatation :math:`\theta` for each peridynamic particle :math:`i` is calculated as a sum over its neighbors with unbroken bonds, where the -contribution of the :math:`ij` pair is a function of the change in bond length -(versus the initial length in the reference state), the volume -fraction of the particles and an influence function. See the -`PDLAMMPS user guide `_ for -a formal definition of dilatation. +contribution of the :math:`ij` pair is a function of the change in bond +length (versus the initial length in the reference state), the volume +fraction of the particles and an influence function. See the `PDLAMMPS +user guide `_ +for a formal definition of dilatation. This command can only be used with a subset of the Peridynamic :doc:`pair styles `: peri/lps, peri/ves and peri/eps. diff --git a/doc/src/pair_cs.rst b/doc/src/pair_cs.rst index c021107fcc..745b14867b 100644 --- a/doc/src/pair_cs.rst +++ b/doc/src/pair_cs.rst @@ -114,7 +114,7 @@ Description """"""""""" These pair styles are designed to be used with the adiabatic -core/shell model of :ref:`(Mitchell and Fincham) `. See +core/shell model of :ref:`(Mitchell and Fincham) `. See the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. @@ -196,7 +196,7 @@ none ---------- -.. _MitchellFincham2: +.. _MitchellFincham3: **(Mitchell and Fincham)** Mitchell, Fincham, J Phys Condensed Matter, 5, 1031-1038 (1993). diff --git a/doc/src/pair_meam.rst b/doc/src/pair_meam.rst index 8227938581..ae8b96a47d 100644 --- a/doc/src/pair_meam.rst +++ b/doc/src/pair_meam.rst @@ -423,12 +423,8 @@ none .. _Gullet: -**(Gullet)** Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). -This report may be accessed on-line via `this link `_. - -.. TODO the following URL is not accessible - -.. _sandreport: http://infoserve.sandia.gov/sand_doc/2003/038782.pdf +**(Gullet)** Gullet, Wagner, Slepoy, SANDIA Report 2003-8782 (2003). DOI:10.2172/918395 +This report may be accessed on-line via `this link `_. .. _Lee: diff --git a/doc/src/pair_peri.rst b/doc/src/pair_peri.rst index 22661d99d6..7c78c960e3 100644 --- a/doc/src/pair_peri.rst +++ b/doc/src/pair_peri.rst @@ -51,8 +51,9 @@ Description """"""""""" The peridynamic pair styles implement material models that can be used -at the mesoscopic and macroscopic scales. See `this document `_ for an overview of LAMMPS commands -for Peridynamics modeling. +at the mesoscopic and macroscopic scales. See `this document +`_ for an overview of LAMMPS commands for +Peridynamics modeling. Style *peri/pmb* implements the Peridynamic bond-based prototype microelastic brittle (PMB) model. @@ -66,14 +67,12 @@ peridynamic viscoelastic solid (VES) model. Style *peri/eps* implements the Peridynamic state-based elastic-plastic solid (EPS) model. -.. TODO the following URL is not valid - The canonical papers on Peridynamics are :ref:`(Silling 2000) ` and :ref:`(Silling 2007) `. The implementation of Peridynamics in LAMMPS is described in :ref:`(Parks) `. Also see the `PDLAMMPS user guide -`_ for more details -about its implementation. +`_ for more +details about its implementation. The peridynamic VES and EPS models in PDLAMMPS were implemented by R. Rahman and J. T. Foster at University of Texas at San Antonio. The @@ -169,8 +168,9 @@ shift option. The :doc:`pair_modify ` table and tail options are not relevant for these pair styles. -These pair styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need -to be specified in an input script that reads a restart file. +These pair styles write their information to :doc:`binary restart files +`, so pair_style and pair_coeff commands do not need to be +specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the @@ -181,8 +181,9 @@ These pair styles can only be used via the *pair* keyword of the Restrictions """""""""""" -All of these styles are part of the PERI package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +All of these styles are part of the PERI package. They are only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" From 5ea37448b6b076bddabd8906cd6a4decb3f2fb38 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 13:12:04 -0400 Subject: [PATCH 226/364] whitespace --- doc/src/Howto_spins.rst | 16 ++++++++-------- doc/src/min_modify.rst | 4 ++-- src/SPIN/compute_spin.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/src/Howto_spins.rst b/doc/src/Howto_spins.rst index 63d5d8f4e7..8ca220f596 100644 --- a/doc/src/Howto_spins.rst +++ b/doc/src/Howto_spins.rst @@ -30,10 +30,10 @@ can be coupled to another Langevin thermostat applied to the atoms using :doc:`fix langevin ` in order to simulate thermostatted spin-lattice systems. -The magnetic damping can also be applied -using :doc:`fix langevin/spin `. -It allows to either dissipate the thermal energy of the Langevin -thermostat, or to perform a relaxation of the magnetic configuration +The magnetic damping can also be applied +using :doc:`fix langevin/spin `. +It allows to either dissipate the thermal energy of the Langevin +thermostat, or to perform a relaxation of the magnetic configuration toward an equilibrium state. The command :doc:`fix setforce/spin ` allows to set the @@ -54,10 +54,10 @@ All the computed magnetic properties can be output by two main commands. The first one is :doc:`compute spin `, that enables to evaluate magnetic averaged quantities, such as the total magnetization of the system along x, y, or z, the spin temperature, or -the magnetic energy. The second command -is :doc:`compute property/atom `. -It enables to output all the per atom magnetic quantities. Typically, -the orientation of a given magnetic spin, or the magnetic force +the magnetic energy. The second command +is :doc:`compute property/atom `. +It enables to output all the per atom magnetic quantities. Typically, +the orientation of a given magnetic spin, or the magnetic force acting on this spin. ---------- diff --git a/doc/src/min_modify.rst b/doc/src/min_modify.rst index 8ef89fa16c..1b57a39064 100644 --- a/doc/src/min_modify.rst +++ b/doc/src/min_modify.rst @@ -109,8 +109,8 @@ norm is replaced by the spin-torque norm. Keywords *alpha_damp* and *discrete_factor* only make sense when a :doc:`min_spin ` command is declared. -Keyword *alpha_damp* defines an analog of a magnetic damping. -It defines a relaxation rate toward an equilibrium for a given +Keyword *alpha_damp* defines an analog of a magnetic damping. +It defines a relaxation rate toward an equilibrium for a given magnetic system. Keyword *discrete_factor* defines a discretization factor for the adaptive timestep used in the *spin* minimization. diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index 66145a1063..b6a863d22f 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -43,7 +43,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), + Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), lockprecessionspin(nullptr) { if ((narg != 3) && (narg != 4)) error->all(FLERR,"Illegal compute compute/spin command"); From 1eb3d50c22551228c3dd7985f829471e508786d9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 13:38:35 -0400 Subject: [PATCH 227/364] simplify/modernize --- src/SPIN/compute_spin.cpp | 55 +++++++++------------------------------ 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index b6a863d22f..b674598265 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -43,8 +43,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), pair(nullptr), spin_pairs(nullptr), - lockprecessionspin(nullptr) + Compute(lmp, narg, arg), lockprecessionspin(nullptr), pair(nullptr), spin_pairs(nullptr) { if ((narg != 3) && (narg != 4)) error->all(FLERR,"Illegal compute compute/spin command"); @@ -69,8 +68,8 @@ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) : ComputeSpin::~ComputeSpin() { memory->destroy(vector); - delete [] spin_pairs; - delete [] lockprecessionspin; + delete[] spin_pairs; + delete[] lockprecessionspin; } /* ---------------------------------------------------------------------- */ @@ -98,7 +97,7 @@ void ComputeSpin::init() else npairs = hybrid->nstyles; for (int i = 0; ipair_match("^spin",0,i)) { - npairspin ++; + npairspin++; } } } @@ -139,47 +138,17 @@ void ComputeSpin::init() // set ptrs for fix precession/spin styles - // loop 1: obtain # of fix precession/spin styles - - int iforce; - nprecspin = 0; - for (iforce = 0; iforce < modify->nfix; iforce++) { - if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { - nprecspin++; - } - } - - // init length of vector of ptrs to precession/spin styles + auto precfixes = modify->get_fix_by_style("^precession/spin"); + nprecspin = precfixes.size(); if (nprecspin > 0) { - lockprecessionspin = new FixPrecessionSpin*[nprecspin]; + lockprecessionspin = new FixPrecessionSpin *[nprecspin]; + precession_spin_flag = 1; + + int i = 0; + for (auto &ifix : precfixes) + lockprecessionspin[i++] = dynamic_cast(ifix); } - - // loop 2: fill vector with ptrs to precession/spin styles - - int count2 = 0; - if (nprecspin > 0) { - for (iforce = 0; iforce < modify->nfix; iforce++) { - if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { - precession_spin_flag = 1; - lockprecessionspin[count2] = dynamic_cast(modify->fix[iforce]); - count2++; - } - } - } - - if (count2 != nprecspin) - error->all(FLERR,"Incorrect number of precession/spin fixes"); - - // // ptrs FixPrecessionSpin classes - - // int iforce; - // for (iforce = 0; iforce < modify->nfix; iforce++) { - // if (utils::strmatch(modify->fix[iforce]->style,"^precession/spin")) { - // precession_spin_flag = 1; - // lockprecessionspin = dynamic_cast(modify->fix[iforce]); - // } - // } } /* ---------------------------------------------------------------------- */ From 1dc3c8fc26b1046b6581eac4562b41cffb932ebf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 19:56:00 -0400 Subject: [PATCH 228/364] remove hippynn examples --- examples/mliap/README | 15 ----- examples/mliap/in.mliap.unified.hippynn.Al | 57 ----------------- .../in.mliap.unified.hippynn.Al.ghostneigh | 63 ------------------- examples/mliap/in.mliap.unified.hippynn.InP | 55 ---------------- 4 files changed, 190 deletions(-) delete mode 100644 examples/mliap/in.mliap.unified.hippynn.Al delete mode 100644 examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh delete mode 100644 examples/mliap/in.mliap.unified.hippynn.InP diff --git a/examples/mliap/README b/examples/mliap/README index cbe33f4c07..070ce86bfd 100644 --- a/examples/mliap/README +++ b/examples/mliap/README @@ -151,21 +151,6 @@ or in parallel: The resultant log.lammps output should be identical to that generated by in.melt and in.mliap.unified.lj.Ar. -in.mliap.unified.hippynn.Al ---------------------------- - -Demonstrate ML-IAP interface to HIPNN Al potential. Requires the HIPNN code. - -in.mliap.unified.hippynn.Al.ghostneigh --------------------------------------- - -Demonstrate ML-IAP interface to HIPNN Al potential with ghost neighbors. Requires the HIPNN code. - -in.mliap.unified.hippynn.InP ----------------------------- - -Demonstrate ML-IAP interface to HIPNN InP potential. Requires the HIPNN code. - in.mliap.so3.Ni_Mo ------------------ diff --git a/examples/mliap/in.mliap.unified.hippynn.Al b/examples/mliap/in.mliap.unified.hippynn.Al deleted file mode 100644 index 4efcba8b37..0000000000 --- a/examples/mliap/in.mliap.unified.hippynn.Al +++ /dev/null @@ -1,57 +0,0 @@ -# Demonstrate MLIAP interface to HIPNN Al potential -# Example taken from https://github.com/lanl/hippynn - -# Initialize simulation - -variable nsteps index 100 -variable nrep equal 4 -variable a equal 4.05 -units metal - -# generate the box and atom positions using a FCC lattice - -variable nx equal ${nrep} -variable ny equal ${nrep} -variable nz equal ${nrep} - -boundary p p p - -lattice fcc $a -region box block 0 ${nx} 0 ${ny} 0 ${nz} -create_box 1 box -create_atoms 1 box - -mass 1 26.981 - -# choose potential - -pair_style mliap unified mliap_unified_hippynn_Al.pt 0 -pair_coeff * * Al - -# Setup output - -compute eatom all pe/atom -compute energy all reduce sum c_eatom - -compute satom all stress/atom NULL -compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] -variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) - -thermo_style custom step temp epair c_energy etotal press v_press -thermo 10 -thermo_modify norm yes - -# Set up NVE run - -timestep 0.5e-3 -neighbor 1.0 bin -neigh_modify once no every 1 delay 0 check yes - -#dump 4 all custom 1 forces.xyz fx fy fz - -# Run MD - -velocity all create 300.0 4928459 loop geom -fix 1 all nve -run ${nsteps} - diff --git a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh b/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh deleted file mode 100644 index 7dfc982cbc..0000000000 --- a/examples/mliap/in.mliap.unified.hippynn.Al.ghostneigh +++ /dev/null @@ -1,63 +0,0 @@ -# Demonstrate MLIAP interface to HIPNN Al potential -# Example taken from https://github.com/lanl/hippynn - -# Initialize simulation - -variable nsteps index 100 -variable nrep equal 4 -variable a equal 4.05 -units metal - -# generate the box and atom positions using a FCC lattice - -variable nx equal ${nrep} -variable ny equal ${nrep} -variable nz equal ${nrep} - -boundary p p p - -lattice fcc $a -region box block 0 ${nx} 0 ${ny} 0 ${nz} -create_box 1 box -create_atoms 1 box - -mass 1 26.981 - -# choose potential - -pair_style mliap unified mliap_unified_hippynn_Al_multilayer.pt 1 -pair_coeff * * Al - -# Setup output - -compute eatom all pe/atom -compute energy all reduce sum c_eatom - -compute satom all stress/atom NULL -compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] -variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) - -thermo_style custom step temp epair c_energy etotal press v_press -thermo 10 -thermo_modify norm yes - -# Set up NVE run - -variable ninteractions equal 2 -variable cutdist equal 7.5 -variable skin equal 1.0 -variable commcut equal (${ninteractions}*${cutdist})+${skin} - -timestep 0.5e-3 -neighbor ${skin} bin -neigh_modify once no every 1 delay 0 check yes -comm_modify cutoff ${commcut} - -#dump 4 all custom 1 forces.xyz fx fy fz - -# Run MD - -velocity all create 300.0 4928459 loop geom -fix 1 all nve -run ${nsteps} - diff --git a/examples/mliap/in.mliap.unified.hippynn.InP b/examples/mliap/in.mliap.unified.hippynn.InP deleted file mode 100644 index 0cba7f2416..0000000000 --- a/examples/mliap/in.mliap.unified.hippynn.InP +++ /dev/null @@ -1,55 +0,0 @@ -# Demonstrate MLIAP interface to HIPNN InP potential -# Example taken from https://github.com/lanl/hippynn - -# Initialize simulation - -variable nsteps index 100 -variable nrep equal 4 -variable a equal 5.83 -units metal - -# generate the box and atom positions using a FCC lattice - -variable nx equal ${nrep} -variable ny equal ${nrep} -variable nz equal ${nrep} - -boundary p p p - -lattice diamond $a -region box block 0 ${nx} 0 ${ny} 0 ${nz} -create_box 2 box -create_atoms 1 box basis 5 2 basis 6 2 basis 7 2 basis 8 2 - -mass 1 114.76 -mass 2 30.98 - -# choose potential - -# Specify MLIAP Unified pair style -pair_style mliap unified mliap_unified_hippynn_InP.pt -pair_coeff * * In P - -#dump 4 all custom 1 forces.xyz fx fy fz - -#dump 3 all movie 1 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - - -# Setup output - -thermo 10 -thermo_modify norm yes - -# Set up NVE run - -timestep 0.5e-3 -neighbor 1.0 bin -neigh_modify once no every 1 delay 0 check yes - -# Run MD - -velocity all create 300.0 4928459 loop geom -fix 1 all nve -run ${nsteps} From 7238a29cb725f63957a47deec261aef2e5e24a63 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 20:39:46 -0400 Subject: [PATCH 229/364] improve version tag regexp to match cases with leading blanks --- tools/coding_standard/versiontags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/coding_standard/versiontags.py b/tools/coding_standard/versiontags.py index ecaa681b13..75a37dfbcc 100644 --- a/tools/coding_standard/versiontags.py +++ b/tools/coding_standard/versiontags.py @@ -36,7 +36,7 @@ patterns: """ def check_pending_tag(f): - pattern = re.compile(r'\.\. +version(changed|added):: +TBD') + pattern = re.compile(r'^ *\.\. +version(changed|added):: +TBD') last_line = "\n" lineno = 1 errors = set() From 3e9dca30173a5ec7c746b47b17a65358ce316172 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 21:01:22 -0400 Subject: [PATCH 230/364] Implement alternate and recommended way to set properties of abstract base class See: https://github.com/lammps/lammps/security/code-scanning/476 --- python/lammps/mliap/mliap_unified_abc.py | 13 +++++++------ python/lammps/mliap/mliap_unified_lj.py | 7 ++----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/python/lammps/mliap/mliap_unified_abc.py b/python/lammps/mliap/mliap_unified_abc.py index 3243df85c4..aca640a836 100644 --- a/python/lammps/mliap/mliap_unified_abc.py +++ b/python/lammps/mliap/mliap_unified_abc.py @@ -4,12 +4,13 @@ import pickle class MLIAPUnified(ABC): """Abstract base class for MLIAPUnified.""" - def __init__(self): - self.interface = None - self.element_types = None - self.ndescriptors = None - self.nparams = None - self.rcutfac = None + def __init__(self, interface = None, element_types = None, + ndescriptors = None, nparams = None, rcutfac = None): + self.interface = interface + self.element_types = element_types + self.ndescriptors = ndescriptors + self.nparams = nparams + self.rcutfac = rcutfac @abstractmethod def compute_gradients(self, data): diff --git a/python/lammps/mliap/mliap_unified_lj.py b/python/lammps/mliap/mliap_unified_lj.py index 37e7170d4a..077b00d7b9 100644 --- a/python/lammps/mliap/mliap_unified_lj.py +++ b/python/lammps/mliap/mliap_unified_lj.py @@ -6,16 +6,13 @@ class MLIAPUnifiedLJ(MLIAPUnified): """Test implementation for MLIAPUnified.""" def __init__(self, element_types, epsilon=1.0, sigma=1.0, rcutfac=1.25): - super().__init__() - self.element_types = element_types - self.ndescriptors = 1 - self.nparams = 3 + # ARGS: interface, element_types, ndescriptors, nparams, rcutfac + super().__init__(None, element_types, 1, 3, rcutfac) # Mimicking the LJ pair-style: # pair_style lj/cut 2.5 # pair_coeff * * 1 1 self.epsilon = epsilon self.sigma = sigma - self.rcutfac = rcutfac def compute_gradients(self, data): """Test compute_gradients.""" From 2072e08624c8510da25e0e6096401293165edf28 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 26 Sep 2022 21:56:03 -0500 Subject: [PATCH 231/364] added get_last_error_message; still working on its unit test --- fortran/lammps.f90 | 85 ++++++++++++++++++++-------- unittest/fortran/wrap_properties.cpp | 3 +- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 506a560613..45540ffb84 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -81,26 +81,27 @@ MODULE LIBLAMMPS TYPE(lammps_style) :: style TYPE(lammps_type) :: type CONTAINS - PROCEDURE :: close => lmp_close - PROCEDURE :: error => lmp_error - PROCEDURE :: file => lmp_file - PROCEDURE :: command => lmp_command - PROCEDURE :: commands_list => lmp_commands_list - PROCEDURE :: commands_string => lmp_commands_string - PROCEDURE :: get_natoms => lmp_get_natoms - PROCEDURE :: get_thermo => lmp_get_thermo - PROCEDURE :: extract_box => lmp_extract_box - PROCEDURE :: reset_box => lmp_reset_box - PROCEDURE :: memory_usage => lmp_memory_usage - PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm - PROCEDURE :: extract_setting => lmp_extract_setting - PROCEDURE :: extract_global => lmp_extract_global - PROCEDURE :: extract_atom => lmp_extract_atom - PROCEDURE :: extract_compute => lmp_extract_compute -! - PROCEDURE :: version => lmp_version - PROCEDURE :: is_running => lmp_is_running - PROCEDURE :: has_error => lmp_has_error + PROCEDURE :: close => lmp_close + PROCEDURE :: error => lmp_error + PROCEDURE :: file => lmp_file + PROCEDURE :: command => lmp_command + PROCEDURE :: commands_list => lmp_commands_list + PROCEDURE :: commands_string => lmp_commands_string + PROCEDURE :: get_natoms => lmp_get_natoms + PROCEDURE :: get_thermo => lmp_get_thermo + PROCEDURE :: extract_box => lmp_extract_box + PROCEDURE :: reset_box => lmp_reset_box + PROCEDURE :: memory_usage => lmp_memory_usage + PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm + PROCEDURE :: extract_setting => lmp_extract_setting + PROCEDURE :: extract_global => lmp_extract_global + PROCEDURE :: extract_atom => lmp_extract_atom + PROCEDURE :: extract_compute => lmp_extract_compute +! + PROCEDURE :: version => lmp_version + PROCEDURE :: is_running => lmp_is_running + PROCEDURE :: has_error => lmp_has_error + PROCEDURE :: get_last_error_message => lmp_get_last_error_message END TYPE lammps INTERFACE lammps @@ -416,12 +417,18 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_force_timeout INTEGER (C_int) FUNCTION lammps_has_error (handle) BIND(C) - IMPORT :: C_ptr, C_int + IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(C_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: handle END FUNCTION lammps_has_error - !INTEGER (c_int) FUNCTION lammps_get_last_error_message + INTEGER (c_int) FUNCTION lammps_get_last_error_message & + (handle, buffer, buf_size) BIND(C) + IMPORT :: c_ptr, c_int, c_char + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, buffer + INTEGER(c_int), VALUE :: buf_size + END FUNCTION lammps_get_last_error_message END INTERFACE @@ -852,12 +859,40 @@ CONTAINS ! equivalent function to lammps_has_error LOGICAL FUNCTION lmp_has_error(self) CLASS(lammps), INTENT(IN) :: self - INTEGER(C_int) :: has_error + INTEGER(c_int) :: has_error has_error = lammps_has_error(self%handle) - lmp_has_error = (has_error /= 0_C_int) + lmp_has_error = (has_error /= 0_c_int) END FUNCTION lmp_has_error + ! equivalent function to lammps_get_last_error_message + SUBROUTINE lmp_get_last_error_message(self, buffer, status) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER, INTENT(OUT), OPTIONAL :: status + INTEGER(c_int) :: length, Cstatus, i + TYPE(c_ptr) :: Cbuffer + + buffer = '' + IF ( lmp_has_error(self) ) THEN + length = LEN(buffer) + Cbuffer = f2cstring(buffer) + Cstatus = lammps_get_last_error_message(self%handle, Cbuffer, length) + length = MIN(LEN(buffer), c_strlen(Cbuffer)) + FORALL ( i=1:length ) + buffer(i:i) = Cbuffer(i) + END FORALL + IF ( PRESENT(status) ) THEN + status = Cstatus + END IF + ELSE + buffer = '' + IF ( PRESENT(status) ) THEN + status = 0 + END IF + END IF + END SUBROUTINE lmp_get_last_error_message + ! equivalent function to lammps_is_running LOGICAL FUNCTION lmp_is_running(self) CLASS(lammps), INTENT(IN) :: self diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index b4dffeed3a..392a6633d6 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -111,5 +111,6 @@ TEST_F(LAMMPS_properties, extract_setting) TEST_F(LAMMPS_properties, has_error) { - EXPECT_EQ(f_lammps_has_error(), 0); + EXPECT_EQ(f_lammps_has_error(), lammps_has_error(lmp)); + // TODO: How to test the error message itself? }; From 502fd0eff8704262c647365bf6395f82ed9cb589 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 27 Sep 2022 17:04:16 +0200 Subject: [PATCH 232/364] ML-PACE.cmake: update tag and MD5 hashsum pair_pace_extrapolation.cpp: add log message about type of active set (LINEAR or FULL) --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- src/ML-PACE/pair_pace_extrapolation.cpp | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 11b2b92481..70378fcccb 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.06.27.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.09.27.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "400f0a4b44c1ce64ae47796e6de4bba8" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "ad6c8597076479bd55059f5947d51acc" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 5fc01f5f66..92fc8a7812 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -380,6 +380,13 @@ void PairPACEExtrapolation::coeff(int narg, char **arg) if (comm->me == 0) utils::logmesg(lmp, "Loading ASI {}\n", active_set_inv_filename); aceimpl->ace->load_active_set(active_set_inv_filename); + bool is_linear_extrapolation_grade = aceimpl->ace->get_is_linear_extrapolation_grade(); + if (comm->me == 0) { + if (is_linear_extrapolation_grade) + utils::logmesg(lmp, "LINEAR ASI is loaded\n"); + else + utils::logmesg(lmp, "FULL ASI is loaded\n"); + } // clear setflag since coeff() called once with I,J = * * for (int i = 1; i <= n; i++) From 2f231bcd50dd958a12aac2661ea18df340756ce5 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 27 Sep 2022 17:15:20 +0200 Subject: [PATCH 233/364] update documentation: explain fix_modify pair every N --- doc/src/fix_modify.rst | 4 +++- doc/src/fix_pair.rst | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/src/fix_modify.rst b/doc/src/fix_modify.rst index e0cf3a34c7..33b11a9764 100644 --- a/doc/src/fix_modify.rst +++ b/doc/src/fix_modify.rst @@ -12,7 +12,7 @@ Syntax * fix-ID = ID of the fix to modify * one or more keyword/value pairs may be appended -* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* +* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* or *every* .. parsed-literal:: @@ -29,6 +29,7 @@ Syntax *respa* value = *1* to *max respa level* or *0* (for outermost level) *temp* value = compute ID that calculates a temperature *virial* value = *yes* or *no* + *every* arg = N Examples """""""" @@ -39,6 +40,7 @@ Examples fix_modify 1 energy yes fix_modify tether respa 2 fix_modify ave colname c_thermo_press Pressure colname 1 Temperature + fix_modify pair every 10 Description """"""""""" diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index abb44718cd..374ac121f0 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -86,8 +86,9 @@ Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" No information about this fix is written to :doc:`binary restart files -`. None of the :doc:`fix_modify ` options are -relevant to this fix. +`. +The timesteps on which fix pair will extract per-atom quantities from a pair +style can be modified by *every* option of :doc:`fix_modify `. As explained above, this fix produces a per-atom vector or array which can be accessed by various :doc:`output commands `. If @@ -103,6 +104,7 @@ Related commands """""""""""""""" :doc:`compute pair ` +:doc:`fix_modify ` Default """"""" From 36d22b9d008d50231cda0471dabe379adcabd71a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 13:20:25 -0400 Subject: [PATCH 234/364] silence compiler warnings --- src/ML-IAP/mliap_data.cpp | 2 +- src/ML-IAP/mliap_unified.cpp | 2 +- src/ML-IAP/pair_mliap.cpp | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ML-IAP/mliap_data.cpp b/src/ML-IAP/mliap_data.cpp index a91e66b211..dd729ff330 100644 --- a/src/ML-IAP/mliap_data.cpp +++ b/src/ML-IAP/mliap_data.cpp @@ -34,7 +34,7 @@ MLIAPData::MLIAPData(LAMMPS *lmp, int gradgradflag_in, int *map_in, Pointers(lmp), f(nullptr), gradforce(nullptr), betas(nullptr), descriptors(nullptr), eatoms(nullptr), gamma(nullptr), gamma_row_index(nullptr), gamma_col_index(nullptr), egradient(nullptr), - numneighs(nullptr), iatoms(nullptr), pair_i(nullptr), ielems(nullptr), + numneighs(nullptr), iatoms(nullptr), ielems(nullptr), pair_i(nullptr), jatoms(nullptr), jelems(nullptr), elems(nullptr), rij(nullptr), graddesc(nullptr), model(nullptr), descriptor(nullptr), list(nullptr) { diff --git a/src/ML-IAP/mliap_unified.cpp b/src/ML-IAP/mliap_unified.cpp index 6bcdc88289..9d3b591002 100644 --- a/src/ML-IAP/mliap_unified.cpp +++ b/src/ML-IAP/mliap_unified.cpp @@ -203,7 +203,7 @@ MLIAPBuildUnified_t LAMMPS_NS::build_unified(char *unified_fname, MLIAPData *dat lmp->error->all(FLERR, "Could not initialize embedded Python"); } - PyObject *unified_module = PyImport_ImportModule("mliap_unified_couple"); + PyImport_ImportModule("mliap_unified_couple"); if (PyErr_Occurred()) { PyErr_Print(); diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index af8768568e..865019ba55 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -221,8 +221,6 @@ void PairMLIAP::coeff(int narg, char **arg) if (narg < 3) error->all(FLERR,"Incorrect args for pair coefficients"); if (!allocated) allocate(); - char* type1 = arg[0]; - char* type2 = arg[1]; char** elemtypes = &arg[2]; // read args that map atom types to elements From 256f385be41f437641b2404d6a4179a94f55b96f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 13:20:39 -0400 Subject: [PATCH 235/364] avoid race condition --- unittest/fortran/test_fortran_properties.f90 | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 00e083b301..931d29f23b 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -1,7 +1,22 @@ +MODULE keepprops + USE liblammps + IMPLICIT NONE + TYPE(LAMMPS) :: lmp + CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 2 0 2', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] +END MODULE keepprops + FUNCTION f_lammps_version () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepcmds, ONLY : lmp + USE keepprops, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_version @@ -11,7 +26,7 @@ END FUNCTION f_lammps_version SUBROUTINE f_lammps_memory_usage (meminfo) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepprops, ONLY : lmp IMPLICIT NONE REAL (C_double), DIMENSION(3), INTENT(OUT) :: meminfo @@ -21,7 +36,7 @@ END SUBROUTINE f_lammps_memory_usage FUNCTION f_lammps_get_mpi_comm () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepcmds, ONLY : lmp + USE keepprops, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_get_mpi_comm @@ -30,7 +45,7 @@ END FUNCTION f_lammps_get_mpi_comm FUNCTION f_lammps_extract_setting (Cstr) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char - USE keepcmds, ONLY : lmp + USE keepprops, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int) :: f_lammps_extract_setting From 7fe9d087dbc2b5e355dcf4297b62f4de8050cee0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 14:01:01 -0400 Subject: [PATCH 236/364] move reusable fortran modules to keep data to a separate file --- unittest/fortran/CMakeLists.txt | 2 +- unittest/fortran/keepstuff.f90 | 40 +++++++++++++++ unittest/fortran/test_fortran_box.f90 | 37 ++++---------- unittest/fortran/test_fortran_commands.f90 | 15 ------ unittest/fortran/test_fortran_create.f90 | 8 --- .../fortran/test_fortran_extract_global.f90 | 19 ------- unittest/fortran/test_fortran_get_thermo.f90 | 50 ++++++------------- unittest/fortran/test_fortran_properties.f90 | 23 ++------- unittest/fortran/wrap_properties.cpp | 1 - 9 files changed, 71 insertions(+), 124 deletions(-) create mode 100644 unittest/fortran/keepstuff.f90 diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index d1f632f959..a90df90fb3 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -30,7 +30,7 @@ if(CMAKE_Fortran_COMPILER) add_library(MPI::MPI_Fortran ALIAS fmpi_stubs) endif() - add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE}) + add_library(flammps STATIC ${LAMMPS_FORTRAN_MODULE} keepstuff.f90) add_executable(test_fortran_create wrap_create.cpp test_fortran_create.f90) target_link_libraries(test_fortran_create PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) diff --git a/unittest/fortran/keepstuff.f90 b/unittest/fortran/keepstuff.f90 new file mode 100644 index 0000000000..8a7f530c37 --- /dev/null +++ b/unittest/fortran/keepstuff.f90 @@ -0,0 +1,40 @@ +MODULE keepcmds + USE liblammps + IMPLICIT NONE + TYPE(LAMMPS) :: lmp + CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 2 0 2', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] +END MODULE keepcmds + +MODULE keepglobal + USE liblammps + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(len=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(len=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 1.0' ] +END MODULE keepglobal + +MODULE keepcreate + USE liblammps + TYPE(LAMMPS) :: lmp + INTEGER :: mycomm +END MODULE keepcreate + diff --git a/unittest/fortran/test_fortran_box.f90 b/unittest/fortran/test_fortran_box.f90 index c21918afd0..9a2e8207a9 100644 --- a/unittest/fortran/test_fortran_box.f90 +++ b/unittest/fortran/test_fortran_box.f90 @@ -1,22 +1,7 @@ -MODULE keepbox - USE liblammps - IMPLICIT NONE - TYPE(LAMMPS) :: lmp - CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 2 0 2', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] -END MODULE keepbox - FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepbox, ONLY: lmp + USE keepcmds, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args @@ -31,7 +16,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepbox, ONLY: lmp + USE keepcmds, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -40,7 +25,7 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_box_setup () BIND(C) USE liblammps - USE keepbox, ONLY : lmp, demo_input + USE keepcmds, ONLY : lmp, demo_input IMPLICIT NONE CALL lmp%commands_list(demo_input) @@ -48,7 +33,7 @@ END SUBROUTINE f_lammps_box_setup SUBROUTINE f_lammps_delete_everything() BIND(C) USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE CALL lmp%command("delete_atoms group all"); @@ -57,7 +42,7 @@ END SUBROUTINE f_lammps_delete_everything FUNCTION f_lammps_extract_box_xlo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_xlo REAL (c_double) :: boxdim(3) @@ -69,7 +54,7 @@ END FUNCTION f_lammps_extract_box_xlo FUNCTION f_lammps_extract_box_xhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_xhi REAL (c_double) :: boxdim(3) @@ -81,7 +66,7 @@ END FUNCTION f_lammps_extract_box_xhi FUNCTION f_lammps_extract_box_ylo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_ylo REAL (c_double) :: boxdim(3) @@ -93,7 +78,7 @@ END FUNCTION f_lammps_extract_box_ylo FUNCTION f_lammps_extract_box_yhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_yhi REAL (c_double) :: boxdim(3) @@ -105,7 +90,7 @@ END FUNCTION f_lammps_extract_box_yhi FUNCTION f_lammps_extract_box_zlo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_zlo REAL (c_double) :: boxdim(3) @@ -117,7 +102,7 @@ END FUNCTION f_lammps_extract_box_zlo FUNCTION f_lammps_extract_box_zhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_zhi REAL (c_double) :: boxdim(3) @@ -129,7 +114,7 @@ END FUNCTION f_lammps_extract_box_zhi SUBROUTINE f_lammps_reset_box_2x () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepbox, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (c_double) :: newlo(3), newhi(3), xy, yz, xz diff --git a/unittest/fortran/test_fortran_commands.f90 b/unittest/fortran/test_fortran_commands.f90 index d85b0f183e..a09b492e66 100644 --- a/unittest/fortran/test_fortran_commands.f90 +++ b/unittest/fortran/test_fortran_commands.f90 @@ -1,18 +1,3 @@ -MODULE keepcmds - USE liblammps - IMPLICIT NONE - TYPE(LAMMPS) :: lmp - CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 2 0 2', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] -END MODULE keepcmds - FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps diff --git a/unittest/fortran/test_fortran_create.f90 b/unittest/fortran/test_fortran_create.f90 index 73fc83aef4..2b5b5c5814 100644 --- a/unittest/fortran/test_fortran_create.f90 +++ b/unittest/fortran/test_fortran_create.f90 @@ -1,11 +1,3 @@ -include 'lammps.f90' - -MODULE keepcreate - USE liblammps - TYPE(LAMMPS) :: lmp - INTEGER :: mycomm -END MODULE keepcreate - FUNCTION f_lammps_no_mpi_no_args() BIND(C, name="f_lammps_no_mpi_no_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps diff --git a/unittest/fortran/test_fortran_extract_global.f90 b/unittest/fortran/test_fortran_extract_global.f90 index 9a8552d677..86c999e8f3 100644 --- a/unittest/fortran/test_fortran_extract_global.f90 +++ b/unittest/fortran/test_fortran_extract_global.f90 @@ -1,22 +1,3 @@ -MODULE keepglobal - USE liblammps - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 1.0' ] -END MODULE keepglobal - FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps diff --git a/unittest/fortran/test_fortran_get_thermo.f90 b/unittest/fortran/test_fortran_get_thermo.f90 index e96c964e7c..2b11470090 100644 --- a/unittest/fortran/test_fortran_get_thermo.f90 +++ b/unittest/fortran/test_fortran_get_thermo.f90 @@ -1,27 +1,7 @@ -MODULE keepthermo - USE liblammps - IMPLICIT NONE - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 1.0' ] -END MODULE keepthermo - FUNCTION f_lammps_with_args() BIND(C) USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepthermo, ONLY: lmp + USE keepglobal, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args @@ -36,7 +16,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepthermo, ONLY: lmp + USE keepglobal, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -45,7 +25,7 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_get_thermo_setup () BIND(C) USE liblammps - USE keepthermo, ONLY : lmp, demo_input, cont_input, pair_input + USE keepglobal, ONLY : lmp, demo_input, cont_input, pair_input IMPLICIT NONE CALL lmp%commands_list(demo_input) @@ -56,7 +36,7 @@ END SUBROUTINE f_lammps_get_thermo_setup FUNCTION f_lammps_get_thermo_natoms () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_natoms @@ -66,7 +46,7 @@ END FUNCTION f_lammps_get_thermo_natoms FUNCTION f_lammps_get_thermo_dt () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_dt @@ -76,7 +56,7 @@ END FUNCTION f_lammps_get_thermo_dt FUNCTION f_lammps_get_thermo_vol () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_vol @@ -86,7 +66,7 @@ END FUNCTION f_lammps_get_thermo_vol FUNCTION f_lammps_get_thermo_lx () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_lx @@ -96,7 +76,7 @@ END FUNCTION f_lammps_get_thermo_lx FUNCTION f_lammps_get_thermo_ly () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_ly @@ -106,7 +86,7 @@ END FUNCTION f_lammps_get_thermo_ly FUNCTION f_lammps_get_thermo_lz () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_lz @@ -116,7 +96,7 @@ END FUNCTION f_lammps_get_thermo_lz FUNCTION f_lammps_get_thermo_xlo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_xlo @@ -126,7 +106,7 @@ END FUNCTION f_lammps_get_thermo_xlo FUNCTION f_lammps_get_thermo_xhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_xhi @@ -136,7 +116,7 @@ END FUNCTION f_lammps_get_thermo_xhi FUNCTION f_lammps_get_thermo_ylo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_ylo @@ -146,7 +126,7 @@ END FUNCTION f_lammps_get_thermo_ylo FUNCTION f_lammps_get_thermo_yhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_yhi @@ -156,7 +136,7 @@ END FUNCTION f_lammps_get_thermo_yhi FUNCTION f_lammps_get_thermo_zlo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_zlo @@ -166,7 +146,7 @@ END FUNCTION f_lammps_get_thermo_zlo FUNCTION f_lammps_get_thermo_zhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepthermo, ONLY : lmp + USE keepglobal, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_zhi diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 931d29f23b..00e083b301 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -1,22 +1,7 @@ -MODULE keepprops - USE liblammps - IMPLICIT NONE - TYPE(LAMMPS) :: lmp - CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 2 0 2', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] -END MODULE keepprops - FUNCTION f_lammps_version () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepprops, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_version @@ -26,7 +11,7 @@ END FUNCTION f_lammps_version SUBROUTINE f_lammps_memory_usage (meminfo) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE liblammps - USE keepprops, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE REAL (C_double), DIMENSION(3), INTENT(OUT) :: meminfo @@ -36,7 +21,7 @@ END SUBROUTINE f_lammps_memory_usage FUNCTION f_lammps_get_mpi_comm () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepprops, ONLY : lmp + USE keepcmds, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_get_mpi_comm @@ -45,7 +30,7 @@ END FUNCTION f_lammps_get_mpi_comm FUNCTION f_lammps_extract_setting (Cstr) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char - USE keepprops, ONLY : lmp + USE keepcmds, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int) :: f_lammps_extract_setting diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index 8ecd9346dc..c3c86964a5 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -1,7 +1,6 @@ // unit tests for getting LAMMPS properties through the Fortran wrapper #include "lammps.h" -//#include // for stdin, stdout #include "library.h" #include #include From de28c9b19c2247a85b47adfa2bc3988582fdbe88 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 15:27:43 -0400 Subject: [PATCH 237/364] propagate new pace lib version tage and hash to lib/pace/Install.py --- lib/pace/Install.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 7e0f14d47c..14988c83cf 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,12 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum # settings thisdir = fullpath('.') -version ='v.2022.06.27' +version ='v.2022.09.27' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2021.10.25.fix2': '32394d799bc282bb57696c78c456e64f', - 'v.2022.06.27': '400f0a4b44c1ce64ae47796e6de4bba8' + 'v.2022.09.27': 'ad6c8597076479bd55059f5947d51acc' } parser = ArgumentParser(prog='Install.py', From 90384371c095ab8df14cf18f48a7af4afea4e232 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 20:55:45 -0400 Subject: [PATCH 238/364] this is redundant, since we set one_coeff and thus * * is required --- src/KIM/pair_kim.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index bc4e9faec8..3d5a730ab5 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -355,18 +355,6 @@ void PairKIM::coeff(int narg, char **arg) if (narg < 2 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); - // insure I,J args are * * - - const std::string arg_0_str(arg[0]); - const std::string arg_1_str(arg[1]); - if ((arg_0_str != "*") || (arg_1_str != "*")) - error->all(FLERR,"Incorrect args for pair coefficients.\nThe first two arguments of " - "pair_coeff command must be * * to span all LAMMPS atom types"); - - int ilo,ihi,jlo,jhi; - utils::bounds(FLERR,arg_0_str,1,atom->ntypes,ilo,ihi,error); - utils::bounds(FLERR,arg_1_str,1,atom->ntypes,jlo,jhi,error); - // read args that map atom species to KIM elements // lmps_map_species_to_unique[i] = // which element the Ith atom type is @@ -398,8 +386,8 @@ void PairKIM::coeff(int narg, char **arg) } int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { + for (int i = 1; i <= atom->ntypes; i++) { + for (int j = i; j <= atom->ntypes; j++) { if (lmps_map_species_to_unique[i] >= 0 && lmps_map_species_to_unique[j] >= 0) { setflag[i][j] = 1; From 77fb3e8af8f5cc27574cd7bf1b6d9948b02356f1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Sep 2022 20:55:55 -0400 Subject: [PATCH 239/364] improve error messages --- src/KIM/pair_kim.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 3d5a730ab5..b6e6d175d0 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -308,12 +308,12 @@ void PairKIM::settings(int narg, char **arg) init_style_call_count = 0; // arg[0] is the KIM Model name - if (narg == 0) error->all(FLERR,"Illegal pair_style command"); + if (narg == 0) utils::missing_cmd_args(FLERR, "pair_style kim", error); if (narg > 1) { const std::string arg_str(arg[1]); if ((arg_str == "KIMvirial") || (arg_str == "LAMMPSvirial")) { error->all(FLERR,"'KIMvirial' or 'LAMMPSvirial' not supported with kim-api"); - } else error->all(FLERR,"Illegal pair_style command"); + } else error->all(FLERR,"Unknown pair_style kim keyword: {}", arg_str); } lmps_using_molecular = (atom->molecular > 0); @@ -462,8 +462,7 @@ void PairKIM::coeff(int narg, char **arg) if (param_index >= numberOfParameters) error->all(FLERR,"Wrong argument for pair coefficients.\n" - "This Model does not have the requested " - "'{}' parameter", paramname); + "This Model does not have the requested '{}' parameter", paramname); // Get the index_range for the requested parameter int nlbound(0); From e22699197d60be749f9945f44b925e9b8dcaaf04 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 28 Sep 2022 07:40:06 -0500 Subject: [PATCH 240/364] Added flush_buffers --- fortran/lammps.f90 | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 45540ffb84..7ab6255f90 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -100,6 +100,8 @@ MODULE LIBLAMMPS ! PROCEDURE :: version => lmp_version PROCEDURE :: is_running => lmp_is_running +! + PROCEDURE :: flush_buffers => lmp_flush_buffers PROCEDURE :: has_error => lmp_has_error PROCEDURE :: get_last_error_message => lmp_get_last_error_message END TYPE lammps @@ -393,7 +395,11 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_fix_external_set_vector_length !SUBROUTINE lammps_fix_external_set_vector - !SUBROUTINE lammps_flush_buffers + SUBROUTINE lammps_flush_buffers (handle) BIND(C) + IMPORT :: C_ptr + IMPLICIT NONE + TYPE(C_ptr), VALUE :: handle + END SUBROUTINE lammps_flush_buffers FUNCTION lammps_malloc(size) BIND(C, name='malloc') IMPORT :: c_ptr, c_size_t @@ -856,6 +862,20 @@ CONTAINS lmp_version = lammps_version(self%handle) END FUNCTION lmp_version + ! equivalent function to lammps_is_running + LOGICAL FUNCTION lmp_is_running(self) + CLASS(lammps), INTENT(IN) :: self + + lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) + END FUNCTION lmp_is_running + + ! equivalent function to lammps_flush_buffers + SUBROUTINE lmp_flush_buffers(self) + CLASS(lammps), INTENT(IN) :: self + + call lammps_flush_buffers(self%handle) + END SUBROUTINE lmp_flush_buffers + ! equivalent function to lammps_has_error LOGICAL FUNCTION lmp_has_error(self) CLASS(lammps), INTENT(IN) :: self @@ -893,13 +913,6 @@ CONTAINS END IF END SUBROUTINE lmp_get_last_error_message - ! equivalent function to lammps_is_running - LOGICAL FUNCTION lmp_is_running(self) - CLASS(lammps), INTENT(IN) :: self - - lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) - END FUNCTION lmp_is_running - ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS data ! ---------------------------------------------------------------------- From 1d4297e2dd8c1c19d8cae6de50ea8b192738a796 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Wed, 28 Sep 2022 22:09:26 -0500 Subject: [PATCH 241/364] Implemented extract_fix, extract_variable, flush_buffers; unit test for extract_fix --- fortran/lammps.f90 | 352 +++++++++++++++--- python/lammps/constants.py | 1 + src/library.cpp | 41 ++ src/library.h | 24 +- unittest/fortran/CMakeLists.txt | 4 + unittest/fortran/test_fortran_extract_fix.f90 | 118 ++++++ unittest/fortran/wrap_extract_fix.cpp | 107 ++++++ 7 files changed, 597 insertions(+), 50 deletions(-) create mode 100644 unittest/fortran/test_fortran_extract_fix.f90 create mode 100644 unittest/fortran/wrap_extract_fix.cpp diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7ab6255f90..9f49a1fcb5 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -65,7 +65,10 @@ MODULE LIBLAMMPS LMP_ERROR_ONE = 1, & ! call Error::one() (from this MPI rank) LMP_ERROR_ALL = 2, & ! call Error::all() (from all MPI ranks) LMP_ERROR_WORLD = 4, & ! error on comm->world - LMP_ERROR_UNIVERSE = 8 ! error on comm->universe + LMP_ERROR_UNIVERSE = 8, & ! error on comm->universe + LMP_VAR_EQUAL = 0, & ! equal-style variables (and compatible) + LMP_VAR_ATOM = 1, & ! atom-style variables (and compatible) + LMP_VAR_STRING = 2 ! string variables (and compatible) ! "Constants" to use with extract_compute and friends TYPE lammps_style @@ -97,11 +100,14 @@ MODULE LIBLAMMPS PROCEDURE :: extract_global => lmp_extract_global PROCEDURE :: extract_atom => lmp_extract_atom PROCEDURE :: extract_compute => lmp_extract_compute -! + PROCEDURE :: extract_fix => lmp_extract_fix + PROCEDURE :: extract_variable => lmp_extract_variable +! PROCEDURE :: version => lmp_version - PROCEDURE :: is_running => lmp_is_running ! PROCEDURE :: flush_buffers => lmp_flush_buffers + PROCEDURE :: is_running => lmp_is_running +! force_timeout PROCEDURE :: has_error => lmp_has_error PROCEDURE :: get_last_error_message => lmp_get_last_error_message END TYPE lammps @@ -118,10 +124,16 @@ MODULE LIBLAMMPS ENUMERATOR :: DATA_STRING END ENUM + ! Base class for receiving LAMMPS data (to reduce code duplication) + TYPE lammps_data_baseclass + INTEGER(c_int) :: datatype = -1_c_int + ! in case we need to call the Error class in an assignment + CLASS(lammps), POINTER, PRIVATE :: lammps_instance => NULL() + END TYPE lammps_data_baseclass + ! Derived type for receiving LAMMPS data (in lieu of the ability to type cast - ! pointers) - TYPE lammps_data - INTEGER(c_int) :: datatype + ! pointers). Used for extract_compute, extract_atom + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_data INTEGER(c_int), POINTER :: i32 => NULL() INTEGER(c_int), DIMENSION(:), POINTER :: i32_vec => NULL() INTEGER(c_int64_t), POINTER :: i64 => NULL() @@ -132,6 +144,26 @@ MODULE LIBLAMMPS CHARACTER(LEN=:), ALLOCATABLE :: str END TYPE lammps_data + ! Derived type for holding LAMMPS fix data + ! Done this way because fix global data are not pointers, but computed + ! on-the-fly, whereas per-atom and local data are pointers to the actual + ! array. Doing it this way saves the user from having to explicitly + ! deallocate all of the pointers. + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_fix_data + REAL(c_double) :: r64 + REAL(c_double), DIMENSION(:), POINTER :: r64_vec => NULL() + REAL(c_double), DIMENSION(:,:), POINTER :: r64_mat => NULL() + END TYPE lammps_fix_data + + ! Derived type for holding LAMMPS variable data + ! Done this way because extract_variable calculates variable values, it does + ! not return pointers to LAMMPS data. + TYPE, EXTENDS(lammps_data_baseclass) :: lammps_variable_data + REAL(c_double) :: r64 + REAL(c_double), DIMENSION(:), ALLOCATABLE :: r64_vec + CHARACTER(LEN=:), ALLOCATABLE :: str + END TYPE lammps_variable_data + ! This overloads the assignment operator (=) so that assignments of the ! form ! nlocal = extract_global('nlocal') @@ -144,6 +176,10 @@ MODULE LIBLAMMPS assign_double_to_lammps_data, assign_doublevec_to_lammps_data, & assign_doublemat_to_lammps_data, & assign_string_to_lammps_data + ! We handle fix data (slightly) differently + MODULE PROCEDURE assign_double_to_lammps_fix_data, & + assign_doublevec_to_lammps_fix_data, & + assign_doublemat_to_lammps_fix_data END INTERFACE ! interface definitions for calling functions in library.cpp @@ -312,9 +348,27 @@ MODULE LIBLAMMPS TYPE(c_ptr) :: lammps_extract_compute END FUNCTION lammps_extract_compute - !(generic) lammps_extract_fix + FUNCTION lammps_extract_fix(handle, id, style, type, nrow, ncol) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, id + INTEGER(c_int), INTENT(IN), VALUE :: style, type, nrow, ncol + TYPE(c_ptr) :: lammps_extract_fix + END FUNCTION lammps_extract_fix - !(generic) lammps_extract_variable + FUNCTION lammps_extract_variable_datatype(handle,name) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name + INTEGER(c_int) :: lammps_extract_variable_datatype + END FUNCTION lammps_extract_variable_datatype + + FUNCTION lammps_extract_variable(handle, name, group) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: handle, name, group + TYPE(c_ptr) :: lammps_extract_variable + END FUNCTION lammps_extract_variable !INTEGER (c_int) lammps_set_variable @@ -647,7 +701,7 @@ CONTAINS ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS FUNCTION lmp_extract_global(self, name) RESULT (global_data) - CLASS(lammps), INTENT(IN) :: self + CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: global_data @@ -674,6 +728,7 @@ CONTAINS Cptr = lammps_extract_global(self%handle, Cname) CALL lammps_free(Cname) + global_data%lammps_instance => self SELECT CASE (datatype) CASE (LAMMPS_INT) IF ( length == 1 ) THEN @@ -704,7 +759,7 @@ CONTAINS length = c_strlen(Cptr) CALL C_F_POINTER(Cptr, Fptr, [length]) ALLOCATE ( CHARACTER(LEN=length) :: global_data%str ) - FORALL ( I=1:length ) + FORALL ( i=1:length ) global_data%str(i:i) = Fptr(i) END FORALL CASE DEFAULT @@ -717,7 +772,7 @@ CONTAINS ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS FUNCTION lmp_extract_atom (self, name) RESULT (peratom_data) - CLASS(lammps), INTENT(IN) :: self + CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: peratom_data @@ -748,6 +803,7 @@ CONTAINS nrows = 1 END SELECT + peratom_data%lammps_instance => self SELECT CASE (datatype) CASE (LAMMPS_INT) peratom_data%datatype = DATA_INT_1D @@ -772,16 +828,10 @@ CONTAINS CASE (-1) CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'per-atom property ' // name // 'not found in extract_setting') -! WRITE(ERROR_UNIT,'(A)') 'ERROR: per-atom property "' // name // & -! '" not found.' -! STOP 2 CASE DEFAULT WRITE(error_msg,'(A,I0,A)') 'return value ', datatype, & ' from lammps_extract_atom_datatype not known [Fortran/extract_atom]' CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) -! WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: return value ', datatype, & -! ' from lammps_extract_atom_datatype not known' -! STOP 1 END SELECT END FUNCTION lmp_extract_atom @@ -789,12 +839,11 @@ CONTAINS ! the assignment operator is overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS FUNCTION lmp_extract_compute (self, id, style, type) RESULT (compute_data) - CLASS(lammps), INTENT(IN) :: self + CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: id INTEGER(c_int), INTENT(IN) :: style, type TYPE(lammps_data) :: compute_data - INTEGER(c_int) :: datatype TYPE(c_ptr) :: Cid, Cptr, Ctemp INTEGER :: nrows, ncols, length INTEGER(c_int), POINTER :: temp @@ -809,6 +858,7 @@ CONTAINS END IF ! Remember that rows and columns in C are transposed in Fortran! + compute_data%lammps_instance => self SELECT CASE (type) CASE (LMP_TYPE_SCALAR) compute_data%datatype = DATA_DOUBLE @@ -847,14 +897,161 @@ CONTAINS CALL C_F_POINTER(Ccomputeptr(1), compute_data%r64_mat, [nrows, ncols]) CASE DEFAULT CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & - 'unknown type value passed to extract_compute') - !WRITE(ERROR_UNIT,'(A,I0,A)') 'ERROR: unknown type value ', type, & - ! 'passed to extract_compute' - !STOP 1 + 'unknown type value passed to extract_compute [Fortran API]') END SELECT CALL lammps_free(Cid) END FUNCTION lmp_extract_compute + FUNCTION lmp_extract_fix(self, id, style, type, nrow, ncol) RESULT (fix_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN) :: style, type + INTEGER(c_int), INTENT(IN), OPTIONAL :: nrow, ncol + TYPE(lammps_fix_data) :: fix_data + + TYPE(c_ptr) :: Cid, Cptr, Ctemp + TYPE(c_ptr), DIMENSION(:), POINTER :: Cfixptr + INTEGER(c_int) :: Cnrow, Cncol + REAL(c_double), POINTER :: Fptr + INTEGER :: nrows, ncols + INTEGER(c_int), POINTER :: temp + + ! We transpose ncol and nrow so the array appears to be transposed for + ! global data, as it would be if we could access the C++ array directly + Cnrow = -1 + Cncol = -1 + IF ( PRESENT(nrow) ) THEN + IF ( .NOT. PRESENT(ncol) ) THEN + ! Presumably the argument that's there is the vector length + Cnrow = nrow - 1_c_int + Cncol = -1_c_int + ELSE + ! Otherwise, the array is transposed, so...reverse the indices + Cncol = nrow - 1_c_int + END IF + END IF + + IF ( PRESENT(ncol) ) Cnrow = ncol - 1_c_int + + Cid = f2c_string(id) + Cptr = lammps_extract_fix(self%handle, Cid, style, type, Cnrow, Cncol) + IF ( .NOT. C_ASSOCIATED(Cptr) ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Pointer from LAMMPS is NULL for fix id "' // id & + // '" [Fortran/extract_fix]') + END IF + + fix_data%lammps_instance => self + SELECT CASE (style) + CASE (LMP_STYLE_GLOBAL) + fix_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, Fptr) + fix_data%r64 = Fptr + CALL lammps_free(Cptr) + CASE (LMP_STYLE_ATOM, LMP_STYLE_LOCAL) + SELECT CASE (type) + CASE (LMP_TYPE_SCALAR) + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'There is no such thing as a per-atom or local scalar& + & [Fortran/extract_fix]') + CASE (LMP_TYPE_VECTOR) + fix_data%datatype = DATA_DOUBLE_1D + IF ( STYLE == LMP_STYLE_ATOM ) THEN + nrows = self%extract_setting('nmax') + ELSE + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_VECTOR, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + END IF + CALL C_F_POINTER(Cptr, fix_data%r64_vec, [nrows]) + CASE (LMP_TYPE_ARRAY) + fix_data%datatype = DATA_DOUBLE_2D + IF ( STYLE == LMP_STYLE_ATOM ) THEN + ! Fortran array is transposed relative to C + ncols = self%extract_setting('nmax') + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_COLS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + ELSE + ! Fortran array is transposed relative to C + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_COLS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + nrows = temp + Ctemp = lammps_extract_fix(self%handle, Cid, style, & + LMP_SIZE_ROWS, 0_c_int,0_c_int) + CALL C_F_POINTER(Ctemp, temp) + ncols = temp + END IF + ! First, we dereference the void** to point to a void* pointer + CALL C_F_POINTER(Cptr, Cfixptr, [ncols]) + ! Cfixptr(1) now points to the first element of the array + CALL C_F_POINTER(Cfixptr(1), fix_data%r64_mat, [nrows, ncols]) + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown type value passed to extract_fix [Fortran API]') + END SELECT + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'unknown style value passed to extract_fix [Fortran API]') + END SELECT + CALL lammps_free(Cid) + END FUNCTION lmp_extract_fix + + ! equivalent function to lammps_extract_variable + FUNCTION lmp_extract_variable(self, name, group) RESULT (variable_data) + CLASS(lammps), INTENT(IN), TARGET :: self + CHARACTER(LEN=*), INTENT(IN) :: name + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: group + TYPE(lammps_variable_data) :: variable_data + + TYPE(c_ptr) :: Cptr, Cname, Cgroup + INTEGER :: length, i + CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Cstring + INTEGER(c_int) :: datatype + REAL(c_double), POINTER :: double + REAL(c_double), DIMENSION(:), POINTER :: double_vec + + Cname = f2c_string(name) + IF ( PRESENT(group) ) THEN + Cgroup = f2c_string(group) + ELSE + Cgroup = c_null_ptr + END IF + datatype = lammps_extract_variable_datatype(self%handle, Cname) + Cptr = lammps_extract_variable(self%handle, Cname, Cgroup) + CALL lammps_free(Cname) + CALL lammps_free(Cgroup) + + SELECT CASE (datatype) + CASE (LMP_VAR_EQUAL) + variable_data%datatype = DATA_DOUBLE + CALL C_F_POINTER(Cptr, double) + variable_data%r64 = double + CALL lammps_free(Cptr) + CASE (LMP_VAR_ATOM) + variable_data%datatype = DATA_DOUBLE_1D + length = lmp_extract_setting(self, 'nlocal') + CALL C_F_POINTER(Cptr, double_vec, [length]) + variable_data%r64_vec = double_vec + CALL lammps_free(Cptr) + CASE (LMP_VAR_STRING) + variable_data%datatype = DATA_STRING + length = c_strlen(Cptr) + CALL C_F_POINTER(Cptr, Cstring, [length]) + ALLOCATE ( CHARACTER(LEN=length) :: variable_data%str ) + FORALL ( i=1:length ) + variable_data%str(i:i) = Cstring(i) + END FORALL + CASE DEFAULT + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Unknown variable type returned from & + &lammps_extract_variable_datatype [Fortran/extract_variable]') + END SELECT + END FUNCTION lmp_extract_variable + ! equivalent function to lammps_version() INTEGER FUNCTION lmp_version(self) CLASS(lammps), INTENT(IN) :: self @@ -873,7 +1070,7 @@ CONTAINS SUBROUTINE lmp_flush_buffers(self) CLASS(lammps), INTENT(IN) :: self - call lammps_flush_buffers(self%handle) + CALL lammps_flush_buffers(self%handle) END SUBROUTINE lmp_flush_buffers ! equivalent function to lammps_has_error @@ -891,14 +1088,16 @@ CONTAINS CHARACTER(LEN=*), INTENT(OUT) :: buffer INTEGER, INTENT(OUT), OPTIONAL :: status INTEGER(c_int) :: length, Cstatus, i - TYPE(c_ptr) :: Cbuffer + TYPE(c_ptr) :: Cptr + CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Cbuffer buffer = '' IF ( lmp_has_error(self) ) THEN length = LEN(buffer) - Cbuffer = f2cstring(buffer) - Cstatus = lammps_get_last_error_message(self%handle, Cbuffer, length) - length = MIN(LEN(buffer), c_strlen(Cbuffer)) + Cptr = f2c_string(buffer) + Cstatus = lammps_get_last_error_message(self%handle, Cptr, length) + length = MIN(LEN(buffer), c_strlen(Cptr)) + CALL C_F_POINTER(Cptr, Cbuffer, [length]) FORALL ( i=1:length ) buffer(i:i) = Cbuffer(i) END FORALL @@ -923,7 +1122,7 @@ CONTAINS IF ( rhs%datatype == DATA_INT ) THEN lhs => rhs%i32 ELSE - CALL assignment_error(rhs%datatype, 'scalar int') + CALL assignment_error(rhs, 'scalar int') END IF END SUBROUTINE assign_int_to_lammps_data @@ -934,7 +1133,7 @@ CONTAINS IF ( rhs%datatype == DATA_INT64 ) THEN lhs => rhs%i64 ELSE - CALL assignment_error(rhs%datatype, 'scalar long int') + CALL assignment_error(rhs, 'scalar long int') END IF END SUBROUTINE assign_int64_to_lammps_data @@ -945,7 +1144,7 @@ CONTAINS IF ( rhs%datatype == DATA_INT_1D ) THEN lhs => rhs%i32_vec ELSE - CALL assignment_error(rhs%datatype, 'vector of ints') + CALL assignment_error(rhs, 'vector of ints') END IF END SUBROUTINE assign_intvec_to_lammps_data @@ -956,7 +1155,7 @@ CONTAINS IF ( rhs%datatype == DATA_INT64_1D ) THEN lhs => rhs%i64_vec ELSE - CALL assignment_error(rhs%datatype, 'vector of long ints') + CALL assignment_error(rhs, 'vector of long ints') END IF END SUBROUTINE assign_int64vec_to_lammps_data @@ -967,7 +1166,7 @@ CONTAINS IF ( rhs%datatype == DATA_DOUBLE ) THEN lhs => rhs%r64 ELSE - CALL assignment_error(rhs%datatype, 'scalar double') + CALL assignment_error(rhs, 'scalar double') END IF END SUBROUTINE assign_double_to_lammps_data @@ -978,7 +1177,7 @@ CONTAINS IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN lhs => rhs%r64_vec ELSE - CALL assignment_error(rhs%datatype, 'vector of doubles') + CALL assignment_error(rhs, 'vector of doubles') END IF END SUBROUTINE assign_doublevec_to_lammps_data @@ -989,7 +1188,7 @@ CONTAINS IF ( rhs%datatype == DATA_DOUBLE_2D ) THEN lhs => rhs%r64_mat ELSE - CALL assignment_error(rhs%datatype, 'matrix of doubles') + CALL assignment_error(rhs, 'matrix of doubles') END IF END SUBROUTINE assign_doublemat_to_lammps_data @@ -1000,17 +1199,81 @@ CONTAINS IF ( rhs%datatype == DATA_STRING ) THEN lhs = rhs%str ELSE - CALL assignment_error(rhs%datatype, 'string') + CALL assignment_error(rhs, 'string') END IF END SUBROUTINE assign_string_to_lammps_data - SUBROUTINE assignment_error (type1, type2) - INTEGER (c_int) :: type1 - CHARACTER (LEN=*) :: type2 - INTEGER, PARAMETER :: ERROR_CODE = 1 + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS *fix* data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_double_to_lammps_fix_data (lhs, rhs) + REAL(c_double), INTENT(OUT) :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE ) THEN + lhs = rhs%r64 + ELSE + CALL assignment_error(rhs, 'scalar double') + END IF + END SUBROUTINE assign_double_to_lammps_fix_data + + SUBROUTINE assign_doublevec_to_lammps_fix_data (lhs, rhs) + REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + lhs => rhs%r64_vec + ELSE + CALL assignment_error(rhs, 'vector of doubles') + END IF + END SUBROUTINE assign_doublevec_to_lammps_fix_data + + SUBROUTINE assign_doublemat_to_lammps_fix_data (lhs, rhs) + REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_fix_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE_2D ) THEN + lhs => rhs%r64_mat + ELSE + CALL assignment_error(rhs, 'matrix of doubles') + END IF + END SUBROUTINE assign_doublemat_to_lammps_fix_data + + ! ---------------------------------------------------------------------- + ! functions to assign user-space pointers to LAMMPS *variable* data + ! ---------------------------------------------------------------------- + SUBROUTINE assign_double_to_lammps_variable_data (lhs, rhs) + REAL(c_double), INTENT(OUT) :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE ) THEN + lhs = rhs%r64 + ELSE + CALL assignment_error(rhs, 'scalar double') + END IF + END SUBROUTINE assign_double_to_lammps_variable_data + + SUBROUTINE assign_doublevec_to_lammps_variable_data (lhs, rhs) + REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + lhs = rhs%r64_vec + ELSE + CALL assignment_error(rhs, 'vector of doubles') + END IF + END SUBROUTINE assign_doublevec_to_lammps_variable_data + + ! ---------------------------------------------------------------------- + ! Generic function to catch all errors in assignments of LAMMPS data to + ! user-space variables/pointers + ! ---------------------------------------------------------------------- + SUBROUTINE assignment_error (type1, str2) + CLASS(lammps_data_baseclass), INTENT(IN) :: type1 + CHARACTER (LEN=*), INTENT(IN) :: str2 CHARACTER (LEN=:), ALLOCATABLE :: str1 - SELECT CASE (type1) + SELECT CASE (type1%datatype) CASE (DATA_INT) str1 = 'scalar int' CASE (DATA_INT_1D) @@ -1032,11 +1295,8 @@ CONTAINS CASE DEFAULT str1 = 'that type' END SELECT - !CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'cannot associate ' & - ! // str1 // ' with ' // type2 // ' [Fortran API]') - WRITE (ERROR_UNIT,'(A)') 'ERROR (Fortran API): cannot associate ' & - // str1 // ' with ' // type2 - STOP ERROR_CODE + CALL lmp_error(type1%lammps_instance, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'cannot associate ' // str1 // ' with ' // str2 // ' [Fortran API]') END SUBROUTINE assignment_error ! ---------------------------------------------------------------------- diff --git a/python/lammps/constants.py b/python/lammps/constants.py index 26bb92626a..6a7fda85a8 100644 --- a/python/lammps/constants.py +++ b/python/lammps/constants.py @@ -42,6 +42,7 @@ LMP_ERROR_UNIVERSE = 8 LMP_VAR_EQUAL = 0 LMP_VAR_ATOM = 1 +LMP_VAR_STRING = 2 # ------------------------------------------------------------------------- diff --git a/src/library.cpp b/src/library.cpp index 16381a089d..d5e309ce33 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2130,6 +2130,47 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) /* ---------------------------------------------------------------------- */ +/** Get data type of a LAMMPS variable + * +\verbatim embed:rst + +This function returns an integer that encodes the data type of the variable +with the specified name. See :cpp:enum:`_LMP_VAR_CONST` for valid values. +Callers of :cpp:func:`lammps_extract_variable` can use this information to +decide how to cast the (void*) pointer and access the data. + +..versionadded:: TBD + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance + * \param name string with the name of the extracted variable + * \return integer constant encoding the data type of the property + * or -1 if not found. + **/ + +int lammps_extract_variable_datatype(void *handle, const char *name) +{ + auto lmp = (LAMMPS*) handle; + + BEGIN_CAPTURE + { + int ivar = lmp->input->variable->find(name); + if ( ivar < 0 ) return -1; + + if (lmp->input->variable->equalstyle(ivar)) + return LMP_VAR_EQUAL; + else if (lmp->input->variable->atomstyle(ivar)) + return LMP_VAR_ATOM; + else + return LMP_VAR_STRING; + } + END_CAPTURE + return -1; +} + +/* ---------------------------------------------------------------------- */ + /** Set the value of a string-style variable. * * This function assigns a new value from the string str to the diff --git a/src/library.h b/src/library.h index 1eec57898e..d0616cd6c4 100644 --- a/src/library.h +++ b/src/library.h @@ -40,7 +40,8 @@ /** Data type constants for extracting data from atoms, computes and fixes * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in lammps/constants.py + * and fortran/lammps.f90 */ enum _LMP_DATATYPE_CONST { LAMMPS_INT = 0, /*!< 32-bit integer (array) */ @@ -54,7 +55,8 @@ enum _LMP_DATATYPE_CONST { /** Style constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in lammps/constants.py + * and fortran/lammps.f90 */ enum _LMP_STYLE_CONST { LMP_STYLE_GLOBAL = 0, /*!< return global data */ @@ -64,7 +66,8 @@ enum _LMP_STYLE_CONST { /** Type and size constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in lammps/constants.py + * and fortran/lammps.f90 */ enum _LMP_TYPE_CONST { LMP_TYPE_SCALAR = 0, /*!< return scalar */ @@ -77,7 +80,8 @@ enum _LMP_TYPE_CONST { /** Error codes to select the suitable function in the Error class * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in lammps/constants.py + * and fortran/lammps.f90 */ enum _LMP_ERROR_CONST { LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ @@ -87,6 +91,17 @@ enum _LMP_ERROR_CONST { LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ }; +/** Variable style constants for extracting data from variables + * + * Must be kept in sync with the equivalent constants in lammps/constants.py + * and fortran/lammps.f90 */ + +enum _LMP_VAR_CONST { + LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ + LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ + LMP_VAR_STRING = 2 /*!< return value will be a string (catch-all) */ +}; + /* Ifdefs to allow this file to be included in C and C++ programs */ #ifdef __cplusplus @@ -153,6 +168,7 @@ void *lammps_extract_atom(void *handle, const char *name); void *lammps_extract_compute(void *handle, const char *, int, int); void *lammps_extract_fix(void *handle, const char *, int, int, int, int); void *lammps_extract_variable(void *handle, const char *, const char *); +int lammps_extract_variable_datatype(void *handle, const char *name); int lammps_set_variable(void *, char *, char *); /* ---------------------------------------------------------------------- diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 672333c529..fc0d0dc956 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -65,6 +65,10 @@ if(CMAKE_Fortran_COMPILER) target_link_libraries(test_fortran_extract_compute PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractCompute COMMAND test_fortran_extract_compute) + add_executable(test_fortran_extract_fix wrap_extract_fix.cpp test_fortran_extract_fix.f90) + target_link_libraries(test_fortran_extract_fix PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranExtractFix COMMAND test_fortran_extract_fix) + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/test_fortran_extract_fix.f90 b/unittest/fortran/test_fortran_extract_fix.f90 new file mode 100644 index 0000000000..85b4cb5f4f --- /dev/null +++ b/unittest/fortran/test_fortran_extract_fix.f90 @@ -0,0 +1,118 @@ +MODULE keepfix + USE liblammps + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(LEN=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & + [ CHARACTER(LEN=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1', & + 'create_atoms 1 single 0.5 0.5 0.5' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 2.0' ] +END MODULE keepfix + +FUNCTION f_lammps_with_args() BIND(C) + USE ISO_C_BINDING, ONLY: C_ptr + USE liblammps + USE keepfix, ONLY: lmp + IMPLICIT NONE + TYPE(C_ptr) :: f_lammps_with_args + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C) + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepfix, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = C_NULL_PTR +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_extract_fix () BIND(C) + USE LIBLAMMPS + USE keepfix, ONLY : lmp, demo_input, cont_input, pair_input + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) + CALL lmp%command("fix state all store/state 0 z") ! per-atom vector + CALL lmp%command("fix move all move linear 0 0 0") ! for per-atom array + CALL lmp%command("fix recenter all recenter 1 1 1") ! global scalar, vector + CALL lmp%command("variable natoms equal count(all)") + CALL lmp%command("variable ts equal step") + CALL lmp%command("fix vec all vector 1 v_natoms v_ts") ! global array + CALL lmp%command("run 1") ! must be 1, otherwise move/recenter won't happen +END SUBROUTINE f_lammps_setup_extract_fix + +FUNCTION f_lammps_extract_fix_global_scalar () BIND(C) RESULT(scalar) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepfix, ONLY : lmp + IMPLICIT NONE + REAL(C_double) :: scalar + + scalar = lmp%extract_fix("recenter", lmp%style%global, lmp%type%scalar) +END FUNCTION f_lammps_extract_fix_global_scalar + +FUNCTION f_lammps_extract_fix_global_vector (i) BIND(C) RESULT(element) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepfix, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double) :: element + + element = lmp%extract_fix("recenter", lmp%style%global, lmp%type%vector, i) +END FUNCTION f_lammps_extract_fix_global_vector + +FUNCTION f_lammps_extract_fix_global_array (i,j) BIND(C) RESULT(element) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepfix, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i, j + REAL(C_double) :: element + + element = lmp%extract_fix("vec", lmp%style%global, lmp%type%array, i, j) +END FUNCTION f_lammps_extract_fix_global_array + +FUNCTION f_lammps_extract_fix_peratom_vector (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepfix, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i + REAL(C_double) :: f_lammps_extract_fix_peratom_vector + REAL(C_double), DIMENSION(:), POINTER :: vector + + vector = lmp%extract_fix("state", lmp%style%atom, lmp%type%vector, -1, -1) + f_lammps_extract_fix_peratom_vector = vector(i) +END FUNCTION f_lammps_extract_fix_peratom_vector + +FUNCTION f_lammps_extract_fix_peratom_array (i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepfix, ONLY : lmp + IMPLICIT NONE + INTEGER(C_int), INTENT(IN), VALUE :: i, j + REAL(C_double) :: f_lammps_extract_fix_peratom_array + REAL(C_double), DIMENSION(:,:), POINTER :: array + + array = lmp%extract_fix("move", lmp%style%atom, lmp%type%array, -1, -1) + f_lammps_extract_fix_peratom_array = array(i,j) +END FUNCTION f_lammps_extract_fix_peratom_array diff --git a/unittest/fortran/wrap_extract_fix.cpp b/unittest/fortran/wrap_extract_fix.cpp new file mode 100644 index 0000000000..d8f19c8b95 --- /dev/null +++ b/unittest/fortran/wrap_extract_fix.cpp @@ -0,0 +1,107 @@ +// unit tests for extracting compute data from a LAMMPS instance through the +// Fortran wrapper +#include + +#include "lammps.h" +#include "library.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_setup_extract_fix(); +double f_lammps_extract_fix_global_scalar(); +double f_lammps_extract_fix_global_vector(int); +double f_lammps_extract_fix_global_array(int,int); +double f_lammps_extract_fix_peratom_vector(int); +double f_lammps_extract_fix_peratom_array(int,int); +double f_lammps_extract_fix_local_vector(int); +double f_lammps_extract_fix_local_array(int,int); +} + +class LAMMPS_extract_fix : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_extract_fix() = default; + ~LAMMPS_extract_fix() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_extract_fix, global_scalar) +{ + f_lammps_setup_extract_fix(); + double *scalar = (double*) lammps_extract_fix(lmp, "recenter", + LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR, -1, -1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_scalar(), *scalar); + lammps_free(scalar); +}; + +TEST_F(LAMMPS_extract_fix, global_vector) +{ + f_lammps_setup_extract_fix(); + double *x = (double*) lammps_extract_fix(lmp, "recenter", + LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 0, -1); + double *y = (double*) lammps_extract_fix(lmp, "recenter", + LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 1, -1); + double *z = (double*) lammps_extract_fix(lmp, "recenter", + LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 2, -1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(1), *x); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(2), *y); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(3), *z); + lammps_free(x); + lammps_free(y); + lammps_free(z); +}; + +TEST_F(LAMMPS_extract_fix, global_array) +{ + f_lammps_setup_extract_fix(); + double natoms = lammps_get_natoms(lmp); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1,1), natoms); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1,2), natoms); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2,1), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2,2), 1.0); +}; + +TEST_F(LAMMPS_extract_fix, peratom_vector) +{ + f_lammps_setup_extract_fix(); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(3), 0.5); +}; + +TEST_F(LAMMPS_extract_fix, peratom_array) +{ + f_lammps_setup_extract_fix(); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,3), 0.5); +}; From 6e34d21b24a028327f80b00ffb5474bfbcacdfa2 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Wed, 28 Sep 2022 21:02:16 -0700 Subject: [PATCH 242/364] GPU Package: Switching back to timer disabling with multiple MPI tasks per GPU. Logic added to prevent mem leak. --- lib/gpu/geryon/hip_device.h | 4 ++++ lib/gpu/geryon/nvd_device.h | 4 ++++ lib/gpu/geryon/ocl_device.h | 25 ++++++++++++++++++++++--- lib/gpu/geryon/ocl_timer.h | 18 +++++++++++++++--- lib/gpu/lal_device.cpp | 16 ++++++++-------- lib/gpu/lal_pppm.cpp | 3 ++- 6 files changed, 55 insertions(+), 15 deletions(-) diff --git a/lib/gpu/geryon/hip_device.h b/lib/gpu/geryon/hip_device.h index f809323ee7..d14631fa0f 100644 --- a/lib/gpu/geryon/hip_device.h +++ b/lib/gpu/geryon/hip_device.h @@ -81,6 +81,10 @@ class UCL_Device { /// Return the number of devices that support CUDA inline int num_devices() { return _properties.size(); } + /// Specify whether profiling (device timers) will be used for the device (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) {} + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not diff --git a/lib/gpu/geryon/nvd_device.h b/lib/gpu/geryon/nvd_device.h index 5e2444b4d1..5875dfaa7c 100644 --- a/lib/gpu/geryon/nvd_device.h +++ b/lib/gpu/geryon/nvd_device.h @@ -95,6 +95,10 @@ class UCL_Device { /// Return the number of devices that support CUDA inline int num_devices() { return _properties.size(); } + /// Specify whether profiling (device timers) will be used for the device (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) {} + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 092b4ad11b..6a563b5f47 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -125,6 +125,11 @@ class UCL_Device { /// Return the number of devices that support OpenCL inline int num_devices() { return _num_devices; } + /// Specify whether profiling (device timers) will be used for the device (yes=true) + /** No-op for CUDA and HIP **/ + inline void configure_profiling(const bool profiling_on) + { _cq_profiling = profiling_on; } + /// Set the OpenCL device to the specified device number /** A context and default command queue will be created for the device * * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not @@ -169,10 +174,22 @@ class UCL_Device { _cq.push_back(cl_command_queue()); #ifdef CL_VERSION_2_0 - cl_queue_properties props[] = {CL_QUEUE_PROPERTIES, CL_QUEUE_PROFILING_ENABLE, 0}; - _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, &errorv); + if (_cq_profiling) { + cl_queue_properties props[] = {CL_QUEUE_PROPERTIES, CL_QUEUE_PROFILING_ENABLE, + 0}; + _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, + &errorv); + } else { + cl_queue_properties props[] = {CL_QUEUE_PROPERTIES, 0}; + _cq.back()=clCreateCommandQueueWithProperties(_context, _cl_device, props, + &errorv); + } #else - _cq.back()=clCreateCommandQueue(_context, _cl_device, CL_QUEUE_PROFILING_ENABLE, &errorv); + if (_cq_profiling) + _cq.back()=clCreateCommandQueue(_context, _cl_device, CL_QUEUE_PROFILING_ENABLE, + &errorv); + else + _cq.back()=clCreateCommandQueue(_context, _cl_device, 0, &errorv); #endif if (errorv!=CL_SUCCESS) { std::cerr << "Could not create command queue on device: " << name() @@ -370,6 +387,7 @@ class UCL_Device { cl_platform_id _cl_platforms[20]; // OpenCL IDs for all platforms cl_context _context; // Context used for accessing the device std::vector _cq;// The default command queue for this device + bool _cq_profiling; // True=create command queues w/ profiling support int _device; // UCL_Device ID for current device cl_device_id _cl_device; // OpenCL ID for current device std::vector _cl_devices; // OpenCL IDs for all devices @@ -384,6 +402,7 @@ class UCL_Device { // Grabs the properties for all devices UCL_Device::UCL_Device() { _device=-1; + _cq_profiling=true; // --- Get Number of Platforms cl_uint nplatforms; diff --git a/lib/gpu/geryon/ocl_timer.h b/lib/gpu/geryon/ocl_timer.h index 25b20beea5..bd77170ed9 100644 --- a/lib/gpu/geryon/ocl_timer.h +++ b/lib/gpu/geryon/ocl_timer.h @@ -50,11 +50,15 @@ class UCL_Timer { /** \note init() must be called to reuse timer after a clear() **/ inline void clear() { if (_initialized) { + if (has_measured_time) { + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + has_measured_time = false; + } CL_DESTRUCT_CALL(clReleaseCommandQueue(_cq)); _initialized=false; _total_time=0.0; } - has_measured_time = false; } /// Initialize default command queue for timing @@ -71,8 +75,12 @@ class UCL_Timer { /// Start timing on default command queue inline void start() { + if (has_measured_time) { + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + has_measured_time = false; + } UCL_OCL_MARKER(_cq,&start_event); - has_measured_time = false; } /// Stop timing on default command queue @@ -83,8 +91,12 @@ class UCL_Timer { /// Block until the start event has been reached on device inline void sync_start() { + if (has_measured_time) { + clReleaseEvent(start_event); + clReleaseEvent(stop_event); + has_measured_time = false; + } CL_SAFE_CALL(clWaitForEvents(1,&start_event)); - has_measured_time = false; } /// Block until the stop event has been reached on device diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 580a3e81b6..5438df2a78 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -265,15 +265,13 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int ngpu, // Time on the device only if 1 proc per gpu _time_device=true; -#if 0 - // XXX: the following setting triggers a memory leak with OpenCL and MPI - // setting _time_device=true for all processes doesn't seem to be a - // problem with either (no segfault, no (large) memory leak. - // thus keeping this disabled for now. may need to review later. - // 2018-07-23 + // Previous source of OCL memory leak when time_device=false + // - Logic added to release OCL events when timers are not invoked if (_procs_per_gpu>1) _time_device=false; -#endif + + if (!_time_device && _particle_split > 0) + gpu->configure_profiling(false); // Set up a per device communicator MPI_Comm_split(node_comm,my_gpu,0,&_comm_gpu); @@ -715,7 +713,9 @@ void DeviceT::estimate_gpu_overhead(const int kernel_calls, dev_data_out[0].flush(); #endif driver_time=MPI_Wtime()-driver_time; - double time=over_timer.seconds(); + double time=0.0; + if (_time_device) + time=over_timer.seconds(); if (time_device()) { for (int i=0; i<_data_in_estimate; i++) diff --git a/lib/gpu/lal_pppm.cpp b/lib/gpu/lal_pppm.cpp index 8b3a6b1dde..39249ea350 100644 --- a/lib/gpu/lal_pppm.cpp +++ b/lib/gpu/lal_pppm.cpp @@ -304,7 +304,8 @@ int PPPMT::spread(const int ago, const int nlocal, const int nall, const double delxinv, const double delyinv, const double delzinv) { if (!_precompute_done) { - atom->acc_timers(); + if (device->time_device()) + atom->acc_timers(); _precompute(ago,nlocal,nall,host_x,host_type,success,host_q,boxlo,delxinv, delyinv,delzinv); } From 71464d831428bf048bdf225008558be01eb249b0 Mon Sep 17 00:00:00 2001 From: "W. Michael Brown" Date: Wed, 28 Sep 2022 22:30:09 -0700 Subject: [PATCH 243/364] GPU Package: Fixing logic in OpenCL backend that could result in unnecessary device allocations. --- lib/gpu/geryon/ocl_device.h | 9 ++++++--- lib/gpu/geryon/ocl_memory.h | 38 +++++++++++++++++++++++------------- lib/gpu/geryon/ucl_basemat.h | 14 ++++++++++--- lib/gpu/geryon/ucl_h_mat.h | 5 ++++- lib/gpu/geryon/ucl_h_vec.h | 5 ++++- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 6a563b5f47..ceb0ded745 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -99,6 +99,7 @@ struct OCLProperties { int cl_device_version; bool has_subgroup_support; bool has_shuffle_support; + bool shared_main_memory; }; /// Class for looking at data parallel device properties @@ -226,7 +227,7 @@ class UCL_Device { inline bool shared_memory() { return shared_memory(_device); } /// Returns true if host memory is efficiently addressable from device inline bool shared_memory(const int i) - { return _shared_mem_device(_cl_devices[i]); } + { return _properties[i].shared_main_memory; } /// Returns preferred vector width inline int preferred_fp32_width() { return preferred_fp32_width(_device); } @@ -582,8 +583,9 @@ void UCL_Device::add_properties(cl_device_id device_list) { op.preferred_vector_width64=double_width; // Determine if double precision is supported: All bits in the mask must be set. - cl_device_fp_config double_mask = (CL_FP_FMA|CL_FP_ROUND_TO_NEAREST|CL_FP_ROUND_TO_ZERO| - CL_FP_ROUND_TO_INF|CL_FP_INF_NAN|CL_FP_DENORM); + cl_device_fp_config double_mask = (CL_FP_FMA|CL_FP_ROUND_TO_NEAREST| + CL_FP_ROUND_TO_ZERO|CL_FP_ROUND_TO_INF| + CL_FP_INF_NAN|CL_FP_DENORM); cl_device_fp_config double_avail; CL_SAFE_CALL(clGetDeviceInfo(device_list,CL_DEVICE_DOUBLE_FP_CONFIG, sizeof(double_avail),&double_avail,nullptr)); @@ -684,6 +686,7 @@ void UCL_Device::add_properties(cl_device_id device_list) { double arch = static_cast(minor)/10+major; if (arch >= 3.0) op.has_shuffle_support=true; + op.shared_main_memory=_shared_mem_device(device_list); } delete[] buffer2; #endif diff --git a/lib/gpu/geryon/ocl_memory.h b/lib/gpu/geryon/ocl_memory.h index adf7b6c952..bfc260889a 100644 --- a/lib/gpu/geryon/ocl_memory.h +++ b/lib/gpu/geryon/ocl_memory.h @@ -118,15 +118,19 @@ inline int _host_alloc(mat_type &mat, copy_type &cm, const size_t n, template inline int _host_view(mat_type &mat, copy_type &cm, const size_t o, const size_t n) { - cl_int error_flag; - cl_buffer_region subbuffer; - subbuffer.origin = o; - subbuffer.size = n; - mat.cbegin()=clCreateSubBuffer(cm.cbegin(), 0, - CL_BUFFER_CREATE_TYPE_REGION, &subbuffer, - &error_flag); - - CL_CHECK_ERR(error_flag); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (cm.shared_mem_device()) { + cl_int error_flag; + cl_buffer_region subbuffer; + subbuffer.origin = o; + subbuffer.size = n; + mat.cbegin()=clCreateSubBuffer(cm.cbegin(), 0, + CL_BUFFER_CREATE_TYPE_REGION, &subbuffer, + &error_flag); + CL_CHECK_ERR(error_flag); + } else + mat.cbegin()=(cl_mem)0; CL_SAFE_CALL(clRetainCommandQueue(mat.cq())); return UCL_SUCCESS; } @@ -170,10 +174,13 @@ inline int _host_alloc(mat_type &mat, UCL_Device &dev, const size_t n, template inline int _host_view(mat_type &mat, UCL_Device &dev, const size_t n) { - cl_int error_flag; - mat.cbegin()=clCreateBuffer(dev.context(), CL_MEM_USE_HOST_PTR, - n,*mat.host_ptr(),&error_flag); - CL_CHECK_ERR(error_flag); + if (mat.shared_mem_device()) { + cl_int error_flag; + mat.cbegin()=clCreateBuffer(dev.context(), CL_MEM_USE_HOST_PTR, + n,*mat.host_ptr(),&error_flag); + CL_CHECK_ERR(error_flag); + } else + mat.cbegin()=(cl_mem)0; CL_SAFE_CALL(clRetainCommandQueue(mat.cq())); return UCL_SUCCESS; } @@ -181,7 +188,10 @@ inline int _host_view(mat_type &mat, UCL_Device &dev, const size_t n) { template inline void _host_free(mat_type &mat) { if (mat.cols()>0) { - CL_DESTRUCT_CALL(clReleaseMemObject(mat.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (mat.cbegin()!=(cl_mem)(0)) + CL_DESTRUCT_CALL(clReleaseMemObject(mat.cbegin())); CL_DESTRUCT_CALL(clReleaseCommandQueue(mat.cq())); } } diff --git a/lib/gpu/geryon/ucl_basemat.h b/lib/gpu/geryon/ucl_basemat.h index 51fd33d623..3f478c4b4e 100644 --- a/lib/gpu/geryon/ucl_basemat.h +++ b/lib/gpu/geryon/ucl_basemat.h @@ -75,13 +75,21 @@ class UCL_BaseMat { inline enum UCL_MEMOPT kind() const { return _kind; } inline bool shared_mem_device() { - #ifdef _OCL_MAT + #ifndef _OCL_MAT + return false; + #else + + #if defined(GERYON_FORCE_SHARED_MAIN_MEM_ON) + return true; + #elif defined(GERYON_FORCE_SHARED_MAIN_MEM_OFF) + return false; + #else cl_device_id device; CL_SAFE_CALL(clGetCommandQueueInfo(_cq,CL_QUEUE_DEVICE, sizeof(cl_device_id),&device,NULL)); return _shared_mem_device(device); - #else - return false; + #endif + #endif } diff --git a/lib/gpu/geryon/ucl_h_mat.h b/lib/gpu/geryon/ucl_h_mat.h index 41dad2b285..082cfd5980 100644 --- a/lib/gpu/geryon/ucl_h_mat.h +++ b/lib/gpu/geryon/ucl_h_mat.h @@ -140,7 +140,10 @@ class UCL_H_Mat : public UCL_BaseMat { _end=_array+_cols; #ifdef _OCL_MAT _carray=input.cbegin(); - CL_SAFE_CALL(clRetainMemObject(input.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (_carray!=(cl_mem)(0)) + CL_SAFE_CALL(clRetainMemObject(input.cbegin())); CL_SAFE_CALL(clRetainCommandQueue(input.cq())); #endif } diff --git a/lib/gpu/geryon/ucl_h_vec.h b/lib/gpu/geryon/ucl_h_vec.h index d9ce0bbba6..2f49f9f633 100644 --- a/lib/gpu/geryon/ucl_h_vec.h +++ b/lib/gpu/geryon/ucl_h_vec.h @@ -139,7 +139,10 @@ class UCL_H_Vec : public UCL_BaseMat { _end=_array+_cols; #ifdef _OCL_MAT _carray=input.cbegin(); - CL_SAFE_CALL(clRetainMemObject(input.cbegin())); + // When viewing outside host allocation with discrete main memory on accelerator, + // no cl_buffer object is created to avoid unnecessary creation of device allocs + if (_carray!=(cl_mem)(0)) + CL_SAFE_CALL(clRetainMemObject(input.cbegin())); CL_SAFE_CALL(clRetainCommandQueue(input.cq())); #endif } From 6c0da8cbaf1081f7cd472573cc371fc52c80c3b4 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 29 Sep 2022 01:07:46 -0500 Subject: [PATCH 244/364] Wrote documentation for extract_fix, extract_variable --- doc/src/Fortran.rst | 337 +++++++++++++++++++++++++++++++----- doc/src/Library_objects.rst | 7 + src/library.cpp | 78 ++++----- src/library.h | 2 +- 4 files changed, 340 insertions(+), 84 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 730148b7f1..9bcf34a2d1 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -10,7 +10,7 @@ written in C, C++, or Fortran. While C libraries have a defined binary interface (ABI) and can thus be used from multiple compiler versions from different vendors for as long as they are compatible with the hosting operating system, the same is -not true for Fortran codes. Thus the LAMMPS Fortran module needs to be +not true for Fortran programs. Thus, the LAMMPS Fortran module needs to be compiled alongside the code using it from the source code in ``fortran/lammps.f90``. When linking, you also need to :doc:`link to the LAMMPS library `. A typical command line @@ -18,21 +18,21 @@ for a simple program using the Fortran interface would be: .. code-block:: bash - mpifort -o testlib.x lammps.f90 testlib.f90 -L. -llammps + mpifort -o testlib.x lammps.f90 testlib.f90 -L. -llammps -Please note, that the MPI compiler wrapper is only required when the -calling the library from an MPI parallel code. Otherwise, using the +Please note that the MPI compiler wrapper is only required when the +calling the library from an MPI-parallelized program. Otherwise, using the fortran compiler (gfortran, ifort, flang, etc.) will suffice. It may be -necessary to link to additional libraries depending on how LAMMPS was +necessary to link to additional libraries, depending on how LAMMPS was configured and whether the LAMMPS library :doc:`was compiled as a static -or shared library `. +or dynamic library `. If the LAMMPS library itself has been compiled with MPI support, the resulting executable will still be able to run LAMMPS in parallel with -``mpirun`` or equivalent. Please also note that the order of the source +``mpiexec`` or equivalent. Please also note that the order of the source files matters: the ``lammps.f90`` file needs to be compiled first, since it provides the ``LIBLAMMPS`` module that is imported by the Fortran -code using the interface. A working example code can be found together +code that uses the interface. A working example can be found together with equivalent examples in C and C++ in the ``examples/COUPLE/simple`` folder of the LAMMPS distribution. @@ -62,31 +62,31 @@ Creating or deleting a LAMMPS object With the Fortran interface, the creation of a :cpp:class:`LAMMPS ` instance is included in the constructor for creating the :f:func:`lammps` derived type. To import the definition of -that type and its type bound procedures, you need to add a ``USE -LIBLAMMPS`` statement. Internally it will call either +that type and its type-bound procedures, you need to add a ``USE +LIBLAMMPS`` statement. Internally, it will call either :cpp:func:`lammps_open_fortran` or :cpp:func:`lammps_open_no_mpi` from the C library API to create the class instance. All arguments are -optional and :cpp:func:`lammps_mpi_init` will be called automatically, +optional and :cpp:func:`lammps_mpi_init` will be called automatically if it is needed. Similarly, a possible call to :cpp:func:`lammps_mpi_finalize` is integrated into the :f:func:`close` function and triggered with the optional logical argument set to -``.true.``. Here is a simple example: +``.TRUE.``. Here is a simple example: .. code-block:: fortran PROGRAM testlib USE LIBLAMMPS ! include the LAMMPS library interface IMPLICIT NONE - TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance - CHARACTER(len=*), PARAMETER :: args(3) = & - [ CHARACTER(len=12) :: 'liblammps', '-log', 'none' ] + TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance + CHARACTER(LEN=*), PARAMETER :: args(3) = & + [ CHARACTER(LEN=12) :: 'liblammps', '-log', 'none' ] ! create a LAMMPS instance (and initialize MPI) lmp = lammps(args) ! get and print numerical version code PRINT*, 'LAMMPS Version: ', lmp%version() - ! delete LAMMPS instance (and shuts down MPI) - CALL lmp%close(.true.) + ! delete LAMMPS instance (and shutdown MPI) + CALL lmp%close(.TRUE.) END PROGRAM testlib It is also possible to pass command line flags from Fortran to C/C++ and @@ -102,8 +102,8 @@ version of the previous example: PROGRAM testlib2 USE LIBLAMMPS ! include the LAMMPS library interface IMPLICIT NONE - TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance - CHARACTER(len=128), ALLOCATABLE :: command_args(:) + TYPE(lammps) :: lmp ! derived type to hold LAMMPS instance + CHARACTER(LEN=128), ALLOCATABLE :: command_args(:) INTEGER :: i, argc ! copy command line flags to `command_args()` @@ -131,9 +131,9 @@ Executing LAMMPS commands Once a LAMMPS instance is created, it is possible to "drive" the LAMMPS simulation by telling LAMMPS to read commands from a file or to pass individual or multiple commands from strings or lists of strings. This -is done similarly to how it is implemented in the :doc:`C-library +is done similarly to how it is implemented in the :doc:`C library interface `. Before handing off the calls to the -C-library interface, the corresponding Fortran versions of the calls +C library interface, the corresponding Fortran versions of the calls (:f:func:`file`, :f:func:`command`, :f:func:`commands_list`, and :f:func:`commands_string`) have to make a copy of the strings passed as arguments so that they can be modified to be compatible with the @@ -157,9 +157,9 @@ Below is a small demonstration of the uses of the different functions: ! define 10 groups of 10 atoms each ALLOCATE(cmdlist(10)) DO i=1, 10 - WRITE(trimmed,'(I10)') 10*i - WRITE(cmdlist(i),'(A,I1,A,I10,A,A)') & - 'group g', i-1, ' id ', 10*(i-1)+1, ':', ADJUSTL(trimmed) + WRITE(trimmed,'(I10)') 10*i + WRITE(cmdlist(i),'(A,I1,A,I10,A,A)') & + 'group g', i-1, ' id ', 10*(i-1)+1, ':', ADJUSTL(trimmed) END DO CALL lmp%commands_list(cmdlist) ! run multiple commands from multi-line string @@ -176,13 +176,13 @@ Below is a small demonstration of the uses of the different functions: Accessing system properties *************************** -The C-library interface allows the :doc:`extraction of different kinds +The C library interface allows the :doc:`extraction of different kinds of information ` about the active simulation -instance and also - in some cases - to apply modifications to it. In -some cases, the C-library interface makes pointers to internal data -structures accessible, thus when accessing them from Fortran, special -care is needed to avoid data corruption and crashes. Thus please see -the documentation of the individual type bound procedures for details. +instance and also---in some cases---to apply modifications to it. In +some cases, the C library interface makes pointers to internal data +structures accessible; when accessing them through the library interfaces, +special care is needed to avoid data corruption and crashes. Please see +the documentation of the individual type-bound procedures for details. Below is an example demonstrating some of the possible uses. @@ -191,35 +191,36 @@ Below is an example demonstrating some of the possible uses. PROGRAM testprop USE LIBLAMMPS USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int64_t - TYPE(lammps) :: lmp - INTEGER(kind=8) :: natoms - REAL(c_double), POINTER :: dt - INTEGER(c_int64_t), POINTER :: ntimestep - REAL(kind=8) :: pe, ke + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : OUTPUT_UNIT + TYPE(lammps) :: lmp + INTEGER(KIND=c_int64_t) :: natoms + REAL(KIND=c_double), POINTER :: dt + INTEGER(KIND=c_int64_t), POINTER :: ntimestep + REAL(KIND=c_double) :: pe, ke lmp = lammps() CALL lmp%file('in.sysinit') - natoms = INT(lmp%get_natoms(),8) - WRITE(6,'(A,I8,A)') 'Running a simulation with', natoms, ' atoms' - WRITE(6,'(I8,A,I8,A,I3,A)') lmp%extract_setting('nlocal'), ' local and', & - lmp%extract_setting('nghost'), ' ghost atom. ', & + natoms = lmp%extract_setting('natoms') + WRITE(OUTPUT_UNIT,'(A,I8,A)') 'Running a simulation with', natoms, ' atoms' + WRITE(OUTPUT_UNIT,'(I8,A,I8,A,I3,A)') lmp%extract_setting('nlocal'), & + ' local and', lmp%extract_setting('nghost'), ' ghost atom. ', & lmp%extract_setting('ntypes'), ' atom types' CALL lmp%command('run 2 post no') dt = lmp%extract_global('dt') ntimestep = lmp%extract_global('ntimestep') - WRITE(6,'(A,I4,A,F4.1,A)') 'At step:', ntimestep, ' Changing timestep from', dt, ' to 0.5' - dt = 0.5 + WRITE(OUTPUT_UNIT,'(A,I4,A,F4.1,A)') 'At step:', ntimestep, & + ' Changing timestep from', dt, ' to 0.5' + dt = 0.5_c_double CALL lmp%command('run 2 post no') - WRITE(6,'(A,I4)') 'At step:', ntimestep + WRITE(OUTPUT_UNIT,'(A,I0)') 'At step:', ntimestep pe = lmp%get_thermo('pe') ke = lmp%get_thermo('ke') PRINT*, 'PE = ', pe PRINT*, 'KE = ', ke CALL lmp%close(.TRUE.) - END PROGRAM testprop --------------- @@ -237,6 +238,8 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. class instance that any of the included calls are forwarded to. :f c_ptr handle: reference to the LAMMPS class + :f type(lammps_style) style: derived type to access lammps style constants + :f type(lammps_type) type: derived type to access lammps type constants :f subroutine close: :f:func:`close` :f subroutine error: :f:func:`error` :f subroutine file: :f:func:`file` @@ -248,10 +251,18 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f subroutine extract_box: :f:func:`extract_box` :f subroutine reset_box: :f:func:`reset_box` :f subroutine memory_usage: :f:func:`memory_usage` + :f function get_mpi_comm: :f:func:`get_mpi_comm` :f function extract_setting: :f:func:`extract_setting` :f function extract_global: :f:func:`extract_global` + :f function extract_atom: :f:func:`extract_atom` + :f function extract_compute: :f:func:`extract_compute` + :f function extract_fix: :f:func:`extract_fix` + :f function extract_variable: :f:func:`extract_variable` :f function version: :f:func:`version` + :f subroutine flush_buffers: :f:func:`flush_buffers` :f function is_running: :f:func:`is_running` + :f function has_error: :f:func:`has_error` + :f subroutine get_last_error_message: :f:func:`get_last_error_message` -------- @@ -290,6 +301,24 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. lmp = lammps(MPI_COMM_SELF%MPI_VAL) END PROGRAM testmpi +.. f:type:: lammps_style + + This derived type is there to provide a convenient interface for the style + constants used with :f:func:`extract_compute`, :f:func:`extract_fix`, and + :f:func:`extract_variable`. Assuming your LAMMPS instance is called ``lmp``, + these constants will be ``lmp%style%global``, ``lmp%style%atom``, + and ``lmp%style%local``. These values are identical to the values described + in :cpp:enum:`_LMP_STYLE_CONST` for the C library interface. + +.. f:type:: lammps_type + + This derived type is there to provide a convenient interface for the type + constants used with :f:func:`extract_compute`, :f:func:`extract_fix`, and + :f:func:`extract_variable`. Assuming your LAMMPS instance is called ``lmp``, + these constants will be ``lmp%type%scalar``, ``lmp%type%vector``, and + ``lmp%type%array``. These values are identical to the values described + in :cpp:enum:`_LMP_TYPE_CONST` for the C library interface. + Procedures Bound to the lammps Derived Type =========================================== @@ -301,7 +330,7 @@ Procedures Bound to the lammps Derived Type :cpp:func:`lammps_mpi_finalize`. :o logical finalize [optional]: shut down the MPI environment of the LAMMPS - library if true. + library if ``.TRUE.``. -------- @@ -571,6 +600,8 @@ Procedures Bound to the lammps Derived Type LAMMPS data tied to the :cpp:class:`Atom` class, depending on the data requested through *name*. + .. versionadded:: TBD + Note that this function actually does not return a pointer, but rather associates the pointer on the left side of the assignment to point to internal LAMMPS data. Pointers must be of the correct type, kind, and @@ -645,6 +676,8 @@ Procedures Bound to the lammps Derived Type required to specify which set of data is to be returned through the *style* and *type* variables. + .. versionadded:: TBD + Note that this function actually does not return a value, but rather associates the pointer on the left side of the assignment to point to internal LAMMPS data. Pointers must be of the correct data type to point to @@ -719,6 +752,11 @@ Procedures Bound to the lammps Derived Type (global, per-atom, or local) :p integer(c_int) type: value indicating the type of data to extract (scalar, vector, or array) + :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment + should be a C-compatible pointer (e.g., ``REAL (C_double), POINTER :: x``) + to the extracted property. If expecting vector data, the pointer should + have dimension ":"; if expecting array (matrix) data, the pointer should + have dimension ":,:". .. note:: @@ -738,9 +776,220 @@ Procedures Bound to the lammps Derived Type -------- +.. f:function:: extract_fix(id, style, type, [nrow,] [ncol]) + + This function calls :c:func:`lammps_extract_fix` and returns a pointer to + LAMMPS data tied to the :cpp:class:`Fix` class, specifically data provided + by the fix identified by *id*. Fixes may provide global, per-atom, or + local data, and those data may be a scalar, a vector, or an array. Since + many fixes provide multiple kinds of data, the user is required to specify + which set of data is to be returned through the *style* and *type* + variables. + + .. versionadded:: TBD + + Global data are calculated at the time they are requested and are only + available element-by-element. As such, the user is expected to provide + the *nrow* variable to specify which element of a global vector or the + *nrow* and *ncol* variables to specify which element of a global array the + user wishes LAMMPS to return. The *ncol* variable is optional for global + scalar or vector data, and both *nrow* and *ncol* are optional when a + global scalar is requested, as well as when per-atom or local data are + requested. + + In the case of global data, this function returns a value of type + ``real(C_double)``. For per-atom or local data, this function does not + return a value but instead associates the pointer on the left side of the + assignment to point to internal LAMMPS data. Pointers must be of the correct + data type to point to said data (i.e., ``REAL(c_double)``) and have + compatible rank. The pointer being associated with LAMMPS data is type-, + kind-, and rank-checked at run-time via an overloaded assignment operator. + + For example, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(c_double) :: dr, dx, dy, dz + ! more code to set up, etc. + lmp%command('fix george all recenter 2 2 2') + ! more code + dr = lmp%extract_fix("george", lmp%style%global, lmp%style%scalar) + dx = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 1) + dy = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 2) + dz = lmp%extract_fix("george", lmp%style%global, lmp%style%vector, 3) + + will extract the global scalar calculated by + :doc:`fix recenter ` into the variable *dr* and the + three elements of the global vector calculated by fix recenter into the + variables *dx*, *dy*, and *dz*, respectively. + + If asked for per-atom or local data, :f:func:`extract_compute` returns a + pointer to actual LAMMPS data. The pointer so returned will have the + appropriate size to match the internal data, and will be + type/kind/rank-checked at the time of the assignment. For example, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: r + ! more code to set up, etc. + lmp%command('fix state all store/state 0 x y z') + ! more code + r = lmp%extract_fix('state', lmp%style%atom, lmp%type%array) + + will bind the pointer *r* to internal LAMMPS data representing the per-atom + array computed by :doc:`fix store/state ` when three + inputs are specified. Similarly, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), POINTER :: x + ! more code to set up, etc. + lmp%command('fix state all store/state 0 x') + ! more code + x = lmp%extract_fix('state', lmp%style%atom, lmp%type%vector) + + will associate the pointer *x* with internal LAMMPS data corresponding to + the per-atom vector computed by :doc:`fix store/state ` + when only one input is specified. Similar examples with ``lmp%style%atom`` + replaced by ``lmp%style%local`` will extract local data from fixes that + define local vectors and/or arrays. + + .. warning:: + + The pointers returned by this function for per-atom or local data are + generally not persistent, since the computed data may be redistributed, + reallocated, and reordered at every invocation of the fix. It is thus + advisable to reinvoke this function before the data are accessed or to + make a copy if the data are to be used after other LAMMPS commands have + been issued. + + .. note:: + + LAMMPS cannot easily check if it is valid to access the data, so it + may fail with an error. The caller has to avoid such an error. + + :p character(len=\*) id: string with the name of the fix from which + to extract data + :p integer(c_int) style: value indicating the style of data to extract + (global, per-atom, or local) + :p integer(c_int) type: value indicating the type of data to extract + (scalar, vector, or array) + :p integer(c_int) nrow: row index (used only for global vectors and arrays) + :p integer(c_int) ncol: column index (only used for global arrays) + :r polymorphic: LAMMPS data (for global data) or a pointer to LAMMPS data + (for per-atom or local data). The left-hand side of the assignment should + be of type ``REAL(C_double)`` and have appropriate rank (i.e., + ``DIMENSION(:)`` if expecting per-atom or local vector data and + ``DIMENSION(:,:)`` if expecting per-atom or local array data). If expecting + global or per-atom data, it should have the ``POINTER`` attribute. + + .. admonition:: Array index order + + Two-dimensional global, per-atom, or local array data from + :f:func:`extract_fix` will be **transposed** from equivalent arrays in + C (or in the ordinary LAMMPS interface accessed through thermodynamic + output), and they will be indexed from 1, not 0. This is true even for + global data, which are returned as scalars---this is done primarily so + the interface is consistent, as there is no choice but to transpose the + indices for per-atom or local array data. See the similar note under + :f:func:`extract_atom` for further details. + +-------- + +.. f:function:: extract_variable(name[,group]) + + This function calls :c:func:`lammps_extract_variable` and returns a scalar, + vector, or string containing the value of the variable identified by + *name*. When the variable is an *equal*-style variable (or one compatible + with that style such as *internal*), the variable is evaluated and the + corresponding value returned. When the variable is an *atom*-style variable, + the variable is evaluated and a vector of values is returned. With all + other variables, a string is returned. The *group* argument is only used + for *atom* style variables and is ignored otherwise. If *group* is absent + for *atom*-style variables, the group is assumed to be "all". + + .. versionadded:: TBD + + This function returns the values of the variables, not pointers to them. + Vectors pointing to *atom*-style variables should be of type + ``REAL(C_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and either have + the ``ALLOCATABLE`` attribute or be long enough to contain the data without + reallocation. + + .. note:: + + Unlike the C library interface, the Fortran interface does not require + you to deallocate memory when you are through; this is done for you, + behind the scenes. + + For example, + + .. code-block:: Fortran + + TYPE(lammps) :: lmp + REAL(c_double) :: area + ! more code to set up, etc. + lmp%command('variable A equal lx*ly') + ! more code + area = lmp%extract_variable("A") + + will extract the *x*\ --*y* cross-sectional area of the simulation into the + variable *area*. + + :p character(len=\*) name: variable name to evaluate + :o character(len=\*) group [optional]: group for which to extract per-atom + data (if absent, use "all") + :r polymorphic: scalar of type ``REAL(C_double)`` (for *equal*-style + variables and others that are *equal*-compatible), vector of type + ``REAL(C_double), DIMENSION(nlocal)`` for *atom*-style variables, or + ``CHARACTER(LEN=:), ALLOCATABLE`` for *string*-style and compatible + variables. Non-allocatable strings whose length is too short to hold the + result will be truncated. + +.. note:: + + LAMMPS cannot easily check if it is valid to access the data + referenced by the variables (e.g., computes, fixes, or thermodynamic + info), so it may fail with an error. The caller has to make certain + that the data are extracted only when it safe to evaluate the variable + and thus an error and crash are avoided. + +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like :cpp:func:`lammps_version` does. :r integer: LAMMPS version + +-------- + +.. f:subroutine:: flush_buffers + +.. + TODO + +-------- + +.. f:function:: is_running + +.. + TODO + +-------- + +.. f:function:: has_error + +.. + TODO + +-------- + +.. f:subroutine:: get_last_error_message + +.. + TODO diff --git a/doc/src/Library_objects.rst b/doc/src/Library_objects.rst index eed14b3a05..6604236f5e 100644 --- a/doc/src/Library_objects.rst +++ b/doc/src/Library_objects.rst @@ -21,6 +21,11 @@ fixes, or variables in LAMMPS using the following functions: ----------------------- +.. doxygenfunction:: lammps_extract_variable_datatype + :project: progguide + +----------------------- + .. doxygenfunction:: lammps_extract_variable :project: progguide @@ -36,3 +41,5 @@ fixes, or variables in LAMMPS using the following functions: .. doxygenenum:: _LMP_STYLE_CONST .. doxygenenum:: _LMP_TYPE_CONST + +.. doxygenenum:: _LMP_VAR_CONST diff --git a/src/library.cpp b/src/library.cpp index d5e309ce33..bb9d42aa99 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2068,9 +2068,9 @@ use to avoid a memory leak. Example: For *atom*\ -style variables the data returned is a pointer to an allocated block of storage of double of the length ``atom->nlocal``. -Since the data is returned a copy, the location will persist, but its -content will not be updated, in case the variable is re-evaluated. -To avoid a memory leak this pointer needs to be freed after use in +Since the data returned are a copy, the location will persist, but its +content will not be updated in case the variable is re-evaluated. +To avoid a memory leak, this pointer needs to be freed after use in the calling program. For other variable styles the returned pointer needs to be cast to @@ -2084,10 +2084,10 @@ a char pointer. .. note:: LAMMPS cannot easily check if it is valid to access the data - referenced by the variables, e.g. computes or fixes or thermodynamic - info, so it may fail with an error. The caller has to make certain, - that the data is extracted only when it safe to evaluate the variable - and thus an error and crash is avoided. + referenced by the variables (e.g., computes or fixes or thermodynamic + info), so it may fail with an error. The caller has to make certain + that the data are extracted only when it safe to evaluate the variable + and thus an error or crash are avoided. \endverbatim * @@ -2130,7 +2130,7 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) /* ---------------------------------------------------------------------- */ -/** Get data type of a LAMMPS variable +/** Get data type of a LAMMPS variable. * \verbatim embed:rst @@ -2207,12 +2207,12 @@ int lammps_set_variable(void *handle, char *name, char *str) requirement for consecutive atom IDs (1 to N) see gather_atoms_concat() to return data for all atoms, unordered see gather_atoms_subset() to return data for only a subset of atoms - name = desired quantity, e.g. x or charge + name = desired quantity (e.g., x or charge) type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...); data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -2344,12 +2344,12 @@ void lammps_gather_atoms(void *handle, char *name, int type, int count, void *da can do a gather_atoms_concat for "id" if need to know atom IDs see gather_atoms() to return data ordered by consecutive atom IDs see gather_atoms_subset() to return data for only a subset of atoms - name = desired quantity, e.g. x or charge + name = desired quantity (e.g., x or charge) type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -2488,14 +2488,14 @@ void lammps_gather_atoms_concat(void *handle, char *name, int type, int count, v no requirement for consecutive atom IDs (1 to N) see gather_atoms() to return data for all atoms, ordered by consecutive IDs see gather_atoms_concat() to return data for all atoms, unordered - name = desired quantity, e.g. x or charge + name = desired quantity (e.g., x or charge) type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz ndata = # of atoms to return data for (could be all atoms) ids = list of Ndata atom IDs to return data for return atom-based values in 1d data, ordered by count, then by atom - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Ndata method: @@ -2632,12 +2632,12 @@ void lammps_gather_atoms_subset(void *handle, char *name, int type, int count, data is ordered by atom ID requirement for consecutive atom IDs (1 to N) see scatter_atoms_subset() to scatter data for some (or all) atoms, unordered - name = desired quantity, e.g. x or charge + name = desired quantity (e.g., x or charge) type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" for xyz to be packed into single image flag data = atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be correct length = count*Natoms, as queried by get_natoms() method: loop over Natoms, if I own atom ID, set its values from data @@ -2748,14 +2748,14 @@ void lammps_scatter_atoms(void *handle, char *name, int type, int count, void *d data is ordered by provided atom IDs no requirement for consecutive atom IDs (1 to N) see scatter_atoms() to scatter data for all atoms, ordered by consecutive IDs - name = desired quantity, e.g. x or charge + name = desired quantity (e.g., x or charge) type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" for xyz to be packed into single image flag ndata = # of atoms in ids and data (could be all atoms) ids = list of Ndata atom IDs to scatter data to data = atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be correct length = count*Ndata method: loop over Ndata, if I own atom ID, set its values from data @@ -2992,10 +2992,10 @@ void lammps_gather_bonds(void *handle, void *data) "d2_name" or "i2_name" for fix property/atom arrays with count > 1 will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -3227,10 +3227,10 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) "d2_name" or "i2_name" for fix property/atom arrays with count > 1 will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -3479,10 +3479,10 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d "d2_name" or "i2_name" for fix property/atom arrays with count > 1 will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -3727,10 +3727,10 @@ void lammps_gather_subset(void *handle, char *name, "d2_name" or "i2_name" for fix property/atom arrays with count > 1 will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" if want single image flag unpacked into xyz return atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be pre-allocated by caller to correct length correct length = count*Natoms, as queried by get_natoms() method: @@ -3945,12 +3945,12 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) "f_fix", "c_compute" for fixes / computes will return error if fix/compute doesn't isn't atom-based type = 0 for integer values, 1 for double values - count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f + count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) use count = 3 with "image" for xyz to be packed into single image flag ndata = # of atoms in ids and data (could be all atoms) ids = list of Ndata atom IDs to scatter data to data = atom-based values in 1d data, ordered by count, then by atom ID - e.g. x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],... + (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) data must be correct length = count*Ndata method: loop over Ndata, if I own atom ID, set its values from data @@ -4193,8 +4193,8 @@ boundaries atoms will be wrapped back into the simulation cell and its image flags adjusted accordingly, unless explicit image flags are provided. -The function returns the number of atoms created or -1 on failure, e.g. -when called before as box has been created. +The function returns the number of atoms created or -1 on failure (e.g., +when called before as box has been created). Coordinates and velocities have to be given in a 1d-array in the order X(1),Y(1),Z(1),X(2),Y(2),Z(2),...,X(N),Y(N),Z(N). @@ -4552,7 +4552,7 @@ int lammps_config_has_mpi_support() * files via a pipe to gzip or similar compression programs \verbatim embed:rst -Several LAMMPS commands (e.g. :doc:`read_data`, :doc:`write_data`, +Several LAMMPS commands (e.g., :doc:`read_data`, :doc:`write_data`, :doc:`dump styles atom, custom, and xyz `) support reading and writing compressed files via creating a pipe to the ``gzip`` program. This function checks whether this feature was :ref:`enabled at compile @@ -5224,8 +5224,8 @@ data structures can change as well as the order of atom as they migrate between MPI processes because of the domain decomposition parallelization, this function should be always called immediately before the forces are going to be set to get an up-to-date pointer. - You can use e.g. :cpp:func:`lammps_get_natoms` to obtain the number -of local atoms `nlocal` and then assume the dimensions of the returned +You can use, for example, :cpp:func:`lammps_extract_setting` to obtain the +number of local atoms `nlocal` and then assume the dimensions of the returned force array as ``double force[nlocal][3]``. This is an alternative to the callback mechanism in fix external set up by @@ -5511,7 +5511,7 @@ void lammps_fix_external_set_vector_length(void *handle, const char *id, int len This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and :cpp:func:`lammps_fix_external_get_force` to set the values of a global vector of properties that will be stored with the fix. And can be accessed from -within LAMMPS input commands (e.g. fix ave/time or variables) when used +within LAMMPS input commands (e.g., fix ave/time or variables) when used in a vector context. This function needs to be called **after** a call to diff --git a/src/library.h b/src/library.h index d0616cd6c4..2eadb9c5f3 100644 --- a/src/library.h +++ b/src/library.h @@ -91,7 +91,7 @@ enum _LMP_ERROR_CONST { LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ }; -/** Variable style constants for extracting data from variables +/** Variable style constants for extracting data from variables. * * Must be kept in sync with the equivalent constants in lammps/constants.py * and fortran/lammps.f90 */ From fb675028b910b8268612d5f7d86126d28625ae9e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Sep 2022 02:42:11 -0400 Subject: [PATCH 245/364] whitespace --- lib/gpu/geryon/hip_device.h | 2 +- lib/gpu/geryon/nvd_device.h | 8 ++++---- lib/gpu/geryon/ocl_device.h | 2 +- lib/gpu/geryon/ucl_basemat.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/gpu/geryon/hip_device.h b/lib/gpu/geryon/hip_device.h index d14631fa0f..6692078629 100644 --- a/lib/gpu/geryon/hip_device.h +++ b/lib/gpu/geryon/hip_device.h @@ -84,7 +84,7 @@ class UCL_Device { /// Specify whether profiling (device timers) will be used for the device (yes=true) /** No-op for CUDA and HIP **/ inline void configure_profiling(const bool profiling_on) {} - + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not diff --git a/lib/gpu/geryon/nvd_device.h b/lib/gpu/geryon/nvd_device.h index 5875dfaa7c..1b2e5b8c77 100644 --- a/lib/gpu/geryon/nvd_device.h +++ b/lib/gpu/geryon/nvd_device.h @@ -98,7 +98,7 @@ class UCL_Device { /// Specify whether profiling (device timers) will be used for the device (yes=true) /** No-op for CUDA and HIP **/ inline void configure_profiling(const bool profiling_on) {} - + /// Set the CUDA device to the specified device number /** A context and default command queue will be created for the device * Returns UCL_SUCCESS if successful or UCL_ERROR if the device could not @@ -309,9 +309,9 @@ class UCL_Device { /// For compatability with OCL API inline int auto_set_platform(const enum UCL_DEVICE_TYPE type=UCL_GPU, - const std::string vendor="", - const int ndevices=-1, - const int first_device=-1) + const std::string vendor="", + const int ndevices=-1, + const int first_device=-1) { return set_platform(0); } private: diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index ceb0ded745..506ee1fe91 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -388,7 +388,7 @@ class UCL_Device { cl_platform_id _cl_platforms[20]; // OpenCL IDs for all platforms cl_context _context; // Context used for accessing the device std::vector _cq;// The default command queue for this device - bool _cq_profiling; // True=create command queues w/ profiling support + bool _cq_profiling; // True=create command queues w/ profiling support int _device; // UCL_Device ID for current device cl_device_id _cl_device; // OpenCL ID for current device std::vector _cl_devices; // OpenCL IDs for all devices diff --git a/lib/gpu/geryon/ucl_basemat.h b/lib/gpu/geryon/ucl_basemat.h index 3f478c4b4e..349873d59b 100644 --- a/lib/gpu/geryon/ucl_basemat.h +++ b/lib/gpu/geryon/ucl_basemat.h @@ -78,7 +78,7 @@ class UCL_BaseMat { #ifndef _OCL_MAT return false; #else - + #if defined(GERYON_FORCE_SHARED_MAIN_MEM_ON) return true; #elif defined(GERYON_FORCE_SHARED_MAIN_MEM_OFF) @@ -89,7 +89,7 @@ class UCL_BaseMat { sizeof(cl_device_id),&device,NULL)); return _shared_mem_device(device); #endif - + #endif } From 777a074744579e6f42f5824c7136ca6e1838dcef Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Sep 2022 15:04:57 -0400 Subject: [PATCH 246/364] Convert PDLAMMPS user doc from latex to sphinx --- doc/src/Howto.rst | 1 + doc/src/Howto_peri.rst | 1055 +++++++++++++++++++++++++++++++ doc/src/JPG/dump.peri.2000.png | Bin 0 -> 205139 bytes doc/src/JPG/dump.peri.300.png | Bin 0 -> 147512 bytes doc/src/JPG/dump.peri.600.png | Bin 0 -> 160581 bytes doc/src/JPG/ovito-peri-snap.png | Bin 0 -> 506151 bytes doc/src/JPG/pdlammps_fig1.png | Bin 0 -> 163775 bytes doc/src/JPG/pdlammps_fig2.png | Bin 0 -> 2622167 bytes 8 files changed, 1056 insertions(+) create mode 100644 doc/src/Howto_peri.rst create mode 100644 doc/src/JPG/dump.peri.2000.png create mode 100644 doc/src/JPG/dump.peri.300.png create mode 100644 doc/src/JPG/dump.peri.600.png create mode 100644 doc/src/JPG/ovito-peri-snap.png create mode 100644 doc/src/JPG/pdlammps_fig1.png create mode 100644 doc/src/JPG/pdlammps_fig2.png diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst index 715f13f09b..d1bb1733fc 100644 --- a/doc/src/Howto.rst +++ b/doc/src/Howto.rst @@ -85,6 +85,7 @@ Packages howto Howto_coreshell Howto_drude Howto_drude2 + Howto_peri Howto_manifold Howto_spins diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst new file mode 100644 index 0000000000..6285036fc8 --- /dev/null +++ b/doc/src/Howto_peri.rst @@ -0,0 +1,1055 @@ +Peridynamics with LAMMPS +======================== + +This Howto is based on the Sandia report 2010-5549 by Michael L. Parks, +Pablo Seleson, Steven J. Plimpton, Richard B. Lehoucq, and +Stewart A. Silling. + +Overview +"""""""" + +Peridynamics is a nonlocal extension of classical continuum mechanics. +The discrete peridynamic model has the same computational structure as a +molecular dynamics model. This Howto provides a brief overview of the +peridynamic model of a continuum, then discusses how the peridynamic +model is discretized within LAMMPS as described in the original article +:ref:`(Parks) `. An example problem with comments is also +included. + +Quickstart +"""""""""" + +The peridynamics styles are included in the optional :ref:`PERI package +`. If your LAMMPS executable does not already include the +PERI package, you can see the :doc:`build instructions for packages +` for how to enable the package when compiling a custom +version of LAMMPS from source. + +Here is a minimal example for setting up a peridynamics simulation. + +.. code-block:: LAMMPS + + units si + boundary s s s + lattice sc 0.0005 + atom_style peri + atom_modify map array + neighbor 0.0010 bin + region target cylinder y 0.0 0.0 0.0050 -0.0050 0.0 units box + create_box 1 target + create_atoms 1 region target + + pair_style peri/pmb + pair_coeff * * 1.6863e22 0.0015001 0.0005 0.25 + set group all density 2200 + set group all volume 1.25e-10 + velocity all set 0.0 0.0 0.0 sum no units box + fix 1 all nve + compute 1 all damage/atom + timestep 1.0e-7 + +Some notes on this input example: + +- peridynamics simulations typically use SI :doc:`units ` +- particles must be created on a :doc:`simple cubic lattice ` +- using the :doc:`atom style peri ` is required +- an :doc:`atom map ` is required for indexing particles +- The :doc:`skin distance ` used when computing neighborlists + should be defined appropriately for your choice of simulation + parameters. The *skin* should be set to a value such that the + peridynamic horizon plus the skin distance is larger than the maximum + possible distance between two bonded particles (before their bond + breaks). Here it is set to 0.001 meters. +- a :doc:`peridynamics pair style ` is required. Available + choices are currently: *peri/eps*, *peri/lps*, *peri/pmb*, and + *peri/ves*. The model parameters are set with a :doc:`pair_coeff + ` command. +- the mass density and volume fraction for each particle must be + defined. This is done with the two :doc:`set ` commands for + *density* and *volume*. For a simple cubic lattice, the volume of a + particle should be equal to the cube of the lattice constant, here + :math:`V_i = \Delta x ^3`. +- with the :doc:`velocity ` command all particles are initially at rest +- a plain :doc:`velocity-Verlet time integrator ` is used, + which is algebraically equivalent to a centered difference in time, + but numerically more stable +- you can compute the damage at the location of each particle with + :doc:`compute damage/atom ` +- finally, the timestep is set to 0.1 microseconds with the + :doc:`timestep ` command. + + +Peridynamic Model of a Continuum +"""""""""""""""""""""""""""""""" + +The following is not a complete overview of peridynamics, but a +discussion of only those details specific to the model we have +implemented within LAMMPS. For more on the peridynamic theory, the +reader is referred to :ref:`(Silling 2007) `. To begin, +we define the notation we will use. + +Basic Notation +^^^^^^^^^^^^^^ + +Within the peridynamic literature, the following notational conventions +are generally used. The position of a given point in the reference +configuration is :math:`\textbf{x}`. Let +:math:`\mathbf{u}(\mathbf{x},t)` and :math:`\mathbf{y}(\mathbf{x},t)` +denote the displacement and position, respectively, of the point +:math:`\mathbf{x}` at time :math:`t`. Define the relative position and +displacement vectors of two bonded points :math:`\textbf{x}` and +:math:`\textbf{x}^\prime` as :math:`\mathbf{\xi} = \textbf{x}^\prime - +\textbf{x}` and :math:`\mathbf{\eta} = \textbf{u}(\textbf{x}^\prime,t) - +\textbf{u}(\textbf{x},t)`, respectively. We note here that +:math:`\mathbf{\eta}` is time-dependent, and that :math:`\mathbf{\xi}` +is not. It follows that the relative position of the two bonded points +in the current configuration can be written as :math:`\boldsymbol{\xi} + +\boldsymbol{\eta} = +\mathbf{y}(\mathbf{x}^{\prime},t)-\mathbf{y}(\mathbf{x},t)`. + +Peridynamic models are frequently written using *states*, which we +briefly describe here. For the purposes of our discussion, all states +are operators that act on vectors in :math:`\mathbb{R}^3`. For a more +complete discussion of states, see :ref:`(Silling 2007) +`. A *vector state* is an operator whose image is a +vector, and may be viewed as a generalization of a second-rank +tensor. Similarly, a *scalar state* is an operator whose image is a +scalar. Of particular interest is the vector force state +:math:`\underline{\mathbf{T}}\left[ \mathbf{x},t \right]\left< +\mathbf{x}^{\prime}-\mathbf{x} \right>`, which is a mapping, having +units of force per volume squared, of the vector +:math:`\mathbf{x}^{\prime}-\mathbf{x}` to the force vector state +field. The vector state operator :math:`\underline{\mathbf{T}}` may +itself be a function of :math:`\mathbf{x}` and :math:`t`. The +constitutive model is completely contained within +:math:`\underline{\mathbf{T}}`. + +In the peridynamic theory, the deformation at a point depends +collectively on all points interacting with that point. Using the +notation of :ref:`(Silling 2007) `, we write the +peridynamic equation of motion as + +.. math:: + + + \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = + \int_{\mathcal{H}_{\mathbf{x}}} \left\{ \underline{\mathbf{T}}\left[ + \mathbf{x},t \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> + - \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), + +where :math:`\rho` represents the mass density, +:math:`\underline{\mathbf{T}}` the force vector state, and +:math:`\mathbf{b}` an external body force density. A point +:math:`\mathbf{x}` interacts with all the points +:math:`\mathbf{x}^{\prime}` within the neighborhood +:math:`\mathcal{H}_{\mathbf{x}}`, assumed to be a spherical region of +radius :math:`\delta>0` centered at :math:`\mathbf{x}`. :math:`\delta` +is called the *horizon*, and is analogous to the cutoff radius used in +molecular dynamics. Conditions on :math:`\underline{\mathbf{T}}` for +which \eqref{eqn:NewtonII} satisfies the balance of linear and angular +momentum are given in :ref:`(Silling 2007) `. + +We consider only force vector states that can be written as + +.. math:: + + \underline{\mathbf{T}} = \underline{t}\,\underline{\mathbf{M}}, + +with :math:`\underline{t}` a *scalar force state* and +:math:`\underline{\mathbf{M}}` the *deformed direction vector +state*, defined by + +.. math:: + + \underline{\mathbf{M}}\left< \boldsymbol{\xi} \right> = + \left\{ \begin{array}{cl} + \frac{\boldsymbol{\xi} + \boldsymbol{\eta}}{ + \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} \right\Vert + } & \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} \right\Vert \neq 0 \\ + \boldsymbol{0} & \textrm{otherwise} + \end{array} + \right. . + +Such force states correspond to so-called *ordinary* materials +:ref:`(Silling 2007) `. These are the materials for which +the force between any two interacting points :math:`\textbf{x}` and +:math:`\textbf{x}^\prime` acts along the line between the points. + + +Linear Peridynamic Solid (LPS) Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We summarize the linear peridynamic solid (LPS) material model. For more +on this model, the reader is referred to :ref:`(Silling 2007) +`. This model is a nonlocal analogue to a classical +linear elastic isotropic material. The elastic properties of a a +classical linear elastic isotropic material are determined by (for +example) the bulk and shear moduli. For the LPS model, the elastic +properties are analogously determined by the bulk and shear moduli, +along with the horizon :math:`\delta`. + +The LPS model has a force scalar state + +.. math:: + + \underline{t} = \frac{3K\theta}{m}\underline{\omega}\,\underline{x} + + \alpha \underline{\omega}\,\underline{e}^{\rm d}, + +with :math:`K` the bulk modulus and :math:`\alpha` related to the shear +modulus :math:`G` as + +.. math:: + + \alpha = \frac{15 G}{m}. + +The remaining components of the model are described as follows. Define +the reference position scalar state :math:`\underline{x}` so that +:math:`\underline{x}\left<\boldsymbol{\xi} \right> = \left\Vert +\boldsymbol{\xi} \right\Vert`. Then, the weighted volume :math:`m` is +defined as + +.. math:: + + m\left[ \mathbf{x} \right] = \int_{\mathcal{H}_\mathbf{x}} + \underline{\omega} \left<\boldsymbol{\xi}\right> + \underline{x}\left<\boldsymbol{\xi} \right> + \underline{x}\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi} }. + +Let + +.. math:: + + \underline{e}\left[ \mathbf{x},t \right] \left<\boldsymbol{\xi} + \right> = \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} + \right\Vert - \left\Vert \boldsymbol{\xi} \right\Vert + +be the extension scalar state, and + +.. math:: + + \theta\left[ \mathbf{x}, t \right] = \frac{3}{m\left[ \mathbf{x} + \right]}\int_{\mathcal{H}_\mathbf{x}} \underline{\omega} + \left<\boldsymbol{\xi}\right> \underline{x}\left<\boldsymbol{\xi} + \right> \underline{e}\left[ \mathbf{x},t + \right]\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi}} + +be the dilatation. The isotropic and deviatoric parts of the extension +scalar state are defined, respectively, as + +.. math:: + + \underline{e}^{\rm i}=\frac{\theta \underline{x}}{3}, \qquad + \underline{e}^{\rm d} = \underline{e}- \underline{e}^{\rm i}, + + +where the arguments of the state functions and the vectors on which they +operate are omitted for simplicity. We note that the LPS model is linear +in the dilatation :math:`\theta`, and in the deviatoric part of the +extension :math:`\underline{e}^{\rm d}`. + +.. note:: + + The weighted volume :math:`m` is time-independent, and does + not change as bonds break. It is computed with respect to the bond + family defined at the reference (initial) configuration. + +The nonnegative scalar state :math:`\underline{\omega}` is an *influence +function* :ref:`(Silling 2007) `. For more on influence +functions, see :ref:`(Seleson 2010) `. If an influence +function :math:`\underline{\omega}` depends only upon the scalar +:math:`\left\Vert \boldsymbol{\xi} \right\Vert`, (i.e., +:math:`\underline{\omega}\left<\boldsymbol{\xi}\right> = +\underline{\omega}\left<\left\Vert \boldsymbol{\xi} \right\Vert\right>`\ +), then :math:`\underline{\omega}` is a spherical influence function. +For a spherical influence function, the LPS model is isotropic +:ref:`(Silling 2007) `. + +.. note:: + + In the LAMMPS implementation of the LPS model, the influence function + :math:`\underline{\omega}\left<\left\Vert \boldsymbol{\xi} + \right\Vert\right> = 1 / \left\Vert \boldsymbol{\xi} \right\Vert` is + used. However, the user can define their own influence function by + altering the method "influence_function" in the file + ``pair_peri_lps.cpp``. The LAMMPS peridynamics code permits both + spherical and non-spherical influence functions (e.g., isotropic and + non-isotropic materials). + + +Prototype Microelastic Brittle (PMB) Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We summarize the prototype microelastic brittle (PMB) material +model. For more on this model, the reader is referred to +:ref:`(Silling 2000) ` and :ref:`(Silling 2005) +`. This model is a special case of the LPS model; see +:ref:`(Seleson 2010) ` for the derivation. The elastic +properties of the PMB model are determined by the bulk modulus :math:`K` +and the horizon :math:`\delta`. + +The PMB model is expressed using the scalar force state field + +.. math:: + + \underline{t}\left[ \mathbf{x},t \right]\left< \boldsymbol{\xi} \right> = \frac{1}{2} f\left( \boldsymbol{\eta} ,\boldsymbol{\xi} \right), + +with :math:`f` a scalar-valued function. We assume that :math:`f` takes +the form + +.. math:: + f = c s, + +where + +.. math:: + c = \frac{18K}{\pi \delta^4}, + +with :math:`K` the bulk modulus and :math:`\delta` the horizon, and +:math:`s` the bond stretch, defined as + +.. math:: + + s(t,\mathbf{\eta},\mathbf{\xi}) = \frac{ \left\Vert {\mathbf{\eta}+\mathbf{\xi}} \right\Vert - \left\Vert {\mathbf{\xi}} \right\Vert }{\left\Vert {\mathbf{\xi}} \right\Vert}. + +Bond stretch is a unitless quantity, and identical to a one-dimensional +definition of strain. As such, we see that a bond at its equilibrium +length has stretch :math:`s=0`, and a bond at twice its equilibrium +length has stretch :math:`s=1`. The constant :math:`c` given above is +appropriate for 3D models only. For more on the origins of the constant +:math:`c`, see :ref:`(Silling 2005) `. For the derivation +of :math:`c` for 1D and 2D models, see :ref:`(Emmrich) `. + +Given \eqref{eqn:PMBState}, \eqref{eqn:NewtonII} reduces to + +.. math:: + + \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_\mathbf{x}} \mathbf{f} \left( \boldsymbol{\eta},\boldsymbol{\xi} \right){d}V_{\boldsymbol{\xi}} + \mathbf{b}(\mathbf{x},t), + +with + +.. math:: + + \mathbf{f} \left( \boldsymbol{\eta}, \boldsymbol{\xi}\right) =f \left( \boldsymbol{\eta}, \boldsymbol{\xi}\right) \frac{\boldsymbol{\xi}+ \boldsymbol{\eta}}{ \left\Vert {\boldsymbol{\xi} + \boldsymbol{\eta}} \right\Vert}. + +Unlike the LPS model, the PMB model has a Poisson ratio of +:math:`\nu=1/4` in 3D, and :math:`\nu=1/3` in 2D. This is reflected in +the input for the PMB model, which requires only the bulk modulus of the +material, whereas the LPS model requires both the bulk and shear moduli. + +.. _peridamage: + +Damage +^^^^^^ + +Bonds are made to break when they are stretched beyond a given +limit. Once a bond fails, it is failed forever :ref:`(Silling) +`. Further, new bonds are never created during the course +of a simulation. We discuss only one criterion for bond breaking, called +the *critical stretch* criterion. + +Define :math:`\mu` to be the history-dependent scalar +boolean function + +.. math:: + + \mu(t,\mathbf{\eta},\mathbf{\xi}) = \left\{ + \begin{array}{cl} + 1 & \mbox{if $s(t^\prime,\mathbf{\eta},\mathbf{\xi})< \min \left(s_0(t^\prime,\mathbf{\eta},\mathbf{\xi}) , s_0(t^\prime,\mathbf{\eta}^\prime,\mathbf{\xi}^\prime) \right)$ for all $0 \leq t^\prime \leq t$} \\ + 0 & \mbox{otherwise} + \end{array}\right\}. + +where :math:`\mathbf{\eta}^\prime = \textbf{u}(\textbf{x}^{\prime +\prime},t) - \textbf{u}(\textbf{x}^\prime,t)` and +:math:`\mathbf{\xi}^\prime = \textbf{x}^{\prime \prime} - +\textbf{x}^\prime`. Here, :math:`s_0(t,\mathbf{\eta},\mathbf{\xi})` is a +critical stretch defined as + +.. math:: + + s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), + +where :math:`s_{00}` and :math:`\alpha` are material-dependant +constants. The history function :math:`\mu` breaks bonds when the +stretch :math:`s` exceeds the critical stretch :math:`s_0`. + +Although :math:`s_0(t,\mathbf{\eta},\mathbf{\xi})` is expressed as a +property of a particle, bond breaking must be a symmetric operation for +all particle pairs sharing a bond. That is, particles :math:`\textbf{x}` +and :math:`\textbf{x}^\prime` must utilize the same test when deciding +to break their common bond. This can be done by any method that treats +the particles symmetrically. In the definition of :math:`\mu` above, we +have chosen to take the minimum of the two :math:`s_0` values for +particles :math:`\textbf{x}` and :math:`\textbf{x}^\prime` when +determining if the :math:`\textbf{x}`--:math:`\textbf{x}^\prime` bond +should be broken. + +Following :ref:`(Silling) `, we can define the damage at a +point :math:`\textbf{x}` as + +.. math:: + + \varphi(\textbf{x}, t) = 1 - \frac{\int_{\mathcal{H}_{\textbf{x}}} \mu(t,\mathbf{\eta},\mathbf{\xi}) dV_{\textbf{x}^\prime} + }{ \int_{\mathcal{H}_{\textbf{x}}} dV_{\textbf{x}^\prime} }. + +Discrete Peridynamic Model and LAMMPS Implementation +"""""""""""""""""""""""""""""""""""""""""""""""""""" + +In LAMMPS, instead of \eqref{eqn:NewtonII}, we model this equation of +motion: + +.. math:: + + \rho(\mathbf{x}) \ddot{\textbf{y}}(\mathbf{x},t) = \int_{\mathcal{H}_{\mathbf{x}}} + \left\{ \underline{\mathbf{T}}\left[ \mathbf{x},t \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> + - \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), + +where we explicitly track and store at each timestep the positions and +not the displacements of the particles. We observe that +:math:`\ddot{\textbf{y}}(\textbf{x}, t) = \ddot{\textbf{x}} + +\ddot{\textbf{u}}(\textbf{x}, t) = \ddot{\textbf{u}}(\textbf{x}, t)`, so +that this is equivalent to \eqref{eqn:NewtonII}. + +Spatial Discretization +^^^^^^^^^^^^^^^^^^^^^^ + +The region defining a peridynamic material is discretized into particles +forming a simple cubic lattice with lattice constant :math:`\Delta x`, +where each particle :math:`i` is associated with some volume fraction +:math:`V_i`. For any particle :math:`i`, let :math:`\mathcal{F}_i` +denote the family of particles for which particle :math:`i` shares a +bond in the reference configuration. That is, + +.. math:: + + \mathcal{F}_i = \{ p ~ | ~ \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert \leq \delta \}. + +The discretized equation of motion replaces \eqref{eqn:NewtonII} with + +.. math:: + + \rho \ddot{\textbf{y}}_i^n = + \sum_{p \in \mathcal{F}_i} + \left\{ \underline{\mathbf{T}}\left[ \textbf{x}_i,t \right]\left<\textbf{x}_p^{\prime}-\textbf{x}_i \right> + - \underline{\mathbf{T}}\left[\textbf{x}_p,t \right]\left<\textbf{x}_i-\textbf{x}_p \right> \right\} + V_{p} + \textbf{b}_i^n, + +where :math:`n` is the timestep number and subscripts denote the particle number. + +Short-Range Forces +^^^^^^^^^^^^^^^^^^ + +In the model discussed so far, particles interact only through their +bond forces. A particle with no bonds becomes a free non-interacting +particle. To account for contact forces, short-range forces are +introduced :ref:`(Silling 2007) `. We add to the force in +\eqref{eqn:discreteNewtonII} the following force + +.. math:: + + \textbf{f}_S(\textbf{y}_p,\textbf{y}_i) = \min \left\{ 0, \frac{c_S}{\delta}(\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert - d_{pi}) \right\} + \frac{\textbf{y}_p-\textbf{y}_i}{\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert}, + +where :math:`d_{pi}` is the short-range interaction distance between +particles :math:`p` and :math:`i`, and :math:`c_S` is a multiple of the +constant :math:`c` from \eqref{eqn:c}. Note that the short-range force +is always repulsive, never attractive. In practice, we choose + +.. math:: + c_S = 15 \frac{18K}{\pi \delta^4}. + +For the short-range interaction distance, we choose :ref:`(Silling 2007) +` + +.. math:: + + d_{pi} = \min \left\{ 0.9 \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert, 1.35 (r_p + r_i) \right\}, + +where :math:`r_i` is called the *node radius* of particle +:math:`i`. Given a discrete lattice, we choose :math:`r_i` to be half +the lattice constant. + +.. note:: + + For a simple cubic lattice, :math:`\Delta x = \Delta y = \Delta z`. + +Given this definition of :math:`d_{pi}`, contact forces appear only when +particles are under compression. + +When accounting for short-range forces, it is convenient to define the +short-range family of particles + +.. math:: + + \mathcal{F}^S_i = \{ p ~ | ~ \left\Vert {\textbf{y}_p - \textbf{y}_i} \right\Vert \leq d_{pi} \}. + + +Modification to the Particle Volume +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The right-hand side of \eqref{eqn:discreteNewtonII} may be thought of as +a midpoint quadrature of \eqref{eqn:NewtonII}. To slightly improve the +accuracy of this quadrature, we discuss a modification to the particle +volume used in \eqref{eqn:discreteNewtonII}. In a situation where two +particles share a bond with :math:`\left\Vert { \textbf{x}_p - +\textbf{x}_i }\right\Vert = \delta`, for example, we suppose that only +approximately half the volume of each particle is "seen" by the other +:ref:`(Silling 2007) `. When computing the force of each +particle on the other we use :math:`V_p / 2` rather than :math:`V_p` in +\eqref{eqn:discreteNewtonII}. As such, we introduce a nodal volume +scaling function for all bonded particles where :math:`\delta - r_i \leq +\left\Vert { \textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta` (see +the Figure below). + +We choose to use a linear unitless nodal volume scaling function + +.. math:: + + \nu(\textbf{x}_p - \textbf{x}_i) = \left\{ + \begin{array}{cl} + -\frac{1}{2 r_i} \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert + \left( \frac{\delta}{2 r_i} + \frac{1}{2} \right) & \mbox{if } + \delta - r_i \leq \left\Vert {\textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta \\ + 1 & \mbox{if } \left\Vert {\textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta - r_i \\ + 0 & \mbox{otherwise} + \end{array} + \right\} + +If :math:`\left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert = \delta`, :math:`\nu = 0.5`, and if +:math:`\left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert = \delta - r_i`, :math:`\nu = 1.0`, for +example. + + +.. figure:: JPG/pdlammps_fig1.png + :figwidth: 80% + :figclass: align-center + + Diagram showing horizon of a particular particle, demonstrating that + the volume associated with particles near the boundary of the horizon is + not completely contained within the horizon. + +Temporal Discretization +^^^^^^^^^^^^^^^^^^^^^^^ + +When discretizing time in LAMMPS, we use a velocity-Verlet scheme, where +both the position and velocity of the particle are stored +explicitly. The velocity-Verlet scheme is generally expressed in three +steps. In :ref:`Algorithm 1 `, :math:`\rho_i` denotes the +mass density of a particle and :math:`\widetilde{\textbf{f}}_i^n` +denotes the the net force density on particle :math:`i` at timestep +:math:`n`. The LAMMPS command :doc:`fix nve ` performs a +velocity-Verlet integration. + + .. _algvelverlet: + + .. admonition:: Algorithm 1: Velocity Verlet + :class: tip + + | 1: :math:`\textbf{v}_i^{n + 1/2} = \textbf{v}_i^n + \frac{\Delta t}{2 \rho_i} \widetilde{\textbf{f}}_i^n` + | 2: :math:`\textbf{y}_i^{n+1} = \textbf{y}_i^n + \Delta t \textbf{v}_i^{n + 1/2}` + | 3: :math:`\textbf{v}_i^{n+1} = \textbf{v}_i^{n+1/2} + \frac{\Delta t}{2 \rho_i} \widetilde{\textbf{f}}_i^{n+1}` + +Breaking Bonds +^^^^^^^^^^^^^^ + +During the course of simulation, it may be necessary to break bonds, as +described in the :ref:`Damage section `. Bonds are recorded +as broken in a simulation by removing them from the bond family +:math:`\mathcal{F}_i` (see \eqref{eqn:BondFamily}). + +A naiive implementation would have us first loop over all bonds and +compute :math:`s_{min}` in \eqref{eqn:s0}, then loop over all bonds +again and break bonds with a stretch :math:`s > s0` as in +\eqref{eqn:mu}, and finally loop over all particles and compute forces +for the next step of :ref:`Algorithm 1 `. For reasons of +computational efficiency, we will utilize the values of :math:`s_0` from +the *previous* timestep when deciding to break a bond. + +.. note:: + + For the first timestep, :math:`s_0` is initialized to + :math:`\mathbf{\infty}` for all nodes. This means that no bonds may + be broken until the second timestep. As such, it is recommended that + the first few timesteps of the peridynamic simulation not involve any + actions that might result in the breaking of bonds. As a practical + example, the projectile in the :ref:`commented example below + ` is placed such that it does not impact the target + brittle plate until several timesteps into the simulation. + +LPS Pseudocode +^^^^^^^^^^^^^^ + +A sketch of the LPS model implementation in the PERI package appears in +:ref:`Algorithm 2 `. This algorithm makes use of the +routines in :ref:`Algorithm 3 ` and :ref:`Algorithm 4 +`. + + .. _algperilps: + + .. admonition:: Algorithm 2: LPS Peridynamic Model Pseudocode + :class: tip + + | Fix :math:`s_{00}`, :math:`\alpha`, horizon :math:`\delta`, bulk modulus :math:`K`, shear modulus :math:`G`, timestep :math:`\Delta t`, and generate initial lattice of particles with lattice constant :math:`\Delta x`. Let there be :math:`N` particles. Define constant :math:`c_S` for repulsive short-range forces. + | Initialize bonds between all particles :math:`i \neq j` where :math:`\left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert \leq \delta` + | Initialize weighted volume :math:`m` for all particles using :ref:`Algorithm 3 ` + | Initialize :math:`s_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **while** not done **do** + | Perform step 1 of :ref:`Algorithm 1 `, updating velocities of all particles + | Perform step 2 of :ref:`Algorithm 1 `, updating positions of all particles + | :math:`\tilde{s}_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **for** :math:`i=1` to :math:`N` **do** + | {Compute short-range forces} + | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in \eqref{eqn:cS}*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **end for** + | **end for** + | Compute the dilatation for each particle using :ref:`Algorithm 4 ` + | **for** :math:`i=1` to :math:`N` **do** + | {Compute bond forces} + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`e = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` + | :math:`\omega_+ = \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right>` {*Influence function evaluation*} + | :math:`\omega_- = \underline{\omega}\left<\textbf{x}_i - \textbf{x}_j\right>` {*Influence function evaluation*} + | :math:`\hat{f} = \left[ (3K-5G)\left( \frac{\theta(i)}{m(i)}\omega_+ + \frac{\theta(j)}{m(j)}\omega_- \right) \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert + 15G \left( \frac{\omega_+}{m(i)} + \frac{\omega_-}{m(j)} \right) e \right] \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | :math:`\textbf{f} = \textbf{f} + \hat{f} \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** + | Break :math:`i`'s bond with :math:`j` {:math:`j` *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} + | **end if** + | :math:`\tilde{s}_0(i) = \min (\tilde{s}_0(i),s_{00}-\alpha(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert))` + | **end for** + | **end for** + | :math:`s_0 = \tilde{s}_0` {*Store for use in next timestep*} + | Perform step 3 of :ref:`Algorithm 1 `, updating velocities of all particles + | **end while** + + + .. _algperilpsm: + + .. admonition:: Algorithm 3: Computation of Weighted Volume *m* + :class: tip + + | **for** :math:`i=1` to :math:`N` **do** + | :math:`m(i) = 0.0` + | **for all** particles :math:`j` sharing a bond with particle :math:`i` **do** + | :math:`m(i) = m(i) + \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right> \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert^2 \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | **end for** + | **end for** + + .. _algperilpstheta: + + .. admonition:: Algorithm 4: Computation of Dilatation :math:`\theta` + :class: tip + + | **for** :math:`i=1` to :math:`N` **do** + | :math:`\theta(i) = 0.0` + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`e = \left\Vert {\textbf{y}_i - \textbf{y}_j} \right\Vert - \left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert` + | :math:`\theta(i) = \theta(i) + \underline{\omega}\left<\textbf{x}_j - \textbf{x}_i\right> \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert e \nu(\textbf{x}_j - \textbf{x}_i) V_j` + | **end for** + | :math:`\theta(i) = \frac{3}{m(i)}\theta(i)` + | **end for** + +PMB Pseudocode +^^^^^^^^^^^^^^ + +A sketch of the PMB model implementation in the PERI package appears in +:ref:`Algorithm 5 `. + + .. _algperipmb: + + .. admonition:: Algorithm 5: PMB Peridynamic Model Pseudocode + :class: tip + + | Fix :math:`s_{00}`, :math:`\alpha`, horizon :math:`\delta`, spring constant :math:`c`, timestep :math:`\Delta t`, and generate initial lattice of particles with lattice constant :math:`\Delta x`. Let there be :math:`N` particles. + | Initialize bonds between all particles :math:`i \neq j` where :math:`\left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert \leq \delta` + | Initialize :math:`s_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **while** not done **do** + | Perform step 1 of :ref:`Algorithm 1 `, updating velocities of all particles + | Perform step 2 of :ref:`Algorithm 1 `, updating positions of all particles + | :math:`\tilde{s}_0 = \mathbf{\infty}` {*Initialize each entry to MAX_DOUBLE*} + | **for** :math:`i=1` to :math:`N` **do** + | {Compute short-range forces} + | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in \eqref{eqn:cS}*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **end for** + | **end for** + | **for** :math:`i=1` to :math:`N` **do** + | {Compute bond forces} + | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** + | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` + | :math:`dr = r - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` + | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in \eqref{eqn:c}*} + | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` + | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** + | Break :math:`i`'s bond with :math:`j` {:math:`j`\ *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} + | **end if** + | :math:`\tilde{s}_0(i) = \min (\tilde{s}_0(i),s_{00}-\alpha(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert))` + | **end for** + | **end for** + | :math:`s_0 = \tilde{s}_0` {*Store for use in next timestep*} + | Perform step 3 of :ref:`Algorithm 1 `, updating velocities of all particles + | **end while** + +Damage +^^^^^^ + +The damage associated with every particle (see \eqref{eqn:damage}) can +optionally be computed and output with a LAMMPS data dump. To do this, +your input script must contain the command :doc:`compute damage/atom +` This enables a LAMMPS per-atom compute to +calculate the damage associated with each particle every time a LAMMPS +:doc:`data dump ` frame is written. + +Visualizing Simulation Results +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There are multiple ways to visualize the simulation results. Typically, +you want to display the particles and color code them by the value +computed with the :doc:`compute damage/atom ` +command. + +This can be done, for example, by using the built-in visualizer of the +:doc:`dump image or dump movie ` command to create snapshot +images or a movie. Below are example command lines for using dump image +with the :ref:`example listed below ` and a set of images +created for steps 300, 600, and 2000 this way. + +.. code-block:: LAMMPS + + dump D2 all image 100 dump.peri.*.png c_C1 type box no 0.0 view 30 60 zoom 1.5 up 0 0 -1 ssao yes 4539 0.6 + dump_modify D2 pad 5 adiam * 0.001 amap 0.0 1.0 ca 0.1 3 min blue 0.5 yellow max red + +.. |periimage1| image:: JPG/dump.peri.300.png + :width: 32% + +.. |periimage2| image:: JPG/dump.peri.600.png + :width: 32% + +.. |periimage3| image:: JPG/dump.peri.2000.png + :width: 32% + +|periimage1| |periimage2| |periimage3| + +For interactive visualization, the `Ovito `_ is very +convenient to use. Below are steps to create a visualization of the +:ref:`same example from below ` now using the generated +trajectory in the ``dump.peri`` file. + +- Launch Ovito +- File -> Load File -> ``dump.peri`` +- Select "-> Particle types" and under "Appearance" set "Display radius:" to 0.0005 +- From the "Add modification:" drop down list select "Color coding" +- Under "Color coding" select from the "Color gradient" drop down list "Jet" +- Also under "Color coding" set "Start value:" to 0 and "End value:" to 1 +- You can improve the image quality by adding the "Ambient occlusion" modification + +.. figure:: JPG/ovito-peri-snap.png + :figwidth: 80% + :figclass: align-center + + Screenshot of visualizing a trajectory with Ovito + +Pitfalls +^^^^^^^^ + +**Parallel Scalability** + +LAMMPS operates in parallel in a :doc:`spatial-decomposition mode +`, where each processor owns a spatial subdomain of +the overall simulation domain and communicates with its neighboring +processors via distributed-memory message passing (MPI) to acquire ghost +atom information to allow forces on the atoms it owns to be +computed. LAMMPS also uses Verlet neighbor lists which are recomputed +every few timesteps as particles move. On these timesteps, particles +also migrate to new processors as needed. LAMMPS decomposes the overall +simulation domain so that spatial subdomains of nearly equal volume are +assigned to each processor. When each subdomain contains nearly the same +number of particles, this results in a reasonable load balance among all +processors. As is more typical with some peridynamic simulations, some +subdomains may contain many particles while other subdomains contain few +particles, resulting in a load imbalance that impacts parallel +scalability. + +**Setting the "skin" distance** + +The :doc:`neighbor ` command with LAMMPS is used to set the +so-called "skin" distance used when building neighbor lists. All atom +pairs within a cutoff distance equal to the horizon :math:`\delta` plus +the skin distance are stored in the list. Unexpected crashes in LAMMPS +may be due to too small a skin distance. The skin should be set to a +value such that :math:`\delta` plus the skin distance is larger than the +maximum possible distance between two bonded particles. For example, if +:math:`s_{00}` is increased, the skin distance may also need to be +increased. + +**"Lost" particles** + +All particles are contained within the "simulation box" of LAMMPS. The +boundaries of this box may change with time, or not, depending on how +the LAMMPS :doc:`boundary ` command has been set. If a +particle drifts outside the simulation box during the course of a +simulation, it is called *lost*. + +As an option of the :doc:`themo_modify ` command of +LAMMPS, the lost keyword determines whether LAMMPS checks for lost atoms +each time it computes thermodynamics and what it does if atoms are +lost. If the value is *ignore*, LAMMPS does not check for lost atoms. If +the value is *error* or *warn*, LAMMPS checks and either issues an error +or warning. The code will exit with an error and continue with a +warning. This can be a useful debugging option. The default behavior of +LAMMPS is to exit with an error if a particle is lost. + +The peridynamic module within LAMMPS does not check for lost atoms. If a +particle with unbroken bonds is lost, those bonds are marked as broken +by the remaining particles. + +**Defining the peridynamic horizon** :math:`\mathbf{\delta}` + +In the :doc:`pair_coeff ` command, the user must specify the +horizon :math:`\delta`. This argument determines which particles are +bonded when the simulation is initialized. It is recommended that +:math:`\delta` be set to a small fraction of a lattice constant larger than +desired. + +For example, if the lattice constant is 0.0005 and you wish to set the +horizon to three times the lattice constant, then set :math:`\delta` to +be 0.0015001, a value slightly larger than three times the lattice +constant. This guarantees that particles three lattice constants away +from each other are still bonded. If :math:`\delta` is set to 0.0015, +for example, floating point error may result in some pairs of particles +three lattice constants apart not being bonded. + +**Breaking bonds too early** + +For technical reasons, the bonds in the simulation are not created until +the end of the first timestep of the simulation. Therefore, one should +not attempt to break bonds until at least the second step of the +simulation. + +Bugs +^^^^ + +The user is cautioned that this code is a beta release. If you are +confident that you have found a bug in the peridynamic module, please +report it in a `GitHub Issue ` +or send an email to the LAMMPS developers. First, check the `New +features and bug fixes `_ section of +the LAMMPS website site to see if the bug has already been reported or +fixed. If not, the most useful thing you can do for us is to isolate the +problem. Run it on the smallest number of atoms and fewest number of +processors and with the simplest input script that reproduces the +bug. In your message, describe the problem and any ideas you have as to +what is causing it or where in the code the problem might be. We'll +request your input script and data files if necessary. + +Modifying and Extending the Peridynamic Module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To add new features or peridynamic potentials to the peridynamic module, +the user is referred to the :doc:`Modifying & extending LAMMPS ` +section. To develop a new bond-based material, start with the *peri/pmb* +pair style as a template. To develop a new state-based material, start +with the *peri/lps* pair style as a template. + +A Numerical Example +""""""""""""""""""" + +To introduce the peridynamic implementation within LAMMPS, we replicate +a numerical experiment taken from section 6 of :ref:`(Silling 2005) +`. + +Problem Description and Setup +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We consider the impact of a rigid sphere on a homogeneous disk of +brittle material. The sphere has diameter :math:`0.01` m and velocity +100 m/s directed normal to the surface of the target. The target +material has density :math:`\rho = 2200` kg/m:math:`^3`. A PMB material +model is used with :math:`K = 14.9` GPa and critical bond stretch +parameters given by :math:`s_{00} = 0.0005` and :math:`\alpha = 0.25`. A +three-dimensional simple cubic lattice is constructed with lattice +constant :math:`0.0005` m and horizon :math:`0.0015` m. (The horizon is +three times the lattice constant.) The target is a cylinder of diameter +:math:`0.074` m and thickness :math:`0.0025` m, and the associated +lattice contains 103,110 particles. Each particle :math:`i` has volume +fraction :math:`V_i = 1.25 \times 10^{-10} \textrm{m}^3`. + +The spring constant in the PMB material model is (see \eqref{eqn:c}) + +.. math:: + c = \frac{18k}{\pi \delta^4} = \frac{18 (14.9 \times 10^9)}{ \pi (1.5 \times 10^{-3})^4} \approx 1.6863 \times 10^{22}. + +The CFL analysis from :ref:`(Silling2005) ` shows that a +timestep of :math:`1.0 \times 10^{-7}` is safe. + +We observe here that in IEEE double-precision floating point arithmetic +when computing the bond stretch :math:`s(t,\mathbf{\eta},\mathbf{\xi})` +at each iteration where :math:`\left\Vert {\mathbf{\eta}+\mathbf{\xi}} +\right\Vert` is computed during the iteration and :math:`\left\Vert +{\mathbf{\xi}} \right\Vert` was computed and stored for the initial +lattice, it may be that :math:`fl(s) = \varepsilon` with :math:`\left| +\varepsilon \right| \leq \varepsilon_{machine}` for an unstretched +bond. Taking :math:`\varepsilon = 2.220446049250313 \times 10^{-16}`, we +see that the value :math:`c s V_i \approx 4.68 \times 10^{-4}`, computed +when determining :math:`f`, is perhaps larger than we would like, +especially when the true force should be zero. One simple way to avoid +this issue is to insert the following instructions in Algorithm +:ref:`Algorithm 5 ` after instruction 21 (and similarly for +Algorithm :ref:`Algorithm 2 `): + + | **if** :math:`\left| dr \right| < \varepsilon_{machine}` **then** + | :math:`dr = 0` + | **end if** + +Qualitatively, this says that displacements from equilibrium on the +order of :math:`10^{-16}`\ m are taken to be exactly zero, a seemingly +reasonable assumption. + +The Projectile +^^^^^^^^^^^^^^ + +The projectile used in the following experiments is not the one used in +:ref:`(Silling 2005) `. The projectile used here exerts a +force + +.. math:: + + F(r) = - k_s (r - R)^2 + +on each atom where :math:`k_s` is a specified force constant, :math:`r` is +the distance from the atom to the center of the indenter, and :math:`R` +is the radius of the projectile. The force is repulsive and :math:`F(r) = +0` for :math:`r > R`. For our problem, the projectile radius :math:`R = +0.05` m, and we have chosen :math:`k_s = 1.0 \times 10^{17}` (compare +with \eqref{eqn:c} above). + +Writing the LAMMPS Input File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We discuss the example input script :ref:`listed below `. +In line 2 we specify that SI units are to be used. We specify the +dimension (3) and boundary conditions ("shrink-wrapped") for the +computational domain in lines 3 and 4. In line 5 we specify that +peridynamic particles are to be used for this simulation. In line 7, we +set the "skin" distance used in building the LAMMPS neighborlist. In +line 8 we set the lattice constant (in meters) and in line 10 we define +the spatial region where the target will be placed. In line 12 we +specify a rectangular box enclosing the target region that defines the +simulation domain. Line 14 fills the target region with atoms. Lines 15 +and 17 define the peridynamic material model, and lines 19 and 21 set +the particle density and particle volume, respectively. The particle +volume should be set to the cube of the lattice constant for a simple +cubic lattice. Line 23 sets the initial velocity of all particles to +zero. Line 25 instructs LAMMPS to integrate time with velocity-Verlet, +and lines 27-30 create the spherical projectile, sending it with a +velocity of 100 m/s towards the target. Line 32 declares a compute style +for the damage (percentage of broken bonds) associated with each +particle. Line 33 sets the timestep, line 34 instructs LAMMPS to +provide a screen dump of thermodynamic quantities every 200 timesteps, +and line 35 instructs LAMMPS to create a data file (``dump.peri``) with +a complete snapshot of the system every 100 timesteps. This file can be +used to create still images or movies. Finally, line 36 instructs LAMMPS +to run for 2000 timesteps. + +.. _periexample: + +.. code-block:: LAMMPS + :linenos: + :caption: Peridynamics Example LAMMPS Input Script + + # 3D Peridynamic simulation with projectile" + units si + dimension 3 + boundary s s s + atom_style peri + atom_modify map array + neighbor 0.0010 bin + lattice sc 0.0005 + # Create desired target + region target cylinder y 0.0 0.0 0.037 -0.0025 0.0 units box + # Make 1 atom type + create_box 1 target + # Create the atoms in the simulation region + create_atoms 1 region target + pair_style peri/pmb + # + pair_coeff * * 1.6863e22 0.0015001 0.0005 0.25 + # Set mass density + set group all density 2200 + # volume = lattice constant^3 + set group all volume 1.25e-10 + # Zero out velocities of particles + velocity all set 0.0 0.0 0.0 sum no units box + # Use velocity-Verlet time integrator + fix F1 all nve + # Construct spherical indenter to shatter target + variable y0 equal 0.00510 + variable vy equal -100 + variable y equal "v_y0 + step*dt*v_vy" + fix F2 all indent 1e17 sphere 0.0000 v_y 0.0000 0.0050 units box + # Compute damage for each particle + compute C1 all damage/atom + timestep 1.0e-7 + thermo 200 + dump D1 all custom 100 dump.peri id type x y z c_C1 + run 2000 + +.. note:: + + To use the LPS model, replace line 15 with :doc:`pair_style peri/lps + ` and modify line 16 accordingly. + +Numerical Results and Discussion +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We ran the :ref:`input script from above `. Images of the +disk (projectile not shown) appear in Figure below. The plot of damage +on the top monolayer was created by coloring each particle according to +its damage. + +The symmetry in the computed solution arises because a "perfect" lattice +was used, and a because a perfectly spherical projectile impacted the +lattice at its geometric center. To break the symmetry in the solution, +the nodes in the peridynamic body may be perturbed slightly from the +lattice sites. To do this, the lattice of points can be slightly +perturbed using the :doc:`displace_atoms ` command. + +.. _figperitarget: + +.. figure:: JPG/pdlammps_fig2.png + :figwidth: 80% + :figclass: align-center + + Target during (a) and after (b,c) impact + +------------ + +.. _Emmrich2007: + +**(Emmrich)** Emmrich, Weckner, Commun. Math. Sci., 5, 851-864 (2007), + +.. _Parks2: + +**(Parks)** Parks, Lehoucq, Plimpton, Silling, Comp Phys Comm, 179(11), 777-783 (2008). + +.. _Silling2000_2: + +**(Silling 2000)** Silling, J Mech Phys Solids, 48, 175-209 (2000). + +.. _Silling2005: + +**(Silling 2005)** Silling Askari, Computer and Structures, 83, 1526-1535 (2005). + +.. _Silling2007_2: + +**(Silling 2007)** Silling, Epton, Weckner, Xu, Askari, J Elasticity, 88, 151-184 (2007). + +.. _Seleson2010: + +**(Seleson 2010)** Seleson, Parks, Int J Mult Comp Eng 9(6), pp. 689-706, 2011. diff --git a/doc/src/JPG/dump.peri.2000.png b/doc/src/JPG/dump.peri.2000.png new file mode 100644 index 0000000000000000000000000000000000000000..d8cacb4bb2c7d205925798545939924b355b17d7 GIT binary patch literal 205139 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

!2r0XLyGv{vJ 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 literal 0 HcmV?d00001 diff --git a/doc/src/JPG/dump.peri.300.png b/doc/src/JPG/dump.peri.300.png new file mode 100644 index 0000000000000000000000000000000000000000..17771bc26c2754551198d6669095f0986754a27f GIT binary patch literal 147512 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 z zYL9lE^~)TGTwqfa%J4%&tCNx_5%YzdAm$?J1afjLwen(c#Z!@9h>~ud0Vws}J>_0C zNwT%zcQ|2SUvw{)4D_8Dg7<@rz8mW!{&cg>dVhTUqVqYGQjOW}kK^Fckvp%bl~o`g zl=UiS7AWpoMa)C#W2B2##ifdfo9~Y}_8cjx^BD8w2)aw?ctNKIksEP{1{m*Cz<5Bb ziX_Yyz(NN^NV&2fqcd~0zc&w`oB#|SCAFh#CF=eZh8IX6w#6as-Tl>@McP|Fzeqq_ zC$yAe2AA&vW4}v) zv=!Of<-5%_OtTTqLn)z8TfwY~vuTgrrX9KO@(4O3OGOR;O3w&V77i-uK?uJ$ zdmJkk6Bh%`3kw7Urmz9Kcb1i@;o*kGps=C|hs5(R$wbm#wHTKB#Sam7JR3B3SrwNL zu;XQ#grmX`x&|2S9laXG-qbAqv8Q<+9UZylKD9|QSD#l=RP?H5v#miEFJ6Q$3Xa#9 zHC47rEl>KWq$ffO@4SESYB~H14mSpf41?kD8(W@Z+tT`$uC859xo^NN2jyQWE6YFj zT?wIZChH1+i-qu-7~>61eHm_`*A@X#pYEb`;`{(HLR)(>UFj(ufQi+Utoe5w&I#tH zl}SmgR<%4mXmoyhv*X+XoH>BOfnuUjGaE4BrkyTpB9V$K#5Kl~ML>cSD1EtSMRX2j_HGnNYspIo4ZuAecZ*o zGo@l-RU)Lseh}XX;4Z}v7KF$ovW_#0Ub!+Q* znkdlHZ4fyEs81y@?F@)7a4;}J)i@|!uqwL?Pdw4JHX(Ge#UF72+Bjj-2|*XMW8m({ zbDaV15n)ma7F-iL{@z2@Tn^*fw-x0OgnH{@vap$^-V~C`&vM~NAA;z#CbV(in&LOw z!21D;CjiL^+>0WUrvp)en4;7{G@fL)i`3mFq8=WqMgb<&2erIJul&!vJ^e*T8_Hq# zAczSWV!HbyqQOYNMCG1ijk*WH)94ICU`(#KC~DqWXQWLg=%mUoMXPWzk1 zY9`hC?P{{EC}nRKF|8Rpe@tnVyL31L2kn^HDHV#lYprj)gxn!LM=&YNYKHF)5hYwI zta`rmtEjqztN4A9teME|pHAwOH`{gjTdw7%UmRO|1A?Q$cs6^j6^XVT(se+>?I!kK zUjh|1NLJbQ#q0;!%kO^q;)n;qo#E$)yyh)86DKE0t93L7)x{_+tqLii-Kx=X6lGAM ztE!5x*ft3g=ci7h&>nr$8q<{chHf~Rh z7-oJ8-@CBfyx$I0iZvLVm)F~KE~*iK`9?C}u0ZxAy3;9Nj!EVaY{V5Ls*RIeanmb| z^UGJ$`?t`%q|elWH*e;=h)sT9Ikq$M`8VF-0=UZOz!`8B-IpEPd@16p&q?xrx_S5Xy8e?vtG z%Vfnk%j$j)a~aSFVU7){Yfk_6d+~G3Fcow{|qx8@ay~ok_J_D z#LW22pjG0hTmM}uXUN~3Jx<&fCM99Hu4!34Kg#F20N$4MLT;y?ULkbk&&0BMUCpK% zz|(ye*>jy8LLwO~;F)F&g}zk~9vOKCbu3`U=iu}KeOAPiAX{>q3FyH1sG;wNSueIW z3QLXJzgtJC$NYN?M7T{f+1)oZ!aT{&Wj~^yP5%nBp8fK2BB=**ChK>)G}42gWV`&x zD+o{MT=AJV4TiSf*3lprC^Vt$Z{FIPPktn_yZf(Drr*h6H5eTbJke+s z9NR6(pPiwk$4~8oX3y3BC7uo}<&KxR+?4dZpgrN2BN-Va(Vx4{$85YI5!gpQaFr@L zucj-r`z^5Vq9mj1YWki{l;ADMA>@!;)-*4Ng#w>k&OJFfO*p4HpeXl6@F zjJq^Z>NzmVY+H8HQz%8-w)?_A!@A~Un#angYuuiY6>nWyK+}O>@!&uM;iRN*%+;ah z&ZCtmKR>=f^=7l6j&V56RKQd-kfiG{dq5%FBS^#&`qu`#@PwlGU-)JGnr+{aMVY?f z8y$GLIp0VFE9MTe7Y5g_GtK}3y%d1Ra+LS`2W0GMxlm?u2WA6ZKFWn~kP`HM&cZ1g z@!7l^Y6w<_tLwQ@cWjC`nZi6V9pLagYcvfK>KyG(R9~9L1hueN=U!(K)-W1m3a8ez zT3HZj<8oMryO?#s7WPZ6dpFb{i2!@nf%E9cQ<$4^tT1Ms(-~q4= z`Z^k5+sK{3x-y$(-r25-2JCu0%ztnGlE;R1K1dm~Y}ppS>I`2#6Q?B9%PJkshL84; zzV@~Rf*NmIB}fKk&>Ns10N9g>HX*~|a{w>ba{Hw0xAs`@8(5;$LqLvs;A%6BOsvN`3698zN zQkN#+V}Q6OPYw!>o&&QSFg=jp1bxJ_Sv#YNfq^1IsEB~)^1=5=yLXp`LBMTtPP9Of zlx;My&!0$R26*crz)ILfa`EeAQT`hUtFOc#RJ3ceDBp&-(BOeZHtN(W zAjFJ$_(yXvxEDJJxUkjJe@>PCzLKU=4l7%q7sCaYmwd2%cn6P$us(EuY+`)b^i<)Q z3xj0LWv4M$_qa}=EuI0jG*}nPp`=$k(@=Fc+U8F02Xij~GX{xSDme=<>R4FrREIzi zGeV>dI}q)-`xP|>W*;BDWSzWY`=*>6jhn%t+Zc%Lq5l^BKI;pGhT4}vsR%h}2Oo|@-?e(pn8*!TN2(7oi0f4I#A_ji>UmS(b!)$U{fgWL-z-72I{O5e| z#?9p|e_|L?>h4+*=zYkt7^s|kWbznrGOnFQ2(YMsVrJuZlg#T!q41GyiMGJeP$bH9*xB5gobAw-7GpLXpcy}u!F%$?2kg(zdkVCE&lQIj4 z9RwxCDRAM*-;YZ1Z1`^`H&d@zS!oYG-EoH!iYol%$^1|&U}ijW1PI=p0{wOxO(V}f zcAVrMZDgmhIR-6HY|;)UBr5+xMYA>WWS$7ROX>tdOEwFu$?iJ>MonDj1T%|pZt*;kV&$Yfqi3n3-0B=iya^c_?GsVUP`ZyIe@Uz2N z^A{TpN)We7ppft2V6FGjojW|hp6Ge{X{LrjK>@FM&5Lw4Is`AcDBaiy}jjEcy_0r5QIu(0_6jbTaGm7i_eqkU{=gLx>gm~Ru@|ux`{ybc zc;H22nz6dP#-C^0h6JbPOk+|F>o8D`HSx7eadpbjQ@2`7b4b(48CEIqlnHwVv{8xg z*(Z*uOh&WKBYO{|ZQ()Edt~ICfNyqr#%SqFWmnDa3S_(WX#7UeHf#ySUintHu7dBL zWv7-4U8jTkR!=OWWeZ*M2iGdEE{6N0g7v0f{VD)MHvn!Ic@is4UN>2q9{@^7zxiKoj{-3ni|>SSFV&kl_Qa5dGX*m?g@?YdWqECz zwdn)Si6h67VjtXf>AxEpQJ7d_+TjVO*$-~8bpXaeRv4JlyoI0oE-lcsv79(wcx+H9 zM&F{z{;7gEQ{x@(Fh`5OXg`S+%PE(T!yzNf2zn2aN7&Lw(Sxc%x*!*oNghxlXz{K* z89;d_0&(Dd4Wk18_hMJ)IHH@7^MtlBsETTjG%H8D4ExfsJm?XPIa}_inTOv|+&>uX zozzp)vum}OJpNEF)S$H>w%FMrD?!Vt{%krOOuKT)c(tD7FTDp4>VkLaF1rcNez6g; zlvWvOYvyt|L%RbK+V=Uiwae7?pS%%O+yl(_uV1tFo>iOV85n#&+5Odnzj65q`&P6D z-As$Q(`GEJ!RtDA_(mtxVW+?lKsSe8#b8g;l3&?-cj zT*lDMG+r|u&b7!@MT$G#sE2m?ySmvb;C3v;WWr?_H$}%_)F}1C$e6V$hlVl11yiwq zxruo)3D^u6?>i0^JsF5urbcU9TL$x|8gqg1@hRMF!Tv5EpJj*?;u?Rj#eMFxq274p z?u#~6m47wn_m-AKpeL84N8A^^v~CT?Tl)!P*_j)s5iQOya-z!7a+5Mp_`AV^BTE`OYu zJF}CME_FSjk9~EKE4-jkRXL53aM+Lsmbm~qTn_4`g?6)XE9lkOr3F~Fo3i}}>iDf$ zrUe}VM0UjY1gf%o4^heo19z==`yW;&J)}_AXG<8_c*HqW?2)m%d#=xYzj$4ISTIJQ zT^F#oP$?T$*W3PKkbRS!91EU=B222ky5cK;V~E?@_u4or0GZb2AyPw+jgEKbo14Y1 zaR8~;;yq(9o2jWh$a}_(dDNj=*}Ao7Y>XsunMC#`C}H!-z+juCq*KQ5X5=xi-}xac za%D3zOvQqT&W%m|F?G|BptfE_I2dW)W2T}ifVi5!I3>JL#}JsFPZ_c%MPUXQ2)}|R|`XH0k3dY z$@1gjqgovMpPVpd9X4p;VD(H~1N=jk(MlxApj<*puV(hR;CDM}N1t|`>EAQecUf~71p>{5G0uz4yKMw?O!$B&9)}ezcXkNNF%9}m2VlXp6Ve1+z(evklXqspIG)L=ts+bNOv+x>8Z$$rv1@L7I`wN(QpQP=h3q zoD?N^@${Tz0H5wIh$!m0m+%^J3y}PG3o4cZFlUI$>&sCrmW2K(kRJ{7hU{S;R`Qf` zSu}2;-M(NyBPifB%IOi+naXN$x-qE$q02Eul2Lh#fEYm9X;167T1cOi)2f}uo<~KUqr#tZRr$eSrmtW}U*g<@&%qG9Y*g{bJDE{`-<%K?_bldk; z8sK@a&aH@ZM;Ie#HlIj&d5_dy{O{ku7eQa~p-NM0x?@t{`fu-8wTS^K)-@MY46uim z`;$Zwu}e$a$GC1FAHy3hsGZ)g^4K0zQeNNipBrYp@PQ?|D+C~7+ze+F^sf_KUw=mh zyy*E`q&79l%y1cGWjX2gLd07-b>o(^;O0f|S9a0~UX7BL(_&`vnU${m5-vpR8(pF( zIjR_gvZeIwQ5ox^422Xm+iB7I?DXWX#eufHzKa6HT=G3xVR1r2YO zhqO^8h-AeY*V1ooR|&um-&Y~$PX;GjBjI-%=Y(4Wo;5+yBR z<@zDZ04BERhZ|lDGNe#x+GlW{NS-~@Y(w1IH=h&CNB@vJ@vJ2h!!wFAuF(MeH_cAd z3=GF8%AlVMUw4t@>#tL%#If;4|k!IFxbE=ABA4yKWg@VmWMKP6Tc-M29# zT9ReygvA$EM>l1frm!r0W>{v}Xo=gCsQ_SSt62PlxY!*&FGwiRWkJudyDnaBfmBXA z{x?0oG0KJ%fuNe`T;Vb0lgMZ8b3cYQ>_C4|%gI=@b#VX9-(GjgUD*@p)lA*z*TnNc zRs#k!fUbS6elg{<=x|u4-tgxt-K(f_{*)Dbt9!QjydGoU&`uT=>u^XyfBT`MpblNV z^)HHx-)@dsc}$cp&nK)6XC)hY!cA)4;Dc44zS85#Ji4Ay+6j?nl$>{y^cYzpn<(o3 z%tt7M2SU5c{+vD{Pn>#DFe7b0H@UznL z{0dPZl~EKi@*t^it#>>nLWy2RqqWxi-1nWOWeHBmI7k>25$^m60w zTwC_LeA4JB!ch#La)IY1$Q}cTX;u(o57-`!O3g zj9L&gkUKWi;G)j+6F1B?^_rOxQBOdufv#;zbMXHaf3T7L(>~?AiU(K&>%{|WVEP5Y z_l{}Qj!*K`V?J@&F|#rKHz=Z_bU#PR(J>;S2;S_`@*E@TPcuF4dEWF>%`ClyV;o7T zx38JRE1p+Sk$Ak!N@fMBdIRn7DP!11+2J}abW@^>0q_;o+DBON(isib4-uzrfI0+Yb=eb+-%JdRo>+ zz=?@BmTSWs5GvbQp2pTMBqeGr|f zrK_kUWIvvzW zjBY;Y>LeinAw|tDq_rwO%B?Z9u^1%%J9roL-DLqN zMlzZB-gmNVev4(&q>qz1d;d4(HvTbNzSKi*jWAmlQ&XD&*}ZM-s88^VObWGfjhVK>$Ie^X@ZWD}lhmc_ z9^9>Gwz)_2JplO9Dvd*Xe)!XKllGUYCOv!RL0|DSPaS;iTojJtObBH9pkf(Mnp zk|JA~orPuFLvlNrQdob_2{{Id>!e?Nd;NQrxieDkU6DYr6%*3D$!wwdRXMQ2F|LFG zO{sF#Rq9}E5Dn;kHs8^Gdjen~$_HA1^i;TJmM#V#REr06&eKQ9bq&Yn;h*tHUv^!u zzHTcof4^^k?;arLzT+fJNOLgx<4|Iu`oVNtbh+g>2b&>_MQk|QFG zARW>m-Q6KA-604_mox&>-Q7s{2#5m?B@II(((tYO`L_2zznC@GTu~y!D?%Qm-VgaBy=oFqa_(h&#c=BDCNj=7ft2p8DZeu1K zj6U+lI1oYzeZ>h^+BBv%y+b>7j3e2NKtr7rbgzlR3JFF5@Fc5CN^-`V9(~i()`7Zy z=u{JPD`rcnfB)VVITTNQ4hO&KX^#OVW%U$n0THFtcRw@VwE2sYNBiWDM4J0Q+{fkQ z^yHN$tuLzFw~T*PCXIOKCBNy4-C$H~TVWVTpK?9#aWFdC6{7m__!G^8u3^u8^)r_1 z;^Lp0%-p=ZS;}5meZxjZVmKk=RNJb_1{IE|Lw2653sBXB-~a8fZF?CMus>t@E${j~ zE*DQSm3B+7xr}LJrsy@m7LxvAwBA-UQ|?v`I=1^)meAOFDb4TU$V67?+|+}HzQ9}9 zQSXkVsoS`QBwEF!XPIZxoA7vHzu6uU;@%G0bF$8S4tJ*Ups7ZNB)^g0U*>`f`_+jI zaDD!w?6qjlkMmBe7e@cZ*o3(f86g*!E(f
o*JT3le_C10z|IqsADb6rw-!W`CU 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

pUcxj-cL6Y<*j@#lkj5uP32Pyy}K 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 Z5kxHrA>o{7du? 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 literal 0 HcmV?d00001 diff --git a/doc/src/JPG/dump.peri.600.png b/doc/src/JPG/dump.peri.600.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdeb036bc1ee2b8029e8c1fa6cb2fc414d4676d GIT binary patch literal 160581 zcmeEtRa+cg6D@B-kc0riAvlA(JA|Nv+u-i*t_dU%1`F;G2G_w|f(K`CCosWX2A4D6 z#rYBEc~195_vP-rtE*P6wJJ(oRsQ{3vbQKGDDQy^GMXqTuaK{=P%!@Y2qcrPLOwov z$?AD&x!QR7ntNEIC`+lRsB2Mk^HXbCyHWFS@$k^yr*@#AP@@24q_q8(kJkL%w7t7t zUh4BCf>logrO~89C-$gCI9j;hmR5#g z(6D{|i9+*`d*T(a@o>~F>GE`-i+GrW9)xrwI&U62c~6H-jh}XRJ0uX5UgZ@ZP?4+q z|JVP^JMcG;;H^9g%5A)(-E9#Q1Jt-4!bA^z4N3n_9sj%b6Y|quo*pTsoG?6IOPM@% zZ@}zK+*(^cQ7=vXJ`1veLGlg}eq2oUeE6!_dOJ58OEbI;mgwFm*|Zqn%HKj3|GE7_ zAmoK7Xn^LKE;6|M8QJ*@j%aAKL-CS-F2CmI+kW^L{}cQ&^Vba(<#F`(P1tH2wfFXR z#nt`rrW>3WgXiITrOZmx@4OQN0lWE0X}~li3mPDhfGwHoYK|7G;diRL(jZVQ)+I)q zV^-$8^J@C@wc%$C5~yyJoV!Lp8QE1)(VSNCS-owyQlh0+@sIP{>BPh#)odmu23Nzn z{0sg|0{vPIBeu>tsz&gzkxHy?~JMj!Xy&eektAtUIl93tg zCM4GG3olV!vKF?gH3IzbW2pBw`;sf*e3#5@Ecwz(*=G^bovEsolF~<}@|_7!@*b82 zo~Fc-D4%i8-;X*zu5evnZ4A6A^W8Ak(@RfM&g|VB4Lj5I`+eb~VPWAC4i7{_7j4dY9{N@Oj7rHKgo=uC z`{MVZPoV4o3ss-j)x=suV`(CXU904zY0?3f!FbuRIb8%q&40R3a;E;|VKjB<%^l;q z-th^D30)vwIu89Imz3~FIw$AoYM-@A$Jw@on=w*6FqNE&F=@Dl+RCshPp^v3eXIlu z(l6<+Q_B-hI@#k|^))SSOz~*N(1@ALW%tP5LdY3aces(99%cn?eQPfpUR^y3-oor^ zUokPRQq8%atJLoSCh7d;6dU~TRGLXc<^sR#Z4$tiy5eK^@zT>1$VnmeY5z#fnOozu zl*bU7%iQ{O4M`;eCK~+Jkp5rBsIEEF-E

58)HVWy<5~Nf=IMH`-gQk%G$)5DxgULfy&WQ%lCn+lk+(?GygjF?w57{lOE%9h6Ia{ma+=JHfgdSZYs7q>{NazrOa=rPY<)GN+Ks4E z6Me|yi}Lu+A5%)lf$trF*>$MN&F`7&rDbnRR@b^{!a_q{eme@EySaT}n1^K0E^RO|x7wK2qsr&NH8M^4j+J(dRxgn z-ycrr)A;wiI?dpXW7dM4->T~`fe1SD;8z&5C7N-msXVcRuw@o5ELMz!Prt1iO&nY% zNJ(L?i|R-*GbO70pl}M(8<+i6c1di(addS)LBO}oHfO#=;wqRo(?gb{C3O=1`mjWDS!6Mliw zo0`|13GvuEXV80tit;7Yqx)CFHbAp22((tB9B|FbYddjwQ1Kb74<8c(jlT$hd68)l z^jly8k_yLtgef`C{r+ujHJXNw|0;bRj7?^vJ6y13VU_d|d4~v4tazda3nZG#XjdI& z>9c_=+S|O)aV8ucKKmRio~+o){`?1#1!BFcG}13G@1Ax*m#qbrR3us-r>ds^1@X@czKX zWt>IPVpmmyGXCi=`m+5DIIQPFdn8NMw@2)M0aEWzDyvKVXJkQzu!QHm=t-rWz19mC zNaG+Yvvk#H;rlyFSZQPZOp>yJUoK|kfJ|>&u;}!9T)MJ(g?CRBzJqt;%s!t<`=D|* zQ#3@9bJB({pso)43K48(kU+f-A39w&dubHSFuKUva5~sG&kNG@JMGL?knw8Y_A;11 ze9vne;?&4ua%vro`&V<{(9)aS)>Fu-M3q#lY<7<+RpIPrt)w3=(rs#6KM*XTOaLT^ z<%!Av^}F3`|AFLMH?lxlLoU3hT`kv$6k{w)G;O(Ew`6X*mLw^qXb;iW(IH(_lnD8k zrOYW;pdw%xL;Wuy!IWG?dv4X~@YMF``rpp@xf{v&=nUSsHuJuL;iOKb$;yC^3El6P zODxmbUphY_aY%`};lr4Kjng27ub#0Z9jHS~drMc5MEsa>ee(-F7*w5LSXmalK(Kjl-N|FeQazbT}%1??VNmGBklj z@-k){!OH#M4DD<>*cwev9c;?qwMO%x-IjUZRz_$H_ncIL%qLo@7e zZQb@7J$b2qI}V#%>Z(r6K%<8=cKRD;DBX{f|0%{3tZs~Lht8v)y zJ-Zmd_`cUs*F*AzY89KUg9DFlHEsgN^qR_$#g5()l`eGt>e>UaQ~>*_RkB=HZ~FFo zfHuNbHY#cO{e<>N@WsD*|I5Yh$2T7-tlyXy7WDB5MAWk7m#?0znS+iw*dF_DM;h&9 z5?n&bWg}w-g@uK8CM9+0ho_cV&cx_ObM@F5$&TqTK1R6vt`S--<@;YoR8qZ&MR+SF zoyN!-erS2*p#zipxw69<}3iaoN41zoVVm&bSB z2*ptdsY~$5yvI@}k;_yz$r|7Cc+ba2J~H0PjB(?(`o6#6#5L5DUvSd@Ov;%@pAc)% zvQ}pi51FN21WbYnGq}w6+q?tU1EDTEV~M@J5$ETx^5V(JST^sz1MaHk%4IJ4Qh5^0 zi`;Iv6B2GyScPpom8T0`p8 zOS)$IH`@7APiGHp4-tETry#^t4LiHCP-SXz%zJDRTtJTUvI0+wEsn<_k)W@Okm!T> z!N2zDo$W$inZy88;M3itq3i0OHlO!V1EpcFCU0Bj_LT?WcHW3#F!-3M&GhN+3!ksg zeFm!)J3jWu998r_YO0WQs%Q;B#-@;?kB{AY2b^O86tOhOwNdIIFiA`)X(C}6v9r)E zXJGJiaIl4mLvzj^toe=lEN}CLl!W|0l$ST<6;#hR#FLWHin0vL+F7#LfYkRx7SU+v z{GFYCwv5OK9kvmTFvrs5WojpY-p~Lw^@%)%4x9ztSDG%sU}_+qv@{L*5IYf>?75X@ z20yESSS4z>HkZPM7-C8qm{g{Z`&d*IeIA^aa7YzsS0GT5t;ch!7Fu_@c4+6ikSAWj z&i)>dBowAzmu;?p6(^d=&(G-p%r#UsFQ#BWMh7Wv_p80%gUvZRTRB#+fHTy8CEiIkuXY_Il|GH`J7~H7~l>}6E4=QT* z{P%5RSRv5_R6w4VyxkP`3Q`em*nIN4NJ*AlKC#eduDl;{h!&>c?Q2L#U++jP$@4ii znMN>gqwspTO-O@yBrcQAEPrG}cFwf_)9MPbs0D-vZcHhz1*vFmm#WSu> zCsIvK&BUCiALRng4V8b!bAr#zybTRiEiFU&9LB7$lv2Nmit>{%tou?0JhdHpk!`sL ztHzbjxcmE0(kLA2)h#yFo;;lDQVDVOz@v_r=(=Ad#xH^Kk)Jdy2EeFc-`I#e8TzzA z;svnPEkRUv90f~Derf6Yu7~PXIJZ1)e=2(iTb`E?%kIQB8ai~*>5g*JI^Op3%&jNy z#i=t$pZG1N7?hJ47!#|1bUo!cS(H5i&B{t~?9si%{l`@K{uRpa7aH}ejNV>Q5<`ke z&P)<8=;+djo;2xyPXQqvfo+ zUDY$j+H+FiUIJ@4I+Zd7d2&RgcY=b|iax>|o<1Qfezf&*S>qQp#FwRo&lqQG>sl9#OKXs1 z>3^xO10HB17eAn+5?l+FWCv=xbDNl$xIG8O0IGH;%xlvFy=I?FB)5%QehUy?%B^o`NuklGqIe*jN3HOsqq zufKnPE-yD;T6*FWmk{e9l`52uWRSR}zF)E}AC}qjo8G1!8P)%YXc0b)*u}LrTovzN zw|J4x6q>Z014rO}4nCe3fS%4Amwh-?odNv2wL@nG^6ckA7LCOLf$q6OTkeV)4f^`InVE|X_MGi& zj3mWthigHH^NAI@qlSivub&)-uw@cU-O}sy@Ju+%%QLO;q;Oa5Vh#~;!$~h<-Ukn8 zeMPmkXmO+Bp&`gFWV>;p0mhW0_<@d2TPSA8;v17iy-nugTLWFmQJ#Esu}wJnPG#@nukA)6g78$I%}USK|>w=86KgcXLZ1WK9?%Jb=YzLnT4bX#v+JCsVatLW*?3rWaCq+5|2&z#MSlK4 z{qv(B+WiB2N=kk<`DqNPymuP~_K*fa%9egAo&5X=&-`?+0$#3i06$rvkXQtq0c(cM zaEFSj`4ACiB57nC+*s|x3>F}XJ(VxG-`S}m*S#G4h^*`kzz@)cawgI+E(?-ohm=S_ zYnfJGz3mFqshUECprwk2@PErWLSA-;01L+9gj6CW9#VYNNC+;Dgpkh_6YJU1RZFSLKeLrZ^xrmhP zM@KtT-oZPckOUWgp>h5&=NjX1Rf_^BSRd2|I zTu40oIdJ_+O}<4#ivf_*04-SvgD-%0NBTK^J)A~NgYf=h6&u}~HKT27r&~+e?!;oo z$BVT03)P$0k-PT@Cs|C4u&)q^Ve?2qfuA@3{L~laoO|gcdp~M&k4KtPadNtO)wDvk z_TUl04U*o?ZwrnLKmO&49}FkGl7$Hi12qbde89V}U7EX^ef0B#mbXcwG=-5&Z8g;&i#3wqN5Y z|BxwG%@$f-1|zO_oR*WDLqk&mn;g2DxEOKLwqv&y!vvSNE_wnHMa|QS6!8T?pM(8^ zvO9v7479zX0r3CPf|?hBVL}PYs&bA{dmE;6zp@^6egOfW`>V^GoO-cbnAfrtZZT)K zkq3P6o8!V&nfAqc;6RpOu;;D^uMI(|64kUxw}gX2JJnlT2Dz8#o5^a^yuhk?C9ZCP7OL=Qj~`WgQWYjy$zf5ZTj<%pej=lY26dTVq0iu+SQ*}`a*!GLjl#AVR9t|@7s z`N3E8Ju`I%jM!lr{v*S(Z1HcMRP;K_oGkB%&LpV5 zn(MJe=v4{Hez;k!A98TMdQchc>iP3w`PTY#yHcY;Xj5n?3vSJ17UOCM(4H^T&Cl<` zDpEDgsD5X2WF#qnDlS`TvTo+U!y~uJ03YkpsLZ=r8R6+oH{3_+F_C>ZFDtOppjDzn zE~GxY%%X&sHOw@c76^`>bX}b4sbeix+nAf-Z7k?}7x*37(RcSlxhj!BC@n|aFe?vg zWj){};;}AvscUN9LyaHp9}z*`Lp@N33Z(U2r7`Nvsg|P(UG+E!x~EJ{ zE60GS;1Z>!QBegOb@jLblD$^t92qWqxn5CuxS4DXNZF_jzdsRWNKu@~ z{Jzn_Y)+D+7>gE;B-VEPV*&QfPIrFOh19?;n@dK_Ko^F~Bxsk#X{VqdYqWzyukGag zdPi9~ORDNapLyS{U*3`v5;rW>i4% zlQXO?k|UVmWylu%{X2MVf{<_taZeY-W`AqRckO}JH!okXwLR*nqL2Rxf;g%VJWcewX7B zJ3D?tl|@XaCu`+$Gh(i}uAA3c$jP?y{K7;$<w6EIjt{iy$Z>kK7-n>CHHYU6yCbzV_ zIO8fRZ`h!s2g>u1&K@4ut?C-CXzK};G6@u%TaBoHjCBb)ZVZTk?RjO=$tUO2@R7^$ zk~)kefAVdHSt$;|SNo$neb=m=oRr72{e{SK@}I9o?FVpz3MZY`|J2D+g&J+$Se9wa zRd^>Se-m_hte?B@gmfGsy85~BWDysMOr*t|-FvVL&ELI-AH##&EvlQv+9)zU{i}U? zAZ~7Q;4qp3LmsE3>o%xN8WeQ((ktd9VyLS~Ql)WE+!mXBPl^5gao&9n3VM9&MDjm4 zT(h;6r={H&_U8TZF@3pW@yrKMBbYWdE82sc=q)`SrV8~>JXu>F(%?Jmj@Bhp9UI@) zX`jHtIuE?-g5VvO5&W3tZ4?gr(q1mw!l!BF&S#?TK3gFk&dfc$0Y<2CmTjZz!+AXM z)%6yuZZQs(ToQ0%S4)g?dbckiaOvxR9`{~qYVr9kLU14XoiTs4#9XV8r_UBSwBYEj zM-N1?N_A)8fSLNjT9q7a3&gC4I%U|7h4lgXr!$ew?#CcG0?Gh|Pd{BpM<)JwyzVoS z(pXENdk@G6hDTf;fW+|3pF(JI7>ZR@ynPO02bbmk7XM!_0Ez6~$jF3RMx6-bE@tL+ zzXd+j)Rl>;wAF*&?Y8D}Yv8N)$iQU_8$9e&t<&tOFSqhhS;^1bTs@cSf$goz`8@b- z`n^{CP5^C_(^8e;%)>)Y8mDLy&|?7niH~I>>&9Iq7zzkB<2%qxrTIab+q{P;KutIg zxL|j^d4oBZ8<)v2Y-x?t`2tfSC=&OKI60;laNZ)MH!!Ny0@>`0ZA^R7f#W=~|J^K{ ztoRNs)q|))D?2>~^mQW{@N)fvFb1)Z;5zj8(bDAn96K2mXR$pWQGr{w_ME!Z*A#O! zFOg(x_Ile$vXA3fbSJABEnYxxp+DLqpKy(6^ObWSSyX&20-?MKXCw?lrG;TemBCwT)FyHu6YG%o+_&7fI5Fv4$*K%aYq1(_Z#8 z1~>owEUa$ua$4fSzlb!oQ=%;&RoL>_O*L;AGb2(PMQ z$Rwis&}*f5yc&g#W!LNk+ukLf>5T`~-HfC-`#e16)2J9`Z7w$=PXK_Ci8vgpHmb#! zu^Ec9)73qj5Uqdx)m~UQP z;cR_pd{xl0yL59u*8)|;&CR|a6RaP%6zwkG%GUnc!vb|aotdxw8$MAeblZ^F86$oA z{>~w^n;~hF9vBTtu;Ww0{ail6@^+Xj>fGJggtFVc;MW4x=mZB&Q1?a`O^nrm#M4!- zSxqwaplWu_9}gA+3wq|qe*C@t8IcGelGAXt*GOfTKDt&0VphP+Qc^^{+MtBJ$}{dEAFc+5KX= zI)t*r>=X#}QGu?jKN_10zz}UvQD7h`uovj@dw&dxR4yYTTq)wPy`Q`fJehwD;cz|# zdwR~}t1;z;y3{V!guMbJVY+3X&sU|x^Z=vhNsNMae4&N=Y^ihdw6e=5as82Hv+#Id zUG3CVmrWt-myn0wC?^P(#C`&TnAMPnG@V0lT_;miD&4u9{RZ}wwu(9)$4Sbn$;h(~ zq&VuHO$THqziwL#ViUmVi$H>qm&4YQ1n-Yn+uK?@<5}9;$>JhpK0-YBj67hTN|@cq z=wvC2_im0$WFKseefyt!RaH9mFFHEFq$Pxel!AZ7iP%jn3jU){iVQ2yIs$n0)p@_$ zB>7|&T(b~WB>DFa2<`6DNwkXqo^H5`2F&tuncX~W>tU%Bot0@l6%^=~XZoGAj_uEE z-6N24j2x{3D5ak(8CJ@j73qBXJex~YbSFz-&7ZYRSpUQO*70HU=u9|G~+s#?2OWG%83J~^3`@HA;JK3Yr=3Nfm8$svz+->lIok)E+f zm9>}cVFr&+s->g=8yl%a$>o_2w%{O(jq@cOsGnO=B#s0fCcB)z|UJw;%)vvD=dN~JY8M=1KWeGWH^C~Pd6{fOlwG{ z((4qWa_w^&w_7*G3%>RNjR%|$^iHS_9HuBF(*4+!jjkzYNq|paV@G_>Zxt{U$v6s6 zKy#=3(5Xi-HAX#y>OX?*`^UTJ!NG~NWP+`h z$=w3d2z!UmGxjRLsP0a2LjpRCEe|1)CRffbj{!mF<@RB#*LTXSAzGxEafZ8v^pTrx z3-vI&eaUAUocH$Pxr+nQ#mWrKqu8=EI?y=8btV^Ey>r&oDw_eD7fTTkkglg(r^gj7 zYpPZ6+WYOt22U!FdBN=5S&mKN|YxoEnl!Ndh*wG^_Q23oW>qZLxgfj=7ThD z&_wo^fvxh=+Yp02`TwLfE1qiQ3ZjN|yRHp@YVmdU`2L$=)T38ZKgqEV6M-tU`J4V0 zo1aZpRl9p?Orerg+Leh74;R}}1qIf;w&2r_f)A+9p^~&1t9y3c)FiSWHvKbp`L&8; zs4)!n_j7o6Uq{@@B?@S8t}8#+kV)AfJMj!iIyzbqtdu$7x3>tE>>Q|KcEMzn@}p8? z^GA21kOSs}BmLS2uTU22o&;>dl*D07Hbb|AS)*76&woEc;e)P>YLtch28Vy6%PSZY zZu84q|9Ft1ZNDvHDqK0vN;a$p`jt7|B!owX_r(@^@YLI(s~u`bk63OX+9k zXVu?gEx0A5$Z-@Bl~NmhS3fv7 z!W9)YZ`N6f2!iZto%)_@Ol_xV8Sej987FE><07SV@4D=_XydB8zqQoNp`AAJKW|$- zML;PhEw5|!y7I(Y$z}OfcULg*Xuk{D4x@&%#tdFhOoVwKJ}cmAg66=q_a+JZsYi`v zch1X>VXkC(Ih}ZYZ;_JX;OT-O-<7wo=;0yVaG`Hc7^nSx4`;XXc;1VizyJDT`cKu3 zA2NLVS6oh%NaI$~)9ujh#kK<9y<*7oLEwqLsQcEspZ!eLd0^4>lpl87wP{13YDIq}ihcX+cVwHQ=SiZo}K{hGE1 zLr4fHd|Qo3h?W}m>zC@$vnT9lik~<##0sn4S)a_ajto9NvWiKv3JRWHPR5GG<6uM1 zg>n>S={|e}%8l8ek6L62$gZ92?9ZqvO#93}`eri-S6_~#gkC>)LbvMXzW|MqzV7u1SN$sz@m|Aph+7^UlT?(D3ySShX zg<3T>agUW?D%VFv>Ixti@FZuzpmTdejq=xY_UYy@sH;!VwL0W{057&!Snwu{ zO_xcLN@{Eq6sco)d~U=rJoF|%#I7`MmzW+8jhyrEokY^Uj)=xoy4C7opLmqH$OVct%U9Nr7OUu3!7M0}nR1Y(+3nH3j}yE;ZEkGbcXY(xouGL~ z^rtqxd@hlW?g=|mr6Aw9I)BwDdX(P)ZCnk(>!3VTv;Xd-Q6>@w11=| zgF)4(X=w0%2JgwWPh*LEoE&MDzyZQQmiz2#W@LNxvrm(BNpy0GhE_?Yccv}LNwK8z z-dcTVyQ`z4?V#L$L!@y^`v|g5%9WOLcjSIhc}5*YlpWBoMSQ!^z|zkGI84{FXNIHSAg=UuDr>r5 zx;|?dl<*1*6jzi*p@&N(F>@xJhuqsg6Pv~~HwvSnBbm2!6G;QDq=S7}8Ox&;3ewi9 zlqq({oOQe(Ny&rJn-CTT?){7&5e$L#iy$pDPK_p<8_R8S1dX9D56)>E+w6M3`2-xI z!CuG5QqkMlOzTmQaXGqNWkm^7jm1ei7p>!%7~op7FP0I z%oh&T?(_SPSJ{bpC2KAZJ0G)mkw>DbK~nFJ1l|b>{koMc`g(h174?FAj~GM9Jw9b; z88KV5BpR(LH&HBk-+w%GHYk;|3Z=J{PTD(iIyQa2a3zan8f7lgI`_*y_v0d>Q`c^L z@)_PO7_*tSQhfP~o>$}aYFx61H1X?iJlxy92CiQZ6dj;CT!KIZ>m{J`sd~Z!SEqSbYV|GS4 zD>_W1T{-E2WEwH_c&Z?zUA5!~BuH0N)3P~j>(-D&;Ekc+r{$-)In%C}=cW^vhKlG^ zfVAv@ne^+DIfiD}7fYUuOz}Vyjm=|-T>><;%pl&DM+vZB)8nQ^pq6BKpMcX=cJPyf zRYb3Gs`1)J`;>>IWqy8od$h!)D;on%rQT*>GIxN8?YFFkhfrl5+rr#;Pfz#e3zCss z#2q7e>w?#|_;^DSwi~_SofdS>77OuEiCu(ARj`moGc!3%+ub9pQEDpf(vn)1^0k z`{8a2X(mofP~{}`F^&9?lZIWPgtb_3*AL)@Am$t*68Onz1qElOE#x(j78wO!LF;;$ zpsT9AT}x59l*4e^o?v3A#Gw~Q;Ny89_gG>1ztvV1e*VpAO`o~)Jkgw-^0t-jfIn7b z@dJ&h?omEzz(e^f=RG$NyjA|3|5kcG5hR#gMx3Np*e2%4aX<#)*6M&EBpcC zWLUI`-|n6idCD4>2Hmr>M4O%OuRNEQjKPVH*Bf|jHwx34k}pfc?tn1$G)~9J$T_!k zd{ojtH_(6(N2A4np7r+j{*0|^ZU=o*!dcts)>;^#%E_KNo6mmh@2}Zqhi!j0JgEkQ z-fc2@4J~TiaVs`4s*NsVr27Z&8&7b6UyxBBSBxrgm)CG++6{P3q8wTG{f#qm25Oh) z3<3bbtObv56%08LDpon%oA%Rr*@D@DXg#4ZzfL%l!}T57=9qxWRjDmr3Yuh~JV62ch8j?D_@A5(B zn>D(2;~%@nV4)cI>@Vg#qb`mP7v8?RoF?QCS6VzNv=-bOd!_4#^oc+bGWwW73H@R> zvGN7aC>gV$)u}n_#k!)$`pL6%caP_w?cO)aAZC3^AfPh;roVRN~Q^pGh`PaZ1*a8ZEb!v=ZaVuC7jbBPiUKXIZO6Y`Bm)3AXHnF+@X8Z|OLXWn(+EJ2~kg z;_GQ7h6fulbp6@bILq@o!a6ptZSADV^kwtmjQq+?S?d#>;mz;>tJ+3xhgAbEGGIA|2<8Y{meV8!Q#XA8<4VBP=}VpW{Q1 zP7X5No;%1f_C`lK*46|v;{Zw7b0S@iX-!4+$qF^~HrCiw#Q@;Px3O)2u!v1rsKrd1lrUz~)V)C!Zz!9PWF56Ttdhl)>&ly)#Ji$vj6FIY89@0p6Co0W=;2g4NqRv9KQ2s4fWjRj+#3{n%Y2@Xn>4 zYHJJRBYP)Hp*2V5bYps!kh^I?ez1hx=1C}n?qOE(sDic#@_uAGHE+dgKSfp96&qs?8(;qGOsAe`|&Ypa|QuG zLtQ}#(@t2}pZThrLX-Ve%B7yCI@yz(DH!Tyh5KM^TwG>WrpfK2=k;o9_H)S7eAU-z z;wlWhSUGOl50t^$q7tgOsK;(dDhp$hcWteZ+U(q~*JehxV7;8hFr-VRSeJr=Y4k}~MM{+b`-@9?Q4ynIt1rdQLhF}jeYba)VRYs{my_4@^Lj^705)mN;Q@Q^;P9(bM;S6LQ(+cfEqBwKRe^ zi4dcLeTJhb&e~C3SQKUxU?k7VE3o&GRQU2pF<|?j3`B@ztk0GjwYIgfu>)dpcze6V zs_WA3PUkvZXcITXu;E~}t$ZaAKI1$32Y1}k%wVKp(-UtG3NEF=0NO4BrN3^aDS(=X|S?P?C!RMyzO0F zu%tAs+xysno+L&zXI|#>FMBfCmnS%bxC#z2@rqWN3E}V3~{MvJC*RQre>`e zvCC!yZX6)^B60?}ByelUVli{#B!dIw#8h=acTm$^0FXe|ATcpsJVHS5BeSAcJFi$? zjUL$D|0R*00s*(f!d=NyrbK{qO89YO)AsVAZKSMM0$JPzLgLlIm^%2 zsb88|88vFVN+044oUa@^4Y5@yNjZ1#gvj`urcUIgxo5-nk;YybhVY#oO&?KxBXW0< z&>S+#1p`2iYMh*@ovZHha$W3TZXEXU(~VXFMr}~*yajhk+9|^@t5anHm-j7RYNbQy zLC1)|pH+bMYQx;>#(^nsoVh4qUpf_$nwq=QqLJD4@A88VYjt^smFDR=MrY@QGQ-u? zjG}GH(!TcL;mqMesGTu_`^DZUFvRbyiep#aa(4M&-t(2a?+u53?)CFSF$~tP77`YW zNEvfSi>5z9Of!uvA5&Oc`&(M(1C!7U4IiSTA5<7ZRo-W*;?%KO3gj)=DU14&DI}(g zHq*0Kv@~6#fOADdL&(BfJ^;e0?HHu#{q#Vy>2bFjfera+ZT&niH^!@?9P`{SJ#po&mCpUhz#=x zbCQ5lj4%uqreD84KuT-n@bL>6OlDjz{-yl`Ui1SpOFs~@hS5@6?>VRcSKQ3&8F0F> z9`e%9-g-E37`m8uV-Q%?dHU&R=El=WE#aXuN~N%Gwe?zClb#bp9|=C@!Hx>&q#%X3 zLzG+&A)%9P$p@)ASZS*^t!{PY$aZxSzGXy@@+NkyIY}lZQ_3~b+iHv2$!#94F*U4+ z2_w}DKbz1i*r4ZbDi(Iz;LzQPOMUS^68ab$qsU_B3YN^Mm-X9`p`irr<{<5ZH+Rp_ zwGg^Kn(}+&I8VsltH?gWx0s?n+8N4>x>e;A5D*o#j;q87u@&50(RO4s1;yt(}hY-@Ka=-0+Hz-KGjs7xVgI zrJrmai&C0tlg>?tl;*3dQi8jpnGAA8Z}N~MU;ER9Hka}wO%?~*iPn}CI*pmir@FdX zPtP3WFGb@%WC?B6K7q6eO%}BuQSgxWm__Z|-l|~~6nO3~D;7zG=X>o<%{u7>pY@Ee>MFW44{fuUc30bx z!B$sc(-xzqAyv1*II@mbLzEA!!y~o#%t9K#$41?!EZXtBmo+dYkO*b^0+ca0zU?Pd@ zhc|tu`Qt93k!(Ar-f6OOFxUG1U1-vsv?$-$DCSmtLRNr%w=*ALwu4Y?LKTa104ttp_*nXSw1gMg8}Mob)SLRvV-ugk7a)esLF~!GT`s>#@Ai zuy>En!cuwnxFh*!K7V_g9sKa)(=TRnITePf6{X^t``=%5*bG#P{qoJ2Qow1Py7BP^ zfj5I9BCDCHYmG{eyONC*qE~K06I`nGOJbIT!VxfpT6g~^;bpV>B^FUp)=HfTGj$T1 zi1BMreI1m=hxI^5Vvb5Kvh$mbA#}8>D9qoN+GT|v*`yKmt=TFIqiCe`{t7+pBzw0<;N%=GQH2TGIH-OW!hc~0&1*7lPLdaJ)8#(O0|7xWQ zY58;57#oL{nduPLbNcW!hiaaDN;-791OF;a8La$>SLAHbO3CzmT+A4dTqPluPKeD4 z0uiQhSeI8AXDI*OPTMf8`==w)`Nha1?umb8p_!FD7b*5MwR-kIL!G^ZTGmb4^uEQ) zP22S|u>>y|)8Wnro_2=j@oXFMv<|@iMbn~xpY<`_6Gohuv+$1Tf;|$458b_p-Z-@{Ty;u4z|TLS0FqRVn^8XfADYfGDyoKU+d~LLqtXo` z9Yd#dcXxMpN=Zw1r*sHNcMc&8-Hm{Nbc^)2pZi_k;x}sz>^)bW$9W-$$R=aiWI&~Q{u-T82Pi^ zU%}Fgt9p8(-Bwa3;2T%qMcNI3jiD4yFjQ3V-r{VP3r=#T zrDdgKlgoZ_^6boo^N5XLCm;X;#hyx^MY?+YdHI8GQg~ zTkC>m$2FSXzu643I!xR&u(<3p6!=sa-{N<|vr|u1930eOgW8?@gE;_B@2!UUtU1n1 z32}fx8L*3?7#vB;J$85~zifV?Elr0%X4^O?;AZz;8iXh@6O3B>6@vL?r3)RjMAi0oi){CPe;YL%PwG~HDV{QL)VcM^) zt_Hw+LMLyWk*HGnAO&n4h)pujsLjV;LC-LYS4nI6fKP`{e~MSUI_bbsGphCh0hZE{ z8k(BwECRCc7}LCVc@vVB+@^#opRbe$T3b4myi78X!WTb-<$m#A`0PLoD(dQ<7h8=; ziDol>rBy(E(YW`d0u8#x=DQK)`NvHy4F5v zFr0q;iqEDnWwnF?A8y)m=~}%O;74=)t*l!NJ9Ex=cpJh#{*kO1`$PN9?761FeR)-_ z2mfVRnRsNr?z#fv)61IEW-6QroCt^xfkMFuP7z2xz;{bb9yX>@p{q(4@>M*syoFoS zcuHNPr~RImH!zRd_~Ev04H@}*N=X0Z!G7U@Lp(8r!o@Ie!>TiOSB1gy=CghRseP|! zHG5VQnizTnpxlajPwT*~f8Ty!qA0*&KCBS&P3Fpw=0x{yN%UIAfy_A+~8yOA)Q5$tCnx z2jHYGedIzztLVfMgjs@~xhQ0ZO;kENMEK)|%{rKfdh#stZl13Qk$o@1q5Lhn9w!e{ay;8@ilK3YoJs7Hb~6N=wUCGOd^WXrld*Od3BhB{vALYrmetcVA&a5g`@=jQm``F1e z2eJWC!?m#!evwUiS(wPZZy0F|KG23jhOQfGKX4NZ1au7Tb@cdL;yXG*D>dfQ7`^lP zxh#*h9A5(!Rnbe;l+sUEn6jtD+ez5?t1h3Is++Onl1WJyW-8Q|SkE`?KYdO`i>$|G zT#iCXr2wO&X=}gcQ}?nHlvOeW{Qlaj(SRFc$FR51G~3#v`R9*`_i2&69cKn3zvUQ7 z#62-cjw;EMmk7=z@No?{G}OY~eP>6K2#R{&_2$cyeI2l0PWBQI=4U_voprsxzmk{4 zJ{h&BP`R*Xmt(S`%lO7+&u(r`Q=PWwTRh@!|M)i|De2__0L%7h(22teF(Cen7TGEb z*L0uXeId49y>XB`PP@`N=Bwnk@i|5KviqFG?M;LI9Eq4TY900O<<{_B-6 zft1d?W?i3~lWBADNX%l8sjcfU}-;B#C73DEN$A#uOiz zL4!T3oP<_*^7F{VcqT<0!x*=lc7y|Qu+uIeX{p!wo?o^*60hsq6Kl#1idO#g(SrS7 zm8OKBfRXM!KFQWs3Tw#sSc><>#hp4{Ljvbb>m6K{+hTip-c_NZyje{HF8eQ!Ia9eP zwK}HFI#zH$3QP-q4Bq^D@#rwM7{mezS)wYdVqN-2ev$bGDYumoG(rYphG$X0>D~pR99M<`*D`fbH;1TTy|GB^Cv<(hm!)|pplM^)(67(gXE|)es>Hc2h4a`M|O7p29&bjtB%Iz zD_J6UJ!48+JN?L_-DpyFJSL+g%nmsL&6;L3#LyI6PDpb^%cqBpnfePAc=Qi7;0*vIX-sQ)JkW<%h(81 zOJ0oL5enhe)4fMTmq)zB2X{E=9D(LCdtU?WDW+#vZ24UWH0f}R0(AvF$J8`6&(6xY zn0qbJ1bKC?9vOEoXVCD8Iy;*+P@_jiJNWk}cru!5_`DBit=2ZSWM;kH_!6RyCLgT( zTxi3XqK15?&O~p>hyFc`;8-&AN}ydYH&i!zeQY)O!+ zfOn6MJ}fqVv2&wi!7iVNl>zLP5wq6bsGzzLgU38!!O~%Xk6m*8dz4G?{NICpw}x4E z&Mp)xq{t|fOd1k9^(o`@$V@V6wM|vfXS&NV=Xse;M{`t0B4(u0LoaR!B1+-Zi4j}~ zmvhQdtvP977dK41b7@b~>c1`a*@t&)-N5x&i<+P*QVbwHK7jcH9?0KXP|q75KQci$ zn`%2dDU&WVwWxTU+FT3(?%0f?P(yPiGIAH-X?PtxQpfhDeGEqTutQY%CbQ-C0w2_W zpXiQR49waN9)$8ZCL1CPug*@X%D^qzGtFD(p z`oZDn@~SfM4g#2;G>*)@(_QMrT}E#g31*$G6Akb+;$m0xxwo92f%6wajz372ZED6n zI!0)4xP5Hz5z=>NRbyE3Ap=^)9cl6`7m^NN^=qH;>jPG$(jv?ewGc?r;9HQ+pCoGE zaK|@ zloSz=ZbpBC?{{MUygVzgj4OtLS!B*Mi^S)rd89Ez#*v(&}w|f0KZpmSsJjf@1S>Iad zsQ!g0@Wd~1DD3UQSTrSzX9{Zt9v{Os#>D2dvBRK{Ummk$Q^;ABz7ejZpE>~SDMKJ{ z9^V+7!$oK)9QNyqy6xPOtgZ^QZrzPG`&MyHHzq$@ zv5_Aw701o3CDmj;5=e;YY}~W{JWRZ)gMPBC${$3=mQ$$~C08z5FJsC6Wmkqki%W5d zlbfs+4>c>pSPF{-k~49#(#R=$l*1!#J(W!#ZI&soRE{7DiVk$-M!O$(n@jk76%!YI zH3l@$TAD-u{AYhra9hVGDu`)S%ciS0H>0BW7FX38D3w>dF*J-HlY44jTD-XnJ;+Z< zAZ^5r>6oizh_-6ZW+%)wRmoPG%+2B;N?@ZLW|QEwv`@SWZ>6=-XNN2c2HKpt27Fsfgg_8H-zzw zoOvW@7>I=?Dp1I{4art>HEx7(gI+@Q5h~~k;q*z*~eR@TP_qHgF&2{wm-k2^#) zals+7$sfVj$sf<#HUe;P(K601j5;;j-jtBu1tZs~(sXq{=dkv6Iop7NUr)EZZnCX} zWo&?xS@7~Y@_o18+&}s5rqbK6qnKv?uua*y&MWxT$wwgQ@Bl?Q^}te7ou;51nQE*f zm)Sxx#PB~Dj^py)>i#zs#7&(ttlJ29nQ2OjA|ubJp~#jFYb<=DldA`#!FPQ24D??w zswxF~AK@1r9wOUN(Zf^AqvI7~o?i+P-z#Lw)NnZi082SEN%8w9{>SK;@E}I_^?ZQQ z#=tRVE}~;vRaFO^_hRJB0l)BmSxux#d9-fLuZV?F{?A)Qn2ow*k z7P{(kMSnaltsPoG?)j(0Vm;kN5Hg?3&lPaF)2{-i8@v5)kXJXb_c`EvvmHyQ&D5g_ z80+3Wp08;xB#%nW+FG+nTQ!E15oRzKgLl%aHk;NWk&*D4TQ+AFxQH;7^Z3(9$!Ic| zp%D=f$!|K`lrSw>Dt5xJmWQSC09uO|6FziF2Rd?}S`pxHawDwzo~lT*VKXRmRmYhZ zJCsZ|#i`q}(WZ(3y$N~a!GLS6E0}_kE|-2Dh)+&TZ0A_Yl#Uv@4T_M(Mx>B=JT`8X zDt_@HiH)afh@H%OKXpKgBwndA->7>(BmJ$ehYIdjcFvGXrWm%Bzd;i9n9Xm?_7KZ( zm&_gCfQ=3ZYO~wVw~uGDELzPEp&ZfeE&ZAj+>bhMBpQqRLWjFZXemrS}@9VE@ku^oQ`b0wRM@FiFG@s21LyY`ZlY2OrZjt++q*Cdn3SUUc?TmdrXRTI z-?aEchVc%LqzlPAbgIf!Jk;$y_UtKybgoVV!kAKsr-t6oaa7m=AN z09(~%T4gb$y7DEBa8*_K@YQmX#M57JV|n?|t>*MNhMR}ypZ}zIWZ@gMKk^wKiclXR zq%Y>1lmTb4-U^}$y~Nl)FF(!QH^oU5|4WwyqI=m_7io#MPA z&SW)>)R^jECTO57Oq3j^-Q8}hYq5B7&rbqEXVujL1#)r!6+N$km?L*u-*vX;o5oJ_ zsbGH&3iN?|DjVUv*(9REM$~-Z_A^D9=6#fh`g=4{WA`>V_x;Wl4SJOXNJ=+4O%dVF|<>$ttF%#)-w ziJCY?mXAOpRMcUAJPMYPm#neq=~p?}{ZQp`RpP!kCg$zkR&z?Fxb+cyJ_}eAsF_22 zVkGa^`4T8ZvSJ5aGbgkd(j4BuA6hbAVlk+2?W8PVrG*VvX%6=YWpe;IVZP$ASs8=PWh*I+C#hMj*g8qG#!kL$0?%*?(W9zPnjbh z^qABN?L`-?`Qr7xZfq8&6ZZg*fI0(|?1{6M7JuIF?FPV_KAU=bB)(K*fiaq0QWV`> zzk&KKx?atqf^k8fWjk%YO05wtc33`t^Vi+4qll0b2gx_7pS-4TJE>gdRCN0*T!Krl zRXj|cop(pbmF3I#KKV5jOTR@_wVwR_`LhPtOoL08PN!joSG0{1+e5LXGK@!Es;t4zg!WqYw2o-R4rj9X# zVrj*jQH%VtPK*zszQtwBWJ6z>Bpm@yNS}QE8SyOs;@PUWV3EPY?+iEuim<)drbk9*)S^%k z6V;-&+fu9e5rfeXzjt@{+s^s4=41+Z-%Rj4<5)U47XVHl6#x}yRZPcFO*d-5^2g;5 z`Yu$A_Z1(k; z7)bm5$ZuozzAk(g!ERyfoTAb{kHU)Q?a86R#}^RCB1VVRXzh#>zMsOEmOjNE1Z+>| zm&&!Y#IEsc23+~4-qM*6Txf!7^EtNuyPbkn6zgV#M)7AZj<9rUO~RWL1R@^!f~lvd{O|9Ka;2zuoU)4L`rIfkR~6VojNXRaM}N^ z)_xm3ApXsQ#afvnny8L^jN3(F)PZ{vSl3v%#oKvkdK!bk$*6t+Fi#Lt z6sNb#wbUOTx$PIlj>+;BN|_Q@DyIN?kAKNI{9|L=l~Xc%y9 zWo0&yD^nPSIM5(re>|vdd@sS4qSQIDKQ7NI3Rv@CM$T`t#3xkSFa82H+anlR3Iiq( zC`1aID1H}~fv?(BU>bPl(Qu!V{rBXfvg`<~mgPA$>Cjt-CV zl#bUxb?L~kqQxkbv?6pmIlx_4OLM^o@~3HSNq=2#T|H!pfs z6Mj&=ZgEs+WY9|aJ^d5hXfet=mGbyEY32{EsNM!=p(0Oh&2(e24sHa~od!?tJBb?K%rf+|KlIky1J@Yk8j0jy_ zz$LjTAxdojBGQ3#3!|)|waj>v=MNc5*VOYS| z=;klDd#$K4ZwPtPCW*XIB>7A?K9z$)^o+QzL|ujmpPuxVEsZ@xZW*ZVUjFhVR7IPc zrCVkzd(oe-L+mpZF}tXx$#Dnuc>;|a8(PIlnmDr-J7mB{sywSy zp8kIdEkT7j($#PhtDmxxKOd$HlzpY8M;c~kq!N%nd4Lf^k2bs+0|LN`?+-nYB5FcF z(#36MsvK5fwMNadYHVp{1Q7w-Z<>3Jd2*Up8dr8lZZ)e5>)FsjK4w%+{_W5M@x|JW z12*Tl*QqwEQ~Q``LM6JY_&^|%9R!S{H!b6&|z@(bYF1sB&xe9lUx(su>E{z zJ?6F>@@D^T(|y^&hhfi*ph#!l&Msdfv3hqGhKzjP?o)sETXyTG%vothDm0SOvi)a+ z8@GH0%+{i3lhfzgEf8)b%j46@CDS~oYVrdO0>pMUDBSo7-eCn^PtVBN{*gbg$8nWY zx)Nul-n?qaY!EVdTyu7g4C)I8sc06@5D*g9e*mM2N}+Q&ZYdS;hcoMOjyHIt4iv&X zw=P^}k8kT8bXAAnmdwxJm=g#^7u}gJn=tHs80`nJ;wiHGRjz?sgZ=-n1t_k?=W&?E zBHyR@I%Y8|Rh)K^=CFtpBN`Ck@(tA7H0ZqU5=BJ|=7%D-IAoEb|JBx*=jMKZ?J;Uq za{yg0q=cZXf|)^oKci>{840=kP3UT$h$Mer&>rsPX{#c32@y_ZdyFfi=b$B?zT*(wsnY2-P>`W>MvI&CWy%4sRKCA<0W+~_qNJWbq2$>-FN`N zjZ9o{eJ=1f6Yo5a6m?=N`6K*tGY7B_W&9)&#nKCe9EC}5Q>p27F-zxIaG3Y6HTT%- z-L3y!SynT}B!QWuFWxI(d`mRawPhzt({H`-CnF++Yfw2z05lT*T5>$7T+rkn3+V?#r;mxw*vb2T+fFI@+0#+i)+`_9jcD$cP7y(QUP z{+>M7FJ~*}><7NI!-GhpOwgea^p&~dlDV>>7_>$!!<+kB5<%WMvl)jL=hug&IF=0W z6?Q233uv?<$`aaNh#|>3p2@cFR>~Xi(Y`t|eD?HUZ*5(E1tm`xevlc2G;U!jD}bX1 z@MHFTuLY6BwZ*IYxH`tI&?0;#-p+6W+fc>-qMAX1V1wD-*yZhUfwL`ul@}hPF{h(} z#rX1!^=hs%jLQ(evFD_z(}P5BVhQi7wNFF(q^OX})&2JgD~dzy?V)R{4j_-DlJ@GD z+egy(?`4bG>gX!d)4gjJ&-??Umiz>X@|>H=2nk&`gM!@sIxhjYr7c!(PunbXaJY-= z;P^g!gs)sF;7^@CYC_CyA@n#dhJBKv>}F`V+S;qQ@1|Z|P1)OfH4t7@mF>{NO2?2h zb;mdEE0gZolttY=^QSBn8L0c$-KQ>tUOS_ArLwKu`MN4)$E{?esZ4ljz*Z!zv9WFM zPz;kfB}MJ+es7!7O77jAs*em0xbJK1wgpp*^J2HRw(BUW)O;x7o0iYE3=(q_bPZi)lQ7Ye@3vKw` z<=dD$N*5?h8dYMlJbW!9h>0MgP>{dmIeefF06WL2^vF1S0Kc5`FGX~MotDJt=ysD^ zNXe+v>V7}R#=Q8*i(}g*c$Xklw4`G44O;D=2c_hvsFhq*95k2^cfiAr@$(ojcLda> zNu}cFLF9+G^4!(H)2Pxg%U~e|CN;$JAFYlT2`lGMqELqSiZIEw5a5oEH0kh)RXMSs zlPxXp(eR!Yclr9SS%KWU*Y{;_JMwnxMT;@RHvWS;y?wpR!8JQ56f`~hTT<0ybqPm1 z-k6_YU4vR+^FL-IVwe?xQirJ%i9!&fbJ_pq|O6(*BR#$=q?+eU7EYj(c!hN}eY z$@Q6ePABe>3}y~Q_|@f19lFf-D7H&1HVz7dkYrPrWE_dN3r&Qsb_UZnYOn^K2JqtE z#IVL*wskn@vL%_sO7W&_+pcE8D8t40(!{_!(F+Vz;C+w4pVwWdZ%{rVxxvWDiHdsf z%YZ++U*DNBIqXu#m#8iO=_3e)2 zgvpPxIrDY{OO_E%PXFH?`yryC6JCt2w*2nODyt=pCsA)AdwdibKmo z>lP-gL0&aeLQG8)no2*TF=onLUf_rM@L*qGH6}7wI-^=rDoH{zXqpMhnhp82+r|VX zFeO;)>Bf#SQ7YfL%r$P@PaVAh_iXc6XjyW_^{`gaJ&mTcR@*J?!HT9v#8nbaQK{*f zbj|RFl*-lZobuuNu9d9imgFH_8cP9y3))US+u*KjT)ZA-g$jdi!^*%^pp;R&*hDTp zi+)7lMeyBOXZ>8cEtvi9U%R|K9p3NmBvn;EM&7?ij9Fj+f@4YhJyt^(N7naPsU;R2 zlh+~ELY1#_F>gm8ifBEdyF zKFfBBSeT1S1%c}a$Aly|$t8fEn*e?FQ@+`^KDl>)2he_{D3c_I@#Wp;@Mua>YG_89 zhW00pxbo%+>C@@xrt5Ufm(f9K=0uPBc<)+}K3!s8N%36$L%`v>o~9Il*@=r&fzn-g zEjamAa8yz)>NB%*Xa`KO&>Mwc>H{wdf4G;&?}qEd+Bx7zOH;~H#SQzkpD?90FlyaA zKJQ{m<0D$a_L}BMCautZZq)s~&8n_${qWWHHPGHq0BC!4zKI|t#t$iki|H(pb~t_B z&szUO*Z8@aGvEQ4?g7j2HU2LkL+Tw@#kq8lDQlC@NY9yA7^316!c?R0F^G^%T5gH! zbb%Xz{I8Pu=eq1fEB}!m|3Bs3QhZm-gO}6(EW+nAW zIl@65W!*}u@86S4)8&nIPT&TlmUkjJn%24R*7T-?&{vZM5{BZE}irl^1w%uqyD8pqnxZH z`qRUUC?Z0P=@>`yDH!=(BqpCht(v;}dB~e*Sh{2So+T1O{O+W(a9+03E&xCeQ4L?e zL3G`_4z5&pBujwWFj+RDfJ{IG9q|X(f39e0th@?HDJCv`{sdiD=Kk+h^O%@mW!Ag- zwKLSRX*6+s+M**EY>rHN4d~U+4zpyz8+!O$Jt3v3RaUO_ z>671IFw~*6*9R>tghoiIO=z6TyMAZ~FU1xqgh|L}`rGkrsk{?NjvP7bU$P=edN^$IGH4n^jB5erpT7qTAdjrY`uoe z@aB)ow458_2GZ&=@yZSezCK&HX<+AKVD$LEEGB^N`w?_BLg&y`!p#_DL-#=4Q{>e8RCnDcrowd!EwG~eDq>oe`@6LG>hx%QOu8m!pA z7cHZOpCkm0`~M{@qq|D}Xj!1#_4UAfaHHDv`8 zSV@=V^*8MU&lbedaW<9yWE#80Dz3De(T;mj1|6n zBG0-abdOkD=Pi&YXSrty4iUK>v1-g*t>YI`RPFo?#1cBxGmo(l3bc^y2|ds5o2P3X zZ|@G3FV^F9fMrY-su(3Av_dEL?$MF6#!rx~E+hYw{^IS|6@_{S9o6MhdF{n{g`~YZ z-dea7SEF;av^^?Wsz}TYJ~lQEyhh|u_;|pX0JxOV2RUJ^lUb^hzuUq>k62%AUTw0i zNp8w0V?_>av-hItRdDUp7Ew_Y>J=au$3Xw*ygm&zy}2Bzw@4-=mmasO>?D?@`6dC6 zCpo?=dwT~=6W~NoAn0|5#0e5z9V|jOiT>O0X58v4O#2>G*=4MT57sf3B!N$8r(%#G zUgwvb#3}XU8yQYL`$kQ+@o}?DJxfb_h);dl@Nh%FzYr}ryp{zwFHj@$&SJbl}F4WJ~&L#6%=n&&h2ip?cQ5bb%$5 z21d^-iQy{V6jH$U9TwZ2Hh9E|IPc&208jALAz{iM?N~wf{DuEKAui0Ey@^54M+4%YY1_75I>>(sVL4m|m_U*Yin0_94e*1){ z>wGIVgA`v`aek;p5fZBMPHL#Cc6p34fZr*i-QM;dpF2klkzr!ZEE1&7^?;HeMc*CI11NMg<< zWZIOVuJ&ctjyV$AfI%i(qvgPj8=+Z#edyu?4+3}ywD3ROet?(&0kq>4tyFUHRtV=gryo*gYiUq^h!C_TBvAnN_AUdlufoB=P;H zzSI0{*h1e0jFeOlaI>7z@%s%1ltO#IWp!~5H#dC*onU(xVsIJM9@_(IG`r(_vkeY7 zL$mHv+q6n1QpJMqR))5A(IVl5yCsqgKznxmO(ch_^jrjtFpzn_ZQ=oD>NXfvpo zla)`NgbZG|WbK~J*i`Cx?D$yuWX6wNI<6Jv-T%S#dJou3wfqZCux ztOX$*YG~1l$#j+yt+DSL65-m_Q>(~gZ1D8yX%R&qj%0-$RniZ;)sLN|*kMYl7?>m1 z$rdIpWmh?-h`x&sWb_&5l{L3p9pSac&O-i~Nz~>{+?;|Z=#gB8(keIw!ovAek8nTl z{h>7KrpJq`K2Kd!Jm!-m-Vj~`&Am}8WrZv=wS{9YuAsTwn13T5Jq^aE^6UqtBzFyR znDJ2gGFS|QO_BMWhQ90SF@$SqnW4Lz?JG!={m!ZdF=tu*NO}4Q9(4 zPu$Cu4lytkF)-q^>(n6VcX#+ehch8HU}`U9OqWqpBy+M!+Ue52@3C*jMj%>PUO*Eg z31JJ?t9h7CoNVx6iG(+)sQ{0=Xz76fK zJpLI+EJGvCWXM4JNe)2;u-c>^INgw!E`Fm}Y(0es*zkj?e1%4?Cnd~Wju%D5#eoIx zgi}!TLFxAP-|g*)`)mAwYYdBKq5vW4lzuwY$vrWvMsi6GG&~Y}d$jc~-;4RmRT&GW zB(P7n979?LH7W=fWXyg@kE2$pVe+4BH1hsXnOVM|3jWuOzmb5Ci>qNCH!nDf%76(z z9-5t9J9?Gs|A3EKjcV>@)G@^!$jGDKN}?5ZO60UcZ!m2}S82Vg5+?>- z(voum4y4XvLFn2RsT)X!r;@vUI!%qNv=v6c~MoNZDKo6A(^Q6_TlSV~5t8o1eM3 zTw^|3H=kMe`CL*;`aICLxg}DQMw^|T%dBp0JzuUg? zQM%1R++O42(#Aldjn~hebZ5y>QFSe;V$fvp&CYo(7;%RQxgkwreJtB@Y@dk~td>1m zlo;6aXi+FIIy%kEmg`UYSy-0j>1ju8MnaB1Zbd_8-Fx@xb{GRKB3Lr!cQBkS6v@U% z2N{&hj|+9pC^J3eoaQX4VJ7}k(yU{RZ~HIcjx6J!!nJ0LTuX}yfh8E zDRiqm4qpTBEyL-qwqCfsUj%_ueZ|>QRaJJaq57?vVsMjt8lrtBnfl!wQ>SP4&IKHv zM+ie^syM*dsJF!n_VP^AxbmgwuL<^;)onf*Z`R=c)PWkk<76(Y(1VSq^3*zqwMPEy z^RGf3eLwB?+|ccQvHqeeJP@5I#n|5ZZ|`Y9t{mz6V0#S6m4p6muSQ1??e4lGz=20x z6~z^3n(Enzqj;ZQOze-pd2m-j6PA^{QOzalJv+Qi2-X95?yY1ul2sNsLlj*3bD%eP)evAF09O!0Lv7QWrKwP5frooIhRc`JO!;+w z!x0Pds=;BmZQ$>zoN|JwYN2F|-1Boqk;$P4bw>5iy(XEk(F0e}M80?jXXPO?Zbew{ zLzNDl2a8_QjD=gy#Cd8M;RUidXJU~$ZzQzjc(uI12{XK@qr-;5GJHFkNx&oTu^;PS zkC5va4&bl*ncr}|ZKj%z)YDTF3N@Ad)~H+C@nA?mrdZCidRpg7GT0Rm@{zjhRJZFO z`Rc8fQ$7+yL`kK+#x0YiVr(2=-eiL5zm8E4!}PlAC#C9J>1?g0TSJT8xBf5Q)QoWn zcMLIl5+5UWUAXllcgOwCE74QtZVlvPEX_jHaWZ$`kwo_Xqw>0`_;sD-2=w(cDjMV@ zVIQN|vSzn`$YQ%mnZJqn=DnHq4l%XpcS{S$^?`9!)v77y!~E83=jAYkP6Y^5s#dLD z`H;g?o(_k*n;v!82X zieB~TzL|fW+6)LB)g=A5Da@zMpVm>ukL+2kkFuA`k(?L?pA3S-lSL$sjg4db6=uy6 zzw1gwYXUY8`6(*)ZcMG!tlItiS#55$QXWYGPvau+bJpRV?`NzO^b)!CP}_YM^GyBs zsJe}s5Dh;a2}y+{a%4mk)c5dMOz~%t6AVRVvd2PF@ANh9dh6&g-fgc9O$ZWnf4BjpHrncq zwFdiW;gEP|1se5;ZQuwosG`FN@r(R_d;HhMJJP|jN{r(k+@T*5##>dka{~n2I8nSZ z?{qpiy>F|aR&xP8jPCpXCAJA~5yOkR)o{(9X+nNmG#LznK3x@4!_sBc$jEA2nX<~B zF_EWSdE?qBW1`eBbu&r>KY38cmm z^YbeQM4c##SXGhAYY)xn6%gI=Wo2Lq!zNo#mfAg%0sCvPc##-a_+3~o2H8nq#iLQvM6 zEOr)g@rE6XG$Q<{8vXtywM!RH45=HTvFpPZjvRb56!X>RMB$hxlktC?ao-i;lmKOo z$TV((a%FAL=9coN*IMFK#+SlHof8Hyx8ugq^9cv3G|cqZ$+5_5D}L81(eGIs?9h&CdjuFaJwO>JoghF_k?D%d1CjWpV-^~&NI`|4DE*I8=T7mEkX6&)c%4TC-ZJ)5w3z~* z*+q&fiO*e#jD*vo{VPQrnB9O5I5CX~dJjrY34&M7z6sj%6WSueF)T)PEKD;Z_27?l zTLJvZFGqx1g#MWfHQR?&&Dt+s5NH{-)@D-&MVM|!DNj9Er<#-~B)Hkg$nYNUBO{d< zmaWwkRltFO*2h;hwp4%aSu9Q=OA z54^P>&HU*!zG%+iz+}2JEe?1|5TZk9(>?@v49GmO zp9EBf)h5O&YiKKwc{~2~+2o1^MR?j1EzjR%TB>%$Ph@l5&6cv2H=22Hnq_l+`c&L; zrio*7z6pfB`BeI=a5U-&Th^Yh=oq((1xDtLZ^2Y;8ya*?bKC#ib}~mE7j4*_hRU|A z7g#QR7JFVks|(d_1+?z&3>ny0=TMUx2Vo>6Kxvf->IpakK9?E%U3IX`sS(3=+j=Ss zyl?oFmW=x*o!at1>G{D^WeG)b4sfjpBeC_qO1L-bYHBX5KK!6wxDu?hoef4%mzG*R zJ|ZF_a!9{@gUE+t8B!(-QUU(6iLeRZW9HY3AFVaa!t7>|6wgEWu!2ClA54dL89T0a zX9nAO-oKLGu5tnW58Ys!&dhBntx2+1oG_$M)!!qD2Tycu^{abD9|wv0;~wE)B=;+eteo%sgQ%1klWyy%=_yoaD8yce^0GXj;0Z z<7#SK;0C6sTf0JLng3RRRl5Ry3>~a03Xus`XldGk*}f58Rkc$jiL9&T!8_mPoOh7a zGYc0(9kjmi(Q&n@xrmCF9iCZFLzf8?DKu@U=sR61U3}>r#=Rg;Ol8Qgx>`KuV;};2 zqHd2V3zAU{v3!fo2^O^^iFC>Rx#yA|hxb8h0gli|JSOl!Xe-1^^hf!e0Lnl(g)}b< z33_d?DQ$>9oM^*+0s$uKy=%^Sl1t^}6$>Z!qKx)g3I1KQ8GHz4mX$!rIxecDTf1+v zM24KU?qXY@VK{{`cXf3YPtHURjbk>VBHATyzS8mIop?50_4g9fwurK8ItCuD)5}L; znbQ4P183Vb>S$u=Z@O`D$S=FXKh0)ZKXYx)1aqM4GNsoVT;AOwlq&`A?lu)sRH1Tn z%G`G~78U(lHh%&-XUCdQ%TkT#d=BI=iqf9^yi5Y)-c1HP=aZFdC;c_gIfJ$NCgBWX z@AixQ{0PaIbZ$;;rsK;;1f>I7bOgFFj84NbtA3ZZ`$3dH#R+&Gp7-32a(6c>ReJt^ zC~vFlRHBPKHqw>ITmfxgUKU>eJT56j|?;t z0vA^jUI>T)X~)ZY&Q_aqY_tJQw5>cJKA!aYS6h!AZqP0g03YfE^?tL};diubtf1S8 zfFnR^v{6;i++b!lt@HkQ+EaLp^4&@WS$9`K2<& zcU>*@5rqm9)WFmV-$x-Sy1T0wEHbg?oYJ5WUGz52E#wzCJU2^`N%A%n`F=*Vw005&I%)BaISrIRi;LG??h=jfL!`Ob+lCS58Z;CTsrVtZR=n^2{P6W;LM+(#$HGJ97}K11*J z_FoKZ18;l;6bUhak9*(ADIH@s+H!+F`lI2LNv1ZAD<~861@?ahVZrKZ&}LIqz`yMg zpBMSg?stgQ=(~vENzkjH63oplZKoqsAZ2-d_6ixs&rDlq-eR9M$=4Dz&OM=}+jHK$ zB-Ut+ER%fU^A1zGy8Y(-C&SMtzoapX3j@r+IOHwu>zr1BJX$^_bVQ{QGiLXLTGlin z@x(XH&48|?+n=xWn8)5;U#|46;s*}GxLshH%IC+OI+__Cvbc6khZmzP2xri#MH`*G zWlToe>_HkM#jHz1X(O0}aq(19)sP)Q#+yh$@Pms7?fv`T-*xf#C-kvIVTQGA@$Lh2 ztOJauFm_NMzn_;Lg-S%>>`bxx$jGNg>lg$CbkX1H^d%bbWWIw+bNi|E+TEMJoX=?J z@?~l&kbm@3jNJNY=#Ly(Ba94AE(VLH9@moMp28(8ZQnIdROpe>S-tr2yKc2`6(2=@ z@ItT=`-8Ky!=U~6es$^ZcB+bOO z(I#oo*tRCNZKtvK^X+5rzc9x$x32SC>k}z@-!$#0vy#96^O?33zrF@;nmHaisfmxz zu#&VvC&|gBCh)+I$(&N_?k+(wY_6SdE^n2|=XoIy3Xk8DDt>CO{OCR0m8BMdWvW{} zjE)iOF)}Uv{qmMkXZZpRwQQkk?6p2b-WD~mGAZKu@ZgILB;m;^)Sy6;%uXHv0xo2Td77Deu4-Lf5rOtF4tbPd6)cL{m!1B@i){1|Nm~+7x5P$2idNGiGJ=w0NqQ>v zoL~I(YNU6X8yv|q$7z7nAUG^a;Sl2S5}$(qN0u(n@%ClhE8EI3FH?@YLO)7gE*W>A z#|R|KoF?UTD5e#VZ5S9>|5m z%aVZ2Zh&ZZ!)A%~5rx2G)MdORZ{?RVad0@gRB`RUvc(rTL=S?PdF<-=B^R7BZKPmr zNU%xG7YNuWU3^*?q_lhO?Z7kW+^O624F_kbQXh>xfEF&K@#*GTx5-6bKIr;dI2FzR zT4L$^zJL~4Ou33@X)4~)_B5S+pG(GPy8Utz74@1M-sfNHF8A@-vcGEa+NX#gj-8*{ zUCaT3LejVi0(yTOnftXM1%z8-`=WD|K5fM1lT%B-3049XYX+5gLjU#Ikrf z#R~9zczfJmUbW-<@a3|L#iGv6k;RJecOi(80mx11=XA4npHHx8|MU6MbFnh7Wcblm zR(3Z&eir?y3l(-rNt%S%_a(>k+tce0+F~1JASHMc)_kkhwC!q2JbyXM>Ec7Be;M2~oiT3e&PW*%#h)na42efm6S0Ez~dZ zjlUvFLiQJ`I#*6S!VG-JiO7c{CH$SLza&gWNeGgaXjF9TSK7X|2dMia^LvtQb|rD3 z9gKhJGQ(=ECl5vy0~!{SS{ghushL@-;Aunk6c9)i_oYyI^YzL8?QJjm)5WOl&S_PF zdO3+^)d{EkfXRqgHWNNjW>dnon#`SRuyu&UR!d2tdT%+r`kp4+*ERnk(m_L}KSw@wXh zBn7$b47Ob~eGv>03}LDq&EfMKPEjH$Y#vXvSfU*WlvVbw0X_-paW0cp)s(SxE z{p$Ji(vnTdO)J%S?J_`z_>Rx4H#1{$d0`<)=4S@WoQ9Q)5t6Sv%bA#rjWn`5GF{*5 z%~4QBpsVvEGjqB4iCrG$YU0bgHZH7}-5m+oT0Fj?s(of@_7@fQh6&rv7{@RI`4X4B zcFnhwGfr+ta9bNzAArjT1uKD!#IZEh|1@v`PY;~qUxuF4QbgROPcI1$$8m^>GCv>L zgOycEjkD}+c~JrKd%^qr@v@x;u8cg)jCIQ4c+q#__vb}X)+1E-0u13PRXU)uTcI_E z4x-C!bX_~@4b@P`>ooo^!`v~*X#ZlJ*q(d+*w1C79V<~Tqj=NerDc2}jv`NWjt^{& z@Z&l+mly`d%XGI<#X8#9q=xW|O#R|&+IVVKmL)PYY#(JJ=M$nJkVPGV86Wr6W2Q6nQ2Q^JQs{czS(l>g)QOCuN*->vtbG;F^HpVS zZKSYRq@S*3Rg`D#Kt_QlrGAzr?OxZ5Ag46rc9~hVcgWA1WA@s5D~E9$29*=`jAwBc zyF_~WiM}gdu>O~kD(d6X)>iUlNDOc1+dp#v(r$zJ4;58(pM7?tGNN$(Jl4bQF-jt6 zH(OA|Mw@w-N?U`F96(P3q44V+3DRIpWjAST3K{7dt3z+sgR%6*Q#<<(4Sj$9hX5`8 z>x!2%K7X=^-6v@?fBW;Gg$3ByMGdt_>Du*Ez*-KV`Ti^ZcHr9q zmwO0jj38f5tCJ-ClYw4%rXGTs+^|Y5M6-Nug6$!oH}hAw$*`F<(5}K^g5-QhLL|}! zLj-ljZfNa7n?mcmGP$zairt8bz#c8n<~iBk6E!!nCbMhnyHM6SOJp$Zs2uLN%?c?d z=h0m)>a6RlR~>C3A@_lcx5d~GX1%MLvv^t>TnRu9Ey?^K|8vpDOi!_e@FRVfjy?~aV@OM_G@E4iuxl-iFOnbuNP?W5R+`F&X z9=V=p%fGVu;ifs;eVb0#JtIWB;e+Rv>-vWgr`BVNRis^ABM#5e!&qG{CLCCR33=f0 zj3tHDf9~#o7u!AsH+CNkQMscY$xMyk7nV5A1yVOMAH=lJl$je05Q|drvFwbaliF1~KYM$- ziEJG1RaL@!|9w(v!y3^y$vA&9lckyeRq3%J`Hkwv1OAPSmngKPGBNnQw~&I8{Wj#4 zXF@Q_NJ#<65SuCd^3r3iarD+BA|moX=;gyK1Tny`%>>c3dQkJjPuS;7;BrD5J{HKH z2#`71ekv+Nu47Y2)ixQF0IMO7KGtkQmTc48U zq(+hq&JaLA10UuHibU_Gu*$JViz~;PL(Fm&xw-uF%QiW>0{XZ%|N4+1lQvdx;R0@~ zNMPff$aF^$d(N5o1)3s@b3}v>gxm;)_5uw7*0a*i&hSk`?&#ynOyQVCr(&% zXZ`5J2Uw!2@GrZCGwo`onTjD>d33T)4ZMpY3K+Dd>IB-hbsS=D#=jMAHH>?A{LZg!#ok!jLXiQqw0LE<4D6`ehJM#OQ&T=-S2?_5 zF4--Pt20Fif<<3}!dFnX8qj!9JP6INw&cY|JH;B^(=iy40cdtYc zj3PQ2*t6O5`%x{sw+7pCVq!~m_4QK^g6~DWBdSKMUJgc}(uy^8=C96vf+@(y{7`*x zGP3leN~O08fj9d9D;|9eMt_k(j?&-%ZH1QF6E2zZwwB0=nk#Huk^d=Y`k(jspv9u=2Qf!l<*t zo4VYqF%c1ttq&c2>j~oVUjgmqvJ@iplshlx6;!u5NC~PtX7@sk{#V(H=oL0B6Xl4c zSh_!jCk>y9z!f!V2GlU7c?eA~?SgPKuk8VBGZ?NQ@ z5S!giHAnnMgD4ySJ7fHwKgSp%`%MW+?6;ebI|U{wS+2zFuO^3O3^KRSKA6k{gI2ZE zi@_$xAP#e8#LK#2F)sAzl*i@wu?+n)&IKg@HqoJ z@AuP0g%yu|1c}fr*ncJNso`2&ZX7k(qG!pEm=S6-3*X`T+*c5YxitYdc1lh(D6yZ$ zw3)Hv889t+BnUbu%zgoWy!As2-6TSN2DfSU|2vaVZN^!d)#U+pM| z7;jACec5r4!J*mMI3Z0X=_L5aS_lTF1|T_mTBISV)GVoq5mJYbW6tG_vojN z5&!*G`5y4l=8voHe|wY&NqbWi`TKFKhzt5tXJP&JcCa&WvP5W|`J>qU{&LY`EdKQ5 z9SK~8>vxl0oRL_+XZUWeOpmwHQ2zeV^$et_}kVrh>!?%lbdlm7OkR^HJwjHFb8;^2yZttS+(#hO`x&Y<7ByL~M4@67$l(2lrdQL^`Lsn-C_*uJ3z<1pfdg4Dx_zTc48hzneqFYcG;% zTG>P=;Z03#KDZ&Nj*TkNR;K2e__$Uk-&SSEgkoNBp`u}z0h{lArgmNW!$utj`i!B! zM3IUTyLGDUPvc}+>NN8dCWu33{w!Tg+$^XYK%Q+hLj_S3(#q0=L>9)FbCt|4OtA*- z0=?((MPIHgxWjQ>w_PxD@P#?#$LV6IkZ&2Y!PpN9b;jUr*4)Vupus-*3k_{LihzNO zY4=X0tn6abvHC1!W#t4=%PrUO6j)g@Te=E+eR(c%kg65Mf9frGS?(iv;xcP#hovEQ zejU*?u-0#D9J%xaRFywzHT)ipA)D_WE644Etnt~x9ksjkvj>hM>p;oaktGGl_#l1z zK_M#`Xza2MydK?l{Trr)bZqE9Y+n8sUp`=xwK{(HKv`=C9};?E(^yP%a_P-oMCu9W zM#7_7>Ifv9IPlAbT!8~nLSNXvrXd{fMC`7gU@S7U5h1G>D^guY`$J_8}l>lz2Bxa~FBVZr4Bli|my3PK(^IyOtPG#b>yS~Es z=3daVdHk=94BEN+g++1z@%-BwEha|Ya?*wZQT$i3xiLvv{Js%A7b-C2>Tk5i`K4Sn ztL=5Gyx)&>N4%L|r_D-IOcJZY9x=?`Zq#GhLoswSbasy`&)^a!p<;6^l;*1#?8u6_ zXDokOOe?Nl3bhl?=58(}l}W|0=I~!4FNp9Hp%vE8(a6YUfB*K?^`nQdL7={Jcp)Ay zn{^HkT1x2U8y@VdPAgn8bGfcD-Pqn%k&l7wI-hM~jAh&~<%)cj!7x^3Y1Ko8MM7jx zD-IdilPhuUtkgx9GOgh~yBT>B45ko)9IE5~9WjeUbU~89uv*FQ+s+a0NHZo(l*5m5 z4(kJ6#(X=z;_V|t0tW8(8oD{=u2Bv+)o}?n0cdhE-7IiIpeGwr$aTvV2#bp~sY%yh zG+|;Y^;$y*?H}f8D&&D19mD*EnMjH)$Kn%ZFhSB1GW#y-EoZ$Bm;PlLMp zQ1!u|S7?PRA`zS6Q9F} zAH6^z;XIN@AiMT9*)a#p=y!BKp4F8keJhut5?XjBa2cP0YL^KV1+uth$~C(t^1Ro( zLRjeH&4p|;H`Hu)eJ`;R5Sz`T-g^+FIV16rYwQ+OX(>46^J#0{tmhmo4=3<2NFI^; zP-SMYo_h$!Ny{iW{coo`$Fr8ZUM1p&^vn2_88uR5DG*%}_WGL|+G} zFd_y2k*8|iy$)nf;db*pl$+)8=TCshANd&jt;y0v02@@U2)VsYnT<`Euq%ze;Uo<< zX%9uN-23>U0Gil;u=?;utZA!OglK>~EM@Y=uCez!O92{M;IBWnf?bFa{@>J`Y6y** z0C=|-w?NWihmcTpnFa{N&QD~N?jZkSz&|dK6ZL5jNlZJ^2JVNVv)<%k`TE8E&0)v< zJSAriN~nUG#>P%_nbFltB(~J_p{Ql_&m^N?UxzLWkBdZ}WM=P9IU~Uc2pt_AeNTSz zhvRprNiZ;sh{zbie+=8LcyknT0s29)+P58Nd1XD4ug)ZB!7iqhGMG;U2CR~j)hjxn zV24`9W(R#B`Qv43nl#jB&~`AkAJ1V~9f4%E{q1^zsfzYMd^&YJ65xkE+=?dt{;O3W z{>#Xmy3uUp(DfibCI+|}J$QFGnnKK8vUL1xU61Odr+=ng`fCa~fgQxC*O7v6WLz$) z0z32*?IKlp1J;B%e+K6pYtQwBwCHbU*WImD5lAU?D2VJj>E)&m<3}Z;HZo?on$VIs z*srHRj0<^XXOUuU^Rl1*_q8heSr+)8UaZTDk z?g?Jh$a79*5yr$k}92s?ygTZK-GISsAPR9o7=!>&p7=J5OJ z!ka3^ROP9nu41R$wlxe)%L0Ls*YRb56grw1x>SA1kOZbpfhYs=bw5t;qG208Bdy`WHJPI!5tjA>(P z)u~>S5WR(?$Ok`%)8PxjD*NvA*NXRMK?+V6O^@BG7QegdNika*)|$2S^{6Dzp8h2v z1ty8=w5XUr$ItQCFDC5nZFw}l(K>(eP&D69(Yx5VIb84Ph^3UOkBsCgFVnH(=8<_% zE!=_cQ%;_6cJ=BkDhVSYs{|srH-|j8cM_+k4A~QWU^dxV`(w92R;?=QR0=aeGNKjd zwfmH0ZMdJ`G*RFj-S5Ic03@8ZpS9}rSzW9-$?uMT1X)rFI+Gvf3xk2Ly*%eiH|q$X z{wz%XN^_Q|*7*@o+OZBJHnTIJ;@O1M*Zx5~B}NDiq0liTAGlU>cfUXo znR47B!=fi~?n#zn8zH@wX5^0wBohGa6v9PYKjSc_T{aM7%J_BuLl{qUK)4+pI zh+sveZ{?GgydI5$&*m``e=036Cw_S}b>z(CkQYJ4VQG&SaywGq&3(w&d|znwQKwCr>c8%a z9=Awex<9u!HEsE}e9_a&Y@nN8CZm67yktn5ov!!4bnsiCkQUn6(=K#j0}Zyd3qL|z zTZwtyJz%=szA_=Kv&#V11B2!(^2|oX*=K2XvnIu(=P&9-8~%&BwB0r7pCf4`K0OJ- ziJ90lU0n0tU$XG#`<7Rx7PX8v~5$q{IpuLU~`#>?ve^CEIuLk|cfyrdgg;Axw75+iYI8|dkQ zYkeopyTlOe0uC2T^YiVNaULhQhPRa}_YNTwoU%Y~H$&f;-C$7JM@o=kD zb?o(Np->{!=t>>7h0^_27BjjpAJhR)ArN0vL+!wmFu9lv*)P}p&-dO7X{Ta!T}k^G z=jZ*&$*PnjxJ1GJ?Qu7@n1&3D6WR+a;hd7`qAisw0i%ixBq@?6NcoUha5l1jENMhK!FFOiyEV ziA=5MT)!;$h_Pke9o#%N*jfl1hHZIoUQ!O2EN~ja{}2In3+Fbe&Pn7t!gR4&5%Ub` z`E12TB3=l3oJ}n)0Y22Rrp?N&W)EG6BeYb+xemg0ZvSMEQ_GqS(nv{J-X*ch@05D4zACbkEGaf4KcLuAK(wl zkOLPhH@%n!Tdg!tms(qvDCC^D@agD0udJ{aOdWD@Q5N$hnUkmPm!F-x9K%dKU(}I+ zYieptbQ#*+f9S!9|005Li^cC2rQO#z`NBfgGp-(4EpHn^%%27b)cb&P=(0S>O8)&9 zL}vDRzT8}96x2POJeYu0SevL=G|FLt`DCUB$L{XVfM?!V=mav7o*CZT_zJ^%{BifV ztLrJ~8puD+7OkIHuR=GsuHRse;&Db;??}Gol0t!K&>Rm`!?0mf#_@9$UKR}%Nr}su zakGbFTae+*2BXEPuzye-4`W%|jkRA2%mp3#vX4qUKWw&HpT*Dv4AbYBHJ)e*Z z@HcL>!tLE4#=4rCa^voIz1eT|!i7_bVdAQ#?D5j(FcX6@z&J24vvg%?hmJ5mz=f_J zM=Xao-nA}+L;9A7du7HtUyu3IASm)5YX$fl#K*VJ z-96OIrQ0G4^y4c621;%uvtZprO@@$f_@_BwpPdDeN}>&s8`7 z&AZc3CS46al4NW4!f-UypHSUcG3cLx3h%cXLXw!1=|6wf3Ky!XE>4LZ*E}K*n<%9P zz(KT`|8=StZpsiQM01o{tZ|TTp6@S#zo(&Ri-_#U3eXz{v_K8bUpT0y)(Bi+G8@3U zuVY0JQdl8~QINn#Nw}QM^*{2$1e-%@`<$NMUt*;DHvnaZ>*h-9Y#?cF{QxD zN9o`jWiFn1C?p2=^)2f*wZ{q3#KwdYuvEIYB>)L#{q^ip)x3t)qzLi5WV*?wrgA2x z!0u|-Mm)`}uKF7Uhvx;nmPv}6jFJMgnFUtRw9L(_vR{MvTnb|pOPXblNZ=&-N3(Py zVPCcVS~^1-4y&BV8)x^8|LFo(8NIUR15Z_xmNV;}@mcNZuN^|rE%`EKBvx+K%-wbf zLdY?v2oZIOfN$8$vRYZ}F0(ni)Yk`LpsM|0J(^7Z*WfS5*o9hIYia4{1X`2yRR_cC zhpt@*9tUmO$q;bQlpE2|r>yhZO-G1Xg=z_U@vMoZr77nLz|nQy1>*$&etY@rrsH5m z0gqsMbKp$~UtVSCNO;N0f_TeST8%kvasD`)M;0xKlv~1WKkDIOl3HZHMB(Z2g;w^r zifQ2yT?$1S3Y-{k9)a3?Tw(u6((Hc)pQ}8jq{8MJ_jOwI;z&lEnjF7;xS+5pizW5! zOCXLmH8rKv&>-#`O=&XH|N7Nq!uGa)d15)qPB9!4SC>e&?oQzG#BM>DUucE;pIE&2 zVGcPwG;lsP=Dx+hs_iu+Ks_>Q6!N_LUqlgQcT=S zcRdG!#Bh^=KmO2_pV)({>GLL6?RuntHGJ>W z|DR-HLdf5zy@hXSUMnJwspZ&vZBa(jvVwf?R|_R#nbDbaY={e-j(ybxkaA4hct_cSMcTserLei!=>|0 zTE?{LC>PAt+Ykm{EM$K)SgG`sJI>O?FMG3fo}y2*RQNRZydu%*d{`$1UylgDQ^$i1WPFnG%@#tHUYP=Ub~$P;@;Vr0P{(zdj9` zVDb79zPxN&%L5@WJQKE+T2xRsYxKXTM9=lRsKG&&zd5GEUvzvE=cZ(Od6wC}w)CbLNC%i4SPoI<_Mv!AV?#mr(U z?Hc0{5SYXe>5)T?QLrNf#{Q?>(1%}TRpyNc)1C_cPUzi|O*65iYdHisyYM5X+lDITTgv&BB z;?Y=!E9^G5JaNFs$;3p$-D#SJ+R~15?K8 zrm9%+h3Q+yEc=@%7O>pxXBkmO$$b}%FHotn;{N`6sUd`^r>CxIkWkB9s7eEK#9rDo zdHuyEyXhJ0_+lh6&?k5)OiYj)V(-C3gJ5o_*IMg&qaq!>y5UFl;tQ#E?l>z%^okb( z{(|LpG8c#fD_rzPQ~rjrT8DB&DH+COpg`@!T_0!x_57E&j1wPeJSBn=Tvxj`=zR-r z6#wFVvDWp-Z2%)iAg0u!7v*c7=5&cH;r)EJ{95pzd`gOkJY`wgA3TQlt!t;&jqch> zJ`zU+&*W>KhU+16lmHJhWhf*#lg+$b+0WBfjcV9(vq^H#ayKiao?eXQ*^pyVmB)Vv z-T&{CUA7akw$*(ZrZi$+RASUoS8sd|nBpwuu*}zs<&GBTKi5bOrUgon-bbIeqgY-s z_crR0yx!a&x5Oy32CDSLtaV6<`>2p=SJ@(i|0@9c&>c~N&rQ~Mm5rfPBDCH)c!Pu+;s5wbI?lXrR@-@nI7v zs>&^nOe-_w4Gj*-E4zi{7oFBu65xi~TVZxR$?M~O&CIG|9cx?rh(9Mp`)B}Nj(=0a z0>9{0{wxFjhi2@bnkvizJ)HV{v6{`=e%YjjB41AXdZ%vcWa~N}6BCdyW{QCAxdDh9 z=F8h2d35+yEw0c_-EIb~8R2B^j{n+u(#usj4}`4(!(6d2HgchRo^bcc38$bysPLAu zGiW3%H-7y1rua-csSy1upLOn4`zOD2<1&|)*fRPTfy=!#mM&~$G*hjTagA`vQ|)`3 zr>tVq-6921?>*z2LmDut(K6TOn?pxoGj@bHBXHx#)P`q*SY+~pwhH1sZfJ63ohOA5 zazt1JNRl@(sIX7!t-}kAP(!SBMmg78g@x@ikMDxZHBwGaCff8kA@2wfi<1*FXMTCq zmkx7p%sqQBU(Bvy!k%+5;mw+NfQh?Ssv&Bq0`6YO-le0}CR@uY&yr!Qghm>+<39by znu%SxfX}THw{N!tLcse?N3CF8)8h1+UxG0i!B5pA6w{)8NPG)FYMqeKRWKYh1bqSS zveMd1Q`-yX)mOmNvR|`vVAE9RV>d574P}nSw6QPjZ!EgHT0&p%@$B)cgKxqvkxR?9 z9N5ZQ?Df4M0n7bBjvh(WazZ+(96)YRfk2>Cf1kxluACgnQgIB_qs+lQm)1pJoFVlv zn9~b%T3POlTO#<6bI1SA&xs;WQ1GP<1CYL925dvC(QhwS4kV3~=}pXV&eoo-HV!bM z=y&?LZL|+HC)DqFCpTY~soA=W%P*oRs%usS9Fp>;_4RHiR=#ke&2VB$N%% zz)^PL{ii6n4JEcWh}K>pCg6^&KqVT9eddv84Tj2(rtmS}S0^cs#DfYu)WI}5nd zKl%NheX6BZ`0iKf?NT$HXU;%BN=vVs3NOY!$D=aeZuqnbhx4y(HfSLX+u}QD; zsjsi}#3rzYcY3DW&(g3xAQcZJ}5uE0?VV+}J6W-t>@ ztrq8c(3I_`x#dQyI)|`X~_U+7)SW+^+s*8JQ zNM;rYD+++b^#&Z#IaP=F(qWc#+jKjwP)({y(LNZ{3S+9!~mgn|CtT8A!O^2mZ+%$Ivt;)4L7do+0S|RvzFI3+>f`l z!y9C1boooT9vXY^^o##3^ zaJI~cd)IR+^520CrW@W+8)m<@`#=B-%&{8T)N0HW}f ztl`T!NMVqWZ@bI2_^a;YlX>&>hbo2BUaaQm^qf?`Vf66EdHT=&-6Ak#KH5Y*Q(gqE#$mB^qoC{Kf02Nw;pMEE25 zNv=(%2b={#yq^()Of10eQ%J?Tzff;$OX%>OF4t66FEU{}dvxX^lj1_FXSA5e4lYLG z70#6{D3kT=a8F}~V_;w*9EAUM4z{O*CE&=XDPS^4ANi(akoZ&dN1M}UP+up9C77OG z4;`V?&)d#!%vO6P1S2yen$HxTLzpaE=;b$r%b58UHlRsMa%?K?NpHeTd)9(u=Q^f! zgH{H;&+AW{fWF}-K58qqOq%)A99=)>>6yplTFdD4bUq|y%whllv!KCmhU5>Hm8F@r z-~`{>kgvHZgktkxk8N_z9#iT6XT*&MID)-;gR6PT@`%tm0GubkC;I)1J_+uPV!#*_5V={xLLfH&*E^~3#!#wPPQk$S2d^uyRpnEXG? zF!O2Qyn$L)iDS+f6*ceUnW{4n+x6Cy=jSF`8}K^W&+W@!R&mw=l8K9j%2Zb&a(N_uuGN#@>hHFW3JHn3uZunde4W9@THDjj@yv3N$7_q(b*A=l!21QFJc z+pk#^PCSnM;>yb%#QA?Fii>p+|IIA~5Q|lQyDlu3BqPniZuVCyta>)Lf4uww^rEL& zCT*kQRjlE_t1`7*IkBII738y=W2lDn-pAtiSwWbD@%quYQ3+loH5D&ZbfslxHMHnx zF+5x;RfcJf8){z-GDip=-e>F+MT6P)M(j%mgGoTZc_zX9tw`m17>f^|!(tMws|zR(H|r|Y7cLb4 zu;Q~2V|M*;iU z_c-w@iKIGSHKW^lYj_!8$J1j@H<%8XZ6@h;FIqfOSr7cEI zaFwB)7@c_l6O7s7)4)v#fY5~E1feb12TT&OMe?%Jm1M9pxK05Q6Qs5a34YTo9di82 zyxDWQqG-*zkkbbD8nw)%{^5L?o4` z0c^t^hJF|7dQNfI9u9+aX290wyL}&^p}V_l(WsR3@J!-m7J2^TvDoptRU0ug3DWTNc53L~Fu{rs(|t(DJztxBOJJFw zoLR>rQ?$@|zf$})Z|>vW6Ij(tR9l>3vV}<*)1Yt%%FBKlu|^rcXr&IZQvb4ZFKUYn zqspQ>o@F`?3OR1_6=d00<^%;Z(AwM&kvA0{_3BMrXKjx0`L{mpNH~79v$C?{UMVG) z?X!HU6xjRLlPk+rW)uA$xFj$sQah>VC3!ouQO0tG>lz^4a&O7AQ=-v9&|RS$hH?|2EPfz4H?Pfj1XSq{6+ zHP6rA=u_T@L>`Iz0x3a;HWp)#A~%PZI?dG;r|5+E*$NuUdyav+9c~fjRT!b)rnV>w zt*z+c*ih+YN|lCr_%bpCJilNoYgDD$x4{Op#wrf8-#qS~G}u1YTk}Fp07I~{rse7L z4b^f|v(|1FAx>cB%UhOQ-SYm5-!o@4#nF6ud>K6;W+oGW&!BC{g_$8G6joJzpYyHC&7VF?iz>HiMN54FVj9}&Tq?{Eg|CNBRy|w) z%E}fY=7z4W<$c#g66y%hM2PPjoRd3wciTSv#~Ea;4D|Xz>%rYwG*5lxy`)10AqrO^ zy!8~ckTyJOazr)nj_#%ONzS0@>Dn@W9o?KXX0~mo!nUl&bHMKhE-fuBqmQK0OxP0< zb853EH(riV8+B{*6?4MY)(P5-huEefY+T7HI6S^xIs%+-UtmHWg0Tkb2402?JAg+J zpSM;z#8`1?W?a$Sub-uZC@kIGBX?=TLN*)Ec|mFyEtbpKdvsM3wCuls zH4F{AcR$^~%%X>-W5}T}r9t+Eg1QGkp2$JqbrQ?_JF#otWZ41|%PMUEZsoe>rdqWr zLIEM5IMQWaG?yrdaQgPdVRpF$B{FmArqj=?j!WKDvCq<8{Wh8cu$R7xygM5i{b+T9 z%1XbotgEHKy%cBJD$H&O0$Ypz%LX&;SLxr(&HqiIQeKP-g`S&s-XDD2MC?w>e10A> z^mFEmELKaYC_k;U-weShES&?A*`L!Gl$dS7#xg1i#w0yPwJqLym`Cevo1=$+$FmN{ zp6{6!HW0ofdz>K}cIuUuUh8-8*Eoei&(MRxmlA_jN0{i zy@p@}Z&$nC+r1_!cFSjV-yC9TgJ+Mu3bt5M-aq1u+C0B1=DMXqT=>ta5wDL+8fHss zq{VZD^@+(O&9z0mv15lwDYW{X^Xz|-P4WfD+qXgW(YOiyhuMDrUCDPZKD7hYzMI;b z3-(TD0Ufqw=b;V_fMnWr?~1Km>;lqY#_yE|Z$y25TOJtAdOxl!1_2wAF1!qO-MMm; zZfHL6h+!`fN}-%ex_FmG3fxLUZEfS^`-9qL<&{-!nC}75(WZxQ7*%G&G+PmK5%XT0u8|j!Z7glSA5+=H264 zm|)=9j>Uw4pVwjp&J94d*lAd7&xH5wNcjeZAZBEPtf7u9mYBGQGeAdpA4CBpw%{N; zveZ}8QVpW{rXz_=HwQJvPaKecAzKK%8!%D~TB3}alI1+9gRQ8?%a>|_4ZmrjCt0cw zvoaeCwA^0&&QtLEfF$KFE4TS9#~A{aZ>NjjNl6V-_i>8=S$i1djtWNTuTBiO=IZt7 z;Q6`xcovw9E?!;zHinf?;zk{=RjSg2{c(cF5WDlJ0Pz{xMM{=6z$H~`SYEoKny#Q} z$M36f=FRNc0bR2Zm0_VUzW{1mnB7mSASQ?ebr_QyTtZ~ zY1Vh#z7aF6)UdaA^WgZMr|&$dPXAkq9Xj04%hX+oiS%00?Uq#xbzfp9hfvXaqVUaQ zNj_;eJ5{&xx0wuVT1*H+Sij>lHZLCjl5=%Dl6pvTn!fekDx${CvDaQKFU$V*>-l6p zBsgBL=|Vp5@=NpHm)k`(kMo(WtfaL<8p!iO82Q3jmS))QMAJraSlIT31AAV{>-$JS z!4F1AQKIhbQk6fG=W!xR-(vz+6IBYiALhw1n{}oHrfw?KEY-^klo-XAglMWKY4)H( zxJ>R;rmUhTBJ3x4etw%Y$i;FU4i1h334#193}`@#oU3=cCNs19WS+Y(dLmmJ4^eQ}=@z^H zWh&`y_|W=P6ZxevdyS`$T$;9N_X;DxXd^3s*+Sp5$B9yALfF{^JlitLx)X-6$<33igzO{ph1RP z&3c9=BmoC1Np4jAFzTfql&bsd-jzomh?ds*KE6JR)nGA3 zcz$+f;}EN?CY-QDjOdq7ixmXd8W#yBtdi9$hD3L^r_;89tQ+p_I znxjsscQf_^)0^nhiIucXgZPu~6Z+_4ozv4P%V!lghqkJv)*O~5KshZt`!-kLFg>#t zK<@H-pep0~_CTAv%&b)RRQwfMTwD7=k=4<)H9SdW%K>omW2=r&O`s@pj_FFQshW*#y=73m@~$PScI_O6XL*}03$wo9Q962L)PI{+jq`ubd%sdxjn ziF1K{Fg(y#`>G<~b2~e`wkGfCLf2Gxq+n*#rF?6He_qUkyXCL%yP$aUK;dYI6ZoDE z(3Wukms}xU24u+8x{p0xPZ&B88r4(=tNL~7H$vFGCjMlPF4SD zEJalq8%IeY4F}*xfpkaO_%j^TxY?NO08WHjqRh;00y>Fk;z-ZI0e@bVk6(7B+LhCz zBB#)&sGuOB-GAS@uWQ3SvYx^&JsJ#C0%B;x&_B(G;q4=VymE|-N6iUPA9zXl*1~HH znC{VcRM>G%@EtZHG%IOYBRlk`z54Xr5uv=B8UBW?ZxzXu&}EK5_a@7hppY?(+$G|_ zrUY*k;1V_AaD>fy|A1XXuoIRFB^}el0&{?si(9d&is`w`FEu)AA;|FGNv!xB>N2=F zv|B^{oQ9vtzL4>YH|2&=q);R(93nwZ!1Pw{zBu|bVe#}ecS<1}ouz=<=>E>QDDkNqCcg3)C1pCqTuu&D7@jQa z!7QalU%YB>w{jc4x{e`+Bx52Z_0^?8@$rq=z-Oeu`nP#$Qc^v|QW19LDS95u;s%+6 zLowY+l=u!d=(mwqrG1nEi^MDecMO&D>I97FTS<{CR<1F4aA;reB8Qm%e@ir_$gA0N zblY2K@4gZ(4_6T!cg9uT-PrkR2LnRU3nbD7^X-l8W{d2MG0ZRhvxq#AXN++TV9LH~Ggr+zbie}$nc^;y_Ij&UAhR5e zEgK^T|H-yDHQ86M+~uw=r{{XeG2^CRo!b-pj!TP_WFoG_DZdKsRxN5NJ)&6rD%0T& zSuBp(a*_4iM9x4BTPRgfmIFJ;D8H!4!NkPH>W{fwvNP|*Ht*r}D^xJJqH22rX5f_^ z?XhO4I}hDB2CQZ%^=^#Hq*h^AGCTqO)Y|iEPZC%T`bd#7WEg53_jDv=UUXJQy)cgVXwH1Y(sj&}YN%bthLWx-k<|giAP6CqBESgsH@7#G94NV`_&qfv+&Q^;xh#?pzST%p-??@CqDAMH*BpGZZGda`o|iBK{OaVY~U{*;@yHWHaEd$qsq3=H)e@7*mr zmR53y^hhBV#u&rOlzk32CLHVulwzZ(QghuXp+CajKNJaU>%6Z9JnWy9J^8XtK=)TkEPcIhv|*lJ-vqsroE+^F7a z*iIGa@>kvw$y^0Vktsc?u^vsdm(G_mFpD#RwjwvN3gf4pF(*)OA;rY!b2`EURrZ5x z>D^ttCS6bdJ3aF-j0+Y^D6bV&*)yv81N7`fX-flKAzXJH(AeDFE+IFyOomZ4?|tRL zam}BfxyW{COyqP6+M;N zKbxupN!U`Q7*g7xwm2daSsCqDcPR*Y#yNwf(KkRS*^fGit+=$roToF?3XC05AEirrus>Rg%wA&WPeYrfI+ZJ-1G6RdAiw#q}hWg zm>7a6w(T_P83!9>Qd6u~R1H}w^j~U!-SBoju{lYWH07`YN*fCSi6;#5LD--QHRKi& zN>Vk8*xF}BK^B@4k7-pKLnX;^E8k3!etelw0 z0Kh^3DD`M(Zn)q^0KSC$_{Yy)y;{9w31?Y5X!?|C-cfw5%O9{%n$TY2;q{_CeSvTG z%mPsGdX36_$>o|0f>p)hzL#Elpsj6HLqp*G_v`lU3%>t86Asr74TTxT1b_$(zk#BK zR9AKAKs>k9b~+bhSbbB|iYr&3Lc!j@-~7ivz`c9z;o*WHcreVYR4`o!MG;XHu(~?I z^FdwDn`RgQn1>(c{`D`^=~Q>^0y{eahCzph5+v!DBnSinigH@kbsVQ~T#v=vG@Y0? z?^Gx>T35H1AikrjlBzBPYg7l6gtE=>>ti5X&KRSvLdE69?`^tn*N~dRdJXMuSJ`j+3UPq7z5VKp>Y+hf3&{qh; zN+-(U);x%pAjpT~jAeB?odfZBtKWZ8mTmNcAzlQG2XX`)sPEncrxnewe4j9LY*XB>W>M6pY4XB_y-w%0QfcIiFYX%~tD2Yy z^L$|2HuJUDe8pn%&>`gfd2`=BB$tD{UP@K%D_0OnA}SRXK`4e%OQnD$We~&x!}Oj# zMM;|4wCNnf+=2YA9kKR@+R#Q}LV#1TlagyYFL5?0@~&ce=aVMn}b=A+Kq2&p)q)LRVL;sH&^;27~9? z+Yg4r*>mUKK7YQtRO+g(z6r;B3I$rz!T^v0fO<*dTU(RR*w{>uhmd6f06x0mf*S$& zveDT1v+2{P&zlElvnjv7-ZXzp5SikKLf|he@!M)UI_?m~4LBY-d9uB(?#$uC->k2X z8^+gPdTEi{y`Z%f|MQ>0Vi7!lo{q&xmMwhzv43QQb-M>FizNu$>C9K$k~=JD_!1m{ zK9%Z;$5*$vW3Ro26pQ%C2&n6DHY?_GVU9EF>j964T(N?eWv^*UhM~$b@W>N2cjht*yHp4g>(61HlkQ zMNl*xj}vuu;bM^qg}MPCmPqV$(wF#F1cvvj^cNI$TfQ>EFqMg0h69x}q4Hp+W=A;OS1K)Gn6sv7>iPo^q#?)@h=#4fQM^jB^a90jB4WB+#qsfQC^Sft ziCAohf6E!=-hwQDO})?oFWZSN*5R+E_3CPH?F3#UB3Kzk`BJGN5{XBnkzlZ!qNW64 zF@_BYBNo(t55iw?v`~<%;`A3lu!uFLL6-#j1bP+E4Wc!ZxvbZ8Wi2ORCb(OCI|li| zTKxA39$}Q=>Ya&reL`>1`L-zeJNeHuL-z^joLl zJ8s7By5@A2qtPLMeT`+2=g#fX^)-Hf{hM#LX<9Iqg7bOs;fH6u`YIfY!R_tk%a=)2 zH32|k7)PZtmCd@!WkeJK9H(c@NMte|P2(jAHBITj0SL!Aw;OJ6XFZ(g~nAzFsr)fPLmgmmRPM^-y*Z&@dqoUZ$vKYhQ zKl#b`1_tg~vLt!zSXH@Pe*AGc93I}btrddUK;S(X9*3WO-WPqBedlPXbKtc5%8VHY zibYTq$0=%zxfN}@d|d*7O90SyLkBkk@TFq&<`-tox+#;fISvX0 zy8V7NnY_-j_Xx}MS6=x>clXAXEAf|Kp3~OGzVnU~g67_S`^-Q7u^|*{BuVE>FIkr_ zQ5xMkWJZ zyl4sn779(3%i&_N=yC-J0)FbLOjnmL9OloTM_n%d;6e7-F~u|)6jgIMMv_2ThCvXh zsY%JQ8%4{ZP}=PlcI*g!{ITkE!t2-jVzKd=GXtqq|FmhxFzhTv#SlavAKwcAlx5)* zHEI~6F#H0B{naoqUTk8RA({pdWD)>)o|kHT<*NH2@rXepT71^Zs*8PyYUb~I%wcz` zAj0!oAm}sGyxB6kQLOBArlE&Z;0fN|B>8H^c(NfJPKu)K6Nw?EA6j?52H$(P3V~K?5Umu@$71LlF%~0yzUHE8 zB@){uX+~q?qGQKg>9o<+#kk$v-n~A{@(mA@Za3K3sY?=3C;+BOH#Fqa=>X3QlH}7g ze9xZDg$sTRs~k9>ojHTwd8Z`^2u-^b#jdW-IvfuFPyS3?tC}TdBpYVtIk5f z+O&xehn3Zwt26^n>vN&os+=<;P?VuCG~@m;&dE?uft z6e*dcZCiNuS@`$AU%7ujQd`Rq#2Hy$L~idy+{)a#`nNIQ9QmSrJrZIx`6LJ$!} zX~Pos zFy?lbvpLK6Pyu^ehJUWJ`?MIpmK=`4)poJ?q?tQy`u13~ZQC)>Ux)wi1qv3qr2)^O z9`B&fY-*xYsq_<1xWD)!^X;|nUyfzhZR59Xvm&3+w2dHX9PhR5VH8c$v}B*$$0LcSmbCJLBj*)QdthjUXmk-_bW zsV%DeCLQ^Unz{Wpa{YCntDx=M>v-uRR^*D4Mc<~R-N0dci)_1^%Pj#Vo7FG-1Oac^NZ~q$s_!1F`99X<~rKT~Bje00VZr?5s43wLjtv~&# z@#@vcqmRmOzfBqjK~Y*q2Qoem4-GjI38b!W>eMOU=xBLj!c#6YPd}aQ?e#DWH!?zN zTKV8XNY_jf!|qqrZquB_aq}_kGt1J=pCqVWZsOfil|Xq_8`SflT(0c7$MM32@?D7b z-S6s;oFX26xB`OYKS!*(I`E!xbVU*VYl$r?=@nwt>oV1;Nc-lpY@}4$efo67;gCF@ z9mkK$ixxGyT9UXT~ zPNGMT8kr2y)KrK@!!%tn3rb6xi&X>RzJVbDSnzj%$Rsa~j%2gdijrX2 zHW-7H$OKOTqf}FHD=(($+Sp>&D)_uEU3&%a$Q;z2!_K zsO{U0zyBRdrD#RT^z^vK#_V(&E|m~bl*(mHRk^`Iw)YSDu_SS@x_T z6zl7^*mhH)Z~((zH4KnCp45jmVCP=Q%7ekQ1s5$VW!r-N7ZKGovRo$oGMrK~uFbw3 z*DDSH|H=#chL0?3kD|a1YO)-xCH^>um4$fN9lU2yyk$@_+w#>DWKbZ$4u`bq-rJWivZWSC3<> zjx6HwS4QDNmVB>3?v#xx!V!eWPlcTKCHPk$_N0M4XytMbeD+x_&(GPgq3Z0}{OsA& z9S->7MQ17n4-Mgh0L+}3({;Bbl~vW1$q3*4rqtOR<2Bpj(P~9LXx@q`fD3Eu5i2mgrdhpu?>HD*jl@Ks+tRhZUVvJd+#kR zm%*ti$g&U^R!tKJ0O5Pz(?0p6zPehiuUC3{v~}woM~_1BI3bEt9OsoJ)G$EH0{8CK zhlbLvt+_w^VOBQlIB;MAMbXEP`{vJgrqh9*9-{G)-kAp_J7bhG0176%uDhm9+bsxb zP0N?dA^>DDY=LPSiZTKKHx@u|1mH`+u3b+rUrxE*(v~d?-+mhig=nYK?(D>xnxtdL zj6{MW$!veWuT&}(3L#mxH4T?#Wc_-sx7R7l;@7@roI8iGEMgdZHVcPBMm~?&Hl0iw zJkJ6^5d=Mp7JV+usAZACpz8I0R=&viM+*}xXZZaKFbtlWinO$NdV3id25mbb%ic_e zlO(rc;65MEvhGl*l1%F5GW5g~#wVX>E|&vE?MMVv&CIP2b)@+w+g$yEaqT2D=Qa)tkz|xd7LczDQZ`y>5j~#V z)KobfPQ!4;78ID23)(_*{bY9TEd4v*(NDhTB(?0&gy)$N0Gb9tQwXBQ3q-InmAYGE zj|j|H^?ZJV+uat6`Q7fafM%I3s<6?r?LEn40|aerZ(nfahzi z8IK!0k4~RnxqR8hFxJyg%O8JiheC|o4Md}$Z4=QbplJ>a%T+1?RjsJ1U)O;{hf<$@ z>Ieq;p`l*V6af^EAM zrTqBg@afa0*Xz@?3dezh0F8~ol?v+f#iG$52$p5pZ&}#4zg>XgKHK)5I6;q%H9q*D z`|x2W2zstwh3~pccDw2G=MA2Zxm=~7+8d7oO&dUu4Onb&Y%C&*Bh#j>L(wah3a#r+ z0FVTLAKWm*jR5@T^V6TgGiKa9Yu2ob7Yhvyo{o-eGU#Luygx2}Qq&I|z(31i!$>I*fZB)bR)xHpBmgc4$W`5C zET*Q`JzDc*M=nD%N0S$(M;bBNsiP)&k7uiaQQMfS>3#QX!iW0Ca zTGQh5=ey%^qhP7KciZDv@Cb}fX?RNtLO2LcIGu`>s6Y*satQSM^TnbXtQe53XSCaV z>-)L!T5Z=Zq~|CJmCEDU&@XvvCx)U0w_8)qtR@Tz*uNE@POY zD7(S%rwDROHXE(3-bYd14?k=um5A~2oMrhjER#&4!^4CuyEP46yEZ*A;MO#C|9;@? zS&3zxriqM=p}Cx4Ss;d?ZEeN=ehNWK0N_?t`Fr1!PM>z;xHvTh8V0a+tE4DnO-;?E z(uq*09{|R|mq&0}POP5c^|FaXYfn#LWF&Ct5EzXn8HQTDTFhjq>T0yVe<~by!!W36 zG=flT*T%10aT@sj7*I$lw2N zMx(`IQ4+=O$;r)wsi94KL=saoV}Pe#{`6C8#fsZXrM#l#T&|IPz6<~Z0C4$+9Bu^Q zKb-G=H?Vp0A_OUiLd?Vjo6GqxTqsXXc?$&`hCu|uTUyeY3}acUZ6k)E+Y zCMJ^Ma9gq1j1E? zTy~KYQEg@a7qEXG!&3i*v#-tap_LLc|_w0z^=Q`yXlHBGdKAZm%7=59TKbMnc&(4KH<$S(O(+~*4nGB%o_`!q1 z__*ft;Shvfyog4lXm>YSsW4t|BApJ5jBsOPu0nwkMIo0vY1`e6jjMQGjm3=qe!U8e z*DRSsk{Zi;u3klXetg!f)rwMy$A5mq{x<^fpUKUwi?& z-9eURZoM@-JnU3eapz90yW6<+R&s1CE(p$i9?a)SNrHGDl4U3oNu<+00I2A?%eLYD z`*Z#MECh+0Hp#uc@RlulG6}*kT`D2lw*3ZzdTl#}AXq-tqCf~D0|1Vm$9Vt%AOJ~3K~x-#>ZXa-*YhNqwygA= zIVWptCmR~po95B#Y7mAuy4^p+aW#{ftf}cy)wpdhhGCi@HWvz`rip@Jzio^2=Ixl6 zIA2v23Ww)iyOs=xL!x*g7!*0~cy)Cj1f{c$57g}FtW?|>mech#1l@z8B1Oe0iqrR` z$j?kVk%0aFYE{({0s_&(t+UuaMEQWl-Te&w-7_woP4y1zk3MQNG+-w#x+W`Wl63d? z2MmJ%3_#aS5G6>`P!!s-D#?s}=#YNpB5r9shLXc$h^AR~3}du7?D7vys&fF=Q<<8k zRh_os5u>c-#&PCfpp4-A?X+qlJdET?RJ9> z2awI)$}o&+W-RMI%Q|P8w>un@w%q{34ppTwi~@jH8D=~l$Nhfi<;&BqU29Dw0-HB8 zg+kozMwcvc9Xo~`Jm>&HDw!l%Rw)z^6lL>yTvcIN<_N+kNeToxAPCvIHF514jUej1 z_d;KMVYuCHRV7m?QxI5Dv`rI*AltIA+S;7Ub&Vj7nCAC9oo6_FyEQTbJy5G@w^l0A z#>S9o_Boxy_4V1-);C&P`#Em$s$Xo&ZCJHn!RLX%$h>*WIqp=c)V6IKGB5!8d_*dh zQq>^GLD4A5arl}w(T)xmP0OEuP6&eb^Ph(dgBTw-G_BCqR#T}sC27FnSUNS8-gQ6W zaFjVj_*jetK?DE*h9Olob<<7WTW&v)Y$-25*ve}+#(;B^AqF5|qm^L_A zwk(h&wMe9|P`C&HKk@$cQ+Yn4Y0FLX3IJ?EkSiEgqNp@-a{+xvlw=J7^n}aj&SVA^ z1$_3|$dMzZQA4@yHpkI^c+zMXn+#qbPWk;cgM+RsS9HsA0u|Fhh-J%+WKvfQ$bt}E z*Hkq*Z=N$A2T-%R^AceJV5VS|c)C)-IS#JaI2+*#<*>%*m)Yp8Kjz;)uI;&vF}U>ktkpLI^aByKy|BD06Ik zDT;oq>y}~oShjX_)S{^A0O0ui^J+<|N06fXD?O!cbr=@<{PRV(+%n_zX|1(2uw)5) z`En%^q0gVMK#=$I&*QSpDhfI_Mi-0d(xu~9uR6nFEs?-%yYk?J|L^8AvtWVM+iSwG z(=gJ#y{=qttW@#~0!We|f;bl~N*RXL($Za3wZcC48avZzG~nvbu7mCE*7^$!6D^nL z`hWRd$7i47!=E!(PgG_PSV2I~=ZZnZt1hieh)(S?KF?!*I#6aGtk!?o=ly zA%+;UBBKJjrMKbx+aynR9kx)1h3fk zTLf{=vW9UyDoJIBBgb(*!}tNqp4Ih5wmmx^Rs3=5J z({vaN%KcP z3LZNaI&ne=08>@{$z*_{%y=Ap-~nxH49@2(fB6gk)?39(ri$b7^fO!A~Y{g;?qh#BdX+{?=bY8il!X|(40ek2oQje3SjrC={?-sc; zCE}tPuc@y&e||C&aow9J-eS0>*#u)HlUp1Pmn3B%Xg`!ZXRg{!>t)vOFbtP%QxJs0 z@F>fYxm?8IK!%6C9UU8ohZ{F;^bQXvs^353{A)rK+ac)dGiP2*B<6ZNRCl*6iexew zMbUam64Pm4p^z6vkEUU_-<};9a2W>wzytc3Gti+!6vxq}65#a`gM)w|pwTE$Dq*51 z~#A4h%)#cRFh`BOe7X@LER^=@oGRNUyB-`$v@Dj0AsK ziJk_`uYJ>h+d1jCWof}Y^rP$6_U*zPnqgjo;S)F>2f@p-T&k%lLQs8EQ^(X4vSP)j zO--ZC&C^PybCZ)bTen(@0xVu!@Ab~;?95!e$lJCI0K=A5CCgfU{R&AM)AdZH65hP| z^1SwfJz=MEfO9C*nMb10Pi`pUMgaa}S+L*%O}lsF#=&6lz@CU#zwJJA{H;UP?V^t zL8qps!r>4}Vy02$l}?hy^N$=RA}0l-&plWQX;woG2K1UqvE zER{;dV&&W4w$GlG0Kj_jMFT}kx{kj8KCA1fWdVXzT^rH*Ta;sVHLAlx0&f zbOS(jyW)0xN~Qdw>CS;9ssSF`wru+{0LWXndaqqGHf+HAhg_PK^KzcQ=8$tGJxTCw zZSZ)EHSAI{8CKQueo0yXZHw#xfSmv^VOdKRWsz+hrx;lEPtdd$O(<^nLfiIZSi<2j zqR}db87USUCMTQDoN3*&$KT(doH^6g)>exw{k0%$O{JXSaE)d0$B)m+A6A8OeaB^Jb>t8qi{cpnM(w8kWu3ohe1Su939H*~bnIZ^}X#%orQxw(Il<)3# zAqa1pm}N=#-w$+mJ3=9O!2)bz0tZ2;rsi81cAopY>gg4rq*mOr*Y{GtqM%-HNST$e z?FZ@AS%;%2%QP^56rUr)y#>;fFSqrF4hhg}0(|c9ciOx>`2S30uY@8sFg$w@@4AQe_&&y`JXU?4Fc85%p7laB)zUc7`rcyN_XtemI z6)K9bV&tAaL_O8T@3>AeSr~><^Z`}HMM<~RkQVD`6ndYQv^3BZ$-hEe?Gso-q z&xD|#nPw8W*5jz+N_A4e&tsSpi{0&i^rCtRQ=a@fmP;gpvuDpbcP=l>L?V%DZx0L(@=@Dq znuM-{r4o_Jlv`T7*%&~$bCyI(BY3jO@Bzr+{0{Kl6Ny-T~>2f(ZZe}i5 z1ppqy*eXdG6piO{k$isoj2T;ddM4-1YouvMRaG~FXtMk^Nos=7Zrjw0FV-7|3xYg5 zck&!JU>Lr5Jd;eiAA3xD|9uk#8IK1_CSgs(1OY=3m}T=lJ${nROOjVnpu6tM9X%Q> zm$M)US{8Ws-9VuLmCFdjC@vR-AmIOH*Sx>vD9=RwRj%q#U7dS!9?fVZjRFb?2?anz z0kS|uNtj@QF(xm@U~I3Auh;hV+BogPt^+0qfsjEtp;4A*Mw-#&?&+Mnt1IWaKivO< zqvv1v&Uv2iyzjeZ%L|>IBb5ppj26Yuf&9zYnMd~+-CZY7u4-%)MDf;q-W>?6G|ix8 zIVq~cwohP~oXPk5*TjS$(H@kY`K_(%+vr~o8Ec9xd$Y^+9!VmViqY6uw(Z&G=8q}r zcw5`?-rlntHXM27l?5|1WVJe~C`q2b$}|Z8W&mi1py-@ASIIK3s)=H8!O7|D=0K6; z&58j2mAWj6%K`X?LenqYe)}!itPVlcoH_4X7R7O9UEKwW@)nETuKaifl-<7?ci!TF zphrBOmnCVwt}iBtQ-1#@1o_`(PBfjy=gj%q;W$mxhZttW%AW^lftMV-WF&eHWqSQbUm z22JZmkP?pjW!Yqy(9lp{wOU^;<1{@%QF)iE35Jgo1n+WfIdDMl@9*?@8a+(d^TIH zRA>m&O%r6ZtsNcW>@582Uz>(eDip+b-l^F({O3PA0kFRK0(s$u+RmN+v9Y3M`Sp2ABv-XvqTP6jemE)Gp%upR2w~md) z8X5vPzDiYNZujPq5w)$Yab%#uJ>(RW5h))flf2ts+9bnh%*38Qq)AD@KEETH_%^BqOXj8`Y9%gQ*-9rf?;14i#exrsjeHg&F6Aa z9G{6qZjxoGTxKum2vW*S@!)*Mn@+)JLk2xcUsnrX@XQr4TS>bGO%s2T1|yQIf~*Oj-wtAD@i_viAqu! z!!}J%Pc2{G>h(G(YPzj$`QTs$L43Jf>g-v!rs*W(QtM!`o`L-tbfV{F^s}(NV{{@z~8{4D(E_mY3zU z&u3(_a{-70&}ZAFmXJm=5*0)b+w z6mh$Ax8B+?I$G-LQZHSqG))h2H*IjN$`AyT$t0VbQG!sR!4z&t(0e6#I&aMNcsx6u zPLY{85AvA`vEAi5z)c-A`qyDcKco6)%4NUT`v=1~-~eZBbVS!>0K`IJZXhsSEKV~F zU8zK2cry$W$eVd-#TD2Mw zbCT3$@BaebxDs{<4u>j6BDqiDw{T~WEh&J;|&e- zE$cMH7^3JpaiW`|hL$fs)Y=+1Rt;kRl*N94T>BWx9L7nK=nx1Z4M9A8p^TwI#o6jV zlqy{?J)c?nMZ50&c@D$e5EOdi2{;~i3xeb1$;j-imC0nr$3vz$k;{eexTA9E5jdfji;YZzw-`ZnwfZ_~2$lUdvm$U zlTX@9mPqH%YnEkRy3}#-pbCHm!*n76TBj)_YAw;IZaGKH3;rc3+zy9AO0}x%`u9Wl zNiIdZT4x2v8i!;1v13A8TL($HyxuARwM-`F@mPgIjwIDu4Z*OiVU${1(+tD%{8c3R zH&vx%`QD)+PiJR$TN_?3J2cJ8=W{qt`F!xmNd4HDtg1AMR$qNpzi>hE`JjmjO%UuY zTi~z1HZUxZPR}YzP!!Qh1=TcPe}B^Nr$~~&=bm?)o6kfd+X5S(Hj7np$r5zA8VEGM z{r1fSvFYSV@wdOd>c9baG^%DY9)geu21u5z{@@43o;`M7Un@;pk;oyEqyQLqIM9-1 z_th>byD-vLAgE={W+!cX~XM-{0hLKtimM>FcwO9u+mMG+Yyw zADEbMc6M%&BrcyHtgE|15D)<5N`-}>Q!7`lt5!u#E3xdE%c8g(fNvy^QPd^`nGZoF zMF|sx_~MI7G@4ntvcu(a`h1y4WTDoe5JdmzXlrZhN{%~`%|2NyESS^kD{Os&0#n;{hL3FXWq`tnfR-2Zj z?_k&%LEPtZnK0aF+hJ?*38F`a{1Adb)erg5`<28Wb?+9-wZbaktNl03)H*H0cnktx z;CR`>Ac~4xRu!LmPKP@@!no1 zf^eBkf+X#C-sy=(dy7S?u5P5e`>16-ox1i1$US!mot@6sAxAqLPYR(>*0yU{f};t! z5WLO%{)L)m@ynm@cV_L|QABjzwRJ0d?wtAAXM$m1x7`*R87Z{3*5`8U>ecqvt&%KvWHL(?rOz+~%Zgri z9en7J`MckhIF3Gj+WXa4q-B9Cu0Z^Lbjy~~#fyPLVS1kI>$T}7y}0yxU;8Bg6O1xA z^)_1+AGP_j4#uq`Zi9#_p1H;1oM5o7RI(5Rnwc2@z$MET$K?nDaX98qPHGIpcXe%$ zq_4u^M@lO!P=_vG{8j*j?_9XW!~4MUiowrVw(rr}dl7R$mfzbp?ASLebt4AaB{C?Ab#~5;Hy?3I=sqhU4*e zmR$CJwfS_;(O(yjPd7B&qiGEX58iB9-#Q0* zn*aS-OAw|2s3*b9QU-vBc;4o?v2eIK7IOn20WfP>9lDNC6fTNUo*xl}%cq~01MrQb zt?fTLJGU=c!fKjJ)5JUO5XZ(~x7(pSoMl~UtUDJDd%1$3 zZ@tgC<|170R=_VtYRHvsKr>851A(qSbfdhO# zZ`yY7zy8ba>JpD12Y>mCGBaZri_w9B#=5$ysyg=UNu|@y?|zqAxl;V-BlXo+vG?Ay zfAE9E&Ydgw?Q6_t<+?iL*=OxbmpDm+j~{nhR&duYe=Np!ck4Ypd^|p#P8)OQx%9PbBq_dDmu7V2meGL0E0=9)-Vkvl+hR3lsTjuFFg>LE`&n+Vfd_NO}X8ws$y=pq3f8_DUFSR z_V(fC=3;B>(#grPDAwJ1r#UbHMIvOaMgu?y0yH)TI1VyR%i+LCQq{B&1QlO+K{L%u zy}kY=OJ4B#FpByX^TX#5btZN(7yNIReGB%{M=vImH>_OAJpFWJdRoclTpY(e@BlhE z=t5Cr!2kgW@XQwhGG#O8}mw%`PgHPAAF#0*g!Tm_EsuXD75V0 zL1#F;Mzp6>soP7X-W@yor>C!MYpXwau%o>__|{v?Fs$jSt2UzO)v7wTqoeuDFFOHf z+`XIT`7lML4j=C4xZM{oc4xCK%a=1lL*|@0p^rZ5?CU$JX3#Wb+{yKI?EGqKLro0^4rL=jA{^ljU$r%lYA9 zEE1Uw1h@qY`p=(F27`_zOCk*OCQW;b#X%->j%1U%k0VK?P?%R&7pqikMfpkl*g*@R zwYC=Gi$nrVQJz2f(b=>J_DUjpf+jC3TbNsR(3e@~Lr zl5{Z~o`m5%3>yfdXS3Hc%wCS0>+>B}6u7nZ;e!WRn(kh@)c3^~Is}mrbSV;Pn3#y# zc9X7?5ENw?cT-bE(-5AQUw+vxmrwQgch=PfDC&=v)rUU(XV=t;jF+x|e!R9a{Q2j< zn3>sh^Uc(M{72*2vuZSos;YMX{eb6P`Ml+JD}@4~s(3z+NfPCD7dfuUvgA~Xsa8GB z&C#n>qkxo;W zE?r2arcXCCK2n_4OncS_ZmSCS<>T>h@%)Ic7iVVL0Kfsr0MH=_=Q!?z%dWT_fNx{~ zwk=y0!Es9vP_GwHBw!4qeZFig77@jKrQ%Z**CUVQ_wJ3LsCnOg@@JnJ_ur2W3}Bk( zAW1x#q)H{%nKODWS3hTt{@G`9Z5#gRqw5NV$$Rdp|L^~9U$zX)pHIL4eq{Uh@ZbIx zwk-G8Ut!md4V8+zje^q9#z z*OAkg@J2hGX2ans0KCKD!7xeJHwT0JbzREk5(uI!TC{awU=W7q&YS0JY5BXu0g#Pv zA_s>nNT&5$5?ZfTD%*TMp;|2p!sCu3N9n~>1<2T|DQHk8DYv4k>NC$+|NN)x@L`%| zi{JjX7z3aukth_4P&&bxE;nvmztWj^_&RxE-uXEZ?|0q_A31|Tppf&yR~1`j|U0QKH` zsmV$8&O3|7bfixt(Fy`poR|#Z97bprVqqve%}yhM3v4xMdcRHK^AJsYd1#0&m73SC z4VTNuT3a7!Zk8O5&OjhAHYUQbw^lpr@#wW$EEGzY%W1FIh2vy4yV>s_5=EILGpedP z9FGTs)4IMY9BvpI;#Jk1$)p^P5KWr^le zQam4!B(zjASeEGT&&1N@h)TjpQ?`YV^KT&WaVTiZN?CuVJM)#E^~0cdgC zzyMIyd{@^^IKH>DGnmiMwJg)NF9I-l*%g-q@QvcxXP4e_$6CW^UAuO)y**#8&Neit z6lIT%F^W}A&g-ui_U;Xc zBC>Zcok}^Lc}Dr|Z|74KXl$%~`l+2t;Rgc3jaDcM3Wrq;eWAP{-?U8kxxRjanocci|)!Z3A_$T?L-HEo9D(5+ir zoz72!!M6JPxm{iVY1>M;{4=I&cPjOf-(MpLSzGUSev9HlGDXcB9K3JAg2li11y-#R zE*F3144uj7v6v+YPQSl0F~Qh&Q4ksxh1j$yGddc8VgA7f#Z#xyJMOSp);&21CzEzO zj+D#D%9Z(p2P1BGjpw~?ckJq`*X`P+;W$1$old0!+qMz^_=lNFh0dS%M5Bhw6@BE9 zMGO+U$)z((ZX5B8A zRxa0xBK)22)V})413}W^!@gva-MZD>vBNHx9k#8Ek0Y53G&$+W=jnO#Qb&*0mCMy! zE&{`|Pd%j{KJ0b7_0dtvvWz?KFviAI1aaCn7LOB!0-4Jh)vCR5qw%-DF#x#Fo^7V- z*wUpd_U^Uk&MiXFwMgk>sr_0)n1uUOm?@#(ui@9Ek;Mvfr>tXmaDTbl0&CjK-ibr9 zU$LwO5R}yQb)uN?`QSr`%E4gOG)uwYUm)mwE;qk%Ypn8XRk2@ABpi*6H{!S-LH>lI zN$in4agyaemg^J+H_gOT+wHF|2@gHwIB~-B)KjIiXZ2*#o|*A#nv~BYUw;i}GD$@N z)6+Fo%>j@Cz=L6sW$^%50MO~Q)gCKwi0$(am8Ma>(JdRg0cnWkPWmSV98%lcNV z=t`v~8ybd4@@+}#MA7e?=BU%zs;VxMJdRD$B9RJBOKojSDC&U2 zQRnyXN~hg7-L$c-4R}19*UPwEKc}cu==uZ17lWzIjL)AJ1e>PU(R6pMwq(bSwQX%Q zon=6jT^p^3?ht7yDG`YgkZz8_!>OS(IxySt?&M{-D!knZko&hwt{oS*z=&wlQ` z?zOH}2U&jpBWugA_zqb>5IC>nauVyFPWyijeh16Wc`BP?ig_M=UO&8h!ii;?(Hxk3}yp1GDO{^Te$W2kpHgYc3BZ zC5)$?yV+?}C8aUi)oy2oaxqrpI$vFurQ{dk^ZVM9q+V@t}k2seHUSqTqN2C zDBI_-)mLCyRC2z!D%xu}x;y=O)RK52N63IZy8n~9;c2J2fj2WhTfsqlA@Dg5RK&$q z3z2)<^>BbcIJ4*`lG0hg@arnk<%syy!4SYgcDQL-&-Ogt9s*8v%i(`oer?gIG7i_!?YiB8?Vx0oy(B!~ORx%7tj2Od+@_k)kC<=Kh;`kw`N2x*Y4K{w zo+msP6_ql4?vVh1%O4ID2~q_Cv?a|HG=F%1B#~&^vG4-(^9`W#z|ahN18EjHr-n1e zBmg)+8z!Dl0VqQDi@#dumhxOlWbA?rGFzku7WMN)DORn)>pE+EekT!soi+#t#sB~dtj zSOZYYwT}-jLZPmq=Lm@Z@($?(xf}jjaAOvh!Hb9~lqL={oj*b&z6y!RrOMn?s994d zbQ4RY(ar%SYdW)`^bbhC&#(6w=G5;9)C3G|hZiVS|3sy5`0^H3Nx45|2=0 z>~6LB-@$%9MX~#(++eGzOhHVFetlhicE7j!JkG;|R-l~6fC{Z^Bdb14tO&(K03On| zE`Mic%~ECXFuzR*V#HDsL5;W~3#J(K%hPCR5GSC52DUy+wH5pml9(n3>E_V^0d=tc zVwE&YncLOc96l5y;(SXdMx+_58aatwPve)Ttu;fCemy0{ckxe7T+!9@u z?U%=dULfpOE=T{$gcLc%K znBe29!jxojGfn&yt!I|7%}%SC-OJgkpi#~ zW{9kQ+_LMSaaxX75ibI2+!V8@&_tsL504`QyrojUa4S^L>~#r_ou-e}@N}s86jO9+YbyCPS-8ZhS8pC)*BvI?$CduR zHdUG6y5J6?II9s|dMI3DKl+sfv0|O{+QyJw;NQZ+pSDm~O2pf@Jq={Ugt^(*yO#jsHN+6NN_Ste^n+aEzV|9ds!WZF zG;6YcrMjN)E5DwkbrTQ8gkgSshS2MPBHc)OJGUPnf(E`xB-ajhY_vrK|EEZkRM-Ej zuIPKA1+E{W7Ela6CQ9G;g}m%rdKrRDwDv|mVSM}MimSSIZw6&}z8k#h0STDLe)*j5 z$$x{zB^(q)EUl6*Cy_{sf%Lq@Q>9t}#9MUfjQ|5%A%RAVjv#O> zLP%w?^ydEc+@z-pb_~8vSTHDc4o2W`tbT^bNYPt4oa35XXBZYqvMRSspI72W7pTN9lG4o;~t&-BK&ci zVQlHe*VmhYlVZ~-UlWqHH5d-`%74duU|LqsTD7z-n>*^>cyMDrB8E7cx}Cf8$%wZx=dC(w;;2ro%i3)F@WP%4AJ?xe8StI*%9JX#fJ#@*(OHhs zb*XcoB2~tE8zr^ukU&e~p#t%?2((;Vja)BuL1$zvMBt)_LGmhUJanfy6syf5sqGfG zwX5}~jhm0T6zxkCCX#fw`jS;?O!V|m zACz3BD^BuK^y#{BjJ9dr#sv^885t`|WCwQDy4UVo>5kVPa!%cl!j zbKYzkRO?GKOQ%F5Eh+qSZdu6JB7F%2LhsDwNhR6R!#AdAfnQad;*fV+cPH1zBWal( zI&xc%vpG6{71I$%VE*HL4-2DyBiSa095hYDl6A7r6SO(qED&InQQ`ILt2(D9$k#%P zl8>y6DXEpcCe#ZqEsvpIsm!^pE3%*7Clm9mS^44oW)fD)-M9TOa}M&3|GtRdD=}Xc zy4f&GZ>il>#fx8DIa8C8GVy^vO|4P^C>94mzX1i_^dG#N?V4_m#YEqaG=QNFY4lda zKc>;(1NdQHrdp~q{xw7fz9bR-zgSX(sZa+=T9%QqaNdQkGvFJhM)iO-r{zFvfWbB6 z%eEn|*IK}wO~>TqS=!uV7KGf^s{J!=c#2H-^IqYL?g;>1^U8T`)%+UNtFJX6&+hni z7d)7x)nb=k!MO9gO}%kZjnSEK9-`mezYX$fY`tA+%eX_bJwFIb$u7w=}6=E!tcPH1>DDK&t$uQU1gLft<*q0vePQmy{PcH!;@qv z_W$}$R!=`;J}y|tU=X1ahw`vw!a^d&3snoa$JOyQQ^?85hiy3FLFU91po-g-L%`c% zwAh!dp`DZj%%u2@$ujYfYM&fD@h~IQjDadW9j0XX>guCxcTt81>r&^+8usSpb(b2z z=LCRFkwqA~9_?szg}xtY-u}h!vVHe-v)EfK+aCbuXMg&GieDc0bi|oVeQ0-{z@6`B zbn4A=Dhtluiz5D=eq)J^s~$J&y%DkRU$5ITzYtkm&%xDiC;0YrR;Uw)h^Wq442O0i zLmvFsK|$|xSjh!s+}-}P>Fz%qPE80&nwdZA=~d$h9g&l7<3mXO?Q$pH!*D_GQJoa! z<_j#~)=m!_i6yGk2|%dIv;;`-J%~Lnyv&ges%r4UeU4R{9E=40&F?@KA?tmcaa^&v zE{hq?XLv;nN^O`V$lk|IHL|IHWEbA~CheLs;9n>zvbu0nPz}=r#-lA||9!DKdnz%- zE3dV`_P~@ETe3^vRYVEOV7R$^F2(QP+vB#%AgR5@h02++%^|UlO1;rh;<8@wA2fN3 zhyf*-H%$`+D>?-%G4`+u_SAeDu=}m&+Z-RXEYJr`$_WiR~|>CC4`gwKIYr zQ3A>QJ$J{*L>S8d0@QadxU*K>4lw4WN6z`Zeuetu_b#Bh&1gIeSx@MTyWMoEL5i0b zKW0#b@q65|R7meB4qeibqMr;l&Zn`l;E4}fgk6RKMvES_fwXubJ39l~wiQh?M5wJb z9W@I}WV!5vZH}9lV`Juqck9A=TTahh(#UlC+8O%!hheUI)h!~HR>AuI6GU*y$%UG#G+6W+%*;?*G9M2r z4f*XlpBkF&DYZ3rsZihNN_u-ItB&-6f2st$`Q6{Z1m!R$4&2mg;cNA9Y*uIYps>hD zmzu}nH%u$>c;R1}q>@w2tUyndX=cESq^_@$oX!djIN)tC67#hh2`admRy>r9op)bG zqD7n79W%tmM=!DD9f9bjWP^s1WymKKslzD)k7C~O=()c^e4G>$b-#Umc#cxyIC42r zow-_DGb6Tpy!xid5h<_0I9$}N8SHmOv;BMvtOy<^aofjs>dGjk!LDV2Z#O?NWr)?(;kP%16`@zvdhSt-Y+)|F)+H4H@1~kO6dkT=kNjaP}J$y-QYjd#Y{#YBUNYA zGw9t;qM5Z4^Y%FcF-8Kj|Wj@dka=^3{jNVzwZJztb1~Tez|aj-}3zX=Iy%Tc%fntwq{;Bcw09r@0ys z_4uyG)|OIY!Y>q+57Cn5B~#4Xvy3EN8U8kLKW1zqp^JlYQ|#H?}xg`ZhL} z9)j_X`LK=wnbJ!tsz1I<@b`L;xA$;6F9SX);8@SIXzS8vB^9b}k zh@~Xc4pYEJvbhsncncetJUf@|7gYuMu0wsbhyh6(s~~^f`~GS9ACt@NG9W3Es3Ey8 z)5$6D!o!U=WEG&gEWelLj4f=4p8QEU=-hr1u+E6cV?_M@toLBc^gZs`id!bI)wN&2 z%oWU@x)v_pkfOJh5Bf5OBoh1Z;L~>WIXbci#m0Lh0Ocq@9~7ECr(1}Hy#TfuFmA1& z-eyy&Hcmu@TjRj=9?y~yJY|cHtU$&sYX9Ehxu00r_zhTf)1y|kkyzXKEN{1i*)QuS z+_PabozCW5u!l~4JFf+3!-k@-vCl=sj@$G)cxXHCQ_bW%QtY425_l1X%*>7D-S|P> z3FMF0Bgq4*Py??CQc{xF{va>d7xvT{1Cx78$s}X}~blEI&K59uZ70 z%?KKQ@ukaVS>W71k7kI31O1yp%2H@jnSyhGr-D~P&VvVmdP1mDEGxDz@Ia!Vo=mPx z3LI{)j5SxLoLal(3=-157Mt^!*uZfK=W}BdE@}g3th7{j?kA2h>LF}^yh#!9?cKIq z{_5$(z-H(5b(oqOR@g*=#V@6KGKp2Z<02#eGE1N>3@y|%tWXq}$ybMBu`#9J08Qpk?N&xGiB5UB<4WInR`- zqScie_D4rP`YES-`<4a!&gA6TfMEbY1U=2yFO|r96SC%5+VKBf6hz&Bdif!}-2#mphi#bAD<&a=qvGvTui2Ep2;$tshJOKl-)MbfY?WWE~|Iiy-RU7 zN+LTqB_1VAo!<+#%b-h*BB97>yO048haATF9Fk2Tv}QXpatqwCySmFYMFMT+wGuFH{MgKY?# zYzvf>b-+lDIz8B^&=5S;7jR46rph_M} zA7Wm2g+JHtMJ$x?5kRAdAwcQ#oH!_Nrt-Uhz~pH3?yL@$h_Dk6f+Fi zb+#D(ShWA-mEj@-B_*h)N3XAx;)L`Uu0QHg(n?{%@PCIQi)MU<=e{`b^r=rA`y(%3 zYGyu2ZPJjeoQFnks#@PQwabSif*(oIV7uIK@*&Qzifdf^x5_8iUcK5%KShr$70w(J zi{V*Qr$RaYB6es z@Q=iWO6fa_m#hByWBK;!zWVbnwKCJspMMS7Y4;ygsT?|MG)hWk@sl%h1O<4#_8M6K z^M(JOZdq>bQh9&rIl9mBc~nB#biJ?s<%Lsz)4mNtIjA+K{|Hf>(3FL-l{#zG&-=od z7e=Fhe&-WQe0+Fl&&Uj7;9Z!^JAYDgW~YYLjE~Rnl{Iz>P@So`i@M&_aZ92OP^F@7onLQ&wgNAdUDU4BX>s^p617=l9pI%6DI^i%b)L9dj~e za}tLtsbv;`Q(-`^qr=;aBQ%1WtoH2J#&tOq3ghED-M(kVGEp-ys8b!ezF~`G`}^;ea|0XxaF)`uhE>Eq2Jkf90KX^b5Y%BU;@_U6%^5|1 zz0%l?oqR4I%1JB2Xzm0sZBGj>Hh^dFm+bfnX|&W+r>~Yg{=XLhtGKaIE^$ZEw*XKB zI!@ZxBq`sgh>M_W4{cCS0AxY7FU6*p2lI%%Ko2Gp2psssX0ebV*r*I-h#S0fY073< zQ6caJ3DOv9X$9J{Sw!Rg zTji-2BKEdNloIZJZtcu}ug}tm2~`tpLg)t9FH5{6UsG^fg?^Rx8sZS59UgO?qvWC( zF2ANo1QOe5OX8T*&WT-HHatgkql6{6utRL*I{Blm_e7V&d4GK z>7!Vq9jC*W=)V(MSNH>{+z-7#gSW#M)JLx;4!~QBA`FK-_!9}+UmGool+K-}`$rP9 zd+S@JO2jjUdcw9%{kq8_G%GdcT-{$2Avj1CGo)4vH$m0a zgJ=aoRDm1o*wIwL$I;Y@Q zY?+ftZN#jik0yQj9P9~Hh`=53)wYj9`wSZQ24en}p1#RuE>kM};|Q3lRXXMSTajXeiVlBTMuO%+dmtv{9zJms^2<}=6gOMRM<1>gO|ML}^< z&;anrbrN$rUYIhF(tRS}P0A-?b~>F`o&ZlSwN)lcm)D%oCz?8t1?A~OYCplXdYiet0!WRT?FS8{Q14lu$g_B??Yu$aw~3}B4Ou1kJh3>FM6Y3J#|o+`_wKJG`e|s$gH#N; zFoAcYzFNU=YTa9m_VBM&^_GPMa;T&Wh*Nsb6AQlTXs^kL+uBqm!)k7B4$e12QuX^x zwU|?ta}|xW_Ff*3J(eyWrD1GzXh@)wJ@CPybR^?w<{&!1z>p4ft__z4P-W_gZux5)GX<^(UW;c>P@k_dN2DpP4^| z2GZt)+RXfwRV7b+#>f8kR!WaR?Z+Ud$;UzF%wQ7}ZHdsSUGJ5L7H2;LnY7XEKMv)HeI8nJdrqR)cPfF4t4y{x=qvXb|QB9fR z$Q`?R^ZRIT5AeF<2J-toxF}L7;RSyZX$&f;;eK;^us5%{mAc@DI7p<%NGRTvqSm?K z{bAe0@UE?86}wuiv8e6eWt73ZhTisk6NWtfa!T^+;_5GU_L}mKCR?w7F?rcF*}U(i z@$ujB6(jkzS)0zua+(zw*(3uYZAEMk5ib!8WxecTHgT^XHN{4Hl5#yZ-k!|ow zja4|^JzBXvjq|}ssl{>Bvlck?J@K{xL1V=W;~aFo%#g=eYx|P=T_2U1Ej#^CpU2&6 zhPKg*Rr)zxDEN+@H8giL4v{6X$=cwm51=FbvN(TvfDY~heAqR$FUiYC50Fy4~wHB zfd$&=zzd^*T9}470QDVD91-*m1n=M1?TdsU+*9|{EN0+Rv~6_nL4BImk`%CljVxt7 ziV8`Y8cK^Y5_Hmyj2EMYA)w9ri;821kkzNPgX-;;?5?reQ@}S^Nq-$h?p;G`WYop| z38lHsAfmF?*6hjGW2FiLhQw8K9f#eo-qSb7T?Q{~Ti2n$Mf?4!wa&qaeInPfjUS}h zd`34uls;+|`j3OXahugoi=EF}@UiOVq(eWYiOU8&p8KK2PE9czz8pVAVWL>2*D3vD za=aCRPG>tCuM7{FF^gnHg~#f5CUJs^+(9B%K!z0NjhUM%&-K|T+TYCm-fZYF3GihH zyiY$L&b_7d>ACZ{iX_nJx*YFoverNf3eX)ty{vv(KGo*7%b&}9xPYOLUIRxl9C8~S9lrXI>#IHaHfil3(`;NHb#SxXx>m0WXz{z9IDDuoz|>C}0MvLf z&F+_`&``S7hgnwAcTrJh$6q`lHP~w<7XrMK!SdC#B06PS7yq&z31HUFrls| z7XipKY+suG&LN3SIyVc1ZypDNI+n#jxX1HpunqjOj*yIVWjzZYCr-V{dyc zIR_6uz!G%>T!Ad2n?8zH%Qbp=34|oc*79_^W40#_HS%X0AQim7!Bm-Fo?d?1ULIAF zahA~&+8YlJs)@hpdeqxmiU@TUz>`ODSuU(dHqZUSPvL4M^SI3#;?(xjF8el@(&}II z6qjMCiW*Fm^f0>KaSF`NiJG5gm+^V=1`p9ZgAjxZG6A82_L^-G^5D;E-+qgq>yS#p z0%0yn;GzA}{K<5vUfU8{;>>iIMbb-0u|cOh?Q}SM&-Ph?gDtW^=$>|ECYjGKM;y1K z2K#{*hn%2F@nX%IT(y!rmZrd>lF=k%assPL?QO6UTU%+ZJv4>+xcg3AR#r9*(pKA5 zkir^f&sT`r$46+`V?_3QT9LTx?fEK@Z$GZ*2F`E494gEY2% zWJ5?4JhEl_Js-5;Sfc7QGn=B2190b8J5uisJ{2}|A__bBkY#2%pR5`PacpU|C~$jB z!Y=t?;4WF&S8<^7>J{BX7b$`VF>$^@03Xzt8#I zFsZO?^1oW6;>kHjK&DVHrustM9mt9*fZjAT_O{{{Ze=xQg{#xn=X0Mf;<(-M>_^!D z7N=o+CmttlyKYqmujv!+8Vt{<>RcIeI|4awVbEk)^{vOOD&xz`%On3GVDjT^YT72) zzK4d10S*r!8_;2uym+|$Z`JA{JW!CtB@%ekQIRZKk&Yeq-9hYYjDgF}+L=|G1G(^PV z(Dn0s{%xm>t~s;U+yw9Kk2jm_cn4Is$4TSahD_q@%0jBlI<1OxB%mEa7EIqWI1GQ! zySfh)yCKwW+io^q6}n6hCtcau>18)KP9^Eh0Yv?u<)`5ss`cfIr{f`NaE5SHvo&AX zNQRqt;mV#4Cx}44EsL6++6wfZFeg%E8!bLKP($?3pLZ9Y0_nw&YOmYnfdcWHrBErbe_;lUR*Js*w zFQ30Wrd8nKZ59^cz*1v-il@y9k-{gOsV&eNLmS@Ij72iQqlRUqi5AF&37h&!CH+?abZJSK)f!0gl4vFTsX}czDZI}!?Rad(TuDT(5P8>Fw z4{n}NY9z37+*bhlVZsDT_IPg}dBt^OZpV#}>Pxu#Tur}%`(|X~&#N<4QLWjvck-FU z$Zp4MNz(P2MJMf*U=G@sr(Gwua$VAf+LfB?>rd_Z)q0<>u*=&WC*e^+X-4XBlOWJO zhj9ic2o2$&-M*xN4rTH0XXNBmt5PQhFZucH^dV73rd)VRO#dFF2x25CQRyX- z$jS{PKpNhrQl{17%pFrn=|5~A1m|ViE5t>Eo0(U=YrT$$Wt6*gvGLJkjo+j|zN$%! zD|=9c7P=_DMPNdKzDaCKp+L?7ri zMR2usU|`O7JIf9tm+<_g)z#Tr*?n8#97i{N^= z&FYlL1000salV(C%4a})@p<9-WhO7n`#sC(02LmgM|v6~QXEB|ivS%N>SD2wR$8Iq zn-)ab5%%EWziNWEf;FVqX)4FWlKN{xt;bt!uaL}JN~*J!b;(u6C$?w>cE0QCyc>0m zp#Xh1%%~GY^%gq}B6i7LUest-)MQ#1X>0Gqtqt2|PLB?wS_-XaP0y;S^}`i6(ib!QB9!T0ckfM%edT?cP9g6P*s&&@C+=!TuNKBaaR zAJC0jq)T;x)?AkPcq_^o)ftru~U2TX1Jqz=04tAou!FCv}0}@7B=}mBUaMQ>n zpce=^GUzRc1cd0XFwKDpMHWWz51~Q@F=wkoNSFzm?mbg$DnUmBBILqUYHEiEK5b;^ zAZ3Msbm;=d$#%PQe)`B{bc5Gc?KX;wD&-Gxnv(~mVzT2-SrgqRU6`uZvpSOm2!Fqr zxq;w39`LTtYYMoItS)G$Wj1QmWZBw=XjBJMCqyZj8_uzCl0F*{*SrtM z4UFa{114yJEZ7VVCMY(@%nZnd088>5>L0&9H2=ZPHFkq z{m&B598Y>YR1XBWipIwLa_Pmo0A3&B8r2cd6F=^}ZnYPv?9L}grXLH0BRtfAsg?6> z22rF+%X!A3j5nsZXHIM_>Fqsi;J>4t_*~DdQxVd~OxuR}RgBWt!=A0pWg=%G_c{94 zABsx78zf-!g$FxXySxH z4Bx+->AaioHc+G=-naae?gHSiHqP6>_D!vxj+ng@%SY<$)UVZW@HWDk!BeyGQj2+obedMa(2%9mh#b*x1#%$u4>9U* zb_NN9S{X))4?luT7uEgF5U!VaMATyJmuoPwrc#)#B$kjHuoyY(;KBg_njyR}Uv>#3 zAw^s)zRo%oLhRATgy0VkB0vvkdJBl~nGL|7_Hb*BRGH1VeJc2dc8ddJ6A02&n0gxW zLtv-H=C*CeW06v4R)au)BmU~giG-reU4-93pTBR*oE_miR_El@Tesk|1(J4l%RJRv z31m6(?qY4eNj^l|a=Zz3W>@>x>10!a84kWhUhGA@ZkBg&bGZ+ncB6}s zzCO&=s6^OUe#{j-o^!pI6l#bi|Muhy4CEe5%Tv9B#?dv6xcD$rp8{@Hn6jSaX&0Z{ zIkl{^di@@!{Pp=D`8_`iECp6fo78N{%SNJ$Pm+;C6zrAy$)4B<3a0Sz&rQoC$G%?= zi-Cs4Nd3kVQKg16P0!88o05}pG32C{$RFA(bQ$ft6+V3$R{JZlww7|S?Gl~% z#ac3~wA!|!eE%}$-CM--nac_HZ719bclOcQeam;CH~u7AW}q^7fWx4};=aF=sRP?? zicFL*7M)Ix*kXE(3Q7(6PgtSK@kD+fuJNthID5NvqAfYgQLIDeQsYY0>^jj{52YBB1Bv9c)P{WP4QknUEx8b$#KK9LZ#Le z2%1Rvz0ZtHKWDVPyL-#bY|X_z;nmH~;$o&kF3W?@l#g$Fcel0AQl;f4G5wv74FgBj zag^5T_hB9vc%~4bnp}$pmjgl{>PX4jnfKt$!(?4#*TthmzWztF(Gngeg9txqU8^P` zalvm7EXwr#^tv4K`z}AgG59@S6#4V)e!x6d(5>)%#7^<0 zkTK7t!{PDxXp2ff$XYi3p@I36d!K`lbRu^RZX0@^MtlZlyYyB8hF*o?r3L?U^Xsm?H&>oqdE&>hvZMHj5^iA28GjsGeT`z9pCR1=Hc@u@NXvWqLI9SYo#7jkh-( zA`f>>k>v{pQ3+kS2!4W#b`m6%DzZ&?o}-OOe=?3T4mX$teK z)-Rx>TR2{*@n{A_#x-^eL<-ewfnH8y)Qh;1k^vup^a>9`!(X=0!Ug^7>LM2B;jnFQ zYxA@ydlH|RhnVOBhTO2R%x(jn#U|(7aSS4}H$}FGvl%TbeSa)B|Iq2+TjnUn#d>}F zsF~svjhgq2&1#WOMjnK2aU<&_bO6Mqc1dQ#w{YnBJE zdfOMb%*9aofVoqL?Ip2O)rL!ku&g zUwkZl16Wr@Y3ta#b=3FvmND>}-UmXBgyS=52NiQLowF>7f5(!qd-&9K`Tl7*VN1A; zx22aD@v!aX5DzoKgBokq*VnLWy<`UPKQcL=S82z!dpRe!^IpzqRDS<%!?MfgQkJ|) z3_||Q1h^+rXd@bqMSv)fk6lX{gO5(879*X_S`T=n!3DJDFz+4p~d znL;%Nzs}WtVF&ksuHrzOObA|N(eWuB=DI&hQdYk2UgC*As3HjaMrzUp{1o>Il5(*o2yhF>DGgc( zAnF8v*X&@U&xFpG{2JvRh;S=io&2BIn{Bsqyo+)uhSm*T_0;kIHk^%R3Rznv;`gtg zKaqw`6qJ!hXquQ*+ubTLesSJc89yYaBxzH|FLf1AE{`6$pazwIEb6M@LEmtHl7ilb z-mZFVl5b!9D)<4Qmj5?pqgJX5JeL3!8f)VM5Ip5M zYx(J4o3T%8R2U)$E1kOTTt0`@J7;yai%gM$a>#GQJ9NzmLdwh26^jF#_13v_EBX}q z6OQ-M9(|tv;?K7#cbs;$>(;jgR-LVWNSZI-H5_Hxvu-iu}aqv@<-1FH#vz>bY$7|k(IO5XD5`MJ?5wvr1lpj z=gWQ%A7}91@o|Xja!xj#YO-*AAk*W8=gP5}C27Y_2H?N$0snNjZz@G`?C5M5Rb?!q z>iNe+Ev=-X;b_AIf@mXu^BzL8OB*Nt@``#V#N3_o8Ye|>%J_a%B0 zKY5qCvgU*!Ro0Pvzv!*wOJx-(CO{X!jCw@Rz06KkPrVT$#!&Y>|5PuNGN0-7MFS+x1oazt4B2YMyxzKWTvJ8pO=o_NAk z*}`h>dh3AHZ{Hg&TNl-YB4Q8^$fraL5tIzU_QwP%fVcrkTb&73%n)xI1xf?`fK!6= z2rS?vMMmq9qelo0`&9hruX(Pmu<{5vPcHQFej?=M#WV5eiboJ7`OKv!L(*p_9y#S; ztC^XqDQt>`VV#sjDP3iqMSYezl=7C}<_xPJeBQW;P9hW*!lhbA4K^ywg@Ku(3xI?t zAH{3OqAhzg#PAn1e^>V~Yo)xxM*IZt)1nK_U6sXDYub!P_1xyO*Pz=p2Sen`Ol^v* zOE|}vW0vx_&EkDsF$B`MOojvY=!@su%yVwrMWEciuUM8ClMljETv2m>{}FnYMvo{$ zkC}w3LLVMaYsvbHO20KP6lzr3m^i$Ki|9gbLW~#s&9}Q$JLcY}3>u*K-IbogU7b<4 zKHR)<;QMWULHO@YP44KyO<`qRY534y26PnY%FRtq7{vwSh!O*b*9$)?q5=~9?Z9S| z!frJ!PuU?F3_hSIN?yL^YXPdr2fBT6X*^7moZVxqFPJ^Fpigp_9H0 zwrnZgl{+_J&PFARJq?52y1U`k6PF(nOuK-DPnInAAB359V5Y*<0RmU?E7OJXw8su* z|Covn;~DzEqjffd31^z>(#lVvB7hy?;tw5{h$`JM9c%#shYA4!T{;nLBa3H7{E+RQ zv-}e+6_O6|i`jhJw3_+;MN6i}JH<$0kyBr!wz1Y+uLdQS{L;-uckFTu1!tBnDZodt zhG8oZY2ELMCfMk5dHI^(e#vFJz{RV*7=kTQ6R<8+&y*mw)u|5$7y(D2XTOZLmQHk= z+KsF#-lqpQ+Z*t4{IIje@aC5X1I%56>DAn_>g%pcY@k`mp^dxyRUV&Q!K|fC9Y@_$ zR{P0Gz(?hSBebS)`!mdlaA&eCCBwJ!0KQ^cm5uA9xlp;z)p~jeHI~Xz#2=_Plqp6B zt<3LPSbmNpD{r!;1d5ixxQL)MBw;vV9Aqplb(>7M9^||uhiDSycbF$iGp?{yE*jK} zD1$u&1kv&>Rs8Of{PuCt`1_<>P2vF@tbLZ$&m2XmG7np{$#NTZ5vD)L&gzmQ|DuY% z(wK1VgJ=61dabSnTOPf)FRCuh^u2UM;=SLO`5Sd~u2@jNmn>XSwJOUG$jKh_?))k! zM1js6vM$Bh(R)~c6OT~p*eNVaMIg3FyDH`~;r zC{A5GFaS8IyB&2i8OFDq^1~=OnWH|-FYPu;O1S8`Z(k;sRM zZ=R>M$F6vO5E6(9ff9#$y6A~1XVKOR1BGQo7>GW^^liH0P~2Rvk;O%wB1@-3_3bTb zpFwPE3)Dv2B9(xzZ<=j2rQ)5AwCVY21UY|=2Yc;H_gYf&qpqXFfZESuO zG&UZOrZ)<%DvQ?-4)}lc5oA+-8%3a_ZO54UnkJ{6FmxT+cm4$Yz&k4XKtG;ec(vRz zcRU1NDQ6BwA@=_b+`(V0DK75S54_T;3{fitFQkHLg(4+19-e!lVZB&fJtij2tEU-h zQZ!PN9F`y(OsGb+%-DECh4wZ#D+n0FDuRN1<0SQd4rOE_=(HScZh`~BGgeExm0?uh zr%Q}=-gViK0Gu-Ne&dmQLuqc-%Gy`dj!%`AbRuQ)#W(jpbKTeK9R(bXM^D2^7y|>p zhKuqlUdZ{*x&)cC-LSB=n`4$;HBh8ygQ2lEH|oSMSkNuk??0&Ilz$)upvzk~>%9-J zpgq3u*m(OEAcxepxmfz{{~-)LFSp7m8J5|$;fUO8uk02I-h5s^(*+Nm`&9030wp3! z%N~^E0%3Tq;T9a(ePHQ*mZ@l}@g5GfwRYR>MMV#V8#!QC1soe3Y;^!eyM%&03J-cO zwYMHNENA9xhKz~z8ED$&|Dwi>&jBI>8cP3FAps%$cm`e)sTcU{tRlSale)2tNk?F1Rh0CtP*guaptFReFP@PHs8E!`zu(%m6QcXxMpcSs{0(k0yujxgXzIfQhB zba$QoopYW4^J~YNz1I6Y_id)jhqkBaQJzcOy4bNvLcdYxf1?3?^hR0!o_?yC8rbIg zc(B+%R-%$5y}9GA6!Z*szTL`gFR*GLC8}O^lM|XOGVX3YkHD-TCVo<`1ao*c5MaDz zK0fwktE@95;!*E5duneHDE#UF? z#@AIz5=UDm6ND_&t`qr!w1%8 zMTbRXc{cX1l%QthKeX{yAPj@KY%8NqmP8I8wQ0LzUPcQ++Y_3X7X zTEyG8!f0SkCIPfd`t;#BZ5>L`nx_V^jmWFWR*;ca3%pXZ@+G{vM@Fcgm;|S7k6Jq^ zdHD9p7v8ow+C6%k4Z(X%7Sd<3J=3FMe#9J(Y{_^yrcW`rd{K>H(6_Jvwm5|yYxQI# zQcH^p&(9m`D7gi7%vqCS*BJwqazHS22TJyM>kx2@46E5=Z!i943pBS*@aiKNq_nA3Q*gGDPk^u`#84Cf3uxuY_{LNlh_xA(JThUzQ z*|}9>j91M(c72kb)+fr@(4QJw6d9FPaJu=?3^MjcO19nH4mnFE600H-94DO6Kf@&# z5fq)tRckrd@n2?|x(+t=jr^?Yic zKTcZpz$_f2rSSc>uveO!M;0cY2=Q<}H~(|`YI?r;y}qa2@g91`9WW^p^0)K+i(S2o z%j-b|Wk#ax-)ngu-C4koVq#Hfr2e42HC6*fP7-l`Kg@?DFFV9qwQ- z7Sz02la3s-0%mF*U62O`qN^{@r+GK0CjL8LLt2ifH#Q7884bO(QcJ$%mB#E zDAQ-M59n*X3UH-k#x$hTB18{d_-CE>l7vRui3Tma{4W_R(|{cPt&Z@Scs6CfqwPOn z`PmPgXdj@Ie;2I*;zok!Y9d_tgYzEYAVw@wz!?p^Tti%xTjG6`GEvZ?HZ$g?CvoOR zdf7nboCXMw)Br~Hn!>c_e*a@|tK$N}{gd^kfh?Bv$zFJknZqNONg#|Ap zj5|5m-$p(0dy`1435UmCdYMlV6#wJ^3Yn6n2iMJlO|)INdl#y_pqi#8Zunl8?(bha zPebeWP~vE_h!Xdj-1hG=SY`9vG|kIs;NVMveX z)9v>meFMM*z7ZY-S!~;SerC(%?SDQFOQ+WW0sGF?j!BFtR8WdbubD~bx9c1Gt*wfh zMHOM}-WiLtGzX_#lUOsKl``1}l<=lw#_&dLT1d0Z(yqkl{#DP#{k4ZjL3(;yQ}$<= z0^ge9o@>5GPoA~)1ghk5yHjmtMYO(tW|_JiK#2F?_s1*$vV}V7f{xH!V*BuH<+iMy zH!z8>Tm@YY+>(TRwis#CVWhF}6#9Z8Fa13f;>X2#ioUIRtrqWZqy_LYeR&Fuy?4GI zX0hChA-f0hA4P4Hvgv?-M7<7i>`2AnknldOx!zGiU)Uv{jBrmeqJr1YRli)!=W1hs zPXH)r_!F2zTWyA2&pTsJ==sHjTttD@z?+R!83CS*&|3kPDi_rt8F zn2M7-vY91l6G5G&nN)|60#jn@=!!cXn!3?=-FF(LQWU)!ocC@2mYz-_kJst$AC2Mf zpL276RAt!{y?l&s{Y8PeJ0}_0dkc$s+eKfa6>5pQS_W@;S5WB5|BZ7n9&bcKUY|R7 z`CdQb!p}18-oAd>dz}v$06iONJI4b(i3&f1pyxG(@=OwETP0dHHY5GLb6$ntv{w7q1EzC7GAh6D1 zgSzmRRJ4~3-$B%slH+5T$ZO!iR`MHiOrIN;akqogueWwhSvXv;{&oJiHiijXG)={=yY3QViXxX1P5*A91~g8Zp7L zT5X_Er=@SjW)4iVE`&qF30ZE-3!lo^(gjXD3&H0^F`q--1k~&=AGZ#e+piuRUXqh8 zIyS=_Q}{(u;k^ay1lJTcD^Q#ke%Nqg03t~iv(58G!=%EZJ%J>nE*vI&C;1Bt-3Tjm zef&sD#HD^R5Gd4KuNIVz@C_6S3PqOS1|=eg>t(`G%}Tg8QA@q5`Lf~M;XTH>Ug zsw1^)4U5Gm#;G(kax6Kip`34fm48^Gfw&>Tb@m>< z0>ugm$Hmsm@~pSWC6$_s+qWSmxLnhR4<2$X+hWF;Pxr37a|PQW=&`kAprg9l$9Aw9 z&^q<>BKx)vqgOVpw$tRT?J|sY%92kT->bd87HuFHczHN_xJJrkHE47zT|0f{i+ST_ z_=xCNZ~A0Cdbh%MH4+6l7o8#^n7PqkHs7gGQ}w-cdu>L>n5A@g+pA!9`?VA*s9_+L z)c8r9F`x>GDDArMCXwwI7TN{~Op@o4t?UYCZGFXTtXL zVO^nC;OFPW_#eJ~wKymfI|@6O-DaZ&1s(U#5`=7s5uYn6Ezr@`)D-2YMa(xdLI$Lj z2%FB7MAuSi;nV`-?+yWB4paA#Vd@V%#9+Rd4`sh>WW_VzLo)@OyUMQ?Y;crd`kd|3#?PZP%DDZLbq7 z$iubb0U3czb&Sfn`Di>mRv%BmmPABE8=ho-_f~@(qfzhT>uHRP3OyH_f&!=oP6LJ| zGcQ%kzR2Q zkcOExSdB}jGH}8*CHP3spT{C&j}uANJ(<*X*Q71J6LrgeyE` zYO#YU^^>OIvq|5vq57W#N&XiUv;Uod&y$qj~@9T{;KxjEHya!V|U za*O6qx{%%@+&&3wn5^Ax#Pnl|-sM)1g}biqbf2vFs5}IEB;c=T)MZA+t=8)}U`GHE1+7ojm8TUA${BFdMA|+Po{-0%1J)O$#mCkvC9e&UAO}nH^ z;fJca!~4E~>ZGJ7@=4KfLfEd#+dRm7is_T&cJo`-yVcv1{gc&JFNX{EkaNx2uQr7r z*^FsvuzzqzE$C(M6)V1NVQH@&o$4Z&nfHUOV(&&rQ-XnvSa>LxismQOVXaMPqQd<3(Yii79m`N zRcw!e7Y+>qFL!d2IwoBph66y$ly4=YT<{}E)Xnj?|5jqNS?IpqAV*paXN`gbF%$Ah z4$&JBfds!M?CoH=ogb(K)LL634*LmAk>Vl+Mai>shE5B&{(JXw1)mqwK<2Dw=i-Y@LUj5s#yJkV9h`~5G4floprFqCLv-a70 z9qnyi#3Nzd-O+);OgP08g#}2VQ`{+v@d#!e?Y!RJFY;PqbYmY%{vLUU$f+TND%3o4 ztey+3nDqnDH&8QMY2{ZH(>}A-N~&pg9bNnHbqT1g+_w7dE4r4N{J?q)?C*9&dAh;% zmmlw(8co>mVxU0&&NI#caWY%bS7Xs+f_`*_4=1g}&z6TfUH3=bIb{ud4R@I{mGF8Vtt zI-4=hrjAP>0|1JcjWCmN>iiE@GWI&~0_8IKRb4ZF?Ka>Yb!HpvTvnpu!Jqq9VAE2d z1~pXg7Z^J4+#DyVGxqqnEX|u#o_0YDTPh^g9?`aF?sU^6(ok54QCZo(JKWDUI1l)` z9o8HDFagj#>5Dw`vH#g74Tm=kS@7c^RB1myqJ1uRgkGdrHtAm<2)-WFp2<-#KHfC# zO)Okr|H0ESt=42CPOLfL2DL4)@cYl?C`&2teP?;k0$5chb}o&OFaE8syE3#k10R0> z?M?dHpR3o{D`5)!hLrMD_)xVB1PRvZe?4h4%usgTLcwwu8iXNC2|MI)4wknPl2nX5 z!IYs1_8VUzHERO3!mquTS9W^1`;tTAYUjlZ}c>;qSt zwK+*irgRp%+5pBK2VAxA9n#DXQq9fO!h09RRPu?3+Y$|&OnL8hcvK)X%wb?H~8>CT|wSIYj69Up%wjF>F^ck`3|E8|vFLOOG0xTFd&ov|7-J6sxC9$!2 z#g8*IBb+vG8sF0U8N$ErkBWzgVRWO;{Xh@11lj)HshXR+8F*dcMiVaDtC@|p<2_kp zH|j2nrv{nIV!>m?nBcNcT~##ncmHfIowfgfV;A)3WIp+3;s%eX9(j@A#IPkg4w4WN zv7ef{m6iBkRE5F#*^&$_tj$D(D>LW{NNzqlHrb81Ee|_EXXay&!#`^89v~ z*qM|3O@V9YFv~$Mel0p~KX)xN{ZBsgy0x`;h~r~?O?&&xayw>v2Lah*+s~CH_;>UQ z<>O+{`%(n#?V`_~s`H5vNMjHFjO22r*<|EzyGZK~(;!>cg!(XF(pz?uLQUM5`p@hG zUxM$7Puv9@mw+R<7)kx|%|@1vdWh%B@a6FI^!juuJU}k{J*y)pea;|H{$@RFTCKLU z6nacIQPl7eZG!`Uat4ERwIOMt}uY3j@2JI(_vO%(l6iIfBP zuco?8xYVL1>cQw7AHY;g*2{E;XaYPCFV86t4_Y+HC(gSCn+mh-`o6isY%DJ_Vxl;2 zA0ZxAkFCU^`!Jja0+W!HyUll`GW)u}tLk=2)OuAxSYl5(?*U=jaEz#-E+3qnKsLz-3bBGLqd#`IZGXHPmR6pM}<%0+-YVd zxU#aSZ=ligr+HO+niNEUOs&S|5d7)}8Zpx~*W*dmRY`MDDF13R*Ax|9yL%ZHfh1Cm z>$Q(lrMUY6ZlG5(63gzUOY^7bG?Dr2IZ zf9+&Wd6GppjRZ?Awjez~h^~f&szUJBy+{uzss1rUU#rikr3t5w*MHl8rWM%gW5RpQ z?-;nu?(sD4hu4`kSoPbhe>}w`$Zb$ID47T(6NW6d4pPrm`CIc67LJL~nbo(bJSY7FbdzEz)R(?=3BDZOy^a zD7mW&Sg(h!x(kj@UA_DT74&qpYM!kfJ#WHPYGzMziPbXI&;p88`H_J5DljSYq1F3z zUCYyR=`9pvR)-P8PJRmH*>?FOUwUlw8(V`O6`{@Q0x8Vq_q{af@_f94Ha1<7RE|rT zPEzq{?6@@?y;c3jA=g^f4Vcml!F%Z2VOvRydXCrsp9N4TXNXs8sv<xHP-J%#{?yd0lPA-)gS^Q!a=IhHxjMT9X4DLD4&++FRwY_ z69$rVRt6i1-c!{}9l55v!XR}Ko0RQna~f6|r2_WlJ1v_8yLy4({I6EYHEBcZ2lw~( z9I+}Y5PpocPPfk*=~=Yr-GXBA{mN+sj*rwb!22Ya;)kMK2eUYyr+u>Ak)V(mEUaVaWge}ePthU#Q6iq$^eoh~I zU#v!7Lb`oz@hC*s#*6MY?mOx8Zh++!{~ko^`z(irfPgJA9B$q)RQPlI zXLh=WyM?=o`-yysJh!(@Qz!#vALbjyQ>V$3pwrpM?pHAQ^8G62&boEGSr0G3NqkuiWZsA44eS+uN|qaWWOu5(oeacXxeB_|rxV6Bg~>_|gc6 zaxUAOL0qR7I0#zOoz>eWj35LgvO>+%m_F!H7>qVI+LX&iJ) z$<^$_vdWzfVcgLPQFZ2h9PNc4Cd6#I>igl(#kQz^(T)}4x1eN7hDnhaRLPG;klNa| zdbV_{;tey6Ol+A{m>vD36ta0q)#04M`}gm8b9Y^OSnt4?e^&dPNpHtEwKcZTqeOo; z=6eM&yN~dL9cR2W=G$g#0l+F;R_&Lqx@fiNZxD$_B#C9-JQ4)4p>w#yZ3L;yD8|es zBTG_$?uUSwt=lvN0J5-~db#UlkXEFmXzxO?ac@s0MrHTV5JJ}4Kk13Qs}fREC_p3f z()o*H>dx2n4=q!As=WH^c6#hkOmx~!FBaG>z@;HxZ}9bLVA}?%HRd+6QmF+aP^yVV z=tI@ORmsIP+*OXvh)N*>5>f(aotU^;P;fH}zS+NRX6fC)8NBzpI6i_AXb>LcHYrjr z4*E_w-SM4sfNb!|c2kk+N+|WOF84SNDE3MWk-EaNQVBiETCOxPD2T1FBa_{vK*0zl zhGhBVz_7ly*lcOt^!2;mIK47y{>M_xa9OH<-F6rIS7^yLDO)U+ExCK2YaX_zR5=J+ zTaK>!`x&pVwX)dCP5;Va_1R3a{X6oEGdIQ}RZ`NDOQs$ludipD5(}B)rr7igeR2&g zSOztaTM<&`d`FEMSqoWn?uba!RHU^GclGpSAS3HnuYUT){42}k0D053C+c$VI4;uf zp_P*(REV^?u+X)Obc>bs@mr0; z(Q(19w@;_x!pj?{`eeAfFU3x}%upl<#HaVgUy4mfgk#F*zS)`34tBJ`&j-o?nF2c; z`~;_^4!#Tp4=aJ$HJ7E1$*+ol_AnFAkZ&cU$6qVpQt3RJ%^6`GGIFtV3w%FWG$DUV zTjPkeDN-sFCaS5L%3_yGBDeBBxgrx&?lLS+#YUQ}t`CRmkxg2RzNfXFv>MgJ^JU`@?D=z$ciX< zJxo0yV35PTV}%X_Grh-~NJNAw3D%Xb$C8#7X`35I83|5J-EkG2Ty!k6N))@v_S#R| zxg^Tt9eM-M*7WUteSbS+GRA*^GU6iE)UJ7Vsc&To4-M?q8yj^8-s7SP$*Q$+KQkiZ zYhB|*A8?|%;v(0!azZ!IK&=w0qEh3io{3+XSmYl*C>3dDG&5*-8NOk#A4#Y>j6$Z7 zPcggWW_|e6FYiU5ut2rH+B5YB&yrClM(^wll&&;{Z1%bGQb{Q+72E6n;>=Zgp%HGe zFYoamP2du5h+GF&oKPi?8AN$1zL*~8px(&bk^5|dfU#jdTO^N&B!S_VCwMg8Ts(~l zZt&{feA?DZxSriWHZiG2$Qw5xAgIaAfY;75UNtMOHy843?pJ?uO$-KG6{$$6u?pGI zH+?fw<4sH|v9Q4VoW+(b8&IJL0BCB|GuY4~VEgCdAWJ>8X!=hVsL@mmsQ9SNKQ`F$ zqJ}syLB5D)F0|pAT6OOHN0hdbDYt(paKDyP}?U=LocuIt z(fgmKdd-^diC;j~xcG5Z!_*6Z(#VKW<<-@2jk=8kcZs$ytZ=|HJJ9nuK_~3@3g%7t!~woLK2H`E+1v>heV_7@$FA;bL&KeE#~i<15tb9f4qge~K+P zN;pN2;rQ6LB*+xb6kZ}TuL1)!c5{Ore^GV75&rvSH_yZP^k)R-T)DcV!IE#t!0Jlf z+SG6&=xOxs*0H_0d+`HwxUy(&X^AKPM}u zH?*PW=Z>^$8Iq*Bd^o%+mP#47=H~u1Rwe^G`^QiPh}d@&KIo^#N=oS9KGquz18Nj* zqtQJ^v@PS{oIhTiMKSbBlAJ`pn^h$U>0=kooA^0__L?YfkiUzPlB|}4-NUz;aO5AC z$efyLO(_*9grbp@FsyB!+w9%L z#w;z<#GtGQx?QOZx)hM4Hk}L&_(MC&eXSWk(>e;AD;yGNY}nt$P_&j%K3`-lL?9JU zPn%N1fg7KPkm?-frvgskq^Noa2I||jRcHwdDcTll1clyov%$q;P|hKhT#_@AH&j=x zTM=D8epQs6ZKZ#Hovm4pJb%)Mn&(d#HR%G=d(D9&>+EdW@^tys5-gBytgKb^M*J`i z0$#y{+|x@kKU?+TB?vTgo!CUUeamObxixG~1My=w_Ox!9eTV-yiNc32U6O9=%=h86 zKj6S;?VK&Ev}yY2IEwJCh<`@Y_t3Sqq2_l2Y*^og{<&6-Z7ZI>d;g@LLrcS(x9ci= zxsx>q^u&J`H5BlNS+>NQZPU{&4{w?_>9Qiv82Jn@E(+6*?YNiO9ZZTk7NWxdiqx@$k$>pjW)xKN$=|m#vO+?tIQ8U z$f1F+edsdfN_oF@>cxA!_iZM_)1<#7+OZ^{!f#(E;UF06AenTok6QDjDROhSP89Z$ zfcj-qn4_ECO0a}y6DL~N*3f}W(I7yZIwvl!TG>WL6!YW2TihS4CcFX&qmczx|W~s zRU+9;@O@XyA^Qiijwgm5o%0bA&RQUXVX7s5a|@(N`f&&aX5nM8rKD%mUl+aE$*Msm zCWEfUL$cp{Mzln1Uz?+wFz*H`bKYj*TrrR*P#SJ+c~Y8g`B_|Sr$V!Yn3?6=gae-a zjd&CMg_CSszmyE;=Hf9t5Ge&%mll0^Za22LvtPa@4eJ8IL;#an%d#Rc_;otC0fH0U?499+>h6tv7ug9 z5(hn@Pt6bxZ*6Vu{?~pD+%ZdaJej!~LRsXjyu^;%Vh__*VI~RXXuaKWTia)` zdrMsyn~GwFtlTA^ryKBSbKXQtE@?MJ%gMnR$@z*xIGnK}E0ucG^%&=7tM?|N1nM)C zg**#F?yYuyqA(D)TK@(mkxtLoc@zj*aiRUzhAXErW;sMHvX`F3c3P z^qo#?@ZZGU{&2zsy-Gqw`0rR8j%-RXN*?`_KB~A{dB-$*6(!SSQQ-j(SBQI)9?pE6 z7P4drL1bvWv^aHa^MpzC{LXAj^AV=7ugtBKrffPY)n&g6MNVfJ8F4Qr3ekg~nt&3v ztY94%AjTTqZ*4JbH|ay&alc_TP%kK;Qv2QfJ*$F#?t6~gOQ82eJ~gP7kRl(hebrv+ z*sDtu4GOfZPCOTvR-7cT0AqcuERhkr25ue0auOMDkqQ|xr}boXbTlQ*lSq~}{X9!S zP2Rn>1}MtY3kn8e(SB9PsL4$hwFlaFj`%2VWsEwo5oFWe(CSI0^=)mzJi1)@d*_Y| z5kUlg{m*A+q>#x^f8HT9l^Bv|mJvdlx(v}lUw{n^nExF}fV9Yh5DOI8=(tc&o>t9} znm{1dZ}v(8cc9| zgP&hCY438h{Ie}}7!NO9GKCF-M1Sx~rs5CsWDxj9z=MwAfFHpqqbz1hg-t`0uhu^4 zII$+aP;dudCXZp{!x%+!7RT>ovl|G7N`c6sl$x7qs5q9xB>DXeoRk@Xlq8&8!CTX)_qw+h!kmF4{f#h4b44fxEFj z!YR55BI(VYa$}Te`n0z$GVbeI$s{w zGze@JM^LADT57L- zXZd%$y<;y7!jS}-ANw=zUA-{B3@bUFW1HvaU&~z`kAYqyBI{`%@UT3y&5m~57o0=V zx4sxU1JT?&h}c|5+c-*;uG-N%gfuNJD4Ssl0c(wy;PdGKCORg~y)Yc83X+~U{B$44 zNPhbj+P>05&t}+oA82nwFN3vAlRRox7YrCjnRKSZy|FY7-Q88Q#FnEBgHUI*{ zgGR^4M;2OmwRR|ib^E>1m;1?Py@U&*`6s>%W2s43DkoxKJit+6f~n+xiM{r&&h7qm zqspSO((8WqW=O?4_O7HH38V%WX7FU5fP%fNvsKdZqkbKpZeE0m%(dRdaso<7JQbeY8i z&veuD)LCt2W|7NcnYb#pOdXFyk`?E=Q-_vef4)!G4}hd(rPsBC-&Yw!EiarNXPT{p zdo2yGu0@^Rq=~oJY3S0Byq7TW%v9_%k&DTG+=qaD}SmrVMM}Q%vZLuMP|YM$>WeRt%eA$3KUIO_&7|>6dy@R zDdaP{5Kx&5;F3ZiTM!kgO<*1|NN3{{XvB2 z)I0V%_tkm!6WL=q3xyp9(*X+oMYvWHb0``iiTOdICcc|s`uq3a53xaaIAu7fYMj)} zS=1^bQO=LQMB7F+y2mr&KyVV8mG5IAQsgS(udJUoiNo{m>pE!eMMJ~zZdt7>prY?I zW^p(uQ%om5B_Lz$W!9BEJm^-!=c0=EIc%#R&;p9p`6?3SuaW#J* zqE zOLX-aK|U-+0|hLmLTE+Q(E~4$?e5pJ_8K6e`e9!bIStv|J1D58r{@Dc81F;0*_XA~ z?4=-uYU`3pw=RegZYb$hAHA(<26qV4H=14PLl!%9b9R`%(u%Hv-X z#63ox{$8s$$LX?ik4sBHT5Ll|2riuR;n6E|*h4@!jYCOF7eC7i>deOiMFJg>xO{^o z$p;Ut?J*}NgSl*obI{PjX%Tk7X1_K>_;p((jK~U&{p<0f_f* z!s-Tx@|93!dgqqZ_wPACsx8*#{{D_p@UK^}gZs-^umo}R_AS`U>&EoVF0W4No+ZYv ze3Kow!G|V^@8!CIxpcbvbCz|0zbz=V&@cLVmxK%JOfNHE`HhxVu3eh9ka*hI^t3_} zlqQw{oX>CkgJXFICnjcJx}?{qVQ$6g;rWYQt}=b~VfWH=!6ZFHd;>5=4JWPpE7rct&0KG|0Nm4){+`VrQ5V}|0NfVgBDScx0!c!AXBW&g3m7ax=q0l4mzPR`%SqTCeX%ehzWSmTonIQsFWg zDmHm?yVs$~;^M)vH-0qqa~6DQsX7y4y#ak|`ws+(-Akg5ypL!O=bJz|;|irHkC$=H zn1ph(e3&GO+=!oduF=inZiW#t`g%OCO`}pgt?Vt*d*n@ZT*Y~8Tp2xWM2QkZ{6BW_ zlx2LYssk^?K&SNLUzH=_V2zf)3Z_I_Cj-7zF&47q*RL^5%%8&sZz=g5b5|D^O?KT; z)B^47FGvT5iR*A~64*1-TzQ1fCYhU0~q&si=xY z4nin8pv`{A0jSt*%lFfcsi>JCN)o%}pk>*-6_B1}^}=#DKx0}(cp!b^Au8unk$ z5s(n~PjCes4}2mT`J--k3n=gaw3%Xmx4nge`Y6r6@8y za6sYZ)1#KL)^8;0h1#^ROhaRVwxy}%;F^LZBUsRW;YSK->lckKiL@!wN}`~5?q*~~ zwlOl1x!-}-MUl$?0hzY9jWgnY(Wpe$YMY;-)nMd9YpJkf{@S_H^L1KnW}n-oTOJpI zi}2^j2pv2eX8aEZ)Q9JZ>qCv`4Nt*^@w~Olsy{!XK1-Yt%GA|V4-Guwtn**MR5n&u z;~nNJUhXIL&^}wWyxDQT+LnKf$IB8Fnw>4mWD8v8JFwb3A0Ju|mxNotKSXHyvbUC1 zrT`)wZj?2mcoQlGI(v1F{cp;XzwCiI{f9GYi%Y2`-E5n^-xfbIUZb*8^Op$|91l;N z_#m)}ZFXL9aTTtw2>>P6C#PPQfy7GgA0!1>9 z;Y8wfNttH>>fN67I{Dm$@w$|?ZZqej^hp7^0 zg^*0Ic$9aVu_imkOZV`+H~7n8PhcLBlziUFYXFuPSgR?DB9^$8)l>2+0s}H4&p_X}9O< z!^D2|_)wOca*_2WZ!dZf|2&g|5NME+-@3zrzmV@s?>L=gN|9N%wE0)476b0T#YK{yy;-jO4hP=aZ*m4<$tlC-6G$eOd%tiNqAMW0MD$jSh(tAh}Qx8|L;hhU%T*TF2AzQ-X1N)z+ zK4NE}9y4%6cOlmoqwe65!#Z0Rq+@S(sJ=@dA|@uFeWR1tc5;FT3-cRe#H5FX>Y0c| z6|ZfY$lbB#odqoNI60V@3^vnYqQmV?a^;|@vk*6(Ft}CxZyViO*%0 zr@Zr(|MV!zwCIzeesTP@O~hS{X*>XRw6Lk>lx_?sx*T^nu0$R=EsPnEqarS%CSOjJ zkjvd@X&P#0e8~BdPU{ihT(Ibce_NT#gZ+tlF);il>{D!ss*zDF@DBce7U0raA6a8t z#QjJ>@&QcokANLMbg22WYAcD1%iK@1FH=+un6e3(4Cc4Ue~G((PIz{?N5PM90DfuJ zj6Uxr9<2|Wj^qzg6GYIQx0IWWHne)H<>D#uz=yJSn*8srv0?MHwT6Rk@?q6TtY^P9@^duy9m4FA^Om3>a(wu& zok-X|Cz|DI@1z6=lJUP`+UiK~#@W=mDRjB(omE$ed*q7}UmL43MT;4x?utQY>gwC5gP%h!ZhmDPkER#7;F9A9_ZawcheI8-{e+7cG zzxSHt)8C#B4DhB4!2aHq*UV;DA{|p%q8Slmumkeu<>`&Q>`?QMQn;z(d7ptPGu8|p zoh{h3C=h3g8((IcQKM=LvSE%*N+!dN&NHqa6g0S1+_$RX%m=VtX45`2z==PX$zK}P z>#!cOrDd4jg>T<1i6)uuJC5XU`Z=Z4h4VPM@Iv7R2ZEl?uSP~j0A?Mw41JxEf!7JC zkdwX!_k$HjXKYD0MD6cU zk3~Thl31J$nNv#%)X4Y=RA?3?q@*5QjpRGn|poO;U&ry zM+BU5d3oRJ;YXPPwU{ASc`cEOF>andakXbV_u|vxxIc8tYQ~Cm39PK2o!Z5lkhL{K z?*q$fm^efW7hB^F4-@+DHi77Pkif?#@P=<*MSwziWo=DAO{_?ZHJT_ zK$_L7XXQuG?GO^CzK}PAg#}%b2C1AJwJY75W|r6zS_xW?-+0KbUS0*FChq5()#Kxn zz=(IAk7o28hMX|@-pUD_Vca(Ym|`{UnjngUTNb_E@TRt!qj|PcQ3$ziqp3ROx}ayQ zvz>%WAuZHOE=a^@U%d^=b97nIycAP1&3dC%_v?{*{{aQr_@|pD%(0oYl40eH7DZCQ z2Ro_fPn<>bD{o?M^~jL{Guss|f5r>D@~V~OtPejaKlwE`0M0b!x$5PG`T7$$BDu5mdC<$_TPo!ws87eu1%&rZW{}TR2 zz-7=m?MoFC6SO0Dw*&WUxEb6jYd8vq$j{Au^A7?FX(f%uB55=lAJ&6l_n2CLWtVPu zqrmugzdpwwlkPOfRgg*4Tm1FB9F>VxF7su=jjx2&Mn_wh!@~S7h4&_ky?f%!bP{A- z59i`t`XyKsObKgi-);KQWwqcUT4j53AG9nq?|W($e-ph@eR=ZZizg1aA%rAH^mtd3 zk;xR^mcdMmO>K##u>@tPL`~w&{<(K`+DxwPO^P+tBu?lAbhR{gdL`)bShx7uJ2XU? zA|V@}-@pB_kx`=AVDegAGR3SdtZx!xq*nNIGPp#$!pg6$P~a3TXW@HY&EuQnC%b<+ ztlVKp>z7>Xo|n6#VKzd%wmXJo#|_u32yUU=|ZHLW<>CrFmd$tNY8X)l6E0 zkqMXc^8TgEqw;Bo{Rj1}>YX(X=hgeHQIn@1nV(o{8eCYu%F?7-+&}H{;r=(&(a+6& zk(#$z4QSXCd*xz@*Vjm&S{MucwsYOArInQD@)FZ?ShRj8Q)OJvP^#){|N7!bul$XM z=EX8?r2|vIExd7|_2B_Px%8TbS?6|wH%j(XbGX<|bqQY1w9aDFf?eBec(3*=F{P;$ zg(vzhPy@G-!?q4G7&qG-G>g9}DrRTyz=!6~A4XEXfe7R!<_qz0@$OQ~`<*Pm!$9hB z+sfbF?P0A&4sSy^@2f~Oi)9}d}{muB;k%%oDCbCy}d^tzRPGx$iuMD&DR31vjS}m~q;o5_?g+zm&pTl|sNOyf#;0O#PdK>Ku99rA zypvyBWj9JwdQU{mi5?LzeZin_rpF)tk9(ZOAaiuDPt?TjSH>v;oA8dSa3X2& z?9rPqIU0?aZyP^#HKuv;KYV0)1Ac?XrOompNEnC;{-M0L#NhvfqwwN&6Up>FeH8q9 zLTS=R^zK~AXs+@?x3xDp(=nPRwaOy3^esJ(6yCYk*wG>8dN%pWi_PLPIj5e2OG}XS zvABr|X7Wj+X2Z$L)(WqsW2Ibcq|i4iBG<0e*vwx!`PRTah5}}wMiip%Ok{-qM}P}0 zxFRU%e-=#*M6Bc-UkO4UV0kY$d;xS3sbw6(ip?yn$f#&AF6%RBRtG%&i?a#K63MmV zy<0ARgYk<04GUH>>~?LELMR#z1TPWDBHR2ujFMJfkX}XEmblAtVGjYDV#N>n0kDN7 zRJM&L1mBs-ySN;`W5+TH1P)CjOWc_NxQsqaZl=t`GfE{_>=t7T&7LQ`K|AGwV^PH{ zi|$$bno6BfPg(N?c~-3suF}7u;ESHl9GjIWb3w6{7sk@9oQ)0o{e8i3;VZFM4U_)? zk3n$0SGRcHyvBX|g5@%8n(5C!XJWC5@$q0jkLbFp>kb6Tp=fx{oOAQ%FSe{d;kZ^V z)Aq_?$7V5IKm&o)$OuQ%%_thmWVYGuge(KevjfCcXHJ@F;*^g8@8Q0h($SQW)_$ngZ&u*kWG^#NhzP7 z7jS;SiT%ElCNyrQYj5$~IV4O)zzw_Q!B)J6M)fk)Th{vu#RFYO zG0;_Sj;^<;vgzP;_HUYEJcRB%XPVn&nbYSNRE>ddPuSLT(z_fblp^==m2ZjAX&GIs zqRnc8Sm^z9+_L7e>`Se!Y)ea($K$fBvd2RoI)v-Ghv%ac6ZT{>9}N0!HuSE$iv9gg zlGJ;99UR9$_Z-pMs$dw(FvzuQR4OHx%ebN-Zg(LPaRNXI1f3uV?b(wV9`-pLrH3B| zLGZ+!Ia@QCbJf-RH75eSFhRGA>054L{@5;xitlyK{8oe8Ec&uhm>F^1Il*o1<@p`R zFFFXz(g2-&UqZeqQtuYYwZ)vVh~5sUwH!%S3mftfw7b8*BD}F%5E@~4)MhIs67gW z98UtZ6~M`lC$3DuCr_R$76)%A;zj^|%w)4a9~^XO+62c1cpfU1ELn!vuP;oc8BqOUKbs$p5i1OYKka@)34cel5pAq_!V zb@g|;{2>lZIx_V(LmK98o;iD=ZD%K-pjS(a_>+BgimTrR1psa;Xj zty?P{jz7CxE2m5e`TgGp0;|H|2O#KFJZ^*^$>1NCO}pYCq~Z%(;O3OPbSj4ZWN^^k z(z2T*!$U(;!{N~DuS1tEQC(g7!~_zJ%7sEul2R1K;5fNqL$<#^3WZ5_JHWq|q(3XO4_fLgFVhRoN+G&jH48=iL~1eo*f@LzML)^HkC#E01Rj#{ zl3H@irFKPyEu-{yMREe>ru&JRdFV}otF57#Vbm#WaEb`96Mri*ca))e5x+^p=gM(> zQLs6t*g=w1c*6q0o%o%gn4QDUn+MIkj$yE-=`_v6VqKM$w_8>N2ucXz&zvEh`xD$R z0C&nj%VzEux4MrGaxW-~a>w|%udZ&v)Tt2+%iCPw;3Dnf6ix#Ozj%XV;sI9HAEW?738yj;c5=OD8t17v2Wvr{qWtsxZI$^l{>Z{0w z3rJlZ+SpidI5MG-&FOr^?LNa^>R=w@t1VBemi z-AVm3$<3YZ*w;^dmx@+n-lyWJUrU|?&DfoxLgA*Nq1$YeVye0q1p6pzFHJ)Pv6v(s zB&jk?jixbP?^JB#MgP&G_~4*9I4B)IaF}sz-MXz<%qz+V6t$yRtSObex}Gx4VUldT zeEBR%4(#4NGnL9VEYe!)c_?O_>IB|B$lj2{jR5@k358a8z5Y^3!7w|55W9D03I%4x z3U0xIKZ4)~qWBOCqv0^y+KSJf z&2QR-!|-{MtV9qTo_Z3j6F&WPrzko(EyFls1-E?@p<0I<)S z*BA)=%jpbwy>`p`1jnyitN+e?cPhHP!mEw&&l9fC*uig2{Mo(W6ERsPO>^1RtE*~j zr+x4NrfIH&2m3z%d{SE*Rw!UR54E)Lk%(W{vp8-i2x0GD_~c0fMfG{}fV#R^LxYbb zU-5V@%kmlg?<^v5nJx32&T(0W2tv(f8}0Uo6oo_(EEt^A-K|$wSF&u3rinJ9);wgK2(FGY}f0D1+l>IGx{LyT(C~M-afvml;tc1Oe>s_LfT77hhCQ zpN0bgyWK9GJ!_=X#I00KALE6cT$weaUN0R9(`2n?k1d0 zJC5^{Cdm~Qt~qn|QB->(p?mI%XOCIlGnM2c9!a|I*s;c{s%Z|#iqRkv3azxQnFl~A zN1X@w%L#Wr6`Qu0dUv_h*xS?dZ;pHOF#OBE{cXyuS#tw{mWc_Ys%lktcf6uv+UV%W zrAwPKndS=@?77@cm6ep&`>NyVB6!zd@$1(`Sxy3geY`8vvT$Nzw5DcGJpK=sZ4$)~ z7A{<(s?Ca0()IC&A7(O{d^TIiW@~0~ogbb8{&e()7;XgMf5TGnf6Sa&pUc@{xcHmj z;QjqrZLQqgynoiLPP=^v@T*S<5KK}9ueXe0oN0E#a1V;wLZRrzi&Ojh92_V8`@e$+ z4>DV}Bsx2BNmACWGZ?04_UtLK*crFG%QS~*dJ#c1e*gVso=4;HG7LKqr2MO2={DQd zrY7I2RZoUOgu}7L=X=BJWs^y*rsf?8ItM+`2OR59&)(#G`H?# zFzk`p+*g3|lb?_?FDla^!8P4^YmaW@^=&o8f+>;aaj$nWK{&_9XQAk9o)1aVBvqx7 zNgKly0pRKJah_pR!)St_D=2EBXbi_?juUNn^0rS+;C>H|+azi8S6{8eFvtG=%Zo*6 zr?0-%IFAZuHzX-U|GWH9PjU+oXg>YfG$`N zK66IS<;a~oh0abh7<3K|r34|I$r!O1EJ;>NOLBD7L6T(*bEebs>#yq_9fZpzM<(WvhCQ=_Bt=4Pke4z67JN1v}F8lB?XaiDkxq7Mk%+8P9Tti2rt!L^NzRsZ@| z1&ZPxPkelQz9jvh>(}oe9-d0iq|eWODsa2+-FKIePevBCk9{0hhG9F%VoQNo|_8 z-ZTSt`wY{xUAeM1lUereyLH#E`x_c^?d^7+FBA&yQmOdNGe~>8Ti4}9i=^&u9K(o? z4!BqZB9S=5RKPH~d-vOm7sm<(hPmbQ{Kta%?6cIrT^8nIyf}lR229fe0EHmPOeXAb zgdvC+8{;uduc&CT+pn~>HQao2)#1b3;>8s>j!6)h^n z>2!)DtFB(v-EP(AyEmI1a=WLw-3$oEQIrC~s|=$=A_3=MQg~SNUr_XW^i=B6?(W6o z<4vD^M#kgl^Up&=LqWrEx?Ea1?F2!ZWhX+Rs(k)>C{!Q_T_07cYB5nUH>5;LfZc9S zU%NJE)vB8VflzC!WA<#svc#$?Djv^roFkDaj*T&e0wxH6qA+eZN0KfC5ng^-J9$#7 zsj(4+kVrsNrdS+@A_#)xX;pQ4Jkd}n#xO;P<7Th-CH5D(Cy|ujQ%UjxiW)|c&0eqf zZ-1LII*N~s7=;3+>*S?N_Iw`c>YA2J1{QCt`sgF4rZwDmAM=;L&^S&f5|Mbkab!fE zm@xBsWa(1ri!TBrBlNXvOeBK7^b+vaTY5OmY~30dAFq1rt%>I5@4suH+fU^dHdQ+c z#exYmPV2jF%ulDIrBV(-y5jMvigI!O{Amz0O%zRCA5EovGiGGQ#**KDd+CN5ZUo?e z1#{;7WXBFO80=cRw(*A_;`iQrt)*qqG=GZYhmAi;^n{fA3UTN2#f6sJZQ5WfrEX@J zVV2!qUqA2AA;{~scXVV;)64UuWmzz6g+iRqXIr|IXPDm>zfDx$WtcT4g8XM7@KG$b zZrL)bzW&QlsJ^#1K5N#yZuj@t>dV$QN$Iw&!6yzUCf7QDkOOX+?BB!;4oW<4ZQKYv*2!#yV(o>BWe&gr%JSMkpgEVDbMa!OuDh>a4{@9| zXU_b~m)U94ybMzlkMj!`E*%@|t*i_RLchnuVOSXeJ~z#Qbb5`;)m!YsJkPTHSC(nM zqN;wI?cP8CIoRHA?%07IJ`AK%WM?NnJgi2e_IMnNMDV$DEkzkqls3CPJow8D_QVse z*p>1m*s$+a)k`>jcTLS{l3b=J`9wnS`GNxjqlOVI6u7RgszRYCNsOwZJ9d;!Q}KH7 zojb+0HaHk`UB4b92#;aVEQ=rrqpG}RVFbYz3e}aB=hv^l$>aF|0FDEUUUAu9E*WB-<&^v+F@Dz^Uovu_hWnZ5N@}11wYAPOXCRi1XEGn{ z+&Me=VV|p1mJFcX1g0$k#x5T0kbLvzZ7&oOb#?V1*cgduvMeY{S9SFYMG<-an|M4I zjb?6`;YI-dSMcz|)0ZrnR4Az7@Vm9Oy)`v&!|-`{kwJV2#vhzR4@BgC41V}wu8CQwI!mP_42J>0sH`MiE@Z`u?4CWpFO`l29I>L)GK_mo z6V`QB)27zcyiJlBiu$L`c7mdM!^BlUi%&S83;p4T;-3KG&7?d{HHDBV-%%jEQ8{Q;DGa0LO6M~eZC=Y^$WOA9+THv^tAj}Sj zEj2Z}g2C?c@;OdtwIsD03>Kch=5~u+T~-*zbX}*Y3x0peYHez0IFiZqDasG93zxA4 zR)&P2%QA1VPJ==!`bzib>En^jrqYH#PWS<|DBdfMBQ^X64h zlpRGGv)MQ`)oZsCs;W2~mr5nh=le`myK}i$X!@Ego6Q@d;y1GJ#v4hJwAnW5y5s%# z%UWB3wl=Cz0AV;43|e%3YJA+8Op*r=PG7p@+O(;!y&bQqnb7r@sO1o(jTY@jAQy!# zAVCb^c;d{NjrH}PQdHOQu#=*s@^VvWr(N@-S>#EWCxxrA4<3{Ms<62!6@#|^B@=~!l@3YSy zZ*RBXyy={pGCcNJ>hfhH2r5rK#h*9<;y4kFnhOOa99AYLp?n?=2K8JHkt9wOT__rR z;RQ()Zwf+vPfvnnZTH`=cXlcmW;}8voX?kWT-9IyY7B*vxg1w0+!BPHbLN~HUTC>^ zCcW^3hS{_7QbM0D0OW%2XEM=ZF=e+;j*piqN_TT}mCe>vEaIZr-_`Z!nd?6jfNzl> z{ir|?cVKwjCLLvfVQQl~`bSNC`DMfYYhnM@pGpsMvWJvW;j0l|H_T=VhcvnM8MH*KPR{cC?Z zT^bm$F%0+9pAsK@zzc%a<&y8*fr~|IdK!~u6M`g*MPninlq9z-6MOc=1_wPTTB2!V zMMd$u-<9Uf`A-DVSk??a`!zMJ2Io@lYAKhSS5X0wq!tc8%(6THz`eaDyB&w&=R=|H zS+nL^t%RZkP?VdV4pmhV#Ud<<_R&#o_Uw+bvS4}n8j}1PMJE{MUaIf~V8rC^fWb?^ z;V{~eLKd)UH4j#D1s-#`<_!$HagBcf03ZNKL_t(6Po?l&4p_BnR!7GK!#KBZCl%$q z*W1|F7h1YBOVi_#NR%WwRqgfp3M?D2+b?Ic-6;BR7Rxz~v*XMd_naV)0|Ye}5nl;y5&y`%n}| z1)+Q9Cd>rjTjAFL@HhadyY@PFeq7uYCEWim?l=oR^%Pkw8h;evjFp_@A(MG6&u2)o zro?wzA1FbG#N?K8pAQ$sN=Xt}R(CPRqAe0_^Ogec|FO>*EpeH84L_$p@48@|lWJ#)6v}#%@owliJ z@drN;zWIiBIFv{P^m^Gx9zo~K`Eb^(27+*@_x}bvJ&8q&ct#SRaM^5XK5x;q?}kFt z2E*)6KB4B!F?c-7`}(4ll~wWhnAfZEe6hC|kR;mYTTm!WGYmaA2$z=+wX{5#$y~JC z4LCjv1b>NP6M80!xwOPI;#irSI?0xA6u~l?u`V~-rvzb@ARHVW4Xj>$kKbQ0K29!N zSkch%H=_|!)k%k=plK7Ok}H?Pcs_!n5=pk2&F^wtS`=Sb)zc_S=kox9#9?E(_L~qU zY3Y@q%T@iCzwGMoZwdy{p&^aq5Vu>LnsP8q=HNm8=1tCSx0}uB@o~6RG73Tl$GxI> z(_mObLYmoyUmJ{<#~rF=AL^FJa-O(VSU!D5{d#e4Xjx4I8A?@ey86%TvXy> zYV#9*zn0B@{||qti$tWi-oizZ93Iw;M!8r-KoAE29m5EMNVwgmT#j+MVh#tga-}{p zVx?*AvBye%eNaV(WqP_vRkcKdn3#YOgf1&f34$#UD4aOqh(z4y&tn}OL^i7ez;rgN zxZRd~ewbya4@J9KFF^mLui=Qw-T z(bwmG^;Phrk8q#Q?DKKguE9%|@Ru&Z*({}L$%zS1GC7>fIarqV`HB>UyWNG}UbCte ze)vQ2>{;Dzcbd(`SPW=w1s{3ja7zm!2pmnn9b9+HdAC5$V&jJ8mIo#nznf)$7ziY4 zYF5E8($`nk&|sOIjN9#HC|b1H^5JkQk+3t2p{c2bWd}$SA0AHUa<=8mTMLD&RaI3a ziNWw;nhq#y$Bf6N%)@i6)|g;ZEEbJZCDw7ky1hO35D0<~6pN6})-p0O+T3i?w4km} zI-Tt3XwYIo1%WD+^k5K0(UjS&Ivg88@U+!>T~+r$P~2jvi$>e6RxeG%05Gbmy!Ihy z(8T_>341Cl#^K=>6s0;lF$ls?G;TCnG8xWd z5ltp~^XB;3vvyTw_U#jH-^L$%Ov&f5aM)rn@S+I9FnRagf15u)8wyQ0|1FjcsN^Bd z@*S;ITK}g%?Yeo>`oIJF=byvrG<5M|fMI;4l3rg=*zIt0bIR%DP!!p__rFF)+|NBX z>-O#8eBQlqAv-aFQxq*pDW}sDiL|X;IcT?!hr_JNBvX|A&K(W z${S|$slqxHMPD;0H+jupEY7jpf2Qkew1-dXdv+zt0=@@Q(1#`Pv_wD7#0FPbzswh! zcmOz{?7R#?_p+>pVfR@qwWm(4*7ez=qcRAVBM6}=Fw1JUZaEW)vK1?;`umepQ|7&U z(KBa|@^Ui_8*bjDA`$G)9W|3NrBX_?oC*jbFZf5?DpDFD5>iU zvRTvAR1QHLEZb!?A{dq$9E6ieW#PglJw54$2Jhv|38xcmY+SA==ly5gGMO9zu!|Qz+27w)UCp6rqo(BvqDq!W5JYF$qQz1}k~Zjcx0#Vr=>?{b zr^Dg9FI<>=>y~-{e*D-mQIhn93+3TqKooIF3MG@aTrMDr1nqhWB|aa>(JY8XA~vw^%}Nr{kPiMAq;zQ!Gc@q^n8cIdGR77 z2*$}trC6kEYO-_Zo`;|@lPO{}mgdjj&T(J1x6gm;t+MfPy1Tm+3KdbbM-;EjnpL04 z%++;0nM4;a-c~A&@qFmiDN|!(|3#mrW)W054@OdaEDy}-80#uunoLecqoe8c^vpq+ z3Bb3@1DINV*e&d)Vs-Lm!bwzm$ z1bc8CW)%!NbR9{I5U-75C#Irxb>5#{;C3U~f83+)YvuXY;o+tJy@7mw3xY5t*%*!9 zw%LACC@j2ip(PqEzi~rPB&dZ8k$gS`g6W9~f@O`%mMtC}995LcRjcT8=U|J)5C}wr zL1Qci-nykG5_++SFbv($5R67m08k=HGfndkKMY>HsIn}vU;z`4LpV;UYC;ff-Q81n z->oz@0_)bj`4m@LD+X?+Eq1D%+yGId3$MFG@479gzm1SK~WI-6F zX=c`}dX^o?W-U!kvj+#WOP9{3X>%?IH#Jp`jYaKtpQhz)wmy~}^ZU<2&=^t%z&16J zc;v*1wG|b$Hrsj_z68TwMUjZ5J;3G?hPiN@)U*agDGUraC@M=)a!t*~aCn@e%A?V! z$;8*x?2bk!d_JGkNfwJLj?>|A*6X#V(}3A5WHMw~*%e)%h|v#N-{{W#hc1fGo<7~U zfB*dQa^Ro;1S}Rco5f@q)HDMCAc9cTb%!XH91a^z8#ix`UAbaQr%R7MDgr=XOUoib zSYj}o!Y~2ZGzBkU(zmKT|2`5}q55`;(EC#9p*Nh)KbJ~t-0lyirYd*s@?E@$84R?^ z1l+lU@H`X_1Cm6U&B<7dRMni<>!NA($tTly-~Bw_eMwpUIMURv5vb8vP?VoD%;NXn zGmekLU0qr*i0e92D3}n0d*cmhWW;m#-CS+0!R7jmqHM#k>o8pW>tAcb;qr8vynS0O zm5j@mN8N6I(V{DU|23Z1s;hsX>mN9s3tL)tX0wK!JFQ=Tjb<{8DE`ysT2Lx^VlkJl zLjZ6G0P4rbzaq(zii&4AF1llfx_&*#{q2r1F9y;;)i{L-^81pWN=*+9war|EnE-t2 z?D~_#=``aw=JD+M^{*YtBzgO`5r);D{uDoVPIfrp*|T%CwZD|*P4t}$XdRGF=e;j5 zz-J8BRm8eW*{xgMfA7;4i@m*1s=M7@?@JH_QPez-r*&|!%IjVK>8CX?yeXM9oH?^} zaM0b|O~m7-ojZ#FkTw`H05FtJ8&|JhZ?l%Y0|2eQa!s z=RJZzZ`+m{88JhU_Tr1$ojdaV_rs+UJUk3ptyn$}DhkB1x+t0qhD=Qj?e`Bp_0;=w z=G;i7*4o}bCjGsrJa8}YXg_99Rb4?g#fi-s3@hSzF&wTme<#r0xO(>NewQm!QL%#K z?$~Uw&$lud>}_hA-`6)`wc1#=G&Yu3RTE9OnayckPuT7MV3^GTm`8;*|whKX$t*vWs-b~fhSZ%iYU~p>D zqGiEgXL-3b7E7|MJDCLA+U)UoT~(EfWrtu`Hkq!JN&!iF#lGQdMKR=Ss-gK-1gZb* zvjy=uGCE2Q4x*9-a~vScw)yiX!(kVSa*~A6G_!v{ap8i>Fw%krY(7s?6y|nE;&H#G zJ?(Th0Dv{0U*_|5WST8zcbeM{qyPDzdhl!g9v1-~g)qY9dL$4SS+HQts?BmDho;H1%3Iu#6BDk`SF`f5`;ZRa@RuDg;K zFPgV)<2G(YX!=uvc){&XljN|?<}H=hQIz?oKh1pejWrenipA>`H7_22kLMR^+J|%J zHs@O99QJ|Kv!37P0fW~tI2%|DCf;sE|*Y%Uxda|shMa0nE-tI{00D) z9_L~^zyHP?-y0oeCnu>?ih1cJyuUw3(-cW6cilByRR!t#FG+GdSTbAxC7%00wx*e= zED8q?n%`^_=BdTvy~*UtxpN>ajI(W z(MRRJJ}U^at5&gneKHIiMn{os7LCOyj?-nCG@Bt51?%c!4C82R<>t>nvT)%UU4NGR z{9Q!N6&KHg9~`CUis7(ovo*o69RTJb$gE7Ji6o2iTQdERG{g96Y91>TPPpC6ES5$H zI!=<{)Ktvn0;i@5I4;U^3C9Qg{=C^dzoOzZmc7dJuVDIRk-VRx7zFu_+wJ@B|8@@# z>n$xO8yk6!J8m>)5m3n&Uo;x~7-n@}pExyDzHHf??(W=z1r0Rqjm1PwBjfQ=v)M>d zP$U8egGwl5;W*3Y%~&!yQCllpt)B}*K$f4>_nfj7$PAzZ6A8Ge$L21suCBg*9SVh< z?d>55vVtJGZCf-NwS!>c*=PB-Hszs*uwu~^3_^B0kV@$wXx4Qd0E`qRUA^jAu%KgT zXiX+lWis84L}ruZuqf^&yL(_aCn_SmY5*Y`2qLIyleyeHzyHGJ%U-8bBM5!Pifmt> zqg3KJj>a(Ud*4Hh#;=wvSyWY34*bi{O(P-cojTL%ig=v<W_M(T5e)n~I0y50A@@kYhe6d4Q}&YklN4@0GriR0*Rxf|@1_ zjzT5Cp|A>;#IA>H1oa z=j-utyTdVIGUX~Oce-33N>Y^Pcc76^5eJ}wkip>8H1OBIezK#(RV?ZdL@r;h()9cJ zdGaW(=k6$3nN!~`kb8KZe@qajPoJ&~2Cb@^d+s^8 zql2>9v~}y0p&`g%fcyGjj-!%EY(jSx5yc{N@F0BYQewr5?OtyU zN%Ap)g?vhhm6vxBpbF^ESGWI?sQ(bb7%hj_uG=mKq6rag=ksU zw{K@KELUDmlu9FwjRzp;W9sf@*!tR3s`c~FclY%*UA}B87W2Gk#?h)tG9 zY&JXk^G}?A`ouEVqhGtJe(}v0s^zuU+&w)jNOBd+21Id^VPb_sEePIjYNBMhTohpd zNagdi+YJ>8Lq_9{_ulKStquL-o9Go4cu$$R1Tz8nR>C&^p=#S*1_RpHN0mx4MZsld zC;&tree`s5^Gy%;AuMzP8#U~&N_N#E`IT3Y&`I@)J;=TxcquFr=;h1*%W<3Eeb;yA z4(4>GFI}<}3LFfVfgrMfe|T_^G#HA}Xo4W%XPz+ygZwG$Hk0}Mu1lAy3I$7R z>w*&}Di<$yI-T_-IShh}LGY}}BqtIsw|fjlqbPbA!v>?#yG*7#s*0LShf}G_nwm#^ zzE@?r42GKl;Lk8TjyU2ZDP*($uCCYKeRsjgh&h?GKK*nA!=~%%KF9G6xlbYdnB+hp zs20bY0s+wF!b>HZAhPLn#^p+yOpM)r)8~tFTvI$gp3PG8=G9M6PqwsFTP$TJ)3Y#q z8AY!m$XHbJSYL^-I{|Zm0di_??!#VhZ!Wju$`$1L^{SU&23QtNr!l8fh(>9SlL`d@ zf*d?QJuzYDxFEyOl4RbyH{9LrfuPKHzl)teFZz7+z(AA3fuvFzj*n0jrqy?td|1-!TmVxkMAsnz0KW4b`qCxSoH^l&iWj_(?0`=H z!O(GAn@U6qfI4fu0L(spTIBh#APoC_4+=u6riN$P#&DPrMH~PoalA=YAq4q+>C&e& z8BvlF#p0D?W2J$aXaAW1d}}o{?1;zR@i;hteyFk%+`02lt*w1kRbiLwkEvT@yyqv* z`!1&UJ}56-s9(Nh$TRYRAnk?YnL=CJXM=-#zW9Rf?S=2UD|YT&Wud^)v=Kp=?|)wy z7!X`8qOp;io(8vXcSa&%in8bPg?QYZ&BA7L2St?}j)t2ziQ!?xwQB~3;lKAi;h+Dk zDHMdVvf{)9qN?!ZB*8Fo>6?m*Sv7C$NBY|h$Npk?C;)97y zq^@2C2?ANREH^$*$g(yu0Wpj@7Q<1LDHe%RsT+nV04NYdHO~+6{M)IAE*ooV3r;8e zzfl%>#E>p!qw% znX68Rqf?e2H<^|&OkNbn0RTxP>>xN=R%Recf1!W?Kqiy%8w_}d>?dj>5xd1Z( z_*S#q_iWoX-qe&^w(Pg{^*0KIb)3ZtJLpQR?6N`y$ zZGXFZb@8Q3u0Viz@x}DTi!M>jGmODxDn9p|G&Kd4m613O<@2Df!@;15VSw`TVmfV! z$BT7!A)_(T++5EvK?w35I#dx1>fiZ}cKEPRC>V8Jj>iFx!!j925a7DH_|%kLRV9uy z06_lbm*tx`Jp@tMw5inJ5AEKq7mI+?X<}KqrG>NE;Ks%mVE9}jvBJ9ji^4*Qn&(gq zP6&Fmz1>?^S826wJ#s`anM{QOKQUpB#n5aP%4Bc|8UsNy499%FP$DscqCdv*%PH*L0YRoz!8=$eMpbOQ*sW0+{M z{FlM-)$|FX@*lLe!;sIfA;}hoaTpACetB3F_p5)pX;euW)WD4v5S)Mcautd?dwWwT zYE7rZnT(@Y1b6LuIyuN>Qfgo=e?* z_eUh@YiKB2y!c&`e9B}(5#(bG8$i)GiV8=MJ|B(NUAv}EO_?-J{?~s6&!4ABl51}# z%x3t&fvR}C{Ga~}Q`DCiO=W>AV--ghH$0O7r}f_Mk=aY1F_|uPb!mby*wV6-VTu6o zPnuqnPQ!%)4FGYc)5UQ_D0B*f+7pSHe>%_q95{n zzhHh4+1SEo{O|HEmux&R%lC3brOFrBI#^WwQ>3!DSiHG~@Q|;pu6guIIB^wlI)^O24%0|%fv{WQIgAUI9iR9Dy3-p-m#?v9QE0Jx&j ztkWq*A``hB#c}wC4Q`IRXfTX2%u@(*0mBTktV56lf|}V(AqWzQlq{BMNdjykmgbbW z?G+DmgQ07NhL&}Auid`g{@G`cD8jNVFI))ue6-*H3Q2ZGl2&(fqM)l*tD>q}D)q3% z)F&(5g~Cn@yP|13gTZO5wFtvW7>=Q6grW|EV0$uIL(_Bl<^15_=6t@HqPAbSAXZce zvb+IBza~jAbGl$!p3`eptic6AD2guW?X~1`+{6UU^QE`mf=`^V!Z5gQU9Phey7ykZ zqeGQtJdps?X^LTBj?)BzShOe-3|buyL6#9o;$M2n(AO7iZAB_8YeaF_X!PcC7o1Ls zAUH)y>bjsq5{`?xoNV8oQlFA6mTrR~91g$aaQrEkyD5tI>HdJhVDtOCKK=CGo*v`i zppoa1rl!dBv{jZ1Uat*?ORvAKG&CHUKOcdh#Wvf16rEPp(*$v2eEgFAcLk)K&(GaR z(@mPT?D%oQvfSo}Z`T$=Xxva(Id zq*2#Z065Js|CpKoOaQ*sUVClp)~yFTo}Wn4qotC8qK+y`jnO!TqPfgBCgYzcb6I($ z`lo60#-m5K4-fA^5Zfo8_$DUUg9p_UCq#q63d4m$0RaG-qEwHE(Dk6*?ntK@vsord zUDI*|p*1(Fb#)(c95!dpJQzOfa<$m)_@|#%jE}3Gop7mylVny9ETxj* zmP5?!4djD2iCQ?D~MG{C;RMn27-z(?5Al9&x;r)mr5arDVx8e!!17!c3mdQ9R<>c<2x*t#ee*x zBbg)_CZ#B*%F2!vE3SDw!=+M_yL2gQLLD(SZ`M@x857qfqKGKfYMLF#D|P)WMJ2OY z&EXivuq1-WIG&3{7AndHUAKJk#Rdd1&YAPD!(qTMUqwZQAf#xzOp;FGIFlP??d6=s zCU#}FAxOp8SjEYc?o^8T{`ZAbrz8lX9gbp84jnV0VYe$B*DH$mMk42;(I)_4xh$KlR(?DPUg9{r)5*N{ znp{_RZt2oF4Goow@-&WL)(0bmFPBJ}t=ke}Tr>Y%rSDN$_ML$N{mhw~XP?!sT%lYp zOxKNqU{Vxf%NB0gGRv`Ji5oZU)6+^W*TFEOpMTzG@iq-y9;(~As$xM3%qi&zK)7CX zyN5bELo7Sc+PW*3LnSHfa5PKO%1p+h>kkfpc74SPWNJ!-AUvO+R8_a4AP52wg!Pd}vZJFG zk0-x&?WMJAzkuPl#qa)}ge1l1QWy2&xNzmlV`XJKdwR+`J7-5Cu24wI<%q3Y@!np| zVgZ*dFvwY}m^ph;ZS;22FGJ^cYl?)b;FLccp#4%P!aMs;VE9N~q!9X?3%zw>~Nq zdn|T{0YH;!DUMg+_<0l!N23;pBT^_ZUayU!=w$N6p`luvZ4QcVymH0+@WTs^9D#A% z)z@bZg|fLEUSIz{iU#6w#3e@yG2Qi$E|;mg{#JW?`uutCGtX#Oud)`48OJRH18Ob@ zClVybfph0Zy1LvTm|T3B~h$tZ}$R#eg6FC4j%?vTO)$7hS+|@I9pP;hp0OW_(6cWp3`rN!1@A?Gljx( zs}=m}tGNvg0k@lpL=c7ncwXGKOQ@)rShUDLIoaFX{1X5;jKuS}g^lY=oOg|KUqjYC zLg6{xKtGG)os#sZ%{KSaC4<30ghEs4v?mmr?C5Y!P5CcfBD%Vgy}eEtzEUXkFwA&; z{WClte*XD2q`S7(_X$x@LPJ39hUV$%Z@Rkhd+%Kq3~orLQI_o%gmE07%;)Pt@b8*- z1OR?Fv;CO>%m9`waa2~ehQpDOkpojx3ol-*2?Q4U{qV743xdH19(u_7&wt|0%|;9p zjvT?7nxwWiEt4^lWYS`B06>1>LawY#S+L;n(xt(MhD8u`Wpc85&mMYgZ2G|m=Tnr? zX1i>)&Q{f*84TC5*=o1j+|l8hp00?+@O)mTDAVlO(R?1t=h*`X(2Ex(tCds~c3=QX zrJzs<;d!{WHZeG8GZ+-F*PPE!`28lM5i=UIwY7cg*XOIN7a9ydMbQv`H*fl%kQ`%> zUF8_&!0{~~eKaSRgGWcr`TXryUv(Zm3f0#mixy#BUAd+v^Wb3IW~*WtSXD~|fq6V9 z{r*%eM%ZlUvsuOE5=l}`B;G>NPc$u5EUp7$9k>IG9?tpR%WGRR2E%3?uRVLVzEm>P zbjs_MYH9+@mseV?KP3p6VQk>OZe{gKaLYJ|Na-ABv#q4*3PlNkU?G)SXt!T27Eyzt zqFB@w<(1A(#O2y*wN@WH=0gzl(j_pJGJqfxi#ZsEnm_;3>guQ6P9FB4~0xD3qAN??A9$GiVEqpMbk=ezDZoUQifri z)5#|iAOumtpvbZ&t2Jvd7*nbCva+Jd#5FaQClZrBA9U*$5)RvU?_Q1|OHwJdwzkY@ zoHm;)6y+pMv%#aZ?H^%cpQ!&_p{7dVdls5EOso4BVA!FNk-1MkIoD!AhlUJ`7NIN) zmX#TeMy9p(2#S8-vlIbDNQsX+Tx0U1lD2Q3R@p8;yRTwvkNC8#X(kXvFf5l$Mr&&= zot?O(?(gn^zVJBODhzc`{j989DluJ31a%{m2Fc zDTYE)JI7$>djx@&^Fun;HI00A>IH06hHgT}O_*nn+L| zeYB*fr{e9m>CZnWY_`fZYl!2=5t|Jh8!JvuTEby!cvxW=n5K2BmA2Um4Go~#Jh6K9 z`KG2xlj)wp!6~m-wA2wQCCof!R6a+z4 zm2KPb>(^C>gW9r1Zf_?j3JZrLEbA&3snJoLVazrV`-R{pRs?KPvfZ?+sn1EJf$UQa(gO(u&ZIThuJNCa}b7uoIjp+oh70H$eE80Mg;LN;s5 z3Xj)~Trpv$ z*D+PatX6({npRc*@yFHMw?zOzM3GG>f=gx{1^Ll#N zh6bzK?Y(_FvwHP{Pd+h;qT%*!O%$Pg9xfImnr7CtX@an;8zV*|61 z_!`Rw8D_ky>Is&OXR~Ma?c20yT|`xjU0wW|H7O{s9=T-x=}*^;kI#=p5QZ5`Bu*8J zpUg~tCIB=3kF{%moz1TM^iyXvO77o}_VmCA0=Be>$Bs!HNA~nc`8*X0Wpg=OsiZ3k zh@ysN%VNuxb%3CC+qT~r3~|5zJENm*K3}WP*BlInyxww}{v(bDNHXMd{Rx7uvg}5) zd3G?^+}^&YynNz!zq^kh3j6oZM-XCY$WT?KheA4z(>HENr4k|t#eo5DBB9ALqA1X& zOvWU0gffVHWKiN_V19yJ)IibZJS#@SO-6P1-E1X%}y ze^AxUqBus9G5{noEC9nXpr0{2_~_^o$L^s*CFpR7!^6v}s~28LU?uPgL{%gJ8VAh&*&hy;&-uv23 zZHur3X{Ho*@O|3KDw_wqVmtTeHUpE$*e9Yfs9}8?Gag3NdCJ7CD-1UpxYGu|vwG@} zzKV(Y;2m%~UFyrv{|LlkbDR$}t$p}Moj=bk9ytBtcF+$v)_0qridZpJP>Fzi=|3Tr zTDn|Di5TO-3aLdWoVBbcz%#$U_bXKoH^I?hK3WL%?pVBSX|jqJC!cZq`%Lbz-&5@|A@I96VuxUGaeHv{ zG~=TUlgAoaG{@OEcBD0ma(4WnArBchhB8euXZPaEZxt-eEeYIF9E`}e&=Fn+vSn0n zU&zf?EO;Gi7ZvvVKk=X4bh*ZZQ9y{GOP3!?b8=_A^WsJY|K%?l)c-ip&f$nDRG3$vX~o!{-op)@5IDq`ue!)`Yy zZFpZ0sAA(E&Z8kt%et1%=Yz4A+E}d#8{kETqd38(=n^N&%O@fukuatN(sW@$ti&ccVlA;(lykYLVP89!_b~|2EL8mP zL94|jh{OMA(n29k%HQqllf{)skCrZ5U4_$Gl#_f;I%FB}D$D9TJy1FfO@>oi?d^5C z*2HlPalU>ca)3S(47^n%e4LE{x+VuLLRIj}O1+OyH_ojZE+^%BH~LOPu_yCnq^U%O ztEKb5K_LBkf9sIIvUz)A-?}p#&w<*Ta{O1IA!PDgN#BivJ>Ek<5in8dLwP z3uDPaZ3I-V5lFb^EFRc~BH8>O_AqjG_K%+9!lrYtaZA={to^+4>#%>En6HB3pmxLS zIi^szBw2C5^J2u5!eT%Yu$x)Pe9Ok8%z%j?gpdP62xm2F%j$c$k4=_+#gUlJ_BQB6 zi{TQU`|gW50v?x)DiX*q3b9!AJ5wJ(RdeBMXQ->QODTAiV=VtXK`qF;{0dnD@iOJaXrhy~6!5!CKn?#rqx7@}pz?nK+u_Yym;^A4^ z8FBV-1K%vGxjwcahFGXD^~1CDv8V?Xk>ZI_8gw6`X?xsthbnk%7N^RFGI?uVR``z( zb%-Qmg1gnZ4~8t_)ny5h>KXC`vAH-4T=+4gNjtZ z3Fbu7rAT9Gu7Ay>nD zO$jE?DWi+DkqPF}6TAgK&h$7I?7oY2b*)_nuDr>{08iTCkxSydBPjpUpY_wJ$9Y%L z9V&CUmVI!Xvin!VafPZJTM^Xl`ujX@V-zZ}`K$V`#*gC&t{qBb?WJ3%t65c`EqXq+x<6^Lx#fi%#>BtotNQ>iM$V>Whl{s-r{W z?b~1L5Q<3A!UVuU*_BO7=63FPEG@F>xN@#r>7o$B$sJyy8&;(HroH2bdFZ~I4pR{= zt`nm<{g>9k0%LXrls<2j)T{fG)@mcIs*Q>zWFZPDbG(}nV59ia^V3iWPj91rM{V&yVX^81ppsJCk9=0Pc6*dNEIBLKaQz= zuMlW1;=>tIX_s5_4~Xz5%Q_iR{;4a{ulhE+cz$QC!8OF*W-iA`)bQ#1^Q4@tUWP-n zo(_RLO^u&n^uQZ2QG8^EWT&VhEvR}W#lH823pqK3Yq7Ts5>ugS%wa zKM}L}3(rzGvZ#iJcBeim ziE6V0GDdj(qOKPELcRBePH{atsFR(9UOYDf1%=?o2lUH6_UpNxqNwB$YN4eTzRF{ZalW4bbPOLiMO2)$FJ$(1q#rQIgq;NbHVgimx z`Y&wQUlYYhNk)DjwIGvDPp{I_h>RxS3y+Y~&=_1?glisXwLOzHf}nnH2KkSAZI}Mc zRCc{QEem*Jq6x zB8qD#{c!m0$6Vk3sMd}SJB655w{g9l2yXtCEi#{d@Zbsr>8KP-rxAX30L*K#5 zALvwDXY6jV#95>2pnL+nby+oiKXli@!h{7EZh(>?*7|L_DomkR z53lfNor^dGs%(JCn<>Z7pLFhWuxI6GH^Ra98Zfr(b80g% zJikMFoa53>*zF3YO7h@)r z3qhKw8k(MRO>@rC2CIqrETQC%j<;7=n1zMgbJf%bb84ZXu$0E|zB{+YOqr4%$e?pK zxu@CvyvI=-UqwJx4(ymAf{(nGZm^zp zq5AsmH9xiIl@lsLRsstDBvF+BE3n?r`K^mm$R1+PMRIb@v&GQasFoE=aiHty{3@1D zM?#f!k>!H|K8pC-w7O_Y@xeheN~l8JSHx~XuqGawI0)xWzhnjv>+7(|(rIm$-3~v# ze@--O-)VFsLSER~YR-|-5pJ`+PJ5^o6i!A*k|_DNT3wLYiNMj4uRtL*+xk_;>;Oba zS#N3k>_@Y1bC%PD;a=|LBjb?S+Ax|gY|5psYhx%BiXy!m*&%|dGNhMQ zVkT_G7_@WC%a5q4-);8S^qobPtw#P92~r@|$ebZq`l7Lu{d^feF=0{8HM^=Sq`o7J4zU0284^KJYqAL&39Ac*zQ^?JDnC5EX_cIlRb`Hnge`N9(4uNj(nP@_E1|KGpn3fe% zlX>~63z~gZI(`Ttp>U&fEtQ8248BHZf^qv%^^Nf!xjTt6(!xy#S^yzWO0a&3dFxc zJm0T-3>a(kdLE1N+gFtiK0Kj_DU0HanQg%b#B`**C_H&v_O103L}7^N$nrRKybfs@ z=-)>b6F$#YqVKo$Ij{=e(F{1RXlO*s$`Zxqdl`~b?7$}N8|n1)j_O9t*?%1#K1Q>; zWM(pfwxpzE0=j&*z6c9^$OjTJAh79R!OW)z?9jA0jB1YA7<#ofK04j=usb1a?Z{QU zo0^%n$4T0jl0UrAbxNWdMI}-{VP3qv&a28|5>nPLRQ+{H)YBCo z{5werS+B3?3F$hG-+^9S$AslbFe2L9yi$i(7KmNikHCo1RE*(izyd}?9oSoK{Qj+k z8+rC|Lx7svUGreo=&8)jN@k&1>EFqma?<6)?(1G!Sa)|2K@5pQmk>Xv8H!lXK8<{STPQj;WEYz0G^!wpm4FQBQi zbWLPoetyeC4|eVvVyt{=gc1I%Z0O1_&cNt*z0mwNa@5^j!jY9rDD(FDrnKG?{bmi@ zI-Oet8;>x$Cx;GZ#fxE+K6nyGh&JoB9ATmf?)5yDe|W-5S6ua^oSsWHtowx^MoW{1 z2*T`J?LAAA`CLbq@rN~H;m8Ti;a3eMP`03eiCM+7%CO@-HjzJ){cQGu#Y0KHBEO`8 zrj~OBmf%FzG|uxoOm)R8;ww+t#YLQCJ{R|rR6@nUG0M&H3U2fjxL3AojfVaF@zR5E73)?rP=k-PrR@6XZmD+T(H3G(oh zOF2-9wQu0dLtpcX=F$vpXwK2~61suG`9%I+tLrz2=mwM=D=`fN0t+ewykoiABOepc z#-^YnLT5;v9HH}e|8_<{LX>M3tU|yk$&$nt4lb%due1kuOy2bJ53`f9K(_N~OoK_eY5IEv1N?`IvIB_|fGALQyLsRA@4$2xAQH$(sD z=kym79gMze{n~&03p2^vys3~Nj8_}HZ6@OLHJeHI$3O1Da#Q|k^sEzuZdi!VRUi&f z&Ei+wDDFxG{Gk@}?EGR&)s$V$$~J$GCYJ001V{*+MZ+9qyu8t3K8SlTA}<{O{mO^+ z=6Y3I`z9m|^yoM}BednjDMbaWM=?VtU0qY$Nc^|rPapkE`q4^T?|535YpS{?muxF4 zmd$Im*8(zhetst->6LhsUm{ASQeaICf`&r+>we4(^*Z&QG^ZwQ9k*9Q+1}XNxP(C1 zg#mnxs3m>c@EdpcGy5gse+RCFgbx_u(>tR;0fLIYJ`}W>>O$N2BLxRwo>!-i?}~v?=SLT^-n@ z3!i2JhK9yQ{2P)GGckxL^kqHt-zDd3(DL!h;wcm$m8q7Fmucix#rX;vjbDCY(H9*g z-uA7ysCP=?4q3-u^)B`pO~-A{;B!aQX~k`G5>ukHXUh0@!b6IY4Rp@usbuu2$WA#H z4Y*$%)Q&WBf$vhvEW}P(LP|OU$ZK`?pPw0!_#W;rMRSu z5#{D6OP*{yAr1>-*yW$@QY8k4;OZwyChN+j(y=aeSuS&ma>Ybecvi zm|cvDQlpQ>!Wb3y5liyTg}1H0|J)h;xTgnDy;6A{@C+|sH6MrH(_wsNu4WkTr8dOb(nY zoV@;$hiTot*oedUFPmVVTG}BkZ6R^ElyfCsajl|U?@i1m2m%rfhm$=$H88z!f67K^@9knw%8R?@}p0<+$_)uo@#LTZSUC1;s- zrJRLDkpO?n_0FEy2>g;$S=^3fie|Yd3r;n-UjUzVxLB9mc*(74cHc-l{>cG59```K*( zNKx~6y*yp68{;4W)$+I)xOak?gQrkC?FJblk~$)ccQ_+CB^J%~;aAj~)POX|DG=SR zKco5Kwx7_v2l7qc2G9K6ptlO==;&*~llOSx+5VdLj>To==JhiRBAxYOPMJ1M z$R0m0M?M2uH2ihfS~z6?#83M6w6D$op?gv_Do>ZquJYM~6gjx_=U(J}sU5D@4|=c| zj$z(@Pg7GNf!xXC&%44@8L%oj*6>g=ZNL1a&ne`5Mk|lu`A+0QPKm5u1ZvXw8x48; z9`_d=aoI40fm&K3=WyrJ>S*)$m>YIprBiR~*1!-CMF_$GJ%NHLL9&dl-joMv!l4w?=9{yqCc z#BuM4`Rw5}#w#48#X4FJZi}#uX@Hp5(Q!6FQLl`*x~izD5m}mqB_;~#zWC|xl0ZsY zFPXpB=Kcgk1=6`j{>@ZJ=80>>SugfSMd>l1ZSh9sovyAD=f_K`xH(|a3_5Els3y@x zWf1Rt*dDXk+-<$gqtX#RzuO%xEW}4L=?WmnMlpdQI+MNoA`jjBv(1acDTWj9=;dYi zwW2iG^F-00O=8tq`W+d;s6{>#ye&33$AUAKFEcy=x1`~+sGr@TxhrFMGz}Ya z#~*ubTG#=R#V01Z0H8J(mGUzxs(mnM=O(lV(i!02(y;=FNy_(Ta%5*?0z=mB(D?6_#^6p>+7 z_v8S4RTjfXddbN6t!;UWZ+Wrxc0Axk;vyOxC@zu!HvwXgsfGf({NcZuFA(KA`AY40 z?67%>kie}soy}Us3?EgH$mS&DnHc#MrhJ@wO_s*9$$x#VWnw5z%cmz^i@|70$g8^b z!)#vb+*{IydXW%-p2R&}gOd_lQOCxuv+} zb{90x0`nECNj9mGpejBX_7irplShvT9)tlQ1DwwUkzbJ5OzKxu44>s$q|f|XJLk0+ zDgeZqJMlD$I=UTACkG3p^TrzAe!7bespF`xX2XmdgbgtHd-@(kR# z&&{2D+Wzdyo&FS0=~;3Zj)}z$QT94yGq*tDPV26%UBn~>5(4P{ceJ!ou0cySR~LTd zA>Y9v6AhJ?f7K=OdvAG(F#ahCA+NUN!g-PVJ_^P%qA?DGV7M$=ycDd+J+~uYInsV* z2k`ste3eXT?ThG%#oGHT;GUITTArxlrrvSu`6)7CS>L>JP+kE*B*jk^r{znR-rZFU zO9E!r0n_e2Y&pxndknIrWmq9l5XeJd6sjvJ>E$uY3_f$3x8M%+-;x=>abt*qu87^bft+*p#59_Z?} z>}D5(g6=laYa5dvyK4Xx*9pL~0D<=WmskwHIxf^LZ9oYLo2}BP)j|^jCFQ&kckhTm z6&UiK8d@A9ts5pUSwecoUW20xL}2EkI?Xw- zXI0cN-CH+4j`PR)PYQGGAdC)o(7ay4+f|B}U9)%V1mYjOJTPnR^=Un`fA#ren+frpH(p9m92RX3|{p9`YfiQHW1rG zPELoXF&Z#tdHxfZNc77&+$L&JafI6mOqK>88&9{{23)sIT&F zr3Jxp2_^PxH#lT;EW)evJ3L1oC52}1dWl*{$O2>7yJOZ%@apkmD2BA8EDs<5agTus zoL*K24&mX{_iP{I7%9*_5O*X*>iA_>)!{t_7y;T=S0|YDNQ5X(|7n;GVD0oG6CuS2 zXR{_V4sIJ4CyJ`9KR@)ndgVaI>i5JI1^+k9iVjpVb-9(Qs)(V4mP}cr^aw}yA6;O! ztT^N0yBqYMePN=!y6e5VN;`9&u)<(6@LAg#ozSl;DEQ@Z#Yhu%dfU?Nj1nF>V7gOR zw`w<=G~AQHt<&|Ws#|yQ3D&07ULRqvYOXIe!51D`V)Mhiug!i#1Kb9NHpsjfD?SaTx>kLxB%+1 zI0*XU$cJzJz!;xAR|kQYom?m?tnW_G0YTd%%cK(k2D!R6*V%D^xf`3?p8`Mw`AF|h z)*SB+jL7pCPL_&wnFurgwu!DMO?>~n(XjCb+YL2YQRMXbq5bLEPmeU8VbZpG&~hw2 zD(YN8!O6C~`(W3g^Y7+m31i9xHEv#cn4a=i5 z3^d5d$DiKQD;N+y!; zLd4R5vE8nzHoj(IeWiU3U=&vrm~|{YbuPtpJUFO9KwZ})0^HoNDRpu2+-5CQv6g~@ z;?`CYN!HofPODnKc*PTU{#1+lrLnBa7^wwy#$b4B`$-khc}U2TV{VQpR&eC;NoRqB z!G|T2g*THfaq#rODA3W&tU0fySScfK;@6bY2XbmHSAoFk9>)@ZieYu*u)Z@I!lV|7lr|_@Cy(=_ZH^=|L;qjGVJ+}Lij zS$#vF3YQ>LQi?9^dwyXS8r*+-C1ut{@^t7R0wmbWI_mi!8J{!L`lV5WcFp+~6?@xP zkUtDygakJm5*)09Fhu7y|K&zoK<41&EbtXv;e6^in9EE~juy&Fh>y=1_%voQrd^3U zwrk%+j1(zNh1@K#>m=IIp^39)i4`U--9_*@H;ndwx6H6Y&sFO) zpP0hJ$g(ms@4H`FLLc}XfafjqW3aU~A0zC~I1VTT8cv(aJZ!6bo8>EP*w&B=k4+za z`7xT}f2{+v+)aQF)D8~*=rhT&{KAY@o%J{Am5W11qE+z2l-u>w;!~gRpuzo=l*qn2#7TwBn;(e0$AOn z#wF?B88EQtM#eZUE?WI4jOyto7j4F`mM_K#7ngwkW^o*AFQTs!Il1o?aIEURh2x#h z{3?om+tm6C)GU9G8@Y8cEAcU|e-E(NqMT`um~y`jybT5ZE{6_xbEa8UwfZn~QWLMw zMO@)`-dd?pKEAcNU8CkI3!nSy`g(bT6^nL%=J1(&ztqWnCwAiT21i$Y{^a|C*-E8q z17EcS)xJKm8=c8*mkHtQD(hl|b!sCklfM53^FaH!39Ge+*9{Bnp{T$L`b9pWNBc0F zDTTbv&}Ta;V>d0Goh?0{8>37#*PN>A!a`vE z_F|L5&fTw`(0-du&jv2KVYQJ_qCM5id%@n*u-^Dstcba2l+fRPS#2-Rmpp6QNMgKR zIHx|Zo0p*c|J0H;B|b(VlCDegTr5p zYkyf*p^S38Q4Y>sAqlqzIWc75C%{DKcH7!#UZE1WF5^d)t^RDiUF7Pvpr)sLR8XKx zP!A7Zmk*DTpb2Md*WZ{_RZwZ5&sGTiT7cKo-8gzTt>-WD| z2U%=+Vtl=3A*j)It+EO@9$YQ%UFf=majg@~wd^b3inR$*j78y#c(kH$9(jXq-;0fu zFqR%<;1uk@&L(a^#j`s06)Vc~6%RYdv+`k zCEc6b6L#q{6VgT)ZqSNrH53eI|Z7} z^ozfWv9AO?cVRASykzO=QMXTno14$U2#^fSR{aR@CIReRGM|Ht=cn0VmYXgG2??Oe z3!;QJwzYjANL=Fh$ka*0!g~QnFOjq+ghAs%rCT z&(km7Hm^T3Wweli64n*XxhKU!sxxvaeJd zCrnjdRsj4bpkD;cy6jxZ46H_+{EQM*{kh-pu=+qjC-d?Djv8No>@`cbx7yRIGqe2! zrzYcJfoY6$Cs!03dT*cp0nbk5V`2lJSXB*VjsEN77dYV^KE`1cZ^^RA4#UkJjG?D8HL{99C-{ns~ z1YAORD0P^?557KRl!5xBk*BO3NiUn|q5V|yigjgWz;MIPPL;zzH(XW)2Z8L@gxkDo z;~_X1M}(yhcX^!HLq2OlPm*eCr;k5>3uVb=> zBE3Q=hZOAY?)zo69#koNHWyaN&$ny+NH>+i{o4PlmMwY=wRp;nJKBEnGIxrP7DhcX z8+n)^n(OqVsGaYaIMl>dNy%oe3X{iCk&}B?GQZV|^Oe}=DkCl;Dw@`Yrfazj`_1Ln znaWDZI3YR@cVam?4gpUafB%I^Rrvb)&k3uyl0rBTb^OdMltfrTi}sZdbC2;ks)+L6 z%<|vPRSoJA-!7x@uW&B;!C0uFDCIN1pz6N9k$HO`G)w&b=@ODGEfvy>fXtj6?rYH3 zC1y`|wm}-eh)ti^v}17Ny#u_ zqh7c*>wCWC87>C!``8Tq1}n@c76ls4EXt;(x#zRE)bg^tz`J3fd*pIJWQVZIiy2r> z1|me2Ew){0=AY5(P}E-c*JDM~2xTkAX{a;xLtjNblY@RjZr@?Vg?(%o*2qxQ3cQ+$ zudOwIxG5HXp08pkRsOQmayXcHuVsYqwEP8LH(XfHlrFpC)=H!?Q)T2ROT*ri69H$! z7K8@wCuEqM*Vl)gpZ}W3=h8fY<8f75LqN9>hMSFuY8qTUZ((7magUCz9OE7!Pyn%1YiCQQ1W=XeOr48*a*d@N#_>GysKsF zt21AmPNEvdL88Ttq*D38oyLSDM#ih$U4xMFG%qNa^@6skC_HB95cZr*P*&ct%9v5P zMfn18;hS1FX2~q#RpdyMNiTBj;JUb))5IC+hZmWt`rVoUv0Ot|U^@gxMC!X;H-4AM z7SXq{pkvDzMuhPOuaQ+JFKsk%j67D1_2)X9;gnqq1A&sl5gSSE^)(q-m&;z5$n6*0 ziSF$i$(k0g%AV6s1_GJ$q5Ub}>l34T3rwFUeqHrnsE7;$J$XbSCd~{(eSJXF6lLEx zUPWdD5&}sz;cNgCzt@XA<3O*Wff1piQV{byLy9_M@aw!?saqR=JcIvkX5A~)C{}%^ zKXraf_M5G)_qpO>3p%4#4d(TqhYOeN+yX_wVpz?3-Y@>wgk3dST73W;8OobA>H{d3 zqZx3xI7cLdvbsuK-c{PyvEAs1j|=9*r=&c>k}9({9gQVc8jSdv8Khe+!7J^};UB*< z{4G=^9LtKqz$PTHX#dZt!4*sXw!FN3f!TGEMM%#(2m;J(L#D)GIo>Im8cAacMUhTk zm3=0|7Ar=9{+`m(XFZ`so@>msU*sKG`=FE0PpX#m-E{=jJevA;pL0U`+2wJfMt9Vc zdV+(^BPARhuzb%4dkf`|Q;;(<(Bbg;6y~AdG1awpy}P7b{&Gmd>*KzuR5FnZKaYo! z69xy9Xoy9jHzOPX)D1FBPnWw0EF}>B40N{3Sg5C z+`HNS1o)DM2|1Ih{(}jB?|tg)o&vuaU416{{al?p;vM5+^Ia^mV!;KN4h#&;u?0ad z+pLU86HvRu6Vy#-9|x>I7Cpazcc0dTLfCQ4*ohKE?%y2W3}}QL3X;~#XQLsaDw_*%`d?skEbgcJOlon@=yl5rKTYp z`;$Yw`h`JEQton_zDL2|&Yw!B3pX}Cpobd#w_}u*cEnB%RN5e54adS`7$O4yiRwH3 z`2Su2x~aU@)|>&33Ts!0b_9e1X2b94aBye`@ARJueCAM7H_Kr#F-0sXhf7N-$M!KW z;-L}C7n%9{|1yP9|6z)9(Jarc#N6~=I%@uu%4%zFE=80Q5&lI+!rJcV#JrUvoxkS6 z`)7w454so;NO+%!EM0#F5236zX(z(@zimwQQBj-KK19t=@m(!K955^08yM1~Y%B0y=g3acI|& zjg^+8g~P%>0>+1wr}I=NPT6gj*V$ulvBWo^3{g(G5LsNY1aC1XcKQ3pxh-R8n~Qn; z0uw&|%7C-N?U|07e53@g7B`x+_35f4lF6q9$+;>%bH0aH| zp84R9VM0-nSYIV<+WbL@_jeniD;UWDsAg2;FGXp zjqY2#?Zx_msxmDYI}1$d@)`|b?z5zJ6!t@gUaVqEFUdR%goR%d3xd zo2zaw#u}BsoIUIV_P)BWF|pywm+&PAUpk603wDlApA@dH)aI(&%}$cs_lvF$me|um z<}%KFTAv=!kB%zq>!;yy92=+p6IQba9VBsqS%6ALb;4TV{@;Z#n!F83yR#*3zP_ch z@{QOmD2QnoMWKD94xiUy4m4Q6Z!31ug<6lcuKwxR6Q12tay`KjxsV%$f*k zo5HUqahF3b#e*j&5sOqY#_0Wp=@Qc>+%;7&mYR?)Ewoec<0$9a+i63CUn4CK z13mKuG+i&!ello4FIA^V^0RWii+5Yj$jQU@JP{|G3bzpR0Q?*t_hGI&6#NkvX?&(| z^l#aILlpx`xx0tQY|()?s3r(P3V%_+_2@co%cH?kPJvI(kjy$>KGpCi%tYi5a~7wj=Rl(D6cpUN=D*7q z;q@0!r!p6A8)Ih3~v^Zj+jtY2Y=0NJ8i~($O(8#G*^|qhd>!RbU$_n<_>H?(l}vGxSpV zlpBpNUT-h&S^yhEkCTN%m9kM6SL(1)TM{Np7Xh$kT35RBd+AmGZzS$oEqkfG=);(BdEs z=AYttnab(2aAGp)-VQqB07dC!yLV3Bt?!6NU}s9vetLSO z_}`k87Ngea9zhtC6cO{Rz(}H5Jlvc}1}xM2my`n6Z;|c_8H6`HJWCm=zyjuc0LLb1 zug^K&Bq1|14y`wVXU(jr=v!3O>19LYE=L&RD^Tmhi6ttE6V7LcR>_QXRRmD#wz5td z{y?z*Lx9Yb{b>U6^|$Zk=A)7uw;7<@P)g+pR&m;~x{8Y-e6t$|Co_ppM6O?yjPu0jT_3NQN&;x?wzw`!9$kYvmH!Z0B|r zcLm4P!dIqxJFXHgL+|d8hN}RZ`r=~4Xog8Ps|n|#DVtb=l^9NWc{TJaUbF_=$f(z2 zaQvH=#+k=HN`N|?G#XAoXnB9{1~SH{HE!hJ-7!Tnkx*f$*hNABI`r7tO?SL0Kp3S- zm#2NYxymI~ng<8b#5?Bo-nWl;1~jcdo9Ct%blCa%&+;kb0d8=35#4bwvg!6vnnC-l z1XU$cZAhNq%eCW1PfyO2_r=br3XH_C-olbsKWmKC!op3%-*>6WlGEOog=f&YGmq+J z-T2im>31^JSV1bg1=ED>kKZyXhYNf{ z0PeP!@xzDLn}`Y`-F3WR5)cR|TA%dG+CMDdAO?r1;+REBg{6~BA8}I(erNd5u5X~g zs-ubtGGddr=M~)Ypl+jh8Fkde!i=}K|GcJzhcDUQ&di&oT}!2^o8GmZ(yyUGUq2wW z{a2vTu{por2l}1qZvj`}Z|%8{37Oz?b(IN`n`?)ThhwFmtDEqFN<&9NP!cDPZ7E*E zr-k4LbIpSa))Dk&Qa=n_{6Z zOrGZ6pb8CiiyRwwbBzc+#FezNlMjcC*eDcEaVx+zE7Mi*9)G<~GFf%BDZBIP8M4Qpkdq#az?a{RV^MI=yQf!ISF|Xh(RsYl$k%s|G&(fk z3H71$VIVGoAvQgc?^>#EEiP^W|IPF7UkIK%k>5t@S2ColkUA5-@Z_e3q)9jPTu9Af z_LMdJ@>0C(>8OW3o3ryQTy3tOT;TI?stFEKaq&Bq0^HYB@yf^uea=LnZ;Oj};V2ck zCdNxmbE@wtkyfg$8}b-%8eaG5!f>%}-^NB&6czIGUl&hFSXu_}zRntxqM|Ju0u;)% zMH}Y#8~+YkYuRj;xcNwsWpL5MdiUK__%Uz&Bp7M!7jP-b0qQXfR5Q-$d0y~i%#+#B z4;e&KkZDA0`%9u%RwYXvt;M5~A@vmpaqO-&EJ6I8stT@jTmmz5)^DkgDbe6ONxZp^ zt63DuT&no>`S0&=-^mvVf=%_B3i4D2n(Y0d%lI*MzSruSS}(MCi@LgH9v&Y-qJ|x1 zV`HRHCJ7t@ynZY)UVVK(x=dlfOtSszRg-0QKkytNVzkr3va&64Uo#Q?s@EBw$Um$z z*VJk9?x+W9hgkB*POnV-~|XA~C=CBhPm@V%ZJxojykk{a*)4HYIsnWbN8Q23(h-0nOD&ybT;nunpe#tCTTi#{5~C`hq*kmt8PA2MG3eYX zv*l4TO+PFm@oj--{*Rjy2w%nhghJsVh{p2wZyN$u3MkP%c`P>>B|zI>=f#W8#Zi|j zyqq(VMn#$2-d5MqaoHZSm4Yj7MW*hLE0;mi4TFQ2$J02Z+0*colVc|*Z#dG1xowNu zALh$6JTWmwl;qW0S4w9!A*tfKJ0LL#4o$qwymtUWxP4pfinpazz-p&`hM|_H&Hm)t zn_u~Oh22gudAtD6{D8L3FCOBeBkA03%Qfoq{HUwL?ISq&S23F||;km+%FE5*l_L|Ee*g2?@?|I{f|-2W~qzn_E&?u=UU; zj3uUnF$^qFC`cHwQT7*fK%lPz9tCuC#xUHh0Nt~@p9ixuuRyl-9jGCz89dFpOnQ^n z0S%f*Do=&RTv`izxpqmz4LL0+LrXFTagTJA=$G$DkGz)?t4tYKBzg9oVP>lUee zJyn8FXeiV3Gb4*08&dFjb6277)d!hrEqQsK?4b$`-=(Ja^Ob#(5f1pL_mocxqsvGF zLTlPta#eQ+ie%ai(v3RJr8Z=vJhJf)4|)2GPS$>KU^-|(bn4*c9Y#URoj(4lGWI)2 zzQ&PI-e1z_q!l+jLB5pAa?Y}{E+^C2p@brXXR^?6A~>nW=XUXMu&w1Dr)HJf@$$m) z?L^YgyRlslYA9xixa9DEwU?x*_E z0mn5KH4Ouu+D)b0b6vE^{E`5hL;RscZ6-}*3X<@zbIHM}u!G7oP+I zRCVUs*d*y$Rik^1ikUiKVS}i=Ut?&!b(^xRP{ROwt-6rviW$_mR%=}h`2Gt<_~Uyk zOhmyOfC3joE+dbAcANf=LRD9w)7xz+p8AoIfmHdY4}IBTe(bVfY_@RaH!-FmbCpsP zXx^$fYIQYlV`F${XXxeLs7vd6KzF>q508)UOJ;$g{yHDe)YWd{B8|oD*WB6)JXzwk z(K$J<(N?aJHnW?^;%N8NW=Oq$WHI^WQF;mce7AUNJ*VRf+yCmu?TxnA zo15uC7YH!co{WWB_WMvH%9P0{xRXi!P^fQ>-J{2R!h}>Wo@l-U?)PMTv{$9sBeZ&~ zzKDyVO3dMn9aKf(p^^LY~(ek4Q9Z?^L79s`R z^*)49()o`;S^4fn-!8cKOBqV1k0cQJlqMCYp zwZ2N5Ij-o^ijFaq*2MGsprEJ-OTeRvn+t72AOO+dm;ZcQdB}AB9}e4SRg3FEPbm86 z;$n&0QH8pCVcLy8L_2T`gSa{)!_LaO*0a;qqd9(==iFASOib|Ut*G|}WM`2Zw$=Mi>;uBrB7z{0 z9!mx}MHt5Q;)$V7<(`r&$4~IK?~w(#b9<`r#LrJ&Q3QRsj*mA?Q!~GpysGRA+x~1r zUR@nyDRvS}Oh_oycXi?K?|@5mU=Qjt0mWnaTv&)JpRnl!T;a*A0bzM6E-ugnYw}E% zW-S_N4s|_WE1Qv_OCIDjdRC;Y)EJI*{kWEaCZgW^uXC#V!8WxsY?N+ zyp=PyQc!&FXQeR{FhxvEKIhgLAAiZm87H}Xd?kq-QD+-5c#?gG{S2S8RsQ+a#JH(BCthG1_`J)SXK zFbyc_4y(tDHO8sEHEeOn1=BBG!XBccO{E7GOt}8raeJ%=OlSyKf@BdAtL4?%gHEKP zE%MU@X{QWK9bv}(O8ZAjbWLZjIbLSYl=5k4J+Ji1EP?mj1fA$C4^K=NxrS5{{k2(A zRA`rXzM2{1*AXfOWf;*#9E5IKl_peEXSb|W(BDP?jW}D!#%6?p!P);-z-$0ze_xr3 zc+QMti_I>Ps>Z1IixtjqI5 ztN+T}>}Y$fwIZy%YGY)MFX=PQ76n@9mLmtZw20tF6^ zMXaR-)tka;7!3AGoZd0%GGzvOnGoJsciBo zArYff`(9%+Ba7z0u~Z#|+T>(M;Ne%6M=@l@)%n`hRj=CNOK|y!F1b~bm!ifk%q?EJ!DlsmI!iuz5rfdDhcY^V{Aenc1}#b{|+8wdFXn z$Ex=B#b5U0*fPSnn0v0D*!1I0?bMLrriSgq>zlMRc7SjpIzG{D!$ot}>CpzW2qiDb zqlhi?`}U2c`SG%hp{R8DY1xHUQrKP3BBN*KV^`V|!zIJHZIcMmijr{a>ZX<#85mHA zqu=2344Ax2;~B17bvXND_1UeF1QJV&WsntsB09)~tIJdVB}2SAZ2BN!XUCI`t_>|< z_&hOn>{#U48W!-JZ2Ri3%T^L_XKZVjtzzKdV0)Rt-zP+vk^YX5Fl5o9JW~FMJvWOigse$g(zvm0xrtcxe9P zZ2GBkd)qW=Tm)ZVQL%UC2AcyZ_ejyw<6(0od~Etjm6esM;-8%QLd*KXxG#4_X%!hP z>dUJfc1u;2{JYAlCpbLoCN5Q+Iovg8r7THp^8Wb+}iUNhXs5W z0vL-v)~i$QMvQfKjqT0JsI7Icq*ShFhF0ybY=xzrx-e?auPS;JY?v!T3q9{-UHiX0^H1<*7b&J0cdj`)3IL-GOy>sv#@$Hv+}h}+&ii%vd&(d6g+{E`8&El-_z4n%P+>^(qp;E-#ENTW&4ZEqhlF+R?( zug8?Ca$_Rw>=7ws6#!_Wc&MDZ58Qqxuj0||l9Uv4gjnG;ukjsHy1l$CYSb2G=}hI* z6E&B-n}?zAdSK%u9S?gib;65oGY}>4CqPJSYI>8z{bn5-+Y*lyHZP6&@i%? z=FI6uqcQFN%p)Cs$L^e<>MF1C4JxJUm8aMJDFe(pzSR-U|l6eK@}Ga% zEXKa8_}jOJyGe(_`Y z^X8L}>aIeRqpZXNy9A^(j;sCj5ziN~lL@pJi#jbeKk65%{+@WHj(MfaA0ELw-0}rQ zWee%jMEr@T?j_>2!~Cg?t%topn;imSKl(zBgF_ktjxwe|XiPApiK`JHj+!i?_zgj` z4cp-JdI{CZ%S&1bVpCRC)zz^ntH?kUeV8|p)o&}vwf<@T2!~%<#sR$NvL`CakU>ar z__IfrZFCcxcwSC)-%xE)2&S%1^vP?Q-ic z-R7uLwVOoE-<+1@!J>4`@?M>oAixFvQz4&FzN~&)h^GhxJuogV zcHw!fNc9gArBnmZDI8?BU7XxNfiK$r2Jw2m>&MmIO=#%mr2hB^`#(VB#woehiA9r} zo019P;}(@P({z1w!rAnxRJcqzU;&^#u)#s!-4nm{)xV*bmLcLsB8Veh3i~ba3)yoq z7*rp-k4~0gga)J!yS`yVf*=*FWI7BnP$<_jWa1+mh-4g1*5&Yp#bhfA3gZ1!=N^dtMBM z>~xA9t-U0%?tT8>3vl<(+|KB;_m%R-v9`7{9hxc-@i0E0R2C$hot;CZp&3h!!beH1 z)87AvSGPAFhl(eOSzv%Yp)$jB)wfk9N%^N?L!V4g=>GXu1SbSW8oO~lpSiVlbzVas z_s4Nfcy7|zt^HuOTpQtHc6P_RbB{R*5zW?k0p{)ZTpgef;Iz`@0wFZaTE^Nfd&m(V=i;hW5W&jQ+AD_pDEYh}e#^Pey`-JT8j@?25 zD`0k7r0D~U8ap8^ck$-W_++#dbNLZdfy*sr$&Q})0u{IJm-7Usf~ow~|5ydfnY!V! z#bzT^wsVE2h8YD_iqTXYV`@k_|Oh+qm<~Wd2y?t;exbB{JMAj0o2eh5ok# zY%_beG!^vbtJ5-qyg;3HMH|?t*)~I=dB8blk3REsH<5A2W0k+Vx|$N3fsxs~$}kK> zuA^g=9g9F7W6Ywij*3b|f}yNT4A##kuc>?*82<#iyx-z?+;8WzZ93697_!O}RxNZG4v^-^7w*IA=kJ=oieJesD3D?wq#6IrFRb9PwQ zzG5d8M$ng{X_$C>GM$_Vg+M6er}_CY&>qo4uaRO@2LouXV{?lYPB!k*)zz!!4VxPp z!#{p3a!vC;W|zj^+F;YrqC*Wr?ECF?DLi{*nz}6-Odn|c)VwCl$MtjX;&(F30Y8S| ztMAPs_r}YkGL!-yZrQ;Sz{nkO1CZN|25Tt9Ybms7uuoMn%lC_`tAaX?^HU3F>X_h- z)(y~LI0S`a$;hBZi186iDPf}&o7*nSZW-(ept(ciSJf}hsD!PIP6I&pZ6m@h@Qco> zBC42`n1Z}HW74CCZ-R4e?Bsl&?kEjdZ-!|B-mSC$Rlb!eWu5OmGxo}G_cKq2i=|*X zw_P^%=;7@e04VP}mln)og(?Tt~E)UgZ z)Rn6>QANKGV~Z<)6g6{p4#Eg)vr_&9vV`qo_t_zbHR6tv)N0iat4%l|MqrKYa;R6# zoULZEby;%gf8FQ}MfCI)oLow8aXTW7EEG=Ukdy0&lb%TX_BI#+L7fieU5_@%7gv^f zG|7TP5`+cnP}getTEr;9&V)=Lx<3ZfCr2ho6NWi$XdN?#rs_Q>(7>OQNyaz*u1nuq zUtCn;0s6}C(g<<;C;+=3@V0aE)yv|EJ~-~z!qve3PL2$fVbx+gb(JK3-%-B8%cU$b zibE_rNOii?`7|yYQ~Kcf<{LS0sBv%3rfVAwjTqqda|QRZSt$P(cV1j9^3;mx>u{J?nY^a+cu(+dHF$ePOd|5tswt z%XFxqx(2JXquR|rA~8b)Ir~r6Osn}3)lY)wgI*@nG^GUyPc0<$*g4UCX3Qk8e>|4# zXhf{~i`1h;@A9_$-t!izyglo*B*xFVIUQg%L{unN(WX~d6AUA-d~vLs^B9~&KZuJ1 zSK>-3?{7kwL(OSu8Z0;;%MD9u6;&efMma6^KWvu`yS|Tjf#egAl2-lm)Jj4h+-eyP zNlLQVbixaTjE+1s>KN~hXUOd;LBo@%ihnz^il$WQ1v)$bdwfg{4J{NBO0=CDV<*I; zXYB$yXjYy=6}1Q?!nT#p)?3bX^PO5@b6(Hj-ntdiSfRuzML8=Ri2AH3D70}gH7{kN z&Ko2N$ETs9k{~xOOA}odF?Chh25ufuNgoDfouP&W3|}VTwf!ee1(awX%_$2BDHN-E zJ~_o~wMdap{_EJ9V_r53LPWY|LIr)Lld-LbxPrM^&lX8msyVuaP(7KIQ`-}?A{zD1`kMxSUg-^S9fZVqQv3g=&2_BuCwys6`f8Y zm#EjyB>&8U2f+j)28(rd@9RjU&~{Q=8f1zet3B3c-QD<6P*VY*d77m7r&QxFN%B-! zt%C1&_VN*fPlsu9>*^+)e7l*ti4{`ys%UL(gR^~A)RaImBnd-BiroA znklk&JrSVs5di>fdaA1K1|rR@8jz17LqrP;8y4i+-2LQE6(wFjEuL^i0Dxd&HXaLf zgsA*{pjoT?sjjF|oeLis+kA9X988is`$81dk^94jt-z!frQPq%P(o`f4yZwr;;oz8 zTfGqL6O^iN-)Q{;lk_Q@+8i8`hD-_C)<@o;4^*}9x z*Rja$k#GOP0Qqp{z+k84V`k>GfuH*QF(-ii5&eOQB6`qpe47xIbL&ZAYRVEnw!N)Y zq4C`JJ`5E_VPo%BnbqfQE(#?3{<^w2oT6&hWN+fKmpntdhq$)7wjrF^dDPMzrF$)2ao+*65_fOT@g-auPh#?8kZ5vV$Onn+gz0wk(JP~x z&Wegp38}?Tg+p1Plou^dhHsl-q{uV)(S>o+Fw5-9@!`~e3zpZtM!-oC5Pte&%~PJ3 z2&kODBJs-St4*0?>1Fs5YAra{Q!Q7&k@`X(h7}v|SpKA|!~Z}hoXvc_+8I6mi{E8| zKK=K5Bt?InaA<9zN=+}ODSkv=gQO{#^u2DS6-Vj3%~}0|eQFs6&rIza7o>pC5=SMbt_ycAkoj%F&Y!~?^c89S zOtnZ(zBn=gsuJ%CI*uGtscG%kEy;6Q=w*UuNu&S87aSZYQw=jA z{~3(#wVUG$=+e=B^w(Z+G`sgdXw==tEQ?3DuKr{$N*F3@{Ffls1$T62TZnQlnB%1; zZM~T=x*03nx6&ObG)Yk??shT_F^}d#*V3Sc5+aX?VPb&b`*52DUZ%6f49;L_gti+Z z9-IR8Af}ho_AsWT5h7k1ht;d7D7tWj!OONpM%pR^w=KR*83H6GLKTlw)^cl3N2T_u&cA z2?e9IMF`O+vYjt?2dx@b&C0xwD!mh+9)~}T%@7vb@m`KO5kjGv7!LM@PyVg-AEO7Z z5c{ksjKelURsfsJ_lJjHzl88YG?&naxjMB2xo)S3mnUm$o93J!8W=_ikx{%l0i_`w zaO4tOb9}QVy!L$4+1X=sKKw6|>ON3`)|oiMm<*sWBpldA7kwhsKj!G7rW3DvVHZq_ ziWm6+Q8nG_Abb9;Wgy&~v+h(mS3TKrJ*TVcxcuebcc|I!-p}2_e0DEeC4=k2I>_^j zy1&1&+x0i`u!iuE2^*nOx=8LcEHv@D1rW#}I9Cqy9|wUD$O$w)H-inyzn&~HP?iP> zgVy~(t8h8?&J8qx4kV)Qa5~s%yECQYyU67S9ex=fA2GuG_c#kY3=}e_=!!x?2esHJm>P|qXOhC();}v70kHqb7^Y~$= z&vp3l;-hFtmH;D!dN%^UmCzglbJ@1gV6N95lPy99;UKBvkJYT5CnyGc^~8cUrw=Bu10>AAoclG?gG zJ3g*R>V$8 zL-kCFc@YtG%7Qla&mno^@R&`(;`A2_CAZ)7Sic+J;O^t9h{`IH3-xgR#0y)@YG%JtK8@!?dv&X!~CT;rcApqgf1m%R2;H zUFp4E1R0=*5jd{kN^D$0D=?4SVfd8*Yf6?hflbP1qub#GZW0n82c?d=DRTdA{_p-D zn|d6agK-734Y983_a$XndA}^`NrQT(3MX>+wYvih99a0dTqnXme(UVqBy#*wthmLK zuB4T6b^pWb@`sh$l$DbDb+rM>*u?G5-YXo$QA*zSK~+EijGG}+O+;vt4WYJHb{y2?o{GyZnV_c;fv4-d`}Q`=cDln2)q z3U6!Gcv_>}!S$F_dR-lFg6NVNmsjk?m0w`Ixtx|M`t3&e3Iu2~Q3P2p{)Ybk4&;C2 zr$?2z7H1l~txB|t)92=P-P>v31inFWq{w9L(`Ds1#jVtcJoXLDJMMlmKTBjB{DvCf z!1eOg*fdJ9(+%}$_XMj_g9y$4Lo6*&c!Akui`>tOSaX10VJ&(PZf;H`wSWtXR-44j zi2$AuF*By!d}|LTnzPks4bk47yB34={hj$=b-tR2EacyT9HV&~T^XlkP%ZncQ4e>T zp-tmSsnQ5y@u!%*b%?iLEtBSVlcb_t^HIVpZ}+991#sr+CZwT7>*P2D8)B&S*QSxM zyj+AsN5LxeK;ZRU@W2_uKdz;P zUtN8>XeSz+yNdm!!^P71CAY59e(-c9?W{|ci;x6lU5#gs&y^Yi`7l1AxVxQVG2T(@ zdC@JDl^)n58EGz<=zS8&`p?^YJ&g1h21yVwOqZ4AVveybnqir7JZx@$p%QD=J4og9 zyIr{@4iZG_BdamozZXajaN8vf3qIUG_i$g7lx(1+B<}k=Wi6b*ZpLxosW;)YFmH&L zo;C)I9*KEOxE9kie5q9< z^c7x-A(63Vw5-j6hgZhundZVmCf{J==EFz*rbifk(;x1Y`-6{9i!gd|cRaECF-E&Z zsaEG~ApBO4l<6t<^9$L_SD((0(>_Km)V$5Lxq(imLlH0no*W+DU|It*O>C%oECE{e zSbB2!fQg7z#E^hMvB>&l_9?oCQGPxXM1SudPrj&>N7pc*n_-kvwFp}xzshV11VZZZ z0qMP6cLXh`5EuS8>YiD;HYDsZudI9=icv>Lw^rl+J8c@a@wdr7_wW!QW`aA_Adbpj zCAEB3WAm;as7ETD)~1soAmSV}+3fI=`geI?=dRbBr>IqxW-GBwHDuCVr-gz3zFMa# z>dyhoL{_J>5qZQG|3ynvWi%!Nddwwmq{AGO$qkw2h2`LtVfZ%C7VmY?|IW|UbiBD@}W z$)lH4JUyIm1gVX*yOsMG?;6pD?VXVbKt9>$yuJ zm#n}!K^Nbk3$FvRh}&80=&%5No%QawL0@T6#*E&jP58Z@Lk|6WIIA38RD2w{SJ3Ix z^NgqFR?hUXbS7zWakF`KDx{APO%^y7ax{|DJjzt&1XvK8Q@sE>vlJfYdXMTK$+xuS zv#HX**#z^-yl54cnMY|L?=aq{o2P1ECzMgJcBOQ9tLv&$Th<42T0|u!!g>*3Dwxrn zS=e}*lJ_h-u5lNZWK&=Od?mKbLVJ#UbP>-0xw*NWo}tMc6&djxiNJb%{KSew@WOIn zfD0VaZ_?v6EaVnMqp0RiWGnQ2 zE@A{e8*g+iFDrzZ{AUVmQtW0Lm z?(N#xZaU1=$cX`uOMXm8D%fkOoEVugjZ2VDQk~`)U6qcE zgYHVA*c#@HI{S33mD1TVlpsp!_B=Gq{*qp{&D-Qwz0Fcp9D{0>#JtmPk(ssF@l3|C zv_!?11NaPT-vNVkX4KD5?PsJ!M8N`JHDw8ePo&|VYKckak$G0Ujxm765UOI(2^MhK zZ9P1EFgg#>@G&Sqxqi&&xL!AI}sE?KdFrd6pEaX-Y~Jd*H(sGA3}lX zF|lq(%aF};?3n2IclH$A$@Ivv==zRvl9ROaBA>mqNQQt=ieARA+tH+VD_7~X z(Uw&7kGe)oQ-hW(*xi@d1q}QgBN$9b@GJwI_+(BK zV%CUxR4a}&t6$04q5@M~Pk@eV1~+KRtM&M7VCZ4_?H-Db4pr~IAvWr8Le%RjG?XPJ zYPFRARgj2wI2#O*w^tnMv_d^jxfC)V za6|PQDhZOyv>gTnXGG)@FFx7MnLy*s5JRWwMnd~^8y4}07DVohAZ%7k^-|VWn9k1U zn)G{X~k)9-pYZqS~_Ba02q;V#Ggw)WJ`}NBrfaudHm+ z8??diqJWJTV8g*JFIO=u>GKBvwz}9D&S^=!z(j+{Km{h(P)|*2$8kF|~ zKo`xJwUI_k0n4LEqrqe?{Jw_e7wI>#c>H`Nw-+*1R66Vh~BQ9 zl~)kcvj~^Zzoz>jd=c@<1p7@kUjehh7803KEqf?lm#Y#j-L! zw5`j%HG`&O98oLU@0sBtp;Smpx|N=>!5P}8*BAuRgM8a0&*tY}<+01}mRruHOz9K$FDrC1axWemP-c1a#Ujaq3jMc`peIF_RI(4c*o{l3*<@77P=l{TGQl)pKG2P$;xZQxi zw88e#c*lkR5us+Lo>()4ob~lGd;H=e0%)dcb*Z7t6BnoI%R%b{t!t=TFVwvp+UP^W z2h1MOJv_g*T28{!QTJfFrj1}0gZ^R#ZVxwW1kr16bLZ`HSJ$dpx>!eRpI*? z^8xgi+rMB52bDo%tJqX`a7dJ{01H7OesxMEjtc4I=2LM3Ju|f$cU9RGWh}D$qbhRU zH>!F%Fp4NNB8?VG4TvQ_%<qoT5M~3lQ0a_ zffHbqmtyxgkwBtx@Rpul#`a4%6Q|Z(6tA|S?;#&V9#fx363s*dJ4?gcyt#4EHhamL zfV{EO(65)5lR96fL>V3)u#IhaULJ?tw}F=G*qyHyCGbousp-0#&W#Ptkq1}b>DtT} zczv3*Qepx*}S?mKUz z6otb#JORD}z>{#;$oYRSK$(}zn_JCo8C z2Sx@RGIqp&|1^|;7Uded@acK)M!DNXaS;ZKi_;)%NKXNs;dSP}8?4Eq+85!^;yuCj&N%CcGeC{cjrTKTsjEnm43su_bVhGtel$=z85tDdL zm}9fs&qv3lzN#1r1raAk73Xd95@7yB%!~o9Q6||HpX!egkpV}p(c9In>$a1dLq<&w zUPqm<(3uV6jI9RZAvQG8czS%Ecq-uVSt@gNxRzEHgiPCbVD_8r#E@>PfN94XPW6F~S z*Ny=`<7eIZWhlhpZF+jBb|r6Nm4V%Eu$cnVD=)}#kxHKR&(WT{>({I-ifYZROD6>5 z((2otoloAKCR{f_+{g2Td!q-=Ua(5HNv^s~+NrjwcG7(}3NtoeF#Br`DyPL?Z|_46 zf}pLG@$s=ba~Ig|!QS{n#yF75kGhF_D?O8brh(!ULxzWf6@E7uU1)Gt;R?28+kSYK zga)ZKijWq=DS^Qc6mj+T_Q`G238uh?AM`5l=ZY`%;IwtfnnzK<+m()Xh!UDsshbVB zCK*^>qK7UaG#|gzHJjK<#P~#;qe7he&H@YzC%3Eh%b%ZI+6PP|C(8jFQdMDLUg6si zu?K3|P{%bMC%w=;7w)uuRMzwS{8a)@@96`TyT`K`^T?Tzl35x5n}uL`d7y52rqNcK z3k8-*bbQ9!`vnD(d4E5QXYk|8lL`bvC|Z`&_5SyAzrfjXd_jD@C3kHKbtYmdHo{k@ z1rA5qNcAM`G@c9J-33c!d|X)>g}80(k{oo<;gaK7e8I?cai6fE0yx^NK7u^QWe*YS zU3qVg@T*`j`HT6e9%hJ!#*1FD?c~!x9^v1TPa!Wo4*}wgIy$@2vFWGntaJ0ltgLv+ zEYITB2i(K~!mMXalEDPgEWsP_on3}W?=dA*l{iu~?ptYp*VY1F*ag*M4c}{Z1*&-O z7caP>Si)$<+*4m-k%>AU&*>Hm=-giU@qzZ*GShnuoj&8IR7(?Lq}f@~#Kg1yt=-x3 zy?_^fGcMeAy+I%fY{Kq;lX^BqO(~xr;f(XOCyL8^jslG`WSCAyS9y{osOQgBmxPHS z6K+Pv_y4~CYt(W3qcH9f=jsXGoyqsSa`sPno-&`loAC(1y!SA>6BRam@|Ejh?!3@L zk%!;(|^{R0b|WONH?S zDzBZz^^ZCyhiVZW-m?R2SN$PEiDI|MP`#EMYGkWX+=mgI{a&PtQwK-Uz|6fJ=X(O; z28kAkhOHBumiKYW!rs=VQ@nY&d^&}YkWT)G3Vp`uh9AjN793+w_t`tU2K^7?`6Ciz zU5gjLVf}gb+5T-dR=+zvSm*zI-rfE#n>@0!bEZ1ujV~NxTpJhHu=2tm!2_heg3zcF zI7vnk5Bew?wc8L^G__m3Uj0YUYc^s8>HwphM&!|TvK)#i>zB)gv;I> z&`D&#fb)FfIQ#r~ax`xl8s-By2*zN3r^~I|722E_WC~r6Rh*>rFPnG^MKlq6=*A)kUSQdIZPjm!CRJZcL2t#4H70_J&1M{`=GyK0K}~p#6u?`2~}gLb)f~Cxs3j(Dg78W z1EB%1N0R&dn6@^N{yZk)a- z>&Ck@*6O00`R=5z@^WD~Rm#_<8RFMjyGJ?x)h?LZcVD|lF z?EbjI^`ul|S(=G(Ua7jgf#W z84*Ma^)~`hVOfDI@uB=vBvOXP&G1-58c%*bn8&;PQK9-i{<~0CKuta1 ziSPWrEV&vG+hMX!{l7C+Uz*CK+Fu31u{=EB)fiU}<<84nei0b%;9$(}0 zG_E#=t6OxHL1!8jAVDg=6+J%N3*WHw$0(Amd8E6~U##}oCYm|M=wsTs{?CdY zAW+TQ6}t6Xx7oxp)x;2s^dg(#Zy%u9Yye6I3QYdRX z4+79@fe5~P&<~QBmkzNY)xzk{q zot<%C{$@z$5Qj;}`(JF*MGz)24KwLny&cWUDakg~Dlh9YYn&qyELruUrt%D#2lG zp{$7{4(9sQRrW(s*o;l|uL6!N}2hk+&^gSvt=fLs}B<(W<<_&1-fr*@%bGM z?r!XDjg1%WPD?5TS)r^S`u(x5%{VwQNYc!C(sgyj#Krlsaqf4CXd?(6RtO1*f~)oG zCGyetCW_$$jkpe{ZK?}YxDorX(|8~h6rjm8LSR6H&yi4f12w>{bK>Kk`@;3@^Rc|^ z=^h!ut+AtyFo0R~Sx)TQuXwk25YMvq#XnBbO2Tb--`hXttcif{fBh%U6}%>!E?RTm zeZ~nn=)MyhF)QJ=1%PpF;|g)+;Xo0@UsDy^ayuTz+1cd^?eKxfOpvdtMrd?2@HrR7 z^xX*Zv-;iWYR!3N>+>^%^3o@;$ zc>e}YN?W_2tju&UicIaA9r(tPduIV$LQQjy^*g5@(n@@%sNb9kXnHR(pg~z)p{Iva zyL;0hS7tp=N?sreA5b!nnu@l#_<+#&v*QwDYDFHH);Ek3@(PUpBK9pxkzS0}+4sKj zUlmN>_L0(U^xytdvXRQx%J;aF%o^6m&Fesy3*_C|*z9ly&K(0H$%JfDgh}+;`kD3k zLbjG3Akj;mh(pD>bZC8VL3)Eu?i3AEZuia>LnFG)DE=3bg{<9ZT@NGQjejLE6CZj35fq7J980}HtO(J83;WM z)8bjcyhkk3#g$i@9f{r=my{sG%&vNK43f;%(Lrp|nC21jqnC&vNl=S{mKJgJxEX#Y z6?bVPD@DRnFam^~ZJw2FIQw#C-If=)HS;*6+`QK<$5f2v2Q;v*&baQ*1ve{5- zn((&}Y-G-qJ~mEyORJdFZ=&Y!PeI5nuC#eQ|1Dn%r#z7(ozsAo-x6c;kJ9%ohvMm_ zIgMEIS7|C6t+|mpmau%tbGuwtpyRTZmS!^#HX$h~3p3-^lYg&K4_au`)YRt1MLsn( z39jsC^;_G<$PWnqSIUn-mHOG)Z9_BV#uvIoEU&KOA{s8oRg-EDCVab!lFwl9cUSO- zXbibj6<|RjnU9!uQ_cX&Ap(62`WZp-wuc>r#m^7nvR9;G27$7=+3eGF)gv*t|E{m2 zcXxZd`kyqfVQ}#(zD#jj{}){h7%&-ghOpmUA&2)X4&5RK&qNc|&6h_@yctbeaCXVv z8C_#fUkd77pi3LJa3k~MqQvLwxWZ}-2*4ext*g5VdW*+Jn3>mM%N294SzM{LjQlEc zvT_?hbep+%!TMEnCKJ;_}?w zerOyVGao}aTF2B{q7`2$1O2JhPf^2*DSN!M15VcNU1u2Oz_?nXY*Mvwyrj_OUR z-P(n%kSgkX@Oo{A6e>yI``U!uS!Po^E@N7A*|cV0N3w@YOsza8Eo7WOnkMy`hPR#c z^|k*`d*{IpR~PN^ylEy#3?X{--g^x(i89JW86-MEbkRF+L}!RzCU}v-j57LYLl7of zbb=tFOb~?8TkgsI7WaAX`3C3geb!og?e+ivlnXXR%tvSIwPTjUR2T_Gv20(6-t7y? z6;l^S+ax+V&WnX?>E$Oi3`yQ3@nC!HIsQwXQIxz`B}JZT20<+{Svt3jFU!tAt?xpVvj1;al;Yt&~A z)zymmq9y!y2KS|;aO>-fls8N5B&aBvuYo>xe&$(l3|YLd8Mj0_kn2Qm?^?UKN|~C9 zZO{2(T7qN?JC_{WK6@bu$y1bftAf`Vx9P24M@Jg)zLbaYfPMgdHSZwlR4q)vZRjJc zDvzNG;`z~9ZSCX_yN#DAbSjr{(M-F&W?fEddh$)af|Hsm5$)rA{ekY>57PLvS`v}D ztxaet1k1t!%;+fejGiCaa&c)18b|f0wX`RdMz61<_Ps@tw}y#Ux>O`}F-*tFk45+S zzh}Ak!wE=aJOzC-po`Xzd#9D5+-YIyKJFBiuf+CgZ$e`2w%@UC^#{Aqi{$0yys`o_ zuN@YyY@xQ+8ngf!#%FDHbau%T7PezE`cCUVI5}!UGHVzhuQ2i+Z&vKv@57<}E~%d@ zr@}?O8#tw_4SVyyAk3TEjg9@hoSahn?K_UGuCC65@ZsN_Ld!qcD~)u%v3>IBkyp$e zRs}moHsX&xg}2KMBgCpIcP(x+`Rd0L9cc9D9xB{dH+2$eaB8Y+&x<2_rEd0C?ypeU z`F?S~=*T!?JxBxt_fPhD_u)1N8{|t&Oj=;5y0GK-p!eLW-(tN2b-Z(bX*sM-oY8lxyNl_RA*(GbI#-hGmi|})c0ctmfa^;= zUK9c$#hd=gPQqL`f_^D|=IDWek|axjczRdwkLsA1OzTjN<)9#b+5!8@$eLy!K4Swl zY3U1aPjFW6cI)^QNB`}&%Zoj+BKKk;6>EJ22O$%E3JUL-E;vSC(wRD53k?^diKk+* zshm#y9HRS{jASm{^34a>JrC$MG6%X5%*AddG$}6`czgB$AGuz8?aS|E*s2#3TgRUD zo^4s7G1T#HQc?i{zASDYFsgfs!Vl0>t>0fWWMwHk`t*K!>b9mG6rtMd6|6S8=x6F1 z%=C)kZ1&ZfkB_fc?a}&hQ=_Zuv{U5Q>8(03^w%B3xBm#xa%EZG$cxx_I|cmI+9uh; za}o)M0Q~ND4^!UG%N*;M&&>o5J5SB8Hp=J-DI*S&9bdj^YHAKjGK!3pIiImjSGFV) zk%3om#e7|EP8J-dV{sYy(npG^P9=kx>p_eVBhJ*DJtm_K5O6g|Ms>9)j2B=wM83OT z6aZFC9K|YlFlA9*1Mppa<22`}U?WkS1kzYqCVtz$@<+gugp*~Ip_$V+41A7?Rge@c z5p}WQt1g(yPwT5Jc6Ee1ZFK!pq~8n!ll}G-rRaVV`H>lsB9vKG_RQQ)qW^HqO|fc# zm>zQMeY@viC8ZPZGKJ80%Gd54^Nod{RpFLI#l&Xr-3uPy*w@#RR2@nGAe&w!ppAh$ z?gv%CTQ5k3iF|x0*O~R8s|*v>LF2{y2ovOR1=b2hTo>;8&oP(@Wq6XzY7pJ+Sj*kH zhZvczRCr=AvUPNsQP3xeloOJD2l6YFuf0wX($JWkn4pP#cmJtmdKWTJ`W|7!cTO-h zFdw$PlH!w?=pC~>UBz|%pLnw>`&rcCmS1M(5^i3AlIt?Qsd&#|3}@;jt%*Wf*IgWx z3ATim?)`%^myx9TwL22mOJL}0X=YINDdq1_ekJDq9QTFpo={8-6KgU84Ij5@Uf!de znUT{hF@K)*VPo|h3+`nsy1hN7^sSZW*R}n3A7l%uDyH6YzYs{x@Mif!Qj6mB50O!0 zxPONg;vIFh7ZHwe0Nwt(NY>JwG@YfwlVV;*a4G5&c;r zfS}ntkW zJ2O>J57101d)6bk4p`qrSc94PF^At;s?^m1EqzUVRQK)(I4YG}p@8tgP|wFlI2WGS z`-wtK-^j?`l2tTY%FmA|QE64G5DQjMV_qlDhXgxear~+8R8H;xL{>16wgv@|z&U@*?%i;EK_md}5)+b_$XzPZt05;AMAJ-+~+xCPQ60oxUK6vuUZCdrST^#?;Z59nyab{4c`I^ zU4qRn_I*0(7LeK^UxveEl`HQ@?b(Q*e&z~6tcxM~a&#Y4_$*$M9kHl{=CgML4%3zJ z2Y|(1kX43O64uf@+1B{R4KqZkTy9ck=C-g%qf$O6zTt)Nu#{*wX zLql@0Hz8#!9csmyI$%FXC#1a5;IL&f)8xJ|)JKnzWX#v*soTsjL?2;0zo;rOp6=dp zf0oj{28sNg^(|*O7?|+Wku`U$zl+0}_Sr3ujU@;W8>$)_%jL&rVwYMSWS9cP#H4Nl zyh~PBHw$Q5@9BlNN@3ZCLhKVyTmUc4G74o-KideH;!m&)!ltI2)1YKfOkg-=kq+oC z=S}O4>({RT_O!cQWKxkiRu)`QKP%Q;b{Kp~A$DR{i)q`Td2Qk3F}>z3wKY>Xvvm$0 z&_S&~wcFZT3DDDX&dRcv--+1or@^&#R#sNxEsZQL>a?Rzx}L3N7Cg35X1NLyZaUq@ zRlJ9}Ewp}^cc)35FvlHnat9yH*0~+!n6$N4>4jgmf_lWu(x34HKqVt(>~av)cnUk| zf+f@w>|Qhn)w?dK5TYr39Z+WIp{y*7X;qyz_lzFz#`t*6Fz;XowPa|fp{iPRk7|oI z$}8}>&q|C1IF49I4=ZSxoZ&+1@e3(o$KpVCECls8k7p<0{jONlqlbRV$*LsXla-Vz z1Ol)wZTK>>&WgY^PA57DwSeNBLWhLqutBjJ@-Km>J7FIA0-`hnJQCAN=F8}^0cQ<@bAAeWLhFOt* ze?3L6B_^uNi<;rh78a_A^7~>}5Rr7e?Yy7i(W3A7MPhJplX?jvTTDnGA#_J!^_W@K zZ8TT6DKAfo1`50AS*lnkDi3Stop*h=St)w5@Z<^4`BAi(mGAe!AN_oH())vm`Q}w7 zi#F_=n*)(uH6|7EL55JUBMZ<%3w-fn)U9A*gC-cSAt9bACb>?cIzATK+|r{L{e;k< zfM9fEik#mQ2^6=~1TCeJvFS=tkY%!9JU`O{Y0fp~d6H@%`0ib3kd-mNzKo2PU}jb} zTlZev$jrYh2^92#Wu?DXR!-@y0o5nk9OriYtz_IKx=FT&?ax<@G`75F`4ZM0!pIzO z?Jwz(^IPyg`{Zin7mqEvB8U&yyF~T^TX6v@**elPkNU+!RXPC$uCBoweg4Zsb)Qr1 zMs%8Dh)KQkeHDpXC7LeMX%57z->#O^-mgua2AWh#l*x0gI& zAV{xR#0z||44_DrpyUH#$9{ek-^&uQen3w)z9G9MW@W?{2rpCmJ*HVVV=ec9o_>wg z9kQ!_v@3=wAI0z8UiYmVD}Serml=h3u1(iuI1s@Dn3{35bnVP9_SeVC?L(Dyz;Nk2 zOhrfxH*3GWbh?+An9`#H^IS@N!0wl+iV2rlILO{m4K*Y^RoRQdCqbVouZB%R7rr#*}V6c7AJx&CeI1iH`&fbB3oh zO6JJel0-!{%*=wh)5z!&BC@nmcD3^>r?$#gm&m2h?N&ywh=vgn&Ot%ncI6hrjy;u> z3RAVTMQ}^wD&A~7^)IR_sx6>w@;3g84%l{x_j}LKZ=>@Yxk_n3)n z8#CrRj2w<(LYUs$QSm!$O6G19cIAiz)>e0ej7(KTaKwJq$S53DcYu(S7R^3sTax*4 z(i42SM0VX9;fQ+bef%t<)q6?h=&QsKG2No$m%|I@K|xtJkO@2kZftwIXCgOg$>y`J zuCJ--Qow4Qi*48R;zQMddnL|vQ17sXhq!CkX#RmdRf98>x_X3nHp%{LORauv?8Qf& z_()dO`V%R7FxymEOsFtOquD!JP>e8*oypbpbZv}({L$E|BYq{xv%U6}2TVn2aE-*2 z4h5u7m}jaEixEqb;x+a7eA1)Fx|6E~mny@v!E8bT`aYkqoF{M>s#UT@Cj17NT$5;F=jkXPYLqYyI&(Q4Q$Ei&Ryh`9c_n%24szT);1tj99ZwgJ6 z#6x;e_X;WO>@(NW#lb}Vvbf)$%Tk(fs5QHQnB?TCtmmTF!O!fi8BbF|X7MC5iw3TY z1cK^_qcsn-`S8ZIe@>2NW5JNwz>8|ePM6_iC(qq!U0(GGI@$T5#so5Gi<}VZYySg7u-?9@!NPJ;gFIbiC=mLY7Kq zDo zo_OZU%d3_8xu$&xn7ceb?-f38eZ5iY;Gruc|A|0iOJl-cZJsnIuxEj~=~B$OX>LKF zjdOY0=%>XbVdj?%o<*Y~Aq~aS^R5+X6;e-sYk4#=)thzJ1~(GNd9Kb5Z$};R(u69q z4%mw>_>71q%n5^t+SnErWiG}uNN3(u|dp@|zi3xvfK)geucT0cZg&b(% zF{ohW7Eu21+27$P`tV6!VfM1h6R#jy%mt;;!|GSOO}|U!krF=jgOOCV5W1pKLf}dr z97#&5K_E2k>xyuTXKN|pt4{7RLqn?(S3U<_WaBRhlO-iT~qP z4F05D;Wy!mb!TG26e8~{Xmz{*6QI*;@P>XQee$n+ir~8^#1-}Uu-znpREBd%_Ldm>6qrFo}OcYX}%I) zVa{i%q_#56T@qBx>JvFKU6A-bMp)Qhe{g9vFnprQ+^{VSKlas5RZzc7V^NsWS4ak=xmn{l3R1EsPMO~?e}}WS=AC`c+V;F@nc?u5QxrF# zjGXMD@;vQf6BQP#N6N}HdC;J-=YUGbfAMI1u)e;Kj+`-)p`?5Qq}Mff4T#?8+ysq8 z(kXL*oTx?NS9{!6R`%V!K(yI*mS%`<`)iF-7bk{-{KNB5$tVwtmO21uBO_TSk?F$v za9zyWk(UplqZ1u!m8+${HG`DN%f?^|9)r00=Yua-BHx*!kMN}Ai-mx_-H3>zwx!0U zFgcQVUPG&~9> zM4SDDqrU$si^7lpoCh0SGc?|whX%)Uo5G_KdnaS=y5P*$Utc(g%crcA(DZ*~yL#QZ zgl!9ykW$1vWPVbcGeMk?971duTe=gIb%^Wa(cRq~*wv!mt}f|8#~*v(kwI#+k9&rB zO#-w!!Iv(LtwEvfx||Bxc>%KuqC`y#_a`b#ql*Q3g}c(Zb5a22h#nFrM*B39UBfA! zTS!}{0&1u%oAul6lPj@LAZnf3Y$_dl(MCs`c|S4s;wo}RX}E4L?0n9rCHXP?V=$Uo zZauWaoGpSym%AA)uzq;9#>_096RS{XHNRD(23PNCyU0z1=FnN@*x;eJTe=FGBs^`Z$-5H;poVgczpeKlw~A_ZAS#op@+m zi~dW~4k3@W2@4A`GP<_Ai%aZv;7pAqM#M(>=51}(`T4^Dy&+83?eKgrRE0>&*Dmus z3oVR=K%+)K-CXgN6z9Iie(etj^(SxMxBi=*{_z8#;<#drjy8=YFc--+X%>2yU zZ$OJJc2*cYbtL45)yLAP{1!PXs{NA?Q#r#GMgr8yDH@#QYH`2YZx=bJmDkMzNAuIK z3~XD%{KWN!$nP5EA!_i$x|@WFH;VT^eyD+Q|O>BXxz>^sQ+H zXqggdeBM8z9dC9q`7u^-SR3z3^U^qTekIaR1&4aNJv&6?$+>+mD{VsR%EU*Rfd$ELN#{=@Xiuqw@-y zRy}nz?ayf`9E}=Py5F4=4iCLJY44>;?0p`!?>bX#Git`~`@Bk^q*f$d&B!R%EsL-J zMVjzQ=+GkGO6}+Syfh^i_o8?D@YVg`OVGl4(0zzN>=X2isYc0os7gb_LDy6Myp z2X@R`(KxjH-}N`tNIgxkl!HSn+@)_@cID)NW&T@Q2Yx~N-0x#*zr96ujQw~4tR6(i zl|h>*Qu{o5xb)NB?MU$I{{1e+kkj%AGOtTv7hy5t+pZ?vz5%bBde7*{=S#+(@C01E zTtcl}M;z3ZCOa?Lr8nSkCKU@dxUFv6F#ZqsZ=%@W>vFF$tOIF(s=^dKMV&l9ZR}Im zQDEr6&=sO2Nlf$j$LZ{%dwN~-iQMxG6k4nLR zvwxX%tiGz+P_WjA_fn zxXY{7y{>71x3-5)J67<-4c;sQa#mLMAT^U6!`#Pj{`?eW!MfZ~QIQvti~#;IwVwej zs2Ml1#w3yzX=R-ba}~9MV|2JS_4S{Tmyx;As-J{rZZuTsgKu_O8gf2EZKm~)BwX#I za!Gu;5fhaXj#&*rBVwbrmKC6GSz%$^7(v=q7JBx6O2}n2b@sP>HpO*F6pR5X6xhCKQ$>-fKK*2D8(_(PubuF%EYK?CJKl~xg` zCO@5e`+ZVZa7>pJql_9Y2RA!h#{fu55)YR~r({H@Jq+mX`unvkco42GOLekWHA=W2 zD7|?HD%t`uu6SvP21x1tS5@WM6T{)Ij?n6C@ENg}Z@1gE+8ajh*GXpTnq+80pUX~6 z((0npEWiG%LNj*%mJ2)PYpd-@!CHwX9*9ebBwh9liCj09S1)t?jE(uh?^5k6J0o7h zOQEfo1@d{?MI}#C-DJUudYUEa=nQ62(QDvqzs1xie1w^Ekjw*){mTxTZ`VoODSm!c zq+lp=IA=IK0n7uk-c#=N!b|HtduA$UIx+>z_QiOZm38lHf%9+#hJ+e8K&hK{FRJe0F)F z+Z`sq=`!=Jb&4*f0>beKaxbBqB07V;9XVXU4x&;UB73WO0K=AZ~tckwYhNA{96|2I+E0)7Djz+KaC%R^em`2{U}>#hgR zcTIac?D&+IcYukRM@I)QWb$=oFW${0)>bMSQmhYhl0FVl{Z21-OSbCn5COBfl}L8` zgDi5|N&0?NR`Iv4?|Y9wHikROf^}pKxqFKieZn!eq2Y@q6C$hLuqb8FFnM>IH0yvP z&@=FAwz_uFLeoWk0i{lqBVEWu9dX%@yDS)@Q78vc&nJ@#O)UM$NH!xSCXs#%W%yG5 zTe3dNLM7hTFOq%xXAWFY?u?77F_L!I&(qQuSi(^bOhM?1ZPBd9V;X{c7aELu?}d2iA|lzW@LL literal 0 HcmV?d00001 diff --git a/doc/src/JPG/ovito-peri-snap.png b/doc/src/JPG/ovito-peri-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..80b0f3c55e286fa20a108706fa4f4066832f5ea8 GIT binary patch literal 506151 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∋|NEh^#7$_Hpx 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�R1`5%cSM17BPnb{ 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

QFCOG1SVK<;Fnp;d|4g8 zHFB?rTck5;p6qCi5YnDio-lR%h(7)BE|P4Y(sOWPh$GT-K;N#t%vL|kij$-{0+<;s zV?GvwtVplhR+(opr7IjaLzH;XzH>vY3` zpg6O?}lc zol;l7n*l?1Q9o0DNqj8_60~PaYhYjxN_9~PoXFg^MOKggO0Bmc&<*}crpAESztA#h zL_;OhYMhB1fiw@QuoM>j!V?%wtw4^Xz_jr>DmFt|=I=)Cr(=CnoM}y2zW5EA(uS)e z2a;+>uA8S&{uH7G%a>FALbG(`>7}v?z1Y7cp;x~FzHD#?DT3~b^mr+p~mBr z{QzLdP~HmDN$VijN!@M_%^A5Eh)OHTDD~lyVy<_E#iy3sSnysS}mivcnNro@kUzYSNJ&Teu3cz*O7V} D3X_>M-SSB6FEJ%mAG;Kx7In@D*gk-!9&N- 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 z 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%0DKa|5OMzi5HS*D>X%10UgFG?_@$3K^9xDc3Hj_Q5 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

0fjU+zX(=j8^sgHYoK5LjHJA_B!@Ug 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

{R_zpKXs~Ik$wiKbBV||7zUUB(!0s)2rD=98 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�p0imAwio9}12zokQesSnObVf7&Xtjo z*(TQ8h9^%p)QzGn1U^VY5J+X|`iW0ISvVdA?|pE^?o9B%{qHv{qoXb>N@K8dmr$0^3Nm6vP;^pq(PgC#oV-m_rZ< zS&*n$Y=?6r5E*C3;yqF(yw90=d7WHhOhXI<^E4pnXj-UNk)rh|Gvvi=J%Y3uB_Kp@ zPSFCstD&;suVJg;JwzXr*|vsXr%8=e#vLB5>43ur`Wa)a-*N8N=CTml5R01M=6u zV@ByPtZZv(fo)Qw# z2M_|O)fbtr85tT-Mxlzgo)aO2yrxryKpKSjP>26_|E z|5ZFazb~L4bL^(=)jh2%5XEinbe%8x0pZ_gSKD^{)eL|XHm`CP* z#ta#;vp!jKd38mzYcNg09A|nrkP=J}jxY*@Gg#}0i$~rI%A#hoK0&`%!q_n{bI#R3 zqN)W`oKKSMC(B$Qi`M{!3d&<>b;W9_f~{^ zPwWFt+tL&*cdrlJ-yRWOffWcXDeIDTyogA{$+q5{hFb@-9ao`eSi5a8e1JX&vC^2hId1_EfB7`J(k8_@7 zaM;cx3Q&ba)e0dc5Xx0A^Je@5pQQ=h=e6$z|^cT+EA_v zbfZZP7*kM}HT|LI;nf3C22>$PL6DLl%>vO2N?FscwyajG>;`(wuvxstjy@NiCzsJ+ zeIO1wA4DldaZ*rhOOnipt}#x8n-2TQLJSdgrIC-~(|nkjZ)cKC2rm#uAPY&osac(_ zn5K!bpYYxjTwpl%;6=`F5)c=QFAKz3%HgV)6)t#u3=}$}K#sQ^V>eN5OLVL7`+)BP z;gv@=isHP$ROYcO7p%89;TeaC;37(Bv@&R=5i13qfCqsRnx<%J&T=tn7zU=h`^@k* z1#Vne_6xDhE7xQndHZF?aLFLiLQ|brs8->uV;L6gU|ISF5e3eAy1v6lpR;rdi7|${ zsnK3zm1P`99_}7k%QaV5S2*vue|e8{4yh$^ip>4QW@~7-4PH91iS>5P$?k+8Jxf~9 zQWKY$SGby-lcgehokM1&mbin%{??I9L^J}mR)`J66tin*Ybc9?s>vwE*hON9NF*Tz zTyz;nwvWW*h$3%C7=cJRk0Sa=@_E53SBiR9LI>mRh^{o%wj#uc_W@xgqRWfoq!PAq z8Pl^Q3T0@Umg=k|ohFX^j)&_#!DeA|cT6O*KmY(B07*naRIz1ux#i(z&*9@E$}5b? zi(jn`RaK#s!h4Sp0-F}XB1kS_g{3=mNSV=k<1}IILbItU)|&Z##&$0E8gw9!lDa5a zm#f@mJ0DS{pgt=|uPpPeW7*7%O^*yv%7Vi~&oWu6s|wjDL=^bh(+@|)iC}$lLTCee z*HP6a>vcHX__6~Ih zvX;oG5OX5k25=c6sD(l+MZ0cUZ8qH9-!a?|h?r0jxU=|A2clMBN~+a5i$kC835!MS z1g4glLgL2A+)cD?&AMu^RZvF?T3&eR# zMa^n7h~GNo$ClmAz{X98PX_dj6*bBn$nJc>Nka`wULDEvLI3T56Jy91lIOZyq?=N$MJ$jVueyGgOu0;=)i> z*|qq0ca~rNdStgrTwQ`&6u}viOZY{wYE>5agC+(+B9IcKSmK;#oD#<5JRz?tgs3=l zlDm6B(?(V+N7F>=TA)=$LNP5fA^MzAAu=TEsV;X0s*>X6-=mmod^e)gy!+PEFt?#e0+hrQ*?Tqx2VTg1? zU|a&$J5EmE?6e|=M39k_Cncv(3igM@Vl7DwIIqyAK`2d3*^v}U2r1AyH+}>UhyBdm zoyYr(J8fG*(+JY+m}kq)?a1w&<^Dd4<#h?mrDU~Qv0m3~E=u}AaOfR(FK4drEb9$u z1Fvr!+8EAvE2>J;ACAPhu&#Tw(wMR(_{2O~y1u9DJ5EkloS&^J3WKvS_K{;B=#SZb zezp@-6(paCRuHvh4zOPWUI;>EILt6ik#@CWS8VajkH?Bc3qjd5m@47?LZV=`UemNA zrkL2Bu6h5%XFPxP8-DilYkvIWCp>v?3&|7G0r6xh)=NERebdQQ>rpM zbLAsp;pXOsS1)>QZarOZ_`x4{?7C1Z#~;>A}p5WRAaZA zzU%3Sfq51TgTfDqm=gD|J<`LxRT#sgUf9m5D9MX@6n%r%-DArDNvg=*Z=O% z`Q`uezjCcB`t2FpX3Mi@9}YBq^kfF@Ee+OzTBsr-g>_H{rmrrQ1eB3>kl#I-gaHR6L#K>cjKLa z^KQHw|Ewa;f0O-wg@Pph`CimNq#ylbcOm(mu{k}?GScG}IZstSmub=)*Xb|+>j`M3 z_@Dpf|HP9gSFATHs-_|WE;#xzV}ra1_`>6xz{C8&_5PaSe&pfqz>+dnY<<4vTUQ@( zd$?gp1KaO!DT{*P=7{eDVpG5v@t+NOAzYKim=Si*PC5VMOCH91y6YplE-*@CA7-LY zwC5`j3cH`P*XXRmSDsmqh*qGl6!U7~`u+~1G~3;V{?n1eT}MBSn4;kFyXTZ`!SS}k zE{>aSFLSYKJu46vV)a!;Yc2@evn?lQ zCmcRIF#O#>{j8=qEAT#$s)RTZIWy@l(8h+{hdb1zB0dSs)51JW=+;oI3%v7Oe|m!t zKHnCHDiqD8K>*`8;iE@LSp356C-=8kd~91kz=vC$F;y!`Yf_pk1m(u|D@ zJ_VGLtTyYM(;_k=vTYUPxFy4<04?Q-xEGD&@x^8gZA%sOg zQN&G=GksJd_?Wv<&l6sH9*z&lLBV6b!RJ^*A~@%mrx{;+)HfvOyHlFB<=_tV$DSCn zC^=6H%edf%+~F;a$mf|UBO1jZ@WPWcI2>Y^s81@|U7K@PP9^R8Ey_r`<$(8&^?6B3 zk>DMX040pWjDH?TeRkcs;qg2Fjh1p-5mRK^PxSjE^I_)h)pd5&oSqWy9k(CnESe;; zU?!4ac1u11S@6B*aDO1hM7Z=s6`AZnSrwdI?C_;$*;&#qGEKSrU7_ec*>jj8v=E}l z-OebbsGrp6l|~tX51yeLbG}p!%W)yzXF(^0h$A4@0#j>N+m^HK8U7*iVtPd&uzJ=K z+sI;PN?Rd-!W1-hja_E$=Y_eMP|q~&lMT8qu-7y0ejyZ|qSdr#73*!oX4P`{y5r?= zhmw*)X?Eu)l$#af%bDR9ukmLdq=OI;TA&(D-IlDH23*2!9nJ?_42WHUkP7=SFyDH< zSJ%AvwB_vik&BljSGSSPJ*W2F3}eme0--!VMnD;aC)h&fmtfFAK?XjN>bTYAs$YF782%KD%tWGtz%YwKW*{Q@ldOp1i+$?Z> zEaSdx@ zCge1uqUXtzij!C{M@Q!ZH#dRny9r$e5RQ}*bq!aSaCKg=TN@r8JTG63>`ol(wWcm5 z%M!V{c1*LQY!XH7ux>y;3Xd@*VsHonK}zlpp2NZNjc*jxrG~-~g}^O6&Mw$xX6R;) z$Az6-(Vn$vp-GQ{*`67jMx2ZquB~m1Cjua!oTEenW*N*o;fVLSK4w0f- zq3bnvIbiLC3!d3V<|R?qhCh0`Vzn~VwZO;7Y$H#u0v~=5dG=n3Rtme!EXzVwcrH#f z#zg!Qxx0gL$fr_YMPzgslP5by3V!%~!)MO}fB6@IfAQlJzWcose)iK_{?p$a`2P1C zAAGPNgu+@$Of!r13^A^;RNq zc)L)Rk-Apw&L!_m+DJgiM(zlV=Mj%>FB7Z)C#Guzp$ zHLI1O*;Z`L3at&+&%CI_AYvl;C4R%7`%~GMfp*SfJI)NE+WyjKVwBNS8=L9D| zET}%J2*GoH0ssApVf-|ZKIt%fLG5bFvY}YDND{(F?w&tz{mBFSJ2*Z-mGZ5vpjI#? z5Frs|!aZiumTqAq4>U$mYlTn>5hY4_gwS+!EMjI;2&zI7(nNBC7$dSOG3x?t5~UqT zabY;z5rLQz<;fYvX2o(iq9#YFH5;ut3y~xx%{U{3q$+A+O7L*x_#gg?yXT)`U)}L6 zf^v?B{=o1Tf6g!ZJ^P1y`e7gnh*FZYqNpo2n-y2z`H1)bWld6<i!_xMfC2NnI9bsj>*2vTIm8rtKC+qGf(O#e|(EQiv3$L@Ave zHu6oSBO#5%RKF8%yvw*sZ6rzyloHvjld|5V3Hx8&F}jiF*$K=E z@jB*7_gWx4q*>6^4QC&o)Bobgay=r?C90ByqXQQa+k}#eB4~t`G);p|7LUz%GNrMT zXSka<*>0)Jiv8`8?vnvsX;x2KHfL+9^MX(Z-0hLW>jPEQaCUi)A40}K5fL(hBZpUS zO4gU_>9c{dHZ+$F?r14&cG2Jx)BTJ+TJ%OCje-%#{7VT8ey8og5Jt)V?_SVqhId}iwBoI6wsWR;5)TAA#&(ItgmkR}T{ z+Gvi44sQcVNBkJ*Z+raYGM>Xrlvkuav2>3JhYEsBSm!cJeR#}>@wrea;5N_N{Fs+26N1ttiSrzi@_qU3nL zFdPR$%9%h?Ns3ZaYz;_();1T1MZ`^6yg&jan60KLOh!%(kvM0Ji10ZOwq3P|R-*3= zsh_jEWdYG8C=*m<$Ilcxb%AUZqRLpds;wcxbnFPTr)q2Bl=Dx*;PF$U-qloR zH7?{FB3&6&sR`aAqQDdysT3|bf(T`w`F-0>&!@!)4qh#@=W=0NHa96{F_DHYYGV!d8t z3(Im?FuI^n1|@Ya%GDkpJyJ`2@0o71pu-jj0$~LrQzmt3zh+Nsc3f%-a7WLdjyGQ^@w1f`one2?cwJdtZt{0Mz=%kp38EY-kc+{!H=mPBwQ`h4c zhh8hnRY9|>*zDGv?RG44Koobx6bXw*mzv6G`qxM1PxgrK2-Hb-vneB?fT}dC>zY(1 zW+Sk{qmv>CnML_m1L5_|ld0y1siwL+uzl`$e-LbX4V|Qjf>j}zlH%NG>=L<-unH}^ z`U)3rxmyBiS0Yx>O4tx+uNGF$F*(nR!$3Op9IidrFQL7N{JH>JIyqj)g%`_6=RC8uL?M}yz%QOYI(#kBD?{3p z#8TlE*fimj<+7}3^ospF5d6s1#!%N44#^S%ix40pE(O+wq-|lcZ zM>gZaYO&NY&}hZ#q#_x~>?gv_%%`tCqt8yE?OJlOHdO0`tP^KDLt7Qx-X-?ONKy+? zI-)9B9NZ5c=L4%Y5u|5w14)$>(mZ0t0wD^PIdRiDj=kp`g)Br{5z#WAdz4X#7$GK7$hVLpMV&akgsKjByP&ETsWs6_ zB8iY73V}45wk~-3tYo_>ky7A%WVW8&HsGH|$};DL%=5%J4wMB{WkK+P{;@g5ErPnr zE@8Js+?<`jRi!vTG2Fb6bbCW^E413s9S^*Im3aR>K}z6#B&C4$Gvm0>b)K$EbVsPG z>zF3bvCqQ%YAvYB?7|Bns1j8pDU6{zLW}{sL|)$X)Rm;I z6;&0esz|#o*q&4@)-lbV)k>mu;J3fsBc!{nZY?G8#zpg;{@OMpyc$lKxlzWffN(bd&Xrz z;Hk<6WfI$y{QZzxpbJ5>0;vM?vLI!kZa|vsI@3l{lmcrzyzfXUp>;u_YpOc1+5jg( z*uEypCW5jgndt#BcoKoCQB-w}E)?2K{OoV{#3=b!e|AZX1^@9s9vDZ95Q=ssxV$KM z^(ydi7Z`iXac?ndMOziD*EOrQ;B*IdS@7w{p8MOx*n5W4#FHn`RFI;^JIOQv$q|CX zdrM;_!{Bi)eo^a{3Y1O=ksAS1N)RnREC?#3sF6}2Bt$$u&W}6@Nx%}4C%T9a3l!No z64HQ|65SLa144LWIph6I^E7al1kL*j^TeQ{qP$XEeyhR1_B{NJgWJR^HI&T`vpdNg ziVzULir7s@|J#T)@$qk`U~3SSCVEJ7o~MmR&wd|J&U1{OwUDd}MfN%?Bnw1IuO_^* zl!c)wz^54zQ_ihLB6K3?Ts@1<;q1casCAJXN`Ofb5d%qUkeZ#6InU7sqySUakFLOp z`@jE~yPyAzLf1So4H{2td&JNFiks)Z=Jm}j`{R))AxME2l4`x;^Ak=C*zFbv zR96?&-+0P=H?WK&_4ygqc0;lYDJ6=!MraN0F{jrCq!v_0<@r?1-%&|KWVYV*DRaWzrk! zN6Ny_=X%E5#uAa z2tB%#-hR_>|9o>p3H}SqM(@VE@ou~maNdn~nwp9{FN*|xUX&(>P!cI5 z8jTc^f`WG2aP{pge)9Au^wWTg4xe1k<@SNu+Y7_$KFn)hlFDy)RwR~L=?=2k$P2e`s@T{6wxH`k*cV20Uk&ba0|oT zh!vJaIMjC)n~M$2uI3>fNe?+pJ(dYpFo%iTha1Ad6K*}lnW4Be$e0V#dL!{Trg>zU zE$ybxB3Cb91a=S!EY_mdlFbiRL=%}OOTDVuY}jngjwF{*+dSzXo{z*BkXwmbYy6xG&Fk%kshb!-9tdS5og{kKG2KoC=c#nbv+uk| zBJtVvb7G2YueRXf)!)BB*M^H{m)Hl(^S}BOi$%SsS@tvW5ZHZh$NFN;QaAXuBVI(x zsvwBKupijJ+T)TX=#1f$Nn#4a_I%4Q3|MDr+8SLL<|Qw1Olgo>vMdWBJbs=ISfE%J ztX3_uR)`BY+#Q+6h0W!Ls;#+ualY;wp-5k)TU>#`tv8!&dkcH>hbj9a7dA$K!c+611$T( zGC=Du>KE8|HX#_c023B10R}jnxzFkDnsSVYJ+9FgE4$CYZc3LXP%BZ$L`6hKWb74t zul2p(`#!9Sxa5ZgH_l9QBHi6lR~45ZUD4n5j5kAZ-TA`tsj7_vskj%k{RF%n}W4T;ppQlR%4H#%Y$QJu!tmi5a` ziLTQMw>bLKK-h)CaQx0vFr6lj>BMT=asA0Pr_WEk{n6VZ0I%2h zyTJHv<~H4N-u5JssGABOJYk7Nyv!gQLDf~PwjHrexW*AWk3WPb{!GmfdS*X!z8M&n znRJebBp6roH~b&dDYOlA>yG_lg;EbJVL>U0(uVEJ9c|UIES@DgW+sN)0aaO))N~(j zsY!SODFz;HZt=mv0d_Ce9Ikf+AD+Z1K}eyv@TLVnNAd{iK9|DA9%dF|dLZ3q;+sg? zB{+a+1-jO#OM|kW^dzS8Ob}CKczZ_POQ>4UG~z3>6+~*IBU!8ezH}lC^a_u!cRbvh6ISITfo!6_X0+Gmgi~uVH zr(SUP3U;f+^~Q6{K$B;Dj0iGaXQ-MQS+BrI>X@l)L`z3)GIa;f4>d2Jt;yb#oJT8x zl$nn|*>L@lBA5kCL{}OS;l;{wcen87&B$m1YClmckItGHBi;w@ZWH(S3FjPDt5DSn zWmW{~Ng|@^!p=}_;9)s&?>$WbN8!RvVW!nBwXTr5M%jqVfn^DtXGha&8dIaBMrsXa zL8Jj(&vFc`+70c+1uo4j(*ss%n)M}wiLMD$YfX&M`=PAeYJ*!M{kgD<>Pj{b+;bO~@N_t@-p*%W7pg94uOD-o8=%@bBUJ znc$<3bh##r$ni8GM5e6`n{`do)CiTyc)W*c04X9VX8K;ROpdm8CvjfYu8a zmkl3&xaNHBIi7l)3*6sJcH4~6iJ$)T%)6T-RprSU{`T)4sp`zdMWks2>$SpYg%FC6 z96mX$wkRp78|c=O7az174vKLakr>wPB`FC$`gq{WFGqg%lacFP%^&^2hIt<7hcg!! zdp4ULtIY!s4=2v&z`R60_$ag88b1DLL)Tey62#;QX{K&xlv!A2a2{T~P+VVYy4GT} zrdyBf&W@qaWu05Yn|Fbq|9oNzV4BRub9nZF;?0+dAN?p{!pudL*lZ81TFo#Wac-b7 zV3a|Ui6T%n8EX?l1e6X`EzJIb*KZ<^$1}^4ac&{_GcHc3m`LJ`G9E28N_voygd>q~ zVcDk?OFpBFJIQYycu}? z=17hu@$1d&nVWSl2bc7%`%h9!c0iv3;Y5vgDtM(%DCo9#2|W<~UmPfaXt!ISDgy3<`VXGQbH^@|+Bi$!0>?1ZQR4ZU7 zivp?)+rxlBM}VsHH+G&CNVB z$HbLsS*aSMDumR?q*1EEbRAh}l6O>D(k4MyC0#z9yKmIkp|KI+1eEjGCvcyP#Es+cX&Sw;Y zwp$^TMJR#7#U>^;HHD5+3I)k6wNRjU%eXGP)rJ?)iJ7HDI!O-&M|iD_CE zCg-T@hN`UzQs6{p4vv&FMj4D!#HTqa`7UIO_)THrYxP9_3Y(nBzx8%m=ihvN z!_!;xjWI`jiyrb@8c_K;{{zuQ{F-R^@N1nXiI@{J zGpBH7xacuSO}%SEG$4 zIdI279s@W~N}?-?HL`RwC8*Yl?yBbWZs7Q{N7_R}{c?lM0ujL&jj0UXx~1K;#d6;Y zWRiu^tBU*Qcz;GbEuM2zvasb!BR2}&7_7DADH2D|e4JS(PozLiXSWolO)|)=@ZO`c z!di<=iab;JDYIj3)@Y+~(?VPl^{Pf9O8&UWi0X;mWI!D>_4AtfM>GD$!yeEAw|GSM z9!X22O8IB$JSxz*vJa8l{W-pvo5E1iCT^z)g-EQ(?d;O*RlzDA7$Bq$-g6rfDFR zVyp>Xmos3YS@K{_VEv1l`wPf*uIC)Y^ zs89l)g%L$GdfE?SB{O8*l18*ffwW{lTVr4XYx5Sq>*`^SzWELm0=kiVF(aFSw*!n)Ln(G zEKx^LPoJf=KwFKrnkv+=2;9-J430bk0j7CD2oO;stHk0wYo%Ci*G%(-YM#zLN@6;V ztqe(K+~}Ey87~6$Rv5=TsHhU<3l8zX3{xerJ>%|tY zqCy8v&H>K^Ph$Mkdz{M1)?k{7#?++bndX@&i|cP06a5jemX)lqF(G3Sw1om~6xyh# z&h&&5&{)ByD@?a`Ex6oOTy0yDcLXO0ArZ2ms};32Oe*6@sGmyTauJ~$w5_mFBa=r8m>0+Gabb=LX&ORI zc<)fwV6?{jKnx{bPKu}URubeS(aLbxgHoEVZJz+zn%;`?yC=syc|QJ7^T&U(;^y6% zyW2-T`^4~rAGBA(KM~4vWCkG!G32ELgIb7PWuIpkC~gd z#hDwULJ5Ph39TgFNv1)gZJ=t46S1}yNn!UzuZUhSrv-Atxl)p>Dvj3Ab&-@L(_~1w zM3M<1nP-KR5kzT9iYX&v#<|G(?9e)q5@;=+N|eQ6y;?~=_&{>?tm1MoB~6WL9g*;b6JE)SS)> zA}jXm8lxqbDUh?{?Hj>vuXz5_a_$%8gJ!ceY_~OaQ?uSI{PK$gec*6_i-TmlSG2W7 zN=?d&5R08Tiv{l>1h~4ATwEyX%9KK~Euzw9Bk(hXC9`-qof3-|v>~G|4g1ERy<>R0 zaM}kRyTt1G!s=iM^GJvj(i*UeBmxjI6-XUf!bFyiW|dJU;KPV9g3Y?cXb5q_hlJJ% zB|S=%Xua^{Mw(qH4i=S2$(7HVEDR+fOH+)Gk=wh8yN88;_QG&+AvpIFO2PFDOI;h3 zv`A5+;hN5}*|waIj^ktC_NL6+d5+9;aYh(p*zXnRK_itYd>7!{M{aH>)@#`91VSo= zkbIL5Wivt)`h1L;5X$@+hvL-98T^u1ri?X;rq+Z|=Kt5?^0EYk3M#*7dO zV{3#=xOoJsvhR`_V{4jbV!c*at3YU!wn%M?D9~i87Y$;c&;apFyI;5@`gJX#iFD*&tr@i+Rmr)cRX(bE| zibg5c)*!14Rbci5^X%Aq$Otr+Bm{#9ED8L$kiVRm@80q_%-r0aIP7*TKllMRfAv@V z{NMlYY*#zB)vCCMY)$*}10;g}$3JDBX5w~7b9KS?#U(;VL~=-JP+1d$BQ34~th6cT zRH-mB72As{v1mDYa*E_E$wGoI7nT%DV`#{s#5-3I$%K?~qSOzBRE5KZ{0$N0JH;EG zE?8f4gnv!#5x=Hdh~M(^h_9_S`B(SJPl{2NrB5&YmIm_OjGO#x&+~1@mU8=V8F>B? z?c_WDH|KA^>AxhjqWp;y57ShQR&(JyArk1&kQxNIGTmG4uQf&w25u zFM0L)74L4}VK)`J)rEI)jCedbU64NN87C1b1ZCJGpOYn^2gft+v058cNeDb7_ z>3=a&QL*~oirPkwk4J=-NTu<8V7Q%#CX(vJnkhGs#^hy)}dnoTW zF0!0Q+;JfvGgF!gIa0NT-CONreZ zs;c7g=1Bk0qgzF@u9=P#{xRU*IdX!$$~1?DtE)@qe&XiKcQosU{qqY>eb3|Zk1|^5d_%KoX?~|>8E1~iN0Lf7zmOw1?~5SeGD1qEl#IU^nBR;z>5!GAd$yvz zXwe@ll-8(D5kf%KifJ18#g9KH#Y6}J?>snIA2uAW58S+chsRUBtg%;?T;<}n=p#8M zWFrW8j&B~(jiK2z$WAb}0kbnyTU!Dcb7DEoOg<4zAXk}Fe}oCb5U5p+79|oao=X%R zBkW#o*?hR=;g|QE-kwVITBX=-x7cJk{oRp=^8@liVD^UkP$Q$jJuZdKvu>$vO=T?O zG&0Q-Nhk8Uh}Fg#>Wv}!#KY}9AqJF|7^U&J(q*Th-c)oiTQ-LcP1kZOZs=D7t8GWU zYKl9nUpT)ym-%f1{e90bzWM_1J!zL19!K0?dwg=`G&+~FuG~vhr4VNU1JHnNExW@G zr6t~bLI_2?QwpUN%gHg%3;PfE9Ig)B**nhqT)0Utlb4K?lBzQZU3fe`1itPAOi!EN z93po=f8hS{NE{O}M%>1uuPj~NA+2T_N8IB=xLHsuLwmKRHkw*%=2tUc{NxqtTA~gD zr4(sO%wH~~8LF3-+-0WLfy}5@(ySVqb;}q>&asCIa?VVTBYtqGPGhtt5y&W-x&Z-` z97r;wJB_MJ_h0x5H8%j}1WVRo#Iec{B^!kpu zI&-<+(wLf?`+KH`nYZ&>v{hsULTM%!aDBu-Kw2lHaU5RkIefBbf9Kh~a&&)xPbVf0 z&5A=d$e|~@8L(gzD2dLAMnEfJrQqh~fuH@qGt+)#eaHkc;~yg7i-mX!oHi2CWP%CE zjl!)gbO~o2pFad%{oTkm58K<{@z}Ji`j&vrN;}tnDRoK60KP@z&ALXOw_W zROHDsE)y()>?Fe}AW5vA398Csvt)8`ew^{bqbrG90uuOed%>T6^qi~gxJV22($mJ7 zTFVl%cDf_W!kKDpRTxOI&D}#^l`myKH1)7}(1E-Ti0Go|Pib!3R zPwn{>xV?cdzZ873 z$2gzq?1n?N$ES&T85yU6X&BKmU>Zr+)EH%$=8?j>uvo3AjN;rYKK}yRwd3R5V~oY< zOOSy`z{tX+7?($8HzSFKm0=8Muu@>Prl~AB+Y+mjGBIR^!SVL-ffPY2#eUyWHx)T1 zvdCzuS$8Yiy2a=-);zM?29h87?0bo(s`&8ZEf-fEF)W;qx6Ce(Qg|w`Yn=C3Yglz1 z*4h%+BV^(6ArKk9|EVOn%)_1I|9lllNw7aC{@@QSheKJX{^I97fAhB!*Vmap`s2uE zQ}Mk|I=mloe&Voc5mY=r^z{8q*GbkZLsi$LluI<_s^Qb`T|iDu^N5r+TDRmpkWx=w z2M&is)6^&>IiCldTQCN+&ZHFR`@}eU>RPegS-Q?VG37MrvWQYrO4@cth=mV6a$H_X z_PdtT5#GKVF(y)1U`#>?58v=K7jm9SIf2l$t!Enw99|;|BS|=fI3k2bOV56n_}$-y z?Zz>?6WSy$E^4$HaXz56WV>znFbAeNVr+4&`FLXSj>^^ukufDS zdLka7iqK+=!s*P}Ck_{ifAz2G66q>3n|;H6+i|@<^5JSB+`{KmB0rpnAB>pVBX#C{ za!4iE>esF zp?~0bI`aE}u;b7Fl!WMUer6a3jz`DoR8|j_O>BjtZ45p~hTb7p3bVFA5f~4Lmffyp98dK9BXuQ^ zGCeg?c&@LZTM3NGgbj!JGp4Of56U7S>LxGPmf!`-fq5B-IiV^;z3UJPkPa;cttdi!@|iq(vX*RXNw$h44KBkp4;UY)t)%ZkO&RYHrEKd3s-6MUgX7XFHXy5X< zub)PIm!k6PLdrj;rR4mN|LOT#R2uPJ!i{(@+`J#}$9n>WnNI)P}L1_C>?3aSd6MkO+W>~dfTAZ(4PX%C2|(HDbU}K zWG~ol*Er*G-XXHa7*)FHWWvv-o6Utl@ByhbMhJq8#l2$HH{FC%D0HoG#~y!l

mO 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∓D6mYc}ty5OuI+Y^)$PRbmEYU~-kXFdUX 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

aPdF!ig_jV0r9ur9GnB|wpsR;=e2 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

@hLQs>=PpHCTt2)zrUml=abV7j0ag6 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

&0~H)OTDj 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

+)R5)vX)n>d5_WBBMxqYz=JXL9u1 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�FK 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%0DvKloXFofSr{OS>#)ITWg47_>`1rReat9E@ZhD)R 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≫K!z?ChBG)vt2p$`zECF3sLsn>I1# zb`v;wkeqm&>2R3yCr?t>-Ay&X<;!@qS~8Cxr!F2R)okXIx89=u+BFse#-SnF_U@(L zVqrN@tMphKNm|drX3C;d-1>HGZ>~6MGz>T7h4dO)x6b-7-x$v;t95iQR1{fS<-DEpgcr zd|n@i&y3;{>+#CVu!N$#v*!c)5*bKJs*$HgvAM6)TM$HDmqk>g#dcsXOYJA9F%Bb1 ziL>v+Pg%F_QOvKt&2p;=rDTRrD*`krgaq~g03ZNKL_t(88bntQ2APucM+dMLufjcN zF_QFRRDLBYkCtwGDQI(uc%w9&oxq(sAD^+9{F>aTJpmm7r!_|Z& zRd^#2j(&U&hkr2vp&V^)1q~;=xHg_fSY3rep3a^(58*M)B`&KcE>mI5_0TmgVJfni zn2^Qvw4ctAFk)&o-b5}Fy`$`Yvk!xDGj2%^R_7$vn2vsT9qRldOjC9apXer>y_|ST zIWdWz^A|fXsVa~dN{~e1!*@;*&6-QpP=QQuAU{V=w;61ywFpK7y`v*siwcCQD^V5| zac=)XENS`37Oo_boM#F7H1;K_EhLBtgD9 z6LYGOfxb^DjyIzWPx9gLB`#$K_?z+q6O~F{{p&xOj4AjuGlFdXBCd5>@HkUBAIV0{ zUx>{bN8vVd{Co~EVG)5uHdou*ITuYwQn&$ENQKE};vIJzR~D)mF3P~?*Rj9xuT0ku zq1{-)NXr=RKbYwR9e1P-Aqul2e^Rny z6Rv?tqyal2iImhGUnFbgGNxM3p$LYVQpQPLx)f8#b+p8B}k}zwa1z3I)2jfF%&btCrzT1d)WpB;q1Ru6B|h36p;AG)A+Pq4Q@M-}ezKLm}pd z!lav~kPP>cIx$J+L$|ZwCoeI6xe?dVPbi)mhKr5RevR>-c0#Ettm7s^Q3*3r0cAlJ zmOuX)-KP!YcDGSu8pY=Kv+TonSoI&fxc0Sgq8#hT(9=$}-OFNy0!_eA|Nc+Vb@fo^ z^&z!Raj>(Il%YOkp#)Q584jrtZ(M~|^i!%TkbeB0SC8U%Hi?ix)Zm`df%M=dnk!59KBizfs`*b~n3Iz4$jTpfRq% z>(70No6RVd>#&+eXm*W~zVTr^nuS=V{T%5$k7+>xiX}@p z-_U}~CLNj_hxvr7eOaZxtblkwC=DeO&~?nS@mpW2uF>Bs0quH1;WRFH408NH8=90I_=0-I%?`}+Y(na# z1cY*WM`k!P&`QCME%=OCcmg&W4t*c_rVN6`*+}dvvd@jO)MiH`y73q_9MaCvTLaNN zCAyf7%!w3a@qD5}2IX2QhS4D+P8kZph%(^ksr!quO{ytmml!CN3Ye~qu_8Z%hpMuuktlJrPh#|m+?$ofPj22pj#r>E zAmhG@6;!DVq)FsRgyiI33i0Hm>jr^yBW@5lH{$=9kmly%-LnTF62YWWaYd`8P!P}y z0#+dY_10Aev>4Gk=eM#%&;UN0THceBdlAsa}I#c+3bQ-1pNY)hYT zm}|Rtv&rY9D7n)8(y?Q#>g%Hn$OwgKJ9CEOqerQT#VBOfmnG+;kC-P2Ul^ za-vaMPo1Lh=us-7QHp@p6DL^M(=+R_5Q%W*!Uaj(V?_WXVl# zxMLfPZ7>}IiD?NWU`PnbAtwppKzIp+k`PF8I0q64U{j5adzWoVwrn-4_b!b_Q#8Go z{eIBchri%G?+4a(&2`P1z4z=jYxX>A&wW4lbHDyN;f4nKXJ$xAO~rBS7$Lcwq+oSzBO|z7E_7?x;x(DDA3KHw7;-qszu^X)hYlgQ-PqI9Id%3dg)SF?>1jkcIj9ya zVC-lT0i)JK_K|EpP}gKA;aaG zD|IB1;M8hK2?hx>=M$0s)Kf@WS`bB}^Z=e)Z^e7!1V!O6(wG{_75iQLfjW(bn+_gC zsn=6*_ub^(a}T0btKh~P89#LjMKH)r?6?Z%JSp5U0;h|)vP(+FfuLNKwrVzP$jCRWwR4>0w=2K5m_@f_@zik_`_;?~IDRh1Q z`JA^75cT_+9|LQpfUmL=0}$WWhX^pl$0K{_A(XAHXaoU=OomylCL>n%$tMya`q7VQ zG8*w(EcjNhrf|<5t_%$^Jvhi^!CP-peBXU&SFa{mU5)1P z$0@k~etefM;X8K@nN~~Uz4ub{x4)q`7ywA#x|NxZ4!pIsNP%gmldMgfa2z;*-0#Pn zlEV4AIx=TxiI~mEN=oqO(tv1hFBcmcSlrx9F_3DpaO#s!*b!4Nsk*yqt*xb?v5`t3$ztqm40h#qW0oN7Pqxg3M5ZY)BD+Htb@67X6@}5ii*&E z@BxbeeK?Gxsfj_op6G9X%XQ582X!?xpgn({^+0(r$mQBvL`ROWDi}mRHb%#%pCaw; zWdo4q_cK{nhxzNTSs4nE4~!o;-1 z4$v=pW{;^^5u9 zgG&ru9!EPp#rpY0jI<3?`^9MfaiS3i(N6Vq&yr#~>xW5HIuUuADN6F=cBqMlAT`Uv zO}8Y_(J>1?8F5KtWM$h4OI3sf2~mF^^GX7w%`aoz=_TTsq@q-dElr186(!LkV%da= zYQ-c{RTzmZ39~Pgh0AYatg(gANDoF?kgj<-_^P!;WggViViu=tWmcSxO(I6@bW<4? zk!<%fV-6sa1&EvN<;S;F(KqfVC<~E1J4}I6NiZ0POeT;XXJvh*le+Hw|Q^>W6guMoqFPz2c3o>T$BbVApQTB7! z{qyJ=@gP+NiTb)J&`Yrz1VmaZIr05$Sdv9guM1_=kD5+?@?bd~9fQQFb*O`rq>K6q zizMjP3Pj_r{OGn4rYB4YsyGB|AKMpd8R+iD9TFq=d0Cziq^dL>iy$RnG;(vA78MG7 zA~i|TDAm#kS&|ULVFz*1c#0;2Y+q1JZ|E{wv4p(d0M!>QTyJ&aj|jL_Al;Tnpiqn; z)8e0zqmgOQ#`%y2+(<_fSgTycO=JE0vH#h(U8%LH_446EHG)GA+R_DSCSUFR7-20oj`gK^0ZWR!61hI5SCFn@u`_e zLSkGFGi1&qAtwWmE6nBYQ&{pH_zNRM5+s-h`zcOyqs^W|u22v@Y9V*`2wSZ|l#vK^ zLu2F@mEhg`F{`CfW}P;yWm;M)n~2=%L$^Xs)5(*h`bQ{Yw`}7&yk`V5X-lbd-W~Amk7LSGOv`YwTT6`S@bS1m)cs9h6LPi{e>*s6oax589NsdS?nk0W;t;;YdL17 z$}|ZUnS(F;j^kW7h5D{Ano2G8pSI!u{5V@e5mKcBJsu~6Lp|gT4zSh{q*$WlgxHSk z20y_h0~)E0-aY|ysgg)y93H8hhI#`biXpKOxkyLA;KV#7LY7>HSgs;7BS3tyh8bM~ z0ZlwpmPv*uj^S9Q$C~IP=%3_L*VhDAg_y~75+OqPN;kL0xhZuRQEAo4($>>k(}^q^ z#2|zGM}CNHVv116!$dfQY;h&xib8_%eW(?3d=?p(n+8$lNKnNK=#6SJn!*(JhDZ}4 zj0iG@%aVzfD3Pc_l({pxDRB!!3V|eG4kizA72j9E}5Wsov!=H99TMkg#NHAzT^ zr+BP9g|Qwx8o8Q`kdYhbX=rO7K%z|m`w-vXl#V!JC#s1jy@jghd(flnHToLR1062jy&Vt2{V$pfre=^{BJ zirpzj9+r}uA}7v1icFb;LQpYZ?PY1Yh)J`63|JelV8whTy*>}pI5DZyMjomvU}*Fh zuFL>lL5aFwN#dXjm0QBJERmFZzlTHR!)dK2UF$-P44bNw4s|KcyhN0wQW{EOxZO-Z zo{LNfQzV_m-aCvau@s4Kh9BIk!)2VnVNsxv1=zezN8lyF7`8ji9nyzLNu(VM47-1Wd#h+jv^=&Bu|TZqThe1At73(K@rX3JSsB<0>Eda{Hd zS1xvt;27tRk6cf&4nBSF2;QDvUV3OXa#w&)Ke4lrpnGtT?$%ajZ@7Vb zFI}Q%a1cXR7qx)y(ML(V?KZmi@24KPaeSOmULGw+j?kZx!HT0t=@}ctJv>Z55dYV| zlCo(N&SS@zX3p~>F)t7C$jDrIozhZd8V#uq2Y#SKCL?q0TC`(hM42m1C5?gk#K7L! z7$|qOe3i*yxRx0kioKQ}18#_A=r4}Fj}(|So5>G_kY5FBV;TQS=E?+(nM}+Nhtb4d z3;BFx*=*Om0zyFYt+ygQaA0mbbAA`mV34Ab5u~wmt7Aa26o?1{v(wX*#I{9%kikIC zx5gQW0c%(N3;JS)*U}iUY_VF&3kFfdUUSFxSH<3=-(n#@6uRaQ;|c^&&Ca6#*5}NK zDWxQU!|x|xvr!Q1i-1{!;o2AhJO;zH?N>`KT`d(R1^NvJ7RSyf2WFj4GTm;}v16Rf zmB7-(_8)gRNb-0{iyae+MiI}roy#LZu*(84S|))mNmqwo>kL&5=r% zFJn4(jLk8CQ9Uz5@18xZa=Yi0CIbVAySrI3Jxvx6Z!}V~XAd`eJadGe$HS>Tdst^Q zk`ucYhfka!yP<(XAjR$G!Z+U#$;`y})KjD$I6&vAQv?kLQa}8VGQiQ+M)&2*RA0VK zDG+XLrDI@#tPek=9MHR5G&MGozHcA%{C?ykBMeVWp#A70ssNSOOWVW*qPO2>Q6NAL z(9_w8?BYerCnm@Qnrmv9_tsm~A2`4);99eWl(*l;yn8p^7@@NA^Uuk@3M$9cKZ;nqkUae~ zDHRpe#7ZO%q&?#!ABo)?t>4A022ub1h;J?ch4Rc0ZN`mm;9!_;F}$W&YqGnSMXU(NX&U_BXEg`6vQrJ38n-bci*> z!xRDb^XD;6Pm_1z1XX~ivlF98gz@&GRLo7zoU%Djg2K*|Ud@ z77Il{;=}}92M&8j%7vhXaYnL*BPyo$p)mIBd7$_j<4S%}65=3^BEuEcWO#7_O;RWwBV6 z6B~m9n2g2yxT~r#vzg48x6oCeGi5C4Kms^TCKQp#wZ7Nu#bLK!D|aW2k*6iG^9ddg z4u^xHSYHM77z|W?YfM6H4UojfbTAksb$FQUSp0XYR4CT1BlX0Ixr7NIXfTixn>#sR zu~6sbS4hP=6JhBcQ;>y4P-mx*p z0R4v_5?Zu~j+z?m1qGCxK8-Oqm%fuHF^fc0^!4%Sr=Q}ToWuYWee(^ak3UY`-o1A`9AQLHRybJiksi4K&Tl(3=#p?oz9 z)@`T0@dyKF>-hDJPf(Vhhk1O0k=FD4?v4#?C`>0)?Zjv7w+lDxP z@{??C-BHTCY*;i;;Ep@udFc;ZP|2(;saCUUt%4Vy*@9RtaPnj;_iij^MR6`6k%qqh zQHmT&{&3&jfQh=Eb}Y68Zr=GHC^L$YWTbHP%db%8mhtf4{z*~Re9A@1ERL44K)Q@2 z6&pY#uvjPK`=!~WMLfjkK}KPSA8ae2x+n!joP(Sq*gjv)zyEL*Dv6y1^8(zlC7HX{ z7PGKCiS$G>w``8%f!nH4NlYwVDr4PJDKGtU1Eu*Q=2gg8Q7Ulr`dn_^R!o9=mQBl) zJo&(ND54gMs&rH@jPlHnmy(_)N1y7Wa$c0}Ym(UY{c19ke9Wr~@S8_haQ(7OGP5HT zrdoLTt^zi$E+Q>4KzT7-zfi%y{pfnqvecx+d01N($L$*`C@qOYmlEct>r%L5brI62 zjq=J=mS;+N=GG;oC94oeTr5dZvpp-Bbqfj+MZFYC1Kc++n>DHFsC`jN!x|pSC}L5P z1PLaVM&h|Wc_C}^7c%qZLE<8EL@RG$9h6B5IQW;tWVn^&+81-{ z=ARSI$)!2qNB_N@15*YZUOy6- zfo-M9XjE1L;z=Y{3wP?4usTjg#MX^4D`IQ>4#XGiBpCfz1kEEe zWM1m0AQVOxh~Ub|py=T{nK*D5yDva6RY%T(#e|QXB9#bMkw9N+5xB0?vNgK!k*jEVX7AlVTK zL_!38LGsNGB%vq~iNLH}j43K6T;GNGd>bhNFFqkkKrLm&9w88o5|k)VCTB4vglJF% zNON&v zY5cT@By%ax-u@E?F89HVk?oncvMlW$OrM`Yhz4-oxSXBO|D3c)kV=V`C4p=nsM>+s z=A%lY&fh z{=;gtaROB(O4iQTv3-q>+t!wmnx-Hp6K*55%Lz5V00Mh9_hgoSH#kLeu1>` zCXQZiA~@jXd&SpL7@y44q=!O@jn|&q#IogCI8CFhUZm#Ut*P97YX!LpK5kem|1D$vR-;F;m|-&eC@c@ZuB?br=wc3xM-rg=r2JMlTj{!V^W zaR*zLu4hm)PS*De8B>SJF1~@Du^_=&6$P>ql!Ass4Xqf(N@NOwc$byE`&uvuROs|^ z%qx-e=fCgcz-2iX+5~db<^0EsU(!0B%&1k1p?{c9KIvr8Q9xLdLv3w8pB)^=m$Dp- zGmeYR2F51sOh(JG3nlb*Texj$B86%>T9FimNP;*jARr)?O0Ff!T>T&OKR00CweQ+@ z1kQKuf4Pml@(Njh`V*ysfOv3_+I{<2bma=!fdCpnQB{TJop(r#849;gOpq}(g`%Sa ze>94(q=b<}he&Zcu>*#}LQ1!8W#AwGU;t3;+)3^|_s~^ePov$=@=rb?@s?Y#xZMm% zr6m9HkEB2PD7^;{GUjwLxqUk;-+dR;sZ&h5Tudxjz_ODk@%8sJIWj_vUQgZ|Z(wO@ z!RvN2RZ@cIsi)?Eov|^7Qd22-{dH{3&4}D?hU9X@FT8*@7$iI~!7$J@e?Dc=Jt!)>iy37u^~S`ak{=+xhcI!(m4B zdUD=)16NB6BDb4isg&q%e~V5kB{(v|Fwj&{fnOpa(e1`0lc9V5dHj(G;_-1zfN{$f zvhKMD|HX^g1%XRhS>*lZH+W8;#t(RIz8U3hw-LH<0Y5O9olX9$uj0LMfw13CyH<<# z&ws{w^eAHHyeIUpzKXfN9=YGom`+F9TW{g%>Oy3An&W&w8XLS9%1U0uuqeN|PIJo_x(+FE?!FxFdd#Zp;`tfz+{U|O<-^rxRDP*+DN z9Hu=b1!Z9&I+KY2bAB7MN+oWWi|Mj5%HMw<0*qS+1}F^#NQ(8nc00<+Nm66Ls0iq5X<>=eNjf01S{dEHpGAH@ zNiouN|A7Ofbat{T7^DDj_w=BC^ikBymlNH#jkuUHNgD{@1_nw>2-xl9@83^eIE+39 zmbAyoykNda~?R}aG1&S z=kbk<5Sf{wIvTy^57Y@%H8&G&X`$R;xHe~o^mO#AR-u3UZE|8D^kioz!OBV;4GpCF z{rCYxNeM|`d_l+XFe%SJkJaZR`paLkJ{Y7FXlrbw`{R#UVKB^@xf=|$ojgf}(@83z z3WextZ)dUFjV|_mjCFQW#GE&b9Oxb%Cfn;J?J5!Mb|Z|9ksa&XhlWV-`N)aw?{hk_ zkB?vTQc}gnew8E;I~)ujJH~QBAUQ@BTpAuGD-!d3j{V;<=kSZBkYl%_ijk(Hv3ZS)ooggU#w5o2 zeSSZN#6*fLmTNvl?wf8R;r82^IC~a%Ab@k>LL{LO8lR7#MnnJN#RLq7Ih9a$HW{zJ ziv7X`S}mGC{~5#4qi6tUP7ab+UuCSmo;bfBYb-9!baf%K+nEI%KmIXZr4r@D z1irX9)PMdn&7GaZ#md(SyLRC(Dk9q1Iaivms*0>Yz+`+pW0jSNV=@%lBLRzr za8VKJmtMlA(=mJWC`sWk9-yk0QxE_7?emzbGwPi z@zE&ZoE#e7e3ON4 zH|c=OY=*%>7MV;G0*(t8xbV?OTyHkBKoGDTI)r@tcI2t4-`zBR*Z$wPt2NYOsi1-w zq9PE)BE&K&BGH`DZU_&W*!4Jw+bALqh(8J~W6lH?RIFZ`yF#tZRubat>}MHat)zLvU17j3Ow zY+0Mnf9|fuVABvV&a!oL85ayr#zhi_W=2R)3KO4ar9aw6Vq!j}#W&!ZjBxfhf1q;O zj@n=$X~Xx>MRe3X`Vzi(8wpIqP<{e?+-K>s){`F*n4g!=8`cpnDqL9XBgj-b-nrCG zTOhz#OD$@tjyFGOq`BM7;ZN(>Se?rU|Cr)caf>#0<@59Sv7H zNiRrbe}|d#-Yohj4dkba=?*FRq%%NE{{V4HFHJrNr=lLZT$3ogHu^$dj(Y9%`K;*0 zVFH4mkB0WqKHZNnYayf@<3Ib}VO$tu;&L|&ReC&!8juHN#FuR*vAC3uSN0SAYK%>( z>#_ZJExA|5&?KePRQWEKpU6+ zZmKst&cd{Na2mB-I^V^=E&4qh^6n>SD8kb2;>BeTu}qc5$mt>KziQ{X8`p8m{1Pg& z;vL&Ped-uG>gZX#yOvzmoi`CSeKZnnf$*miA zQFil#oG_b+tX;_szj>LI{Bo=k3+D$~>D48%^66i3WqN{0P>#-=$uoDnNhpv*XGlwD zG@ra>yU0#oh07*Is$NQF-Ypa?s^G}p{RlE8!OiPg_0Lxsn(AS|IL)L!hl)2|qSM%d z!RbN1WFwN~d?L+#WQO7hi2OLTNhCUaB;mm%0=qsF>DUBuf}e;OJVnI}ObwIOF+y2H zLUi2Cz_A+Aq5?_;oO#KteEl`FYnC(bz8z%W{vg5XRTxzwru=>cyA4@Dge)K<;t7*0 z)sPSfBV_7{d-@S-n)*m49c3g5vowTA9z_v$p_2tMi3JdA5W5wK#fh{k#f(+vA=4(4 zZL*UlQ-e=n*6+dX77?e>Fo_K5*6qkwuc7+wKT+}YeWY&QLV4*%Ca*Li8y`X)3NmFF z#&r55YXk+EVJ)tz>yVdJVm*A6Os^Y}B7sS@5+UFr&16N0%y|OIon{h3Qv6~a#z2sp zUVel2rW!_+KC++rCEj@zgd=Vm5=B^V-azW&h4h~}hFu<@z9p zx$PC&-F|}kWmr9Ws;_?#nJSY(TNsD0gc99$f(|*8VJAaz>1=%C1JWuNqgc9t#;_m# zu74wC&1z=c9uA&3!?ujuSd)4mW$6oOX}rSbq?J6d}Wmd3+do#}Iz0AIpjY8nlz_GaR8))IoXn0>WMmue2XwEHr|| z>BSzD@}GmPjHV`IFb$KI9M9Vqk28^~r+Z|O!qg=GdbE)mvyw?qnA~hRyPGDtqAI1$ z=p;82K0e;c*_n8*j75>zrf9m@PtBzOBZDq(SzAO$;{YFiG{NOY5qYUFT7sD4jR{-b&AK9D*%GL863r|J=wI`y{kC&#+-}Jiq>B zJr^#iXgWJXvdqtcBRza`T);ZyV*9p2zCPT=r(b$$za%if*w6Ws&3s;Cr>=P#mpH)a zcn4n%+v$=dFh0>mAWg!1h6x4|fb|?bP(tC6q!wCzaXRIR1-rJO2oPAu-F97obO`VDJGDz7I!#>^b9oveJ)I)3J_;8 zG3a2lKa4nS4bg}Wt9^{HC`wS1KtvmdIBZ7~aWE?+5>O>0@)&t=OB!kMsyV_&Dn^h= z5WYp;5RE3+%{Q?D!%LTve%D=e?c0aT>&0{1Z7hEFS(^6m$1*+5MWvG4 z4jka(=bz&>ndr*SX8v=};Q}V=>gbTkNZqvygTsNXsfiX~%QxTPk;$03aDfqp0^O5O zl6KQgwEyd0j05iN+mS9`&iKB4Oh%)`Kl2O;D^}3_@yFN!$BrGWeC;)A{_qE!kqEtI zW#l~gAZpD4>7eK1_Z; zugAAd~i&=9?ei7Y>Sn81!5I2SJ_ z^S8exAwM6ZUXR6O!jzIi{41}p_3gLkve)bC7zd=k`yEq)fMR@{X~1~fZNzQdh^w&? z8<6L~{I?ggN~v=se|FJe4$gfMU#*l_L~V7uC6Zn0PSD@%J|?Qa;ue2AmR1b8QHy?`LTNd56~FPQkTR?B>%Q;=z4om z0n-3GccN}@N6VZFZD#v+lC4%$J|7MsuyZHQn2(DaaPQawMkC3A00E$|jl2C5hg8l2SNePD`2Kt)?0mH}$$zx-r@joROT^U*aYX0rt$gZtLIB*~6u zpmR8#l*Nb@xgg+Oxe~R{ht}=J1^9RF#M0hQMobl8+p+~*F7zJH+?X>nNnF01xRDVA zAh2y4!?Uww`+Rd{o^o>uEnZCO=qS?IoN0FMMAhDoGDbWOF;_nBs*0t1>|9*lt8^-Et*1h{KpS}1Z3Sgw7f+exI)2RRLu+3jLtR}MtE#Ac{Ba8IypxNwv$$0%2AxjU{qmRW+r1mV#e!$mDwZEP z!l=i?$WD}lI<4$i&*K3P*!tN@ZGCo#6RlGxeF z!kALX+1!kzzn^L#IS{~g;sjE+o2rQtVlu@h{_DAF#tpMfO^%VGF!1yb7t-7{j7;J~;x?i3*$_wLQE9U9&Q5ao z9Th~SGD7l1lz{-&_QQm#XR*bbiIa%%_g-XEp_g>k2s)XZnk&PcpaE;eEE+*V*y2a7 zDP$(G2zgpI6WvBGd~6{YTtOt7f!!l;aL*}x!DaX(d3Z!#%;s?nmI9oiVx~=#w2xUa zcuEj-^KscCTxn~;AY|iH7Z3_ZNKFsZr%xxGlY}B!$zS1P8yYEdLC>&}niYvmT&E|b7cn+4PJ*SL)Q9TiK^tE=BQ704zR~ zix#l&wbxO8b%^-BF>22oC3$%wQcW9lY-WTJ{S4+MawcrURHCM(`AcLgtSB@={6>ND;`wARE@X75gS6Z%!dU?h%8pQz z)=&KARV=^ldvvKo>>p~tB2Oee`$mooj{5N zgf1+Lv}k^CBgZ{Me38>ZZN3f1s+DNBm2n}t3;TQ}#;g>szk3IR=jsv9I+)Q5-ox4VJ|Q(Jhm7n6$TcAxr;ef#N$`lHL{wt3f&u}N25a?7 zsvfwX_VXw4PmeO07)Smuo(E)QY>lJ%{(DH8pUD-W5lf|$_|3~$aN|xIA|Vb;wc&6{S(~$+x6Kzh zBpAqCuoivR0zMvZ<+y)>!Du||7JnaYVKRHEV|1;K{Dn(M5Q&-UttW47Ir+=08262E zsP_}nRtcC~E=0}@UN;_NC`U~5%rw?cHw|@e2FG+vPKD7*1%CHx9b>*ih6i1wB}qAX zx}SrmBY16@bl3Hx)d`#&P@+g%k0==B=%re&!O@*W>ZEsSn6Kidnc1$#km;dkaD)pdy0C35$CEE+dU}$)^d$^tW#H9k;+KY~ zZ$5{(vIq+Cvf@HSxkN@;newrRY`O; zbTQE5Mw+q;u{wiu=NdSDYKX9I75-=e?JW}w4R&A_FCj6ZlJ*WG4L$vcl9mvn0EJx6 z@#8JH#ASrF^OznDlck^Ky$_}dtJgE*5K~{%z_d9JFY}0cHJq#&V$vnWDXSvj(NR;^ z$k{8Cpj%ETkVRwL1xCFpEYWPxrqVNJWn^rCxD}hQ==9hFRxbC}6Ixh}ke7+qF+((B zqft4IBUMfW0q>u7v$4m(0&fV%-~{fxJZ6vXVV)2`5mnPYHIB1b!jR}V?k;9`z!vB}O_x`S{ zI=B8mr&k?GN4(V)XRq_jHRmiNs))fBup?*` z4E4{)88p#0FvZEnA;Q|ZL=3YSnI5GzG>C3h3G(zb^fC{9Z6Bj9@iCp$k5=QPeSZVj zFEWs!o5HA3(CCcP8KcLSr9q5XSP(8?s3nNXm_kgz#p=9xY|{#Yc0F-|0*!kdl^8~? zRFQ6svM|w$Vtjys5i2^u%_7qj*KH_bxX((AILY=^QEuFn&Bf*msDx>rd0;O8bzKQx z{(BD^ZIH+BDq(4E9BQqcsN{9?y>l|iWzr_=vWD8__`fiem#5(W?FcMdgiWbL6N%6T z_?Itd^7Ltvn2|RMFI`IL>{&E|fR7m?@`&`eQD&r$R8nqJ0?Ph=)KZ=^N-TstsVJfY za(a8omQHW$frXI>S*K2sB=tGn-Ob4A)hw0R6a8O*P2=9ZY>h@K0eU++IJtT?*F~c! zfsq3TICtRfgfzFCU1~MgO1l23U0qE7@sDJ_`z|Fw zK`=<~3hfq)001BWNklo?gQYSVYa|v()0bb8 z+TKoiI7}Eg@$9n<%Vcbk##HiCyh&F!K% z1K!ou@orok*F~cw1G(elOuzdsSJc#C21!$9en{WVIqEP@&zV{xr@4wGhsVLo3RmFu{Zec-pH%1__y`6JQmM~us@B_P7 ztzz?@JqSZXd@*kx>;L|DGL|o=Nu|PY{yaU8Jc7Br9FJN(Q)C3PGcs85{PT3IS%WPa z#jaA3pwTcTt=T-a8q{jWq_rGUt0}ImBrta_lNT;9u22xK(=jZ~qX$5tz^+gb1?&n1 zD3t`%>KPCL$kgeu%jGzjkq>gVwXtH)9$Id@jgZrcYUfU_eB=>6E-$ATIHA+==)eEX z{^DZddV85(yO#AYzf5mj9KC=2E5jKX{P3G^cr7oFMK&7^!1jk9rqf`c=8ZRSCMHtx z^wacx`YGejKaUmI@b%aDTrR3tt->XW#4KHkJrZGP&mIzi{^VqGKKh8`8#a&!Gz0fr zEHvJB8)F9!5R!nB4br`v0o3l=g~jXTD(RlTc;9_oDShTaV7j1y)R$l8{B_r{ToCAI zMygB)tf;Q01+Yr}Mt~0BI%(d2#Ef*3LR!zo%*gl2fVs?g;;1EtODdpy`)%e)efXv8 zvZ%S4s=xe&4R5{0nfvY|1DFT+zW$ngW@Maf-Q9Hl$no__#as_yTfLgt z6)R}?!lb?M??~x-jg}2H|=05Zg`!{VO7MS8Cr@%%rz15QB~)3-+UK5Q@6MehN}y3ttwt0C1Zl3!YBfSM z%Cs~`TD6*}1PJPZafN~;osMyd6*PC}PEaZtm(6g+BMJo>N+nLE5;rq)bJ==5qcRzZ zK-{WT6yJLywXpXfPqgpTX4 z=UTw>%U@y_1hxtSI$-p7zr)hs&+5KD(t(M(I{u+nbBidF40!A6cqcB7_0cGWfcL}+ zI`6-qB{elO@`J!$vzd};lqCS8qa0Yaj94izsesX4yO?%5FZm#K+;kK5z>a7X6VS4I zH-|p>fbG(=%3f8)phCeFPA5sg)I0C+!LD6wjYP-<=8TW?fm+S_NQ4|9*xJh2yYI5R zrG-);G(601wVL8cgi7iAz=_IAOoG5FK;d#>d-q-Ps;XEhU5m-KM0pkDtZG*f35eCz#D9J<9za%IJp;r@?eC;k z#qah#(*7nSMZJ~ ztf8SKRM1PM;lo;FNs$kzlX2)4>0KP5OS-yVO<`*K|e25RZ|=v%e6Ob zqB-2ao>nVKkpwoE-i@v2C~0{n!tMlaTyiH`-7xPuKEUWRV6-MtR8WdflgzlyM_|Ir zin2`3o)4plhA^t!#1)&cO&PI|d68>Gw%@m$hKJh`wICV|=(Sz~at#rm3As9h+^irL zuMw>-4*PgFN+BL05I_w1Nm3XHwT+URr9fqp;f+yps{0(PuebwyqMkA9B%N`v{Pt~3 z96y077{nyg;Sam81Z=p(7-T9Xeyx&$NEo?CBwnt^<1vtJO2F$<6I3h7iY+8DRm0$v z9%ZZ?wbsJA?G^mvU6DvcKqiBPbR(m^VFD31a($4j*+!ya1tWeLZoh}v3@x&-NK^>p z33^bN4G^m#=vCp1>QH)}r0170b}@k37(<#NmQX~*Vh!>Od9~iy|B*SEVOD>cTA# zB8x__wRe&mqd*yuqt%#@MU}`yI#e1Fi_gjMcsoB(#UlDcc%mAd{T;{+?aVER!6QVe z89qyIww#_s3xeE_z0XRAR>o9*HkQ~aG?^-1Jy?fg&GqwV)Nrw(oxQ_{dBuGY`MNARtzo*3{}1N4 zBs`0gum+X9f1!#N*G0mc4XAutKJWMxP2>#5yEFvlI(F6X#;M8V+=?EQO9eX5oTld3 zNw#iICaN`JIX%v_w~qO1GO)C^V8|>cF*z1zW-7WK8v&=2qhEZ*_0K#>>#rWcR)2>6 zqtz7scqi5$-9*Fjlca1~$KZ#1DE1i$$flSMg&6Ih!gsNc*55u!K_rGRAAXRlUilrG zNDv)L3=si?F#%!QS{%80qRnmS_nyVr*hOVjMcMNYl5y2a&<1Hf_8Dn1H5$1Le>BXj zYt~Y6%gtaH`SP0WQ} zFg)-VX7AsEpqJr{iloV4LZ?C8vXU=8s%G)EE6BZOEsl|Xl!Jqa!6=2RmSHw(dF7SA zbF)T)&*5Ov+Lib`W7y80N2c?UvnY{|EPF}&c{aK@AII9x@Y_8fle^tSS7wOj;a4a> z8&Bm8QPgqq*xVDG7(2?I$rkL3VhK#U`PIiS(zM(`I6sCzw;bn_(-%1<>q5Cuhtd<_ zqltq=Cyx=lOTmbGf;SF4OZodQirbs%3_|0Ig;YFs8>P7-!zm)R7&kwA>v8P=wSsAb z5_4)PpT9eVacTi!bvZ$mhR0s2CmhHonox*5C5`F}gUD6M$c!<#<*~F+1+Z3GQC+>B zL4%xs4%8D3I$(AN3T-AG9YOlWPGVT9!D_M-@l5mfXYcYq+bT#_$(U_Q!D_V;=;NiCyC(8mGV?3=#48P{b=yM-`Z2ldwl+XcTG`LJ&hJh|Cy|QV}NN8%3?m zMu`=pHh{`wCterCtkyFfnZ^^02Qf(b^4YZ5z!eRWZ&KkgC>U{AF~p}6a6@rY977fr zR;P$cDQ9tICKtR)lv)*$XoQUHct-o2C}mMpYKZ96$m6tlyiPQUDiYIGOxi{K@&F;F zNO}S!&W@*XT7f63q$o>6XPXDN$A!tDMQH>@tOB)1O~~p8AUY$L)1<+nk?~7)|BlrqdK@6kL^KKr<`E;gPdc7Nqfu^_64>n{c>A z^a=%6F29N)n~h)m@i0?UA$GoeKfZPG^gmIJA{64y|Gt)i_A#7c7rv;96|2iADN7)3 zPYb%@Y^E%BdbNH?Nx-cX*>k3YD@x-rpuDublJg(=enjb)?*N?3aXBtCa4yIH+95u_ zpR-RqLG5$TVa&?Hylx%JEnBD+MM_?MmBO7niIkLZ>f3LLefnu~e)Aiw!61VT4b%XO zzWNIL=qSFSA)2*XlAd~siIx`RUN61C$o1EgTU11_vy(}kj@YN3!rRh<&g;bqcy780 zgHDHbYz#jzlA21QPKVCtLjVS2V$jQEq(vggq++U76fb$;_yI(b9H|`w0-|`yw?za7 z1c6FXyyWvT-q}gE&v(hI#w!TS5=Asp!KbyoomqbWjAR_(w%JJP@5dwoPd-s(jwoVg zMv80HV!=IsKE+>sg;9D>&*&&B$pb|WLi|JPpip{U0i14V zV4f&m8s|uNH<=#KB|ywA2oy@-iV_$XMG8dmk_V36Puy5CDZBT#^ct10F%RMyySu77e(R);gU~7FchM#rR5UKzz(Df0$HL+oG60dU;sNB1krQtBc zUwuU+Ese~#-=e@hFa2M;oBpr%i{rHytI^<+*}gJ#>kfXGBG2yCQALMN%y-mGn3hW z`x}ja|2qX3Y>p$EoPD)R2S z3;Di%!~aZD>H<*vKNO-CtG3OA=5Gdt8K0Q7`AX6HH3g~KVBvV?a3SdGy zG>|B@qk@1&6v>drFxl3IG8nw%firEfFg`eV$xB8lig=_ke&-bwmh$y?o@D158!yQ) zDuL>T1}a67xbNn!yqsglkF%t|AF~9wM5X6aGN2VjtPKssOF3Et^mld=>-CcM-C+$u zK>odFu(Pw1sNYYefivmMQNu+qa7^LUY zbbdbJU=VXSj2}=v{x}nzotS*S8PAM~Q^?DRfKFN^_7clvJGkb{JZ)YMU z1);AGC!l)nIi`w>89jFnr%XobS6`vpw25J>63E!{Z2Y&;5zqc1s}DF-chsQl?&6WTH&dBeMtkQ)CfaMcqa>Y8St$(kk1{#X&7<2hxb@m1 z&Y$nYZtvm8x2AC8l|{HFEwpruv1yT;KR&aa^kgLsjXlJMTiE^9cKohM>g&%@Uf|S15Ic7^tCIvvNDbHM>>cy z&I^ysW7CQZ`iGqKHk{-B+tT^v151$0J)AmROMaY{=O4L>j;?Mx&$V*L#%%7sZUtel zjf-vFqzD#%dF3MJWF%AH(1vlepBHakgW$E(JKTe2dWh%NZ6-sZ?mfvC^I9IdLr+8q=CXP>9kcmN3Lmk|>X%^=ix`~7%6zWE}dTBB}edGA8 zVN%p0kKdC=)A$5}UJauI6d4^P80;7m{HR=h?p<&*GRG(hNT-#N=aZM#f1|K*aV#B0QPJjdX1K9YJc%7*8BaWMk0*3CrDX63%|pH@j?sQXn+Z=z?{c^#KN67qI4@T9Y0S}(1S+d zq_OTeP5VCOO`nJ$vc+^aG+DjU*5Ek{a+}4$BaWW;6emw5AI~uAD+XQ zoP@cwn5bTX&^LhglP@S&h8e!lfquzKg7tNjx&tK0^wgbiz<#EdSuzn_Ak4w~dU}^c z@t3(UDm;Y8qXfkm{Q1*NnZ3kWWEcmWq!b1TCE0L?z@#pxQFLQTiV{|a5j(w1W;$@0 ze3%6jzOHE|v-B8K3@9UN7DiKW*iK<79K@rG5Vzk-!KWi^^FW$X#)WPRg*!Ge;_f1% zvLg$cSy}dDYWiD9R+&iZ4U%h3#xpG^lo*HKG0ZP_WZ~#_?+g?2V>)Y2C664J`ZvJaCV9>AGmLC_>H%Wq=6NsD!051Ga&Mq56Ql-z)AV33$3 zGY-1~t*U~uMLX!LzKCe^khFah6+izmd020l6Z1!=M<&lTUxee>_+!;>|*r$)FneI2Wli*Qd&(c6BJg~0&7 zTDlVV#2|fxy==?Mansg3TH5-V8XDsEYt#ARhIDjFf%-FDteEfP^_SLAkfo&V+&Pk!ee8OB zJ%Yl`iDQjivo@aRe!YOAk_76{c9X93^4FIZvuSG)M`|vh3j4YDo+9qLZWgCcH{o~K z`PJ3}t|={`>f3J!yQa9aw2XBbDGYYiGSb(;_4+a%zw%CoFEr!IOd|W|_hHVPN8$P_ zaq2XbJaIQ^Kd26X$SSF|W z%b&_wxGaO(wmSN{+E|;K&JT(cFvz^ro~Y)&{2#F)@jCPhCBu^gR20uAH~ngc#v&Z7 z|AH8eoAr5%XdJV0QSjgijj=F0myh<=(B;%HY;_TrD5G(Bj5cK=y0QwoJ34v${lj#U zhewl2OJf&ZqaHpy8KyswKuyC4AAi$%> z7;cIzzmCKPyUIZgoT!CqN8dE5Q3uwv8BDC$Y7VVQy5*{B%Yqeqnf;ZlXIX@q< zs|!ESSy6$^Xe7yQ$0J?Ov`w2(cXty7CKoKgeDlr7YHNuC-39~6Pd|;mxtXZX$9buU zm?9PSCiHr;D=Nt8>q9LSAip?rgeB7Z6hODrNq#hXskmzog^2Zdh?NS84ynI5sXY}8 z67YB~0b3EkVYQMgwZqc?&iUS9j83cdlDrPzYkvp6S*3!wUIGM$gF)>3_fsAY&v?{$ zJSZi@aRU$|2>1sFDUU?ZODD~14jf>i+dTtTM5DL{2Pu~r0txe6FsJ zQm>a}iAmxg8zar*Azd0r*x?{ydis(Fi)Cz#p_3AZ(ko{fZ?HsNGU60pso(n;2>e(f;87giCHryedZyc zx2b97{sBgBzL}lJkCXSapE2iWKO_C>tJ#0(5TeaS-}E%ru`yDl>oWx8e>eC1hvhR2 zD1QEPQkN~Gy}BB)yBj-TTeF66cQOQiRj1OfZtAVuLYangMICML*txiCwA({lbixlZRLGxqSr1aWRRxl&u< zbYh&GoB>JzOGgLO7cMYg`X3sHgYeW871H}-Lm~WwgDjHfQ|oYW_|PHpzXw$KBycQ6 zTC3AO9}&O*5>OEpMfz3b`mUXtz@!71QNFqt!~e)UQIif6}BirvxUf zRuZK(D+dOhP7)#!lBM>T#X@IuGfSjCjX-G48cglg&8jReBUfyfnC;99i`RdX{s zz@MFs>aoXg9XWC-?@aC3fup^hBGh0n*nqyL2OZD_1a|B| zA>~3}Obn{0p2F48fFTgT3OIJ`V644;#$yE--MEpE)rvV7Bn0r#LpT7_=qN$Jy=fDT z6BDF|!!r_=IXPGg3rQOv2OzR}Gu|ajkYBur3UKDl-n#TS0W1ph?AuLTswBqFM-n$={e(YyGi!@XNt)W zJb+EDCU$t3DBxYco_f2T)Ib0Q(3PH!y|k2skr_v(;1yTkS-qNYQxghcAS(;quc``9Ru)N*KTdmVD}D*Ene*#kV=|j@9zKj52*k%THZnr)zyKLQ zS3?60pMFYdQxh5E<2X*8BIDU-NnEgiAk)PVn+|^;MQ4hnz9yn$~l>&YK`>CeGGbrQFteqTT;TYmJ3+@4)mgnY#p>+oTjVWL0XEFY-50< zRf7!lJ4lW7bLTbl8SI|mT;m9$YmyC%GLQp@4s;WPjYQ)Z-5q0ece@a$C%AU?Y!c)V zx-M9l>YpIP;A2T{7AN<06Nq{c{2l1jI*!#(Fg$K0Mr$J}S;MjVPDU&qvUAj2bHyx9 zx7nGR3X`byQ;-#hQ>&$U+)q-RmbieGw$TwhF^MF^`PfokfX{2gtMN0^TT789NJ^5H z`rc#2sNARqdy%_cw7OgH`J8OYn@>*If_3~9$-y8M@ntN^Uq;J;!vse?^hUKT`^itJ ztvg1i5aOCwUMFw+4l=L4nu2AkQ0QYwFDQbdLRc`Dik-J3Ch7<#YjJ2*xI)QPWZ%j> z^J+4DYBs3n@`KDD5i83l6xOl8n8sbIJl3YoBB~OYn<8VeF~m(P=aQKsu(VXgeH*jb zRGQ1&TrK@=z5Msh1^n0A9MncTxg}bbm&NngHA`8Mpd&Q`<*M1NOj*Oagkq9>e$q4* z%*wlw#JKsK{qhLvh=5lfPuU~C!D5IoC3r~iWw9>pdMs`ePKygwM}+4q9%Q7kgYlRU zCSxv-7Tv?N-9}HqfnrF-PZGD0sxwkM+QqnA&+_DJxw-5XYI^FCIbdse4R;k^%c*nc zm@w+d)h!^lQHHa&9Z{=eOc5aeuAdSkGoZ3s8P|ZYXc5sf9mHF0L}Vgub`M9tJVf!? zHe8LZc+E+~7Z%WcXdl5iHOAQ`cn&vVXl+BQbmA8ys8-A)X;m3bpS+K;Zw!qf(&KmI z5j>pTQ%(3-GjRi*7~~6e#&iLiX4D1gh@!oi56$n$6QaCe5(b+U_X=7c4E~a z`U6<~Aue3#W@7I??6v1HyWJ4+GA{ZEl_Zf=Sj1HAY1D#`sNloX-i2w)GKOl-5OoL$ za~IJ)X2bRDYsiltIj5XPpCL$ziV-KUR|6BSWt_?K_}A%cQ-D`AK?AQ*ugEm$9#>fv9Lj zHe@456GL-HH5P9Vm8tQ}ON!;|6aU7q2w?JiSely8c+|zDD8rvYbQh?PE)P9*Yw5X{b4an4)H4e3IhgE$9=ov6+1g zsOuOIJIP2c;?w#L+6<}GPK7B-UX5*1pvxM?5R`FMZZdoR`8fll9`e%Rnnf85c6HG+ zG>$Q1VOd!kneisR{;ZX#J4Bq$iG6&6`V)5IG#V6)k(g)V+qw}@Xwe!yblOi*<7&iI zkc!GVNT#}zL*4&iVOb3Ru0b*tNu25YfCZ~U5SrvzLp$&G9>BUG#8mMB=Pr)YFc5rP)0y$a@Drqkz6K4+0AOo2UM457h}tC;R^U5mHiUIC&ELnl-F_^;MMf=5h4kK^l!l*1!Kg_V{?}tE(Abzn;|l?jvUF zR_fk+kF#boYj*Eu%wVABVXHyy7ykDluBxjA7^;^a<2I6Ut!)nYL6X5aqqnpKKdyBv^35hK8$76DiZI%pZIOt z*#F^&H0gA#```ogD^}1qGQy#e5elAphWxwlX8-%|GZY(3@^61j@{KoAd*%%1M@Py0 z!ym}oxf6?APIW^Az8yPQ`TX-7J$;(K@o`N5{of?satr-VCk;(a_-?p?IgdSt-E8LA zzI}8S7jxA+?;x8ukCuxUab0y4aXWXSm^Y8(pMTEqoH;Cd>n*Iw$<&`c%Soq`6}xwn zc-2*mJDs#>G!(q>0$I1;&e5;Grrqsk?nfVycK6-1r=(zAuzgr=r&l$SHRsR^&ohwa=s zMpIJAeeXRcTUyANo}M`=o0Uam!2*l}12ce+M#ET95y=({DhU7@tf(MuauO}z)oSr= z-i&H^7+oZS3vjPqjY%d$?Qq}+dS=Z+dhsA0Wt}&Q2+}h)_{%~`LU(UNGEmzz0oKu`ufO}3h;J=fwXPg z@EkhCR9hRTjYj4jJjk%yjitREtpsdYfV033W_*COK>DwK#mIZ_F?q)w^uP2HN!MM6 zrm2ZJeSMTmpw(fZLSi}f0<8uE>2JQtba64$r%$5+1{@9&H*G@v$xoOIq)TkJNoihl z099uvRW&uN428&$01^B5K!lJ&fxonrgsCayfF&~%%c4b?`}@%Y9+e9BmMzG~$1zC2 zuVcju3>pm@n{CGIy|55XFi3&~{CZce#IIChw%cdqCyRQezOC#6e zm;u{?Kt%=dlar_bS6m#SE3UxU-HlQLQX-E&O8lx-*iN3rWj2%i!3V_La03&E4q*)h zQ2*vP_!ck5Qd^4`=v%y)*)PA$=%GV|fqZ!mi35CN+d`|{=JUwDC@!-r7^ zgY;)+GH2H=1{)f{W}{1`LiyTjDD`^$ZEZNSvx$B8UFy%D$6&W(*Jw!m+uyJ#6ijw@ z5(b9n%%S3mCx{$Aj6x9b78g_W$tQT?;}MNUCQ3?(fA(4Ax8F{kUQflp{zcBU*P_4Y z9**|*lKszrlD=aH9YaI3NO`IB4}Tz9P{8S`D$@S&2MQj1kam}gi_Oi5H{FC`=T0>9 z=289m=S<9=P3c>2;Y>>6{MoZ;wr(Zu*S|(xS;_t{zr=WwYSsP-;eo`N63BT5v(Q?XKHHjZQO`>!wqN`Ea24FUo(`HMEQH~ zp;@|=j{bfk^X8HI)KjEw-_GZ|c40|NBlfY!$h`SxP8~l^@8l$@ue^eMC-5Ii#a*W`_rEYEL_NmLx(sW46^R%QPLJHpy9#=Y~9`T#Ky9up@EM+ z_<*p*f^FqWGG2R)x}F~FJw5cs#4ziF4{#(UasKF0gf(kOdhtd4>FHGO+sBa6$n5vu z#~v3)-SOinHf$j0nP{&E#-*5z>Q;t>MgI$pZDlFF=DYR^ug(OKCz z+sm_0Ucte}0c4>t#Yz_|=9w7K22eya7^YjvP0->p<`JV%qw8+vmTQ*Mr4HeW38D&5 z5NbV!FgHX*=f@CK;cOk}j%BmRj!uxIR?^TjiZ@e^ra+F_tiomY0)^5Y*--rR+@W1LQvg}sUIGqIqRp|nxP>>k`f8MS3$qS;2y)^_vh87tj| zD~RS+V(awsKd)9{i(Q9LHIKnzaC@vAYfeHITS1RCfX6+}zGDTr!?T!n3HTC8~|Tb#@X?7ys>$VSVH{s!$V9aEJmMFgxhYX$2Guy zQHP_X0)F1&=%3$XZ8bu=i{nU9*orutXqK&z^$vpgQ2j5nQ80qY1*6c)nzpIKn^brL~u4aPbr;IwgiH4FWD4R!9 zmX*4!7Sz`-X7%;AF&HkOWk|=Im^I{y*^Es^uv=hz@pd-nE+eRp!7^f?EV7z4#zIOG zE2%v;$fD$}6a>@B&D+GWRs|tv30vnrK*$!4)0a-$nQ?x+>gVWG>AZJgm?N!0X1VgX z>&}~aZS*)NmxifT1=xDm?@**x(oppcUAhRB4?Ij}@fN!G9l}|jhh;$yNfTp~ssk9p zQTClVO?g=X$@>nFrfeTI_87P2EMe0l@@@(@`= zePs6a5HmhSyr^bcrlT`Al{mGYB%g>!twgzK2@RHU4$JMtSC$iFv0~C_ka_)Bm(Isw z@gOP`#D+rX`r9#gw-ZtdSUe(y`Z)ArglVtHtpEB6?d~xCmR91`ehB;VeQ}OiZjl1H z9F!qi@silpLy@Zt%K*V3=JSG*}|rOzQyjby)>0M zXvmGS@s~eFrc34cl$zI0_jA?82PjToL~V~3r?Z$+-4-gduBO|O!bdd@eo*;58LBdR zM$|+m3~Wx^#-{waAS=dp@&9A*y~E?G&bHs*o<5qU-n(R3u5#}UV`F0*7i_S>p%_DQ zB_xnH1VShY5CViyUwYn9jg7G}xZ4=_ZrPHoF01#Mkw(*d{r=FlU*7Zo`ObIF@pD~s zU0T|+_j>kPYp=cLe%5o}9%iM@W_)}O>FRX8KY51vc?-!8sd0OtsTo$6{()OdW|K50 zj_t;ic<1FZ=kZ7J#yhC8Z6i0m2EjalJg$HT&OgIh-33mx9mm}xu)8_J`NWCT*uCVb zrELASn)i+iR8-q2$d~i%-}dqGz5vHBM{(F}_?=E(eb2Y^zq z0zupn2QSy2=ddD)erFUVay~f!BK3*KxY%Bex>d@lC!Qqf?DsfpE|M^BDaH;fyJpR% zdi!Uj&YFUyvL4ejFLS%#r*7X4+^5Q!ACr^obyB(K0;e^5N#E!~mTJQlmh|8DERB(=%B5U&0rw0!HGT*GwPPQO$>Y(E$)Zy!<&B+(Xdao#(A1FxbvnE)ZPW&$ zcqh%ml911ikM=Oo=fSNTflE=yiIa`&JXlSzXb#SBF20rkUw+s^v!xK5E)U~Cn4(lA zJ5K76DJOB{Xgi;8If}zD4_|Z=b+rS0@ct>9d$Wk7E~2MZf!Ai{&_N|$>2kU{;6Fdy zLuGR=PURFFj(FbthDG~LqUDtUzs%K3hDA@zOSfft0BtetN_7GHD7+Wi!*%!U5N|ni)yL9e3>KXdl{0? zrP)@%zd!ha!^b^zw@;wIe>8`_xAN6jwS2?WN|XMu*cUX0e!_=OT0`rK?kT|*>& z9x?4m>f2hW_O~EgJeE)ZxIst0UN%yNi-_?IX?Xz*NebdM31n;I$Wyg5CO(Qx63?OT z2&Y0OqN4@8N&%r+L&%eaP?kkF5+mOdPq~$lNds#Unfk!ru=IG&*DCKg-B?kEPr826zFVXMlVA-5}R*g~;GWHQ_xWr4F$1^I` zhdv}n>JcCiB`8F(Dd^AY3O}yJD_I3B1lmuX;>Qgem|IoF?Ld#;&*hC9nbO_OBB1a1agJ72vLZ2& zX`v7~77P3Dy_d3%4kn4<^6_V$L258CIvOPzxbXGYWaxAhio4Yt{{3$pHXC_cx1s{< z5(!8oxZZn@IpV$RLm^JDU(a%28F2BThv=L*kx5lmsDO@-KH}KPlgzBGr-&8tC4+lOJ1KnN(H93ZT2WncW*Uu%N1nDS)k`gOg{@FgYA%DPU`8;Pm?S7{q%B z07oBsh_pa}se^-L0H-%^##vg*E&csSfvWrOr)JV5Mu`CfQ(Ya|GiGq^%P;ZBWJom{ zX8-MPRBhdg$7*HvgbB!%NJ8N+H36Y?#31hasMs1Fm3yGjx1S1ywS+` z&psn}wh^qa=iqI(;fRlC**D+dX>6qG%{K`pB{AvKPw{niv3KrV;?mNX zyL~&zWL(_1k^ZY!nf%XxGG*O5J~0?51C;C6qsz&m<&8H`16?y`qK%KoedrJ>pg%5- z0f_`esyRU}r%$UzWwRj>gD_g4=GkY-{q8#qK)%~e*MS3+eewy_p%ALQd$9w;gAbB+ z@F4Pm0YV~Zdgz^Zm|0atu9%f^^6tBl2ZKn(xkn=iGRL&`Tl!S{_zjS&z;M~jT@0&xx&a-UuE=t_tEkARhz#;;z@?4%@;Hg9G}MFq=Wc!9jqQksq(!(z2^b=NM&uU}8ymMx5t zN*Q?eSr*H%U+yy9WYq@&&-Bg#Ba!X$y2B7PK2e|C3{Q0jvYKmN@pi4 zf#}hr95{Lu1q{FI1_o%j_g?zi+L#{*pa!m%m(!usu>nvUjnr@0K<&hdOsT0M8R&oF z2`;MD%*fieArc(I^JM_Qe;R2iA&#;=KBLPOMtR z04zCn< zFhIbqK^9Zu@ka^C<;0^QJ}DlLXIRfgA_-G6CXS{HKB9sTK{Z7F$T(ziUV>p8D%Bvx z1u3-E$54h+h(=u$=Z|H`orgJ;gxs4*N?1pVU4t`}fkqNy$R;ICNF^#&BhyBxzjPkM z7(If_e^%Fmk<|h&4oIRUffX2?_*MaasxrQ?WP=^m#$y zfu^%<$lYp!auxDW5Sb%@+#f<7(h`%%QH2L7$jzX`mV`VmhC-c1W`Yc}DV3lvh(8R; z=~05${KOPG!X6J5H4Y@jBM>4kV#)})V>0Q~dU3{rL<|86GxXTvf&|sW+M2#t6rak2 zU*SONk5ZVJL3+FnlgvR-9z{bUX<5bCr4|CJC=#WPQe_gRu8SxW)P#cqJtimmEERgS zoM1#C@Hxl7#@N$_VO^7f0gH$4>8JPO5=Xc~O$W5&CKmv8VkC!jyipZ&%UNf1Z!bU-Oy7 zMfbP_I=Y*Q2$}2+v>}@?hVN|6)SYM}nw?75q!G0AJ1O7!36lI2dhT7nta#*M+;%H!X%v@2z#&tU zwstA4U+o~KkumepCy+^Gj4LWYed!`FCXQ{Z+9XKLBfVrIO;6;yZTVMhali)@%nYN?m9%&A0ojU zX8E6cus6G#={^M?d}tf$=5y zXG~y^y`O>NR)=i zP)Z0#9mqma9Eu>W;#4$QYFsu8DJjWFglrU16?#iAae@qaub)VP7GFXJgHk_gjh=+~ zTq1G>)}WPmA%ju5=JQ1f5Z$f{Y0xvKfka=y3yrKygVH7h75g#YIs_Bv`F3 zTta|Yxdi#QIhlIw0B#Ggft|kMIbAROJ+lb zgs9X`qCtX762R}X;P>0mMATRY1~4df=mS#ZLWGt&C+SKbo}iiuDWg~|ByiBifM_c-_ z>NPCLPDCB_vw715cAeQ%DxwW zkG-N9eP%w(U-&c1qAUcJX86~GAR{J`fFK~;4Bp(dn;AGa?f)s$-gX;9Di!|Ov+=E6 z%d|%y{U66Qvu4p&Ur%#=Jxx=laC=J&?G+W&HaF8ZZywXPZKLkwN&HqT^;ubrK6Hq1 zPY<5fR;~e(-~A5#&=A;c^a0+bOVPBp5&-Ie%okt8)!t4*dpmA%7k&Z%P5I*#!Kdq# zKp}?dXRd3a#DK72L>1|`ltc=O(rIbuBRaP=88s*5BUy^tADkH`0 zi8zCS=(K6%yz&YqfdF~Hxz9gGD~f|>hC*EV;RlqWuy-yH8W=#++R8LhUqv%8K<)PJ zEb(~A0o>)~TzKOR=9|sr0f}ZaC$?{AjmJYFkm2#*^!b=@;sk|2ve`^sUmud8AyVIc zm(sR2j{oalXfiWN{r-FMfn!^?(A(Kb*51A31E%U~uC}zG|ME*l#$q(?-HUAEM2rtV z%;<2Kfiq_~dFc{KKm5R0zaM!=2i09&wEyW(%!@`z@p`%3*@^q(j~Uh3iLR}UA9w8{ zc>X-odwWT9yJ_$4=FGFtGP9?Lkw9B*Ep<$MVx824aSFT__f1Y4R2c3ZA>8Ek*+ecwn*9~2c@a);7 zu3CjGKAxJbTk!+->}+QK>t8e;J4TDmHcZuIGBH*hH&VdtbmH}Rhyj&=X5Bgp|MVvs zw`?Kkc4ICpW84cbAU7DWzVQZG9?x(<4iHwZWH1;c*4l~}i2vXNT#FY|AyPA*mCIRq z_AFQS?L%-n82~!-^Kmsa5C<3qf!6MBMwFK`1`rw=sBCX1clT~40iH{j`04Cf68G(6 zoX104PY=~SJ#;+zBy)p7!sX?Zx3&`9yO$YWFZ!-74t)D9;fe|-wzZMt_tVhU#_7NP zjY+MoXgfM+Z*In6v!VI;W3qfc%J=TYY&Mf~^eDwZZ*47yzyF@BefuZ?Y>kZsii>Go zw1_)_-UA1478EdW@4Za*`N#)^!9k>Tb> z+3wvmUb_bGzt5Fbik zY%B#3bviM4y%b!Z3!_n-0|S&^4+1(I2tFT0;`wTykG4~%82z)kuwR@THGn!C#y>bn zf#{PK@R>{$i9V?Sqs2mDIDBJ1){4h+#5!YxgBT(avPGX_J|7W>gVAEy01TN-H#DS_ zUN2#%lM!NB&oC8X$Ds58VHa9Xs=yk_pV(mWtavpJ{rZ+)I>orNVZsq z)MO%6^h*OUG(=`7M7CH@)MP>}zH^m;)M7yq3Xv=NDe?Pp+wF`J{fHBv$s4qMJ|9lI zokH>5r~+EW%)0B^J$7+!zD|pIO?;;&F-+$uJo+dDZa4b&_F+oCQKPt~(V%rWhycEo zE9uV4LekMe1Tbvb!qCKtbR0W|8?fGcFC*W2i?e(8V)FUO-oBlrKmVBnAAEoxNc`p- z;%CkJA8VuhB}?d$NKnn5jceI5@}GYC=7RF3{co`d0zN^4R1lB|0uo6CMZ}NHS+TX{7m3N~O)M%2WNEJhTSn)3PIXy5b%<8~l$=mCBFmN&=Qc6JYi3?tBZ;ovMC_G#j#Z)jb}!oF)jWCIJe?(y+d?MGnn}FlO!h!q+T1u^nNcZMy_FW(JdS~eSmDghF=)w za_7V)GEf$@+(E$Tprd_| zMdMv;`(!C;nNg0Pxj<2hk)2ytl2st1y~m8(R>@OOj-h0Xf&GUrP?F*2Kkm!s!L^y3 zI8sN@+skXuj^ob{kEN&4LQCsqHm*>yX4PmUS`T$+PV?MTrTk)JDXk3`=y!Coa()K? z{M|wvZYyb7f`JCa-w}JQAZDd zo%$$CQ^!(QcN$}DH4o-5VS%cYimP8@u*SG2XCuET+kmaE8(W>7+s6Hp1$R6_v&qVp zhDH>N))F^o6azi=#H3mR#p96Y=MrnKBP|%f91N3l-+c&O?IcEnc=g#tX3gV#w3*~l z62fjLWx7@LDYOj62}B5DFu5p6okE{B86;A4{auu*6?6-5xCRN&HUa3rN5({!%(eEAxjGCu>oU9`5;5S*aKrE(K>4dL)viA>DIrH>*w2MIci z*b6=MCiw|Q5?SP(fbEL|Opj9{bNLv$T1$>yLA*?cF&acWW*qL_`_Tp52!aaPoH<CKuR`>v{dA^ji@y7mfG;1`B`Sow8uDePr5sIJv4f^q8QOb3+zw<5`u@G*;WUtuB(3!KyeNK!v zJJGT-{6|iZ81NyN3fL7Ynr&_}Om?MY3~{@o5TreBH`hx zB0*u+GbS{fguVz0ua96zO;z;pQheaN!i~ zSvr<({fu#Q7h-JdWw0W^w2b@6)=vSUA8&OdOH}ijmb-vcR}SI`T3D%=#3N-Za9Xd? zI^+;BM;Ri3Ot>8?WL*c^z3w1#kRnJaeaJ zarER7`~%Ir{>V(m<_H*_eRLV?x${;XE2d;{;P5dtK`&1~oWU<2DWRq18Xi+053bPh zpRdkGiih*3&N6*Ml*b+#NpX>ypH9}1lGM(pA5ACT5aVL`Sr*-z%$E0OF?CD=2luy- zCb#kU{ke=CrJ|#$m+*jzKmDeN`E&C)vgaH{@g9D^B8C50H-%GY&R}=>d88zhM<-3E zqrHaCjusZGr|>}1R3=!IIKQ~SnzB17P|c&SIY^JGmr4~(d+~3mv-7ELy^LNH!DCl4 zX6z%_l|ydAbaE5NQJkg6?~CHHXR)wwBi`?gME`Y#NmtaYoN^yaOD7}! zY6q^@KPIKS6QAuoV-m{Qkn2NdAHu3n=Y+JGP`(9^)XbsdM>yj1QJpo_+53=ZraTZoSXK)-QtRiiF^HZ5CNS3s||he1@Q+Dq64fo zHN0C|${kMUFi(6#19iua5i}Yx0E1R5#;z{LZ{Louy&ZXFCF6hb3;5HYX#DnD(x**B zKW-d7-+s%LC!QeUc9U}SD28AEn!3_bT8|&60G5#>v4=t^+uI2O!ip8d$H(LU`fCD!wX_s(AV6wI2U3Qqv_^d|G44CP368Z5*(yxPRBCr<|KR%%2$PtR2&Kp@F8T_|6yp?Lskn*$L-Ws55=T1icEE7!&NO$g}K>W@Or<4BI zUuUvd=N$2zVzCaX+l~Lwp&O#;6M^z)pJkRqbWn>7@i|Jjn219Qzeev;(eDXJ|2kOc_*f?zG8;aNE~3Tti<@^j}$%pFzJ8) zJCzSVOgs>|`)-QXts{BvTpE@yC%Lti`ZwM{`oII|#J-yp4s&+tQf8aY!$CaY!p@yc z7TY>E806BPJrs&#XvEL@OCx@)r%#jnv-a=bxswSDYrz~2;66i;Qqk$=@?pCh_hM= z8VpQ%;|-c0d4w{tKF7?N*qfTjve^g$10zQwgu}So+J-YMR;(Z{Ap!fAEhqs;X(^^a z09!`~dcc&LiYq6Fp^6F;fWG*6a$a}=%b)*DlFx@bJsn$SCOwsv6aX&qJ!8Idg*d+- z7tl6g0xGi^z0pWmsU$FUDs7i9lN<;DV4XM-yU|F2$uvAa=j9>QXmB(%pawK|-;Fd9 z!MbbL@bgwsfJLQZu(6S3z+^Ds8Z(B0^XEwc0)>T)dFB}!{`f}{?RI>#XH&3Z1qp?P zMBCd%AQ*HbMqq1cAz3VYva;~lY=o|7ql_Pqe`tt+sDIUyoee`nr2Blxfk0Uq=D|T+ z{r$)RQ%(+cg8^$@9a=!PY86tA2IIDE7=Zq~JUX>nQtRu<0;22IA(WKR{OYS@#A4X< z^O^bFb2LBo6j@d)>J1xk=jGA4YZr#rR)PfuO#ZL`!dhL;r%yb=ie0-1$Yg|SYpDdT z78bJV&>_mCQd+icqj>&&(npU*(%p@tz8-y98Oo9p8a8aWvF2&Jas_um0STf;*wyEr zqcRv|wivkbKlvoyF=L3!%e%2Q(q&{YSzJ3M-CRoEwEwLEoZ*aSr7%1v3NauW0hg0v zjg}P05LzTig&274=rn1Bc;cgUe;5rC!eMw=7c0@nUI@{)5C@0mnM3-7<;0CB#Nv1v!lNTPg@U~Ide!~Fb|Iq zD_ zoK$XKJBw?l_t4ib=ZV)BF|%v|5B}vON6+`MXo;4^cZ{Y_9^$1f7r3n~f&cvd1AOc4 z{>}mc4r(92hFO~Oh z{}s=amlJadBzrx~C`zWTs}E-=Om;-d>XA$FCM0sC+fJG{z%Liyi#;)pciOJvH9A>S zJe~$u2gj@GNR&&-b4XaeXfq$w@5ZOq@$2Hp7%?V+7wh-n#>||!8I)-Rss_%`*V9Z& zdlK1;XOr{#pV|HL)2LI_WR1I(zJ1N8eNh?{Q%OqBz#@xMB$H!_M3Kd!B+25)l&A^H zG*p``41Kqcnelph?OqN)^%oWwX0Yeg7f8NTNm8N)^}?CVTXh?Ip8pHM1BVe@0bIpd zmb-FGsrq6+X>uKz66kFiFkO+1Miz%k zDM1;D;gUsA>J->~VeBd$VRZ@~dNIkQ*vE~+Ei>V7=|WeOL*jyYB&qzwTWt8GPDc7m zxPRGvUadNfE;p04it#L7Hkp4m9l$AL#+;cvAgF$ye;-o{-e&~|MH*-6Dr zp0ts8LoPp+s|iP(ga^}jc=oR`wPy40J)f|sbSdjM|B*I-3J>kt!r0^l{WG3+I$Clt33Q+s!<2W2nK73;)(@WC1{F@)Kb`0^^n;VEK9i04n8)1Duch4_l zPT?HvC$Dkjzy#0AfObG zskJy=HnNj*QK)6KwD)7O$3Ut}B1lU}`(HE+L4-_ePT^qG*j?08&>D6~cFy>yW~rp!Sf zS4b*4QXCEzjakjgV#?}d_U~;X;7q2i!Nkg#oqgsivPR8ifjWWa z{;Pa{X&>>k^+>2^wsJD&maQzCk%GeP=Jfkpko@Oae&tsqNUekp*3tZ91vwvX=XOCx z-`1@-*Xbx)sz4i#Q0waB;jLE*{%RGTL>i(+6951p07*naR0BWsnsKGu(a*{ttX5&~ z?ItL7VjrQzFAw612JyBwpxIc2E!f475W+N=gf!KOL=un0Cq)%gkrWJ(rwF5v%SZ|Z zAre9oivq)XI05nZuj=Mf^rrp4$Zlrf{Qu01cicga#exoyhr=Wd4Kc>;CK1qhy|f-X z#%;kMDS$p4rrc;GVeDA?UVoj=fBb{~jt*24Co*F7YBagI$dpQOyUG6H2PS&G$ZBgj zynjDaJsuKkYG^!gfS%M;0sG853pJUU z~O1o2eBFqoIQJ%3SjzAKcQQ-io;)g!L`&><{UgoVCGDW9UYuB znJD`3LrQ=7OIpA90zbpL9831^r~8|4FdsiYEJ!_mJY(N|m-1b^=r9^Fu3E+7@4lnC zu8zj$W=?ChY-(<1-?!f~G%!HttXY)3{4(7>A5CY^QV}1|`o>1Aayj)!k8%N+`Th4K z-E$9Dwr!(Pt!D0_L#P%mZ_O{5u{H(N#@3lTs?J)9;1=Q$&*=g?i?N6-PB*bis!DoSh9C7r!HK; z*xXF-^yy4~_gyMFJL##e<~*>nzMk;NkyL*79j4KvnZ18M`n&HYJZTb7}Y8A0nt8h0pp&A-uKoDTlCgj!C=tUs50?-Kp86t?$ zB?$NhVVJ^;VL@~0rcGF?t7#Pkgx~+3jMb~@-?0OOC?>9c=_LZO7|PC0T!3foT9Oto zCVc7AuvW>45%|W8A)}`U9}rx>9u_Phbougdu%Wb+v{zoiyMI3b*93vgk3K@#*-3bC zkS4&hX%pe+6Tb@(O{*Mgo9z`EoK=tiZl|H_2aoK^Bl?wQ}yn z2^NU~l@!3~@sJ`0KL9M^xVpY;p;Hh@5rYZ@0Y6Z@k=5J(mM3j*iGa)Q|2 z{$YxU#Z{j2S~}M+X8hBnWg10);=zO6V2@^2M?r zIOg#%R$N#HfynCB_!AO{R96!f1iGe7p)EO?46~UCz$1^~7(E(UP0es0PoIwF_rJ&f z(@!XYE|rS(Pd>q4S&7W)q)iYAZ`y?K>QxMYN2^8q(MJqkzKqW8W(ZI`^9*5)23cz> zK44(Q3bGz~gxbnV!o9r=7=%|4`)CE^@2dM*mhyyoFI@VmSccz{CK=MIcSYW zT!KLG!3UB5?sq6xts<~$6%*ci3(2%;2=nK|0}qg}em&OQTnsB$5?Z;Ek?*`ixTuKA z@4mx1Y82xS9Kf8EMD3wNbODL)zfb16b^Q45yL16bAAZQF#~$PI-n|%IE{gW=C*{Eh z+57(cxPb7Zk23Zzf8p?#Ut+OZvD|YHi?(c`vZ@MWTN`mtJ;kK2zvjEoKEq?Tj%&-4!BA={;}0GrHgziJzxjqf zpkU`tqT|PN?(@&-2cpkDOUl}{oZ7Ji50Lh+e=+WjH`w~}%Xk6h3ooFVJeg}h{D8#e zVlWydX~_~i+1Yd*K8zITpE;9RJ9ZG6FoDKXr;u;nOwy~b;>*vc{OD1vbLKF1-#%*H zZfee-r%9({?x8~rWoB~q_;Hv&pOSt1sJB|_ym%2?d^{zG4k4R2k8@kLU$BC()ITBrFr~N`uIW;*I&}2n-=H!g%Wh z3Y4>uM3lq^`cQZEaqr9-^h=$%JT}z5W~A;Y@}yK!qI$xeCN_@9WQ438L1Jg1Q$TxB zN~SFpSIkd$#7A&cI-xU%NC-HIs=Rp81&UWlQH|^)F;PiHO9wqdH>yz*TuF(XzS4$G zQA%{w62b|EbTnFNxTIsqH5_iux9gl~;4JC7G~cJoW(#$%!65I531KZW2A+KI&R3=}t;uAUlN?QxgVP z57+v45i0gj>+2-cA7J3MZ;8GA3GOQwsJ+%o){@1Xe(}#tb=%0WgC*wYQ%NJ1yX`1O zN4eJAM2%ZU+n6%Q9l^Dl9uA&p;FP5hU*c$5%ucjw8wal{@up8<&}ZYsfuoc+k0PKO zL0#`4M}Dm2yoZ(>zSEn?LB+1{b=2L-FFsd;T)tTv$%5kI>)a}V$-w| zlB+q}ah_9GC+M};6DcicaAKIKT+UTjDZ--JOxgon?$cw=tVLW{&ye2FnX~PTsB;k4 z7BLZU(AL+@h+2-csRVhRf^a-U4^w#N$`O}~80HX~?Tp#Rbbl(N6Qx0a$E@bE1FEC{@Q`xu>q0+;Y@ib1) z1X(quBr?M&>w=8ByQ#b9PIkTYXJm&?Qy@^HD<~m<-C72OV@x{FQzRD>FlQmjspI_Q zI9aj`qTL46!7Q$ul6ai~*3GJ*Fe2m3RUbA*CN}FhOV-r$@mV8=m>jEZh{C!ocK3}V zXlW(0Qp2JmF*}A%;E;rf*c{ALYETP|#8N$EMS?U-D_NjjhQg_4-x~*LY~GA0r;rn- z0Y12PhO*4%+|>LCQA#+`afWhVjBm}qgW(Ai9m7LxENtek+C|7xGWP91O`$-|!*iR+ zk;(Y%*hvy57f&r;jxrSD)Y&~u4`1h@`L}RWMH9PEbP#hX`EJYIRLKkJ9&s}|72v*- zjjXR-$Y)0mWATKUFQ{e3oaJ0|^>9#fjou0kkNwB4VW;}PUP4npoAcX0rucL(O`!xCF$u%L6e)?4)W{G~p&z?I%+mjO z4NoFS(qY1_l#;!11Ihv|j`j|c5;0Xj{WXP6i?JDp$@|JpR6lbkqfPL!te=tEY*v5! zyM#3=_Fg%Oe$>sDy8Bo-YXf^P4&pMU_|c*#sFzmIJM7{5pq)F57qhvlft~w5LT{O1 z0fpQ>cO`>YJLtFA*-})&*XGT~=J0d;%rzRsGVYzzOs-VJ2S+|bW()BB#Tya19qhky zno4mak1e^Iyc{Vn?RlSeV~Pze526a^aq%Cg(C_YJ(SipMsATN9{NGd*iqZIzRB2l{ zZ)Ok`4 zj8EZ_z$uxL&h-995`afm|Z~J zFX2qci>Rf6tm;{GpKYg2XF=Z5iX)|<_u3?fFHK=DXhv30OVH-!;MpnMg$p3F1am|{ zBI@O`wT8H20jDq9IC`;*E?XH%Wix#`C;Ja|(rK&4ubzv;DMco>ap;VYkZctZGB|(i z0!PmXNoFrYZ&Gsh+yH;y-HA7I8Ln6ck{kygoF68Uzk;Zyj4OSoIdpNHM9Y0x$>+@Q zC>IUG7@MjI&dp`g-Ok~2FCg9QCDP;}>GBi$_cm^KCutDJF*qEkTGudf@hT&~e}Rmn zM;SeG29{^=uIXJgtqJUjAfKEVWRD|)sCgxm(=kTcZR~ij2XD?QQqo+s1bOeBD@;aO zFu5~0bL2E1eb!5mW`cntE}WR;{5dm%*gP^Mi?AAl4D}6S7;7Zvt6^xs#C2B~vt}77 zZ7q(Ni1XH7@^4*9T$_V1>7qzxVmP}4!7LwYyj(kSiEn+SkfJ;n<+(Xn_KhMLGEr3~%t1S(AghqxGP&7IgpVniYdqOcUjn2T6e78z1G z^FvaaA`*N)H=y;Tt}U$pf+52B$(esl@ zf}NeLPE-E4y1Q||`!0*qbXAFw5sp3oJR9xy8LAnl6KOKZ{G&%H2eJYI_CNnT8=X$7 z(urSpEJo3rZ&D4YeLgxnI+*q8r&NVP6at^T`6l^qzfEH@NmejOzr{lK#~;%giBJF> zKYWOrQw_=(k!i{pnBC>hqc9R-WNM1!pZ>&xV30E4+Mz=zdwOUX8KD&DK68e_*Ir|p z(MSbg?eAw|&mNYKjZwjj9+2PZq~`EpDuMXa6r(yFmD{&d1tk0X(HRU>e*Eza9nRz= zy_1uaZ{N7P0_)c!{mNI! zzwI_oY~PM9FOSx@-eOuJVL+$jjK#v7S6-p^zWXpG5_DRvsK50s%I>?5D`(CyYPFK_ z)Kg?^+JwpF;zDmPq6Z$J?wjAlEthld_;DuZ%wf|TZy@{jw>j6-L(y~3QGC~3sJ3ij z_}DS}Efz*MZ>C_|Hahn2#}N)=d-PFO9z00*v13e4Pvg1g9yVOR&hZ^PaJgJuYiMBB zuYSeZt5*qHt@MFXoDbSWddcQXnoUU`LrC!V1FqmM8F6L;J}>20^sv41~CK>6ycj7TIThldFOqwCgD z{?nf_y?;Mbfb`FQCY4B#nXY2+l$IjM$sybAz7Zd^zxoxa>1ouz{3ZE7X(GYCPd=gS zvByZ|Y90Qc1$+!~Wodq_%7! zyRnhc{rgFULJZZ^Q1{YH9DVIIO8@pZ8q?Jwq*AE9^(~^Eoyhj?MVgLZ?p3SE*6UHH zL4(BOk7ELSCKKkWDrWuTADr8tBXP#mCg$sQ8;*0oF zDf$;JV(CX8asK2#*~pZ$#7XP!aQ(7<$F9-Xfd;Ss)rw@eQb>0(NPqSJ%((< z2BHN8Ts?6D_sW%2J@*_Am5M7TPSB%Ju;QI}$ZcvuTwP6a#R{rkeU+NWAE)=q6^x^! zm=-MHroKM9^?Gc5eN45sa;MSAi3=BSj*k;qxRBYWPEovV8y5x#kv#b%^)I|YNTtFs zF@Z0YqM*4MXKyb@9)1{CdpkuNH*(>F53s%XB8k0w8P)4CJog+o0l9WNHjjs)fB$#Z z0#$%{c$o2b-eI}jPAy>CzaN*yLPJ{{HGp?ygi~+5#m!D9b?JSr>)JIM&Y!0N5L~;) zxWz*8XP+^b8SR+AJpVj5r9lAo#02Bh(+*c|3G=bs_!a6BdTUWRH)t_jkV| z(b2&=pg0h~VYSlx``@!V8l@H(J8}eLTN^7425JG%v16Rvxs%(0dLTS7!10ehV)fJ% z^+4$GVRpRr7PtF+R0E|xAL4cE&;(SY4=w5%F4M0^i%D~hVf!(`V9te;-ImxNt{~lXg8=IJ+)bp84w7>Qmt3x4b z0P~?kh~sgVO-xV?gif8}!iOKSCGEG?Vqto0j1`lU)B>X8$NA{ZH@VH@VKyK59KjW@y_~Kt!P+_2iSN8XCTQDE!j?e>VXjNhJ}+ zXO4u%MFPSC5kiTA!n*nR@{3vV>K~BR))11Z36mluNFftIJnBMcy^hQg;ms|-U}Zr) zmoDyLy!TUnbkiDco!^YXc%7b;+j+chBi~zg4<#NUtE?%Ohcs*~DI*%RbFp)R?8=7_ zrshovEC?HQ{A`3rOT>%g#k{V;_(o!bI#0W$lk^(bUo12up z9HB%;G#O_3$}$YzGQ!DB3KT-l9ypG6_F8Pp&sf)n{YW>KtT9B@9eW(;pL2S6>8O?Wn>cT*XBswl3pZ^%!D>7@?iYa#{(u9!sw1uc&Kv+~sN}(a@(qT9G$;euQ4-x8^ z8F|=`D_Mv_nL*Ss&fJAXq!gLNQ%U6UFiztH;@P!WgkdBKs8ouPlxLI7jesPE0I)$% zzA`1nB(vhm^^!%BaPM^#DjTAr01|-&|Fr-rwE$6Rgox6O-yA~~OQ5KXAQHzY(#KHj z>Zj7?LK1S|^^Ktnou($UAB}37t8FI#7e zEb#A&nM~J%Y)RMR(SGL{$y6x0!f% z#}KyMbwt!!Ajz@QgS6WVN#)lP6-4p)tyn8sa1@qdNyT~Rg!<^B0@HJ=S7A6t- zGuRWEAhEE45x(k_hQ*1#8Bd9 zY*#n2eJ2SHUL#~Qlcz4l@WFdjB;#0$imCthcNn{Jh3T<=OtqEV@y34<(Maexc^LJr zx3c2NAEK@;$8_;HxlR|c7(`lIsk-xS{5B`!@4iR5)5mc4AhM>pMEn6f;{ynjVItBH z4x&W$dL+p(32_9=l@1!?B3$AWx&k%TPd~!G|9*pv>x0OJ0wS$TDQaAR%qzrm=m4sC z2)6`Sw~F;oJ%ihCWzaZ`ud0e=KYE;^Rg2jF*FWP`si^wO-SnS4M()G}(wG3zoOvXy zQaC@U|9o`UKje_AwKnlNiCU;QxajYr<22O z9kzvKBy-e6ZGLv^&JkE!kG)dFfy3`{Wco1Es{>d|!i-%Q$G7JsMV;-;)`f75UgM+0 z8E9!IrzS{7fto+uTU)EUXHuO$&rkQWLvJz*!N z$RQ*Yk}ZwVk^_B{nWRE$)RH9n@i9c1^+-~gh@v6vQ&z<4GEx#PvXlUsZtl!Gp-+h`*q9mn0 zH^N{D!PiQ-RMthLEQLpy;$pXrK;ASOJ;(&PB!xy6tXE_33lIzBfR&JB zf`WPF$R!yRM8ago#~BQEqs>%OW|gyCR8F^+)wFkY;G0{?+->(F z$PyEcgMHM6t9}EL4Xc?*x`?O5I_n@3w(nKq2zwNJ28xrAFPZzmzpA{L238bh2Vr(*MMOiOcF@ssC} zl$8;YN{EZ4NRl(BM@oJ5;Goj*D-z|v@RCV2$J-EN9> zItl}U8&pDN&pu1^(@&A5HE=%fM?GKg`p3GvZ)h%jPS5qZ296xK-rda-zR9P5|nn4D5-EP7Y6V#^LQoz>TeM9#_ z3i!LbZ-_<9f#L4%8yYxrpg--SJUw<^lZi5`6;0ZQR3br5UmqpuWZ0#{hbcR7UM9-X|aB2!^JdUWY4#y{-kU2Pr z5*QsDBPTZ(>G9(z5()ZECfeVAo5DBWB>9hjV7zh#`LbomzyEy}1_I=ckJGV#KhoX1 zS?2Rm5eRVQ;6Y+LcCgfFWF9bZ`ZQC!cCqN&+jK54r3RK(OkWX zMz2RI5^?DGaU_>6QRDZc5D1VqHQ{{Y4f3a^Py>34h1^7fjPvKw09_*^*iWBkw!?u8 z(0IM5wr?ks87jNv&=BQ!-bqocX(IptAOJ~3K~(C*2~>d5>Ez7R6q!aNVxV_mfSY#j z=K910(?Ic#9rVQGq%L2^4}`w{b@J}Ii@^2kgx`CQWO{8%zxq}3@4XjEW+v~x{yJqp z|2dVv_ytkFAIrXdoa^qU?1dLFh(yHF6oXEnT_mF5#TOY72rx`cP*PoucKLFWEiGJ~ zp2ksHO2wv4lrLFAWczm1p%7lcpPP&7{`*Ph=3+j4n55ImkVZqz>#q|oFUM`OFak4fq){f7fC$M{=o1CP|ZpXTBA8iK@vT_jBOTAr@Y_GDBx~^(yBN9wh(B5thW`6zcVK9y&z${r6cL zi!mn>!7mWtOeC28`q$BX^bwZBhxzD(52!L4$#OW5h(vhu@|b?>Ey~k6F5avx#3xRW zXSbsii`l<-FVk@athjXUerRiAbHX0Gx?KgB>r13Zt*RS88FiaQ>B%Ds_)9+VAqv!_) zn46AsDxfR9S!S^_sTZ&ZMxyPGP$psed38lo&5rs!YdZC1KMP6l`e22e+%l&9Mf zrxT~az+Ar2EQCY259Qf1VjUv5QIntk}NLS^h?!6ZR0m{<=PCj6}ew}KUYeoYH zaE*;o?DsQ^89F`Z%9#yHBP%6ocL`VXEAdO^h!Bz_ zMOYxk74h->vF9*1m>HK%Fwk{{vA`BUIA52i^!^+!>qYuT$<~EEY7A7wq=YiS`zPYjvY`qBVC;0PA zD|zVa&0OyvptR1x<3FzDmOEx)u^I^rhS~CznXL9ZVSl zG^xA!)l-WYG>&7No~EI2niqeu4!<~p-flo?(DA+bi?Qmv@g$`LtywG&EGE|?B|bWa zHJ_wg6 zs05j}k}BzDEIY5F5eV?BM2xw-R8>bPuZgWVn!K#+Wj>$jlK^I4_D9 z7qyC3rcMaR^>~TP#l&vEgNpm_;aZ{_ah4TXN{-(?hhTO!UPT__K#-)tOVpIYnpa6e zDM00&pjatjDj-BAP9e7qQLIYhi)Rsu#E}L^dGPi+tidpGnFwWMnkI#pu+~Fd0TEk} z8j+gZOg9OwfdDF0Ia^p3swex@DKsK45m}N0hITybGO=eT5Tw+&ol1NeQsOx|NMxDR z$m{5r#-OMSnOI6-+<>SspFn9DF@XqOcPBnoj6h{BBBh9!VH~GAfHymgP?JF-5<@Ie z;wje>mB)zstmrKh#2WI5X#@zpPVDw!q74eB)lnj18P%HE49F*OWF;s{6_fp;j$224 zEJX-<7ZazhF;|sCION6@i*f4j`_T4JP$v>2bOg~SQdr*FPOU45BO;*op>L4YkWazN zTF&j?g|}iB%YXTE1i4z=qmwwc@1WctMk~!ESx|y@_8iQoPm?Vd5sUcHE^H<~VgOMB z@$yAvS}bIR6ZqwFe9a9sKJ);c&%eTAp^~gbit+4x3U9uN+*u_UJ!bkRJCWRdGs}PR z6v>Df{fRat7cMf(ALYu#G^Vo`sG71+6qj=C&}kxuapnkwXhm|mFI>ZPwVleimr|*a zevg%oIyr_4IoiAmWYKa=Dix+uIew)Gu{@iEKZ>WkkYt96pwoy>H-N0Mj6jwcVbF)) zYQ~?LB2ug&L#(7uQ%AqROEfD35pg;%cO$N^BakgaCKKYbPh*!QNt6|%k!4dV%fhM% z;wqPuOoUMS-B=vm#2SPMHA)0sZpzLL(`t7yCy_)i5fXS{GyNGO$TSK9UM&${J;Cf8 zB6$(ABQb84HDJ>RiAd$-3X+sZY`An5e4z{^5*1Q&KlAId@x*0BMMAV0cIM7k# zpdiO(XK9t3;h+gYZU!Q|l{FGAA^%kpIbNb}71ge0zOnXBrq5p_knl2{n}d9H1DRVK zL^Hf-1R|!pJv3H?(8@h%{Q)`-wzF)Gh#cV*nPLexa}2j7h*}`P>`77m@M8>x1-OF6 zcn0gpk*#9VY$V^SpfRPEK zSrv=&*t|73rrfv;9$K^-9&IgVex-nE&p4R^D|c4Nd319iLg%?%2E@o$R|c*co(TvRBnJbhO! zch}|MwYgAwVM{WLKi;$zf8Piaqm-IZBR~1(Z@6&kEaQF$bwB+z^)0udhzN*xTtci( zVJpZ)bJy*(*&KK!8f3m)?rnMuvnvC8SV);f&Nt^2Qmc&6)up3A?&KS5Rj88=Y~C0e ziG@2BLvy_ntJBS_d=Jk&TgrW3tHA9Xq<*fF`Aehx=J%@^9`B{H9=`LFN>;6vVju4y zBVp%`}D<=J57d7%7eAltSf6^d~BL)<7OHQZs)NT-^DmS#l?|PGF3~_q*f9( z=2P5!Gvym@C+u-^;^}9JjTsT#d^@ZD@CVA*-$Yqs3k6kk$uC-ka!O5(K}Vfd#e&L8 z&J675X!tOZDnB~QWiI#Zqg{Cx*-9T~X*WhwA4g=z3C$Mbu=`LtiYYH@Ktvo;5h7wW zZmEizrg#fYa`DWtZ|2}VS-AduYg{-~j9%A+Ncs~3P!Q>>}>4etjVNL>+ z+JLTB*B1!ty}T!+=&#htJOqSuf~1g0GWUpP^YhJ(upAdh7H8p+mWPoTE>9ZbdoFx zXf|ykdGR86y~LQIxB8s@mQ=%I(m4Tp(+ z_8H=|U&^gpiR|1t11ia6s5fmQuxAgMX+LweZpFKECs}|Oh^$#dtiK|>WMkxVBo z1%U4Sc|M#ohp(l-UkOm<_ml7U-)Lv+^_1|1&PTq_hu`PB!EagxOplGBNq=T3ARHSb zGkrY|$QT<#o9-Jg9% zFbxu>fXL(|l5`^V8c;AcMrryQfPG?ush|IxRiA^Q9uFCpFS97!F3{XNK@yDou>p;~vzlr7>-@x79PtU4VJO!9uei@rq%kYaY zveNBl9-!Z~i{>Bw2*K;GV@rd!O{Jye%$|+x+ux=Ja6Iw|oj>>i$y29T+0#P;ICcFx z_l=I?co#^hrpR2%}(NUy;v7msm;$kFg*D?|cQGM^dj4fNnP3gW# z91b!Z4(6r54}V`D=bwBMIozOCN=71_o|+;TD2m4kUAn~FG*BJ4S~p%bbjkzrZ2KMb^Y~Ma^OV7IugMsVYwy`QbZ|%EwVE~q= z+d;jaUE8*C`{yyCtBbwcwy`Olm@fqU7cL-=#ct5V6(^JEbviQB{m!=AsYv%v0^}zW zluS%en4a5OKsGi;@xQF6Stb*C{{rgfrPqcc-Ou5_{f+Lw{f+z506?g>7i)UGYnZ9@ zJF{&Yi_+^n9tiN+6Hjnc+Gq578q$?gwLr?}qv!F*Y2l0NPwCaGB>94qIBRU|Mx6Ov zx5|sI=9?xZT+2hoBBM14M@BO^0oE0>eAaU-FR;NCe`#xPz8P~*4{^Kw#$GlFEc|>Y~Ikj^qwLtM7{y=6~8G(TT#6bDYH#4?k1>#T$(sN)q9TyAIAXa8w z9UESKmER2wao3Yivf$x|X#$QYl|*bd@|G;2YUN7wm6hOd5IS`VV@(Yun>T;?Q23?& zuYhn62-8353Q{00_Hc)jhr5j(bl0O;OV1Mx{L*h6x$D6pj0ho&5}EqrAhMY z+4mSY(am39`w{-y4o>9_kTeIm_dDN4u2t~Qr~gWZ-it6Qp<~ZczViB$T)6Naf^dX< zwG&w^fY{@~Ib|a*6OpBq5%$JN#AU2p-@@|N0tU^abUMO>1Thjy5l(Lep|%{iZvu6O zgjC3k#BXE%stT617I3glhcNC&DO8XlmvHNvT6XT+gS0#kOE`j5BOoM?kx0al%qk|X zl3)wliDpQ-?cq&S)|R50j5BTb;>r|b7bI}VBlzSpB8d>OEE(>knUKuP{H6*Tb4A#% zUm_;Fj383Vtki5CYRu=&uJ@2gV`Swuv#N9*^UNg(G#SW?TM#4z2$V*WLJ`diZX+i! z8)tF^NeXhai%~sWO4q@6iDhN7di~9KJ*TlJ2M8vDlq^_=CPzq2G=kCWB}ZAqyaj9M zH0?*CR1(UV%WZG{41a$Isfe8wcRzwhq~zbqZ{xF*Co!2#Jhth6#sqnMq#r~f60oIt zF^wzd@z~A__=Fz*79h4t*QpC?Ixg*o#niRN<1I7Lh@rqUf}N$p~GjZNXr%_Muw z$K$IX=H1Z`5G!Le$X8M*$U{CPq%bcBtuvG6%5sF)PGPWEv1iK2z5RYBKKTcAS}o$z zVk+`yQ+%ciMI=ClNW`JHcCcI~qeP%WXbNE7b&~q0zKY?~W0ZO$D583f{^38l=bwKk zB~9X0DR6kh7~^p&)VX+bvzbgmfmne|Ai}@rETs{MibNRBT_H15fi0HACsAUP$Pfs# z$d?!6bJ&rJG%SpHdr%5xmq((%?ac8s|R`(J0A6>J2h@p`C20gdCBK zXdptBAOrF3cM#n358?s|^47(KL@^u#23!&e6M{_ERy>5-+E0Aghb)p{Q|o$MV@Hq* z!mQ6;MX{)WUAhS(IdN)2N|wx7!=Vuaia?lxi3pFi-oq~4N%|+erP$wFfF@kq;hx{W$cPWTbp-BhcJndr1qBP$@0RB})CgAB*i^m_Yo z#QiKTU&@l3BScOerPt&pGV3PR%zuWdOLj~h$5~#pj0ZP=m(z|Z{^QIqDaoy7Roxm^ z-PO#K`}Z(0I>t}F@hHn@6Unf(0BWiIse zbJzSTR+LvEHn=#@(NC2-&YD$q*pB9*v=7l-wUE}bg%mUtqj>jaT$2Ve3u;l<Wdzrg*ISV!xk_cOfj5`SzDOlOOn9`J*J-=v2k*Va~ zb<4PPWfGA~Po}mINnC_XEJda$BoYvD_r1+X6#^vcY@}o%(a4Dd@u(J?T}U7(MkJQv zb4Hn%8s(5UPNX5qNYsL*RK=)PL081jMcW`01xPwN@OO&Q{cz|nBI5;Lp+Z9@yA*C?6X|ow~rC8myz09@^8N#dniQP@Gx25`yTUt{A2uCS)4e3 z9?Qy=toY*}xi&gV|L7>DTY_CX6b9M(KR%LWqh0qSy?Rk-~*2D z*+bCn<|we~>{%RQF{W$R=*!Ke?)~=>-E_cMOpcrhFI@8=&czDO9@3*2_%1SXk` zzH{fWEMLx=UAr(E3|#N-rW+`F;RX7-x`4TLQqTR8su*+ql}=$Vh8+Sl6#7kV=v1cFzD|bLS$jsX><3yb(X~1Vs-%Nc_kV z!ho^4nX$@BvZkgG0Hb+%_;0xd`QRX=eQe&f3;*fU2m=8u1qGD;`@fUw?nW^^O%gE7 znuS;@r6?^7?vzM~H8xUewIWJ`g2~oa^2}yLKtLwL*U&(o)rypv$~0GNE5&B>Om!7t zZD^n%7(^b65lvqgeO@sFSQ;Bq`Fv>OaT36kR*SN*5Utxy0`Se9i`DI>B$1fuH(zLu z_|olUYb&{CGh!f+pHD)orNHY&mg!QOB50%08SRgZ3^ZkBWILSz_-4;05DZcniy;8) zSy_ZjN|@zx&1m2Nsek!CB3doh!a_>j?irr}XKO1(|1w7`t*vC4&1ll=OZI~wkgBUA zdiE?yz`bl489)3X!J|i!08?dUSXZn-oCdna#9|D0-G$O*LLQ0WD=(*R#|}K#t|4|f z@JOW?@4S=X)D+p#C@#RXW(_f^6ph0{5QshfG~$vHa{K#l_;o!EiYwA%<8Ez5X*QFQ z_S4?dLZ;P9W-2uU+^5%bQF?xc7A(MLHdB}eJIuw!jH=ZX`27Td$;FGQ`^#T29X(1g z6hiUB3mg#&iRyId0QdU!1ZrxS=!Fv?QcW?`}e=ktf!vh;;voz0|7jbJVN82{zQ9sH}|I?<=jWq+?>!VNR&eE$ zPp|>iCr%(b!X@d*KDHY~PLp@ILq;Wk2`<@$zzH zTedLkl~+*Annm{f`55&2|HIyUzsFTw`~R=$Gn$b`Go#+SC0Vj9_l7HA1EE8JKmrMn zN_b$1}lB_OEvdXB9W=7KVqUrVXg9h&Xe*c2} z;PpIuo;f;aj`rSXpS_pXd#(2y^S}UeB_$N@+eb@Z9|^l1LuMx1=I0qQ8gUE`;w~$r z^2`~`3I%gluHeYZqPn}AnPifQ=4KXB?V407S?KO&9yQTf-;cMye`%j< zXdvweKcMyaak2sT^fcj`8m>I`6kEHxP@Ox6EgI$8zyR^*o}<344Z)#99Q@-S**G&p zJ&-;+3Zn#KI^_k_ZxR1PLXH zP@F;iRUE>3lJ+RyuKyZIhYP7VfW#i9*jmHNnzc-borGf{>g^h~CF|(^!SC7ZS)@Q3 zrR!8HzEKb1f1bnBdX$gOy~~CwHJR;W=!6Q40zU;NBTd36Y4QX^kxAS)`H^ji6O+q0 z-Ze(MIDlt)79wpiA&Zjv=^SQ~jfAyTbQ~Y#$ltxpnagqeO0c*C9NT}1fh+Y)=#!i} z*@@RFrt^?a1YmlU0k;6v03GYr5rb;I> zPA|2Yb;RG;N3GFFdf0K!(E4zGI6xg_R7?ni;v)M@vT`jztXyZixbnH7u;PuORe)=xM@1CQ0YwyN`Ptx09yI;?npv3Vbo{Tek~gG(?}##0pI&x0M!=E{Jio^&DD{pJ(^pPli;& zse!Z9Yirn>zlplMQie=M5{ofz&2L~$K{ZxSjPcP)zP;;yD$;cH&y0~NP_t)J%&PMv z-0922GN5O5lpmwtE{wJkS)eohzY5G^dZ#6dB~M2qNSzC_v~TW z7e9}>p&CU_0r9L1k~=mdl4l?_J5eO$xQJ8q+AneD=m=NVv-=k>A=2cas;DGZl7qLl znC;*D7Nn^re7E5#{YT|T}>nTju@LJ#cZ@|SYA;@_xKFO>RPsC zZ$lf(VBQuc5t4G7vYH!~t!3VqU_?K{Q`;V3Rc0Pnr$#y3bB@og*vqDZWhi6{I`qTr zQ0ln5aSd~B2V+Jf_pGR8V_qIHyOV#MJI(Ium3)5H7S@z5<9OS7gf{r*ng`ihvyv-g zy;x_ge0T4UC@b}jUdjJQkS2P+2^O(9w3~hL723W+fc|^uMfXW!ul#T8nuLGvl*{MNkgWL5>=SL zwC}?nvymeeaJ#OIr2Z7eK?}=;d87-k(;7_*>s;-fS~))2{DR zS#l40O(8Eew;*Y}mAsu_;1Bvi4%!VgKKuegRUI>;AeviisJUx96-5pBM%^S^yBQxG zLoSr?!6VW!|c>4Zrm)R zFx$rAt`^QG;#gNN$5o=Fx%mj^79GSkZ6v5sF{hvAFaK;NuxvB(k^&}XLKsHJIWnRo zB3sAc&;sLgW-cuh5sXzcJi5R~2QScP%)ujAPDiJY?94@e_h$n>wlh8*W1zE}_V#p4 zmLg`&I$rF&}oq0i&w*={`H0KHwgcq6rR zj0Sk`bQ_E14M>XDU^V-2#zvS~79vuo!xeULbl;z7SQSCC%t3}uisQqpR1Vsx^ZUv2 zIkC7r6v$O%gu{q*A|`Zx&OZJO4SE;uOT+XXJV>TN&l<6qPync3iAxoyM>c~p zV@pOOai0rOBt+t>isv^y$N05tq{)*M&PlmFYcIv=1*ixkj3f{UBuIr3(xOoW(Kzu~ zl!Q!zfd6FxNQeZ)1p=G$sbFj(7DK&m9h%?$ zj=We5T_VA7M+Y?>9TX%I=m5|BJgQTt(4-bVcOpS?Ump#j5P6{x-l-|%M~<)}7NZcD z?(Id?+|2UHNh$!B!GLrBe%6hTQv=w0dKfu(j@p9(-$jZx?sRCSGUFf^I zD0uf>%A-+&1_NyuFVfiFzC=Y63en!u!kYPc%40F4z*W7Tvc5jDJs#qL04}u})zPCU zrltVs*6UFkji@Ik5K1JBdA&r>o<%t~x0Ln0awQs-ib!)aNr{B3E*DjI-9_6=FOl(+ zpAdfQEyfNUV7#S;ZF)V$fW&O3xvPsCEEWm?aU#J$cQ>_zgA_#~xQ#|6H8m*TdW#&F z3wb<_J1YyppZ-Lt(}@Zgnw%uBua8QX3wb!qspe*Ky1OYhna}{%U=W6eDC+7$0~oDV zVm&?7nayMY1D7u|-_b$6UQbRkiE(5EbwvfrzyF;AAQA}Bclk0+sWvNsQK69PXcR?z zJ7T||*~^zH{pceqSQ5MMJaUBX3kwu}l0|;oZDc<21jo;uLH*ccl;3j?!nJD=?%YZE zjyqWX?6WKegE)J883h{7pXX9{H=@~Dt^#S_|2|Y!;_UCoC=gI}IDrQczVHI|-}naJ!b0S?+(Po9hp7Jk_etBbg}%4n z#+;qaig(^2Tv0*y#~(8bRJ{5s>Kkw5^v{3JJiu4K%9a;jWVEFPqs7Abs#WZI;|&hI z@(Mv9`p`ox`^GouI(-_e!NAWLp7&v^Gt6nd42M&;V(@jkL>tDD5=?{KD z-Oql;#KD7jyj~V=x`~os{DQVO-T ztInL^*he2B^LV%d)V%*bQ#KoZy&hv$7Rx{Wm`HIk(`U~z2^75fCc4KS>vc#+-@drxrI&p_AxO$%gAW|JaUAf*Na%8z+GKUWaCDh#2w=5SrR#;jV+ z>T~B<)M_y`H!}ffUwxH1jRto|2PVM&)vuzv?KY-Pox%xZzy3OTPdvfsKmLIykzn!j zpC{uhU!m_`{{moe#R^vc^Plv-{yMQ_lF(z1(eV1~OtrTYG?|#IuV?+yql`M8%nS?= z`Rr#Y`QZ{lQ)eA46z4>PPj~>P0@i4PCR62)6>~~{5bx!G)9`6iQI4lO&@$f=ACyES+j=3?YASm z=_aZkcmRD{8v&Dv>GE0uhk z+qaKv77Ie7aS6=%@sAN!R$}kyzyp*XI)wbrJCSbRPU4O`DEQ_#kyKQ0>iBVD+qYBn z+;jL39ANp(3>84=$`$4Y2ieV1RovXUbC|DOA$Mj5okD?p=T16*{cG0S?UVu@w;O#| z7Yzmj#ejEo6t7Z=_QZ*$iYlj*)2C09-P}wapo~W8>g%KU+BK@9QG_!y#A<8tzx5W? zZZ{dxD3O8!W`FY=miv6<0(!lkU|%1rJRWp@KOv0<^T!`kovMI}#bW5&+E|vNr1UQ= z(0AnutLNvb1bmB&j2}6|jf;zv0>YsoK5A(pP6jVhOmj983#P7Xt_y+*CujSetP zPBPcm$2zy0BEU8`$JEJ_Y>UMx2d3NF=sb3eo19Kc0|7jjE^+zrVODf^vkF*jZKdnT z5pMN(sP+2^96rqHix*ixFu+QIP^P>9L?el)3ocCOXR@bTlUPE~zn$6{Rj@I$n7b2I|la2U_kt0*>YqUiK#@_~$a z98n~KCgtk@#BaC(>2(0-y8RniJOy+MQ$;ul!BWD7G!{pkNFb635sTv_g#sc1kPsu8 zkfKS-SS!-9%_d<-bU6=H-o{OtE743P_)OuQ+|>958nnBZGK?Ueb@1}e|Di-&Psh2{jg2lv=G7^F?@tA~!FrTC_1GzGZ-8qXjkVib3i$D~_w8v^pJ;po9J_M~YFV zDG8W{NG7BNgmpxeLR3i$mCKaqWnvuh01=;wsK862EDK?FCed(+xuIdgtFw_RqKG|H zM6PwRr!hgH(m@~?L6uR+h;ImCi4TDwOxhI}rKjgu7gLfJir~%AqCC>V4u_k@uo%Oo z%NW}Z!G*(^FP$bJQ3eOAv=O9%7S=?orI zCXxQ`b=JSzOy-FTT(w!~&2cjnHDK6e!E}odz0QYpYLSswKcF}k=X}pF;=Dpue(fG| zKevV4`)?<6O#_DEe&&YtR6Ox8xx3e48ym!Z>NHsF7===7)yr7<$bH1j2F4E`qW$Dq zmhIj`Zc`P#r%uxM=KIKUw5)#oJ`BTpTs`B6!wKf3A{xK*45*cK{o?~h#s|<9=*Y>< zA`tU(^5cI}R8xsUmxaMNhpDFraWaHI8bi8aC4v$iX{9>cS37Z946Oh2FDSfaGnyN! zDfrx7RNnqDlWpz9x;l|Yf}ET0|5U15?ps_{6&1pan`=&QdW-ri4l%Vol=3VF5fANaN;v1dm(ef}cX z(sPh(+lst6i&!MeSV%-@MH7J{9dl6&N6((XU9}oX)oMnj=Qw_~9mmR*$m?qHIz7zT zyO^nP5m}#0Q0QO>Vanr|S&`>Q8uQ_dr}Ik3Khft7F(Vse)@GuAa+(9_W~}w4T%K|= z7L4&H&oHj76O{CyA>^uJ zYQmMww|0@1j6$XY-CZ|w-rIqrU=n$W2Qol!2{Du@#Z_HQLarn*6T&5GBp|OtDAq81 z!H528kc74lk>7_@m|)HrBq*sPAyAPfa^rN1@VGNUqC+8$5sOEOiwY2kHAI6BA|W@6 z!Ca&n#YDq4;vNfOK?z}rmSn(1SzdyS+-wrbG<5MGH`ECkca0#+NGHpgNxmsbsXBxv zS3)qRL^_^BXefX(E+V8z!&KM6e3}A9sgB&oZzm}TkbQQ9)lM-QZy38wh%6dJArLaB z)Y16lv#i;)8H3>}0(+b<=ReM44G*(kTg`o%%{-EMH`_9sSQX7-uS3mU!bUb#--tvY zMl6J6Qbb%VMlJ{;jwcZ$l8B^Ik|H5ufdGjB1OkW(ml6p@Trb4AZr1^v>-KMI#_@4{ zJw40=@h6{L;`5)MCz`4}$iMSWq=yfGs>w15pK7MS5)D@lP{0y>j-CG%2L2?-o6G;w zthtj(a%?uVsS1E_D(gBobx%PeLELVqiWKz?ptM*hCZ#PCkF%)PQxlCY>3RT3i-lDw z03r<#JDoJfVklXn3bM}5vfASzGj(jZe3|O0DY8h-Lho1;9{ zFH3JPY0b^l138fhZoQtO?|cW@AO1k$l`CigT{4NoW}`OMF9FbHv2aUjEYcGRym~z= zBN3FTDuM2!M`?1oPyrc<1d}IDu-xe+BUQEFG8$R#a-m7Jd%@|X(qtk(Rh?iP9!AyI zM-fZ3KOv`+JhS;zZ396#OkA(0A(>qI8-V%LsZVtrq@fTAy`EL6anq!#u&UbIDFk%E zAnu6?%2LlkoC+#@qN$Sx3<(7Io`0Tg9uLBE=QwxrB=L_wM*Q~MTswRi>4pu&FJC4; zF@XtWvjhQ8aWP_x1?A)UxHT7#$s@_Txo|; z^q>YVUcHJ`BqG+{ju41fRFGak!62hE zGiYwUnefSz$V?^zVlf$a+`;0(gJgL;OBFXtCDMrrvdw1vfdG!;V$w_|q+MN0S`zEm zV{B||o;z~;+e*Qdi zmUNxWsi3Mj^=@nb_BSH+^(-td5_|k{>VEb!I!~U&>+xU#%qkTXcicfVk-&8B9G3Zc zrhvr553}q?KVng%A-ruH^S9iB&*`M%)mJG_y=Nwy4fz+oz+6@q8QZqu+r69G-~Eo3 zH{WF5VnG4~AAXqZn{UQ8F@bGr3j3u?7=eY`Ze!zHZ_#u7IA*Vx>_7jRP&A5ed>j!= zG*KsKW?1falLz>PLgvh71aH1cE--WL8o`PR#Q*vi)qrF9ax}mHJ>%c|9_4^YB*K}U zji{xCe7_%?(TIHaZUSe{pqrgVAQq#%{dPKDe34?O6A`djP=K|sk9?yM5g^&NjkwK* zsG|c3AYQYE!S;3(9UV(FUD?@8&drfFFn|g$2n6`j(}}gTkd{mm%gI5xWefA~y@$kZ z$B~xCtVqP%E3Z%i7>0)#0p|bvzuD<L#UYW9$j)Z;kw@Ub z0lZ^lM2m_T|JAR^W{I9GP*Otp{CTwTI6ffnp@*;>I6#KgN<=P4ednDtKl2QQ@i<{1 zP+g7t>Q!=WHj+Tv9e3dB=|MI!vIL^<+)2;h|Bmoizao72FlLj9jwhbr=J|PYhK9Is z@+4VKCp9kDr}{BrmZ%oRKx}al>C6l@fF=-NcK?2ab~|fQ*JgOV1PulnQ|qKQ6k_t? zMOLSdm0mBi1_N7CYqKUE$EDY^EE**zRYf><_%J1IH~Bz%EJo{*Bh>sKt(oZTEGmzO zWvTVo)7lCtjk0vW+1H1AXo#j%n-q3Cp80v!q|S$fK`e`lG^O@ZF<`Y=*p}MI(x#`8 z@7Y7hY$p3Jf1#Eoy2zpZ`>A$1sbPsy&#KpxYcx^^sJ&j$>ruO0)B~CEIL710(YW2z zr23jL8WFhNtoURvb2^d5Vk}GT0qSrVfyeWyR*%%-z&ba_@=x~UP>874OJ(YOI$*X~ zXiS}#r>ZI|QumVqHj9PqRKGs)6LkN_ukfet^NALoGqopvl1O4n{r(f$Q?EjSd+Sy> zbA}~}YluAd7z;8P39}iCN`>V4=Si!qyzUfUw|@&ulA64NC0|$yNCZL<2@yyn2!t|% z0x51JWW>{m5=7`QGyct=koNoIbnib&G$##f`wRtbW^#i$=N_K zmp9USWrBb|L1m$x-~M(tNB`N4N|%d$u8VJdvx-nMOeh#eXddGJU3K)&_CtCFilCB5 zw3&$IR@5>D$q^YV<+oE`z7@^Zl>`b4NN&D^&5wT#!~!hSo#f0wwym6|RiCBHWcTU!RDh;7U13QZs$+$oCRq%QcpiGe0>>aiw(C= zOj(J6fBb$ki%tgv-Z%-#B;S89A9-#%tz%{gOmWYSG&b!i;!>|2MbOLETod=*y^`i( zHxa=+4{gX`^ZFu=Ob-!HxL6}h^5E8WTs92h7lcW4Pw?cjb?6;NN&+JGh>Lk_(?-$^ z*C=y{u$Yr%7B}LLg2~}wej2uf){=flqh3-^VOLIvm?ZWG5UH9^iwh0}?Bpcjiyg#Lw} zQg3(R4=2zsTft4g{}aj_1>L{?5s80(K$9CIo))8)_#^*!0t6-+D7sZGB`< zdXdUROd+7|(XY_@${$%jIE;E|fJ+~LK%QKM{rmsJ@}QIUg9lM>-NLdvK1-k7$y7%h zo01}?PM#)Gk;8#!zs1IB8yV3gQ-u{2EU)I!p?%nAt<I8m864T5CQI($DRSCRlJ|xy8^MCE(28RIt zX;|O@03ZNKL_t)oFM&}gfm>E`-rY?gKZ-;uW{r9s_OO&hRyKJ`8Cs8kKuE=6dL~M3 z6wzESmFj%#sw!e)1wK>(a3}==Eu}n-?+i@am%W&o8A`nWrsy~ISE=i;?i6`pB zG<<}tH68?oPI5$?%PjYAWoTEiomBNBo3k#yGfG=v1W@Hn;#`lBt;`sVp>*& zyIPDu8b=e(ry*+#F^ij`NiT^xC|v(J&R?;iiewY@$JiUmBf}-asTGinI{9JUCQ1Zi zI>rYfC&Ko^bnYoG;Mmm(q)7#9GHrb0(J~GkxlAZci&i+oZ@#gHmUG>>6){$?fG0L( zFupL)q&-YdnwR}AH}c`3WB4Kxh|cr;*HnbPGZ+{1(d7Ag>!nRd!+tuQ0z5JY-@3J! zsuCT?d*=}eMBJ>Fu%{uP{^~~3o> zkhN(YB1r~T=Lk{xB7R{8H)!s{nyAJe%qPv2L9KN z^O-#ge(}OOF7xN3EhZitinMNTHFd1>M?0>#Z zXA;hv$H;wTD|LH6i&7*&>l|crQpK*q`$#7n!I+7W-@c9OVh0kPfc?+D#L5pQ;m|0- z0u7n9<%m!bMTQ?CX+kLip%kQ21Y!{qf#B1aWe zm%fDh8{eSd!3RnE>}MG}ae`s1mEb-1(Dg>dzR#W==>!|O#3qx}=*TP{U z&pd-}<3{2(8`H@o6I-{^@V)QhY-zz9iI9BuSyaoH6X@;52n;qgvF67=Ce+e`FA||Q zHy1%;BWjb0ATW@T!HVDhmPAVn@n{r7em=qF%SktzNdPkv38C%V$+1{S#$rqXrrKKa zQ+)jnnT*)BZDcMiAdJOu1D4uaa_n|wEKx_zmzPrz2p~;SOAV$#sEkygXuhI?Jf9C` zB0(HjP^-z&Xi)il#95;8D*5hrNe&Mq?dU)NxP(G1J9Z#)I7mbyjOFH1xMBr4CKE}( zArcYZv4b3&4M8-D6_}{4rNnMWnhG#amz0nfjUtUk@d57DtH~CNk$Am?fXUKQG9nQ) zu^3@sT%|&llY{ybEuXS7RHdb)rD(m(>FId0vng3zB*BvQK&ZBsEW3S4hb1F}_~y-M zW@eW90C=`;rP%LB9t;u&47If^rp9gzFx_wi#XcVdgUo9*M5?Pye&2M_oKlF5u|xMb_KP z@=$0=Kf`QB+|~7|o`%ZrXXM~PHh4Vb0Aiz&e;znMlU|P|6%34|f`htL5X9#35S^c= zI&~}s7Dq=ZPl1Nw)Lf`ceU<_vqob@$eUuZ5O4;^B)!$E!` zK^|c2>Y~CRElt60p07blg|>>TClQ`L|GZZx;ly;eUzf6Ceku8SbXIbGExCm-}?0w z{l|Y$x@QmaUAu^6WidZIO!kK#QsZ)w1-NEr;J*9t9z2Nh``@QH)wbkacQN+kA0xC_ zklcMYiaYPb_3EqmQ}2c^75rV7dbSd)6yYg6+!D;C4p)y29%04<=fSm-@|oK1lM z*{Q7liRNZj`u!B7p7GeZbCivYPy}eBQ92JDqRwWcGLcvsyPh7jMkC8pW9c3ogw|FX zQs?K|+E^SOW^*`9HXxp!#yv2=*3`4nc)b{#o7tI6lE;!Z&DjG7*kCYF2xNIYTx)6J zCYE%NN`Zlq5pn_ns)NBL!T3Z1{rETyskxh$n$tC(fUxm6CcU1zR4`ouTp1l@T?%B7 zr-1v46zD7mMy_0;^WZ^l_W8&I7|e zG>eOzJ8*z4J|7jSxo^IFnIfBw`c&Vo9UUlodX_+QVD!uxq*GI@O93W~j#8NVt_p|* zgSZL`$XHldss^jCr!6xRozsZ`7|hK@CY7QKg#ZXHUyehqCO-wX1@iLnrS=&q;Fd@* zmY0+5av@Kx&*s`%vh8-#fT&c8ciT233k#@XF@nH+Z7ngoovaklJy~9kJQze5kCOoW z>(=21vQz7^yP^W4&qqNbfe4sYtC`bkDfjsh0+Gr}777c=O3^F|GBa7+uz`rdKoXd# zt|pS7Prl8D42WvAh`#tmoK`F1lP8zfW58cq3wArYR8ZJjT#O_ZBP$vu2~4EkkK)wz z-qKQBkqEi57{U~A?8(ig(Cb|qyRtI8rKPAW7R0H2W-L3K!o@{IK&ZT&$&wP(77H@K zk&%IA^JXLl1G3awApYGOM zr0dtydGH{9pAY#Den7#?FOzlu{V2ck6*8WF8ujYc*B!#^_HSc?|MMf{|73y+Q)!|C z0g`x-U>1OE4t}j=AlayqV}OCtdX<0T!$IxJ4dFXgpP;5LHu+( z?dLnG+_R0&nN|d{AtJsgWi@*_>oM{1{7GC<6?Fx-63c1e+zcqPH z#N_;Z-@Axa_1wAZc?uHM#LYhZ6K=%u0vu)^MUEu%PrO0(2@mO(B6jcH3(+`%;dY*^ zU&FoCwPYnd*vC7$wNb)`Vhxf45fRTY&)i$X_NqKI%S9}D=Xma^GCqG#6V+?v#D$aG zyhlV+xq{Uj^BJA%3BeY~4e;sh5nwY3|fE^5l-Mu{bBebzutUVjTC1Cem(Q!L;)VvSf^;LCxLu&ogSV zk|`CV9uM=)wLf5b-V5S5>e&fy%dTQB79rsBlV+dhzU&-gPABoabOh!Ro~quAVbp+7 zsw2l0XO~EWEGfm{4U-noQsI%YD|a~yaX*T_M{!$t#+o9>x$ zlnNP}r#uvoC5cM&IinO3sH^6&n?BF%#2j9)h&8$mJej)#_q&%V7A5e-BKX7-jIaEf z6@$YB-oHpA#>gd$s~!) z418)8vi3;|lUmH;ASI9AMcw_oc=yl0WJczo_PMW6zHKY!<_l;?CQ*x}Oe@l<*szOa zdpA-+2%T6>)~)xWDO^UOJBsS$8MGlEnxvBUQ!UhrGN_lPqd<(!5oY0JGm^uH(ew`! z*OlUO>IwMt*kb|GZ(NV1zKBR#AyzB=$NK-oFy>=+ER52VK~7Z5K#mO0=l0;s$Y+Hk zoxP>&84q|!OUk&xEu%)5fg$E0Gbv_!qKMrE+ZZxA2!&&mxMSR+S;f4;fg>OUvzxD# zuVcY$BT9lix0|PGD=|$CA`+=d_dD4piIXm{GZC<$@{8Fk&!buik)$1!U(MZ$z2vz3 zWGdWfV=C5ac2Tap5&fYHghUwxS2c0t*PbCOCT6=LhYE{|TXZ|wmA4b`U>|FOGQM7Q zBfg{aJyMqDmEFyu7B9o8@s`p}Eup>yQ z$TdY-9#!ItS&%10s7wOB-*i8LfEAxmOm?V&O|l(~4UgjYTd+yB6g~Ar;y3NVRHI?4 zqJg4^zE0(~yRnILaF?v(&L6)@`Y6nN@g&9P<&+C+nAtzg_zy2LbJR@Tn%mf#tmnRk zG;WJZ_(D@H^|fL~t;fl7>se2Nbw$}+8#~9At*iM=X(=U6CyQAwsv8qLep5cxC7@d_ zVj;uBeV@^?x-yTb&PL{{1Ups;S*J;oNVnolck;rQtJu9vi?%9GSmxy0&z5lCo_e;d z$-*abvh4;j>vAJ(*igpc=q2ucsFFLE=Mr%maa%^%QzGHZtBNR1k04Ae5H;xedcg`B zt~!bR=Lh5+aZ)~4K!$P?-pNHIQ3(o>5^cqL0$MdK))CHjU7*5M&zDv_Ou|>m(PJ05 zQB%hAYqy~Z_^=raJh)NDL+doG%MVdm;^&5HCwtavX{gC$wCfVze!7f@ZmFUsPr}07 z7`s0s=i$#6v2j}w zEj)rq(S?4l8C6*}Zy5UNUGJxBj}Y6I2onuKe2)egs5D|WUSamaZ>Vp)g0f&90Wz%9 z7S25WIJ-JW$>}!I`oU@H-BFr6GQ>g&q0RN^RyL3bBoK?z5K9Dz5g^z`{(t_~ z|HtRLZrANPfOFmc-ApKvAl7J*Xfy~!A`((5)(<`)ZFUyl$Otx-ifpwS$GLO(GcuSE z2#8Eg5i}Su1p;KeUo(-i+bUAxyy_!h7$f_=zVN`2FvhPi3~N zZ@Z20g9lj%g>c_-2U}iwh33~@!wOtbD7f`s|DyBVcbT=@vEF+x+unJH@qqz`CMJ+S z`z-6;cmsz>L~Bb6GuyXw(|hmHH8#fh)D+6+pJ(}-Z!(uma^?JaW_Rsk+rE87SFK|B z#0lE9S~eX!MnJ7*rnQw;K=bm;nB#F`Gc(NQ=F)WR7{QDTY^|+K0l9zq3sVXOg5F+C zz~aLXlU`WJ?CH}Cj*Jix3Q0WuH0h5$#y>v(7|GptQ~k?dQv03n&^t85)$wr>Pe0B2 zci+XWP;lk+X|8SF%x&+#PkhxX`deB^JozN~FTF&lq=e41XEEP!16vLsMtt+lTzv06 zt|%1jJboPMjvbgyCQMaTWWD?{g?hR`3gOkFVk%{llPn7Q2fj@ zEDD7T8jWaw|9dK*f1a~#Z5Ze0$^FxxsQT5f7&n>d85qF*$Rq6f=p(MSw-X#6XFw=K z_v>H7z4wxK&pkx%xrZ&k_yzIRt4ZwGf%uDGr1qQNB=GZ}BTFQR0P`{#dC4S_WRf`0 z7m2VUk@z&bVKyEoCmu(c(!N-bNcey3y=RnM)s^@CtDL*Kt2*bLyA@ikEP+G@3z35e z1`Nh&2F93S#*ghWHrNImhw*?h!Pq1L14y9Il2BGl>Xy{8I;ZMbRb5@(m2fCVdzPI*1wf|@De~ws;I*~vGjK<^W<8d;DWlHTOmI>mslKn1; z1i4H`W;~7va0>$SkqG62fH=95JMG6mCPffXo6Q7)$Q^g!v|33I28prE9iwP$B*Sbb z0rW|wWIpl;imon1f`GH826KHqxs#KKfjOxZ`6G`Y>*_)+2+WDals*4Ek^=`wPb3fn zPRa5rjx0ey1b793sc4kiWPcD?ibN<(wj&}DO9}-=iNtb-KvGu?NnOQ($!L_^L;_V3 z;IPT%WC9vNKmbh9DA|bwX-VB$1c7)gMs`wn3sNZ(iG=i|?ktG}&RC3+WWN^}k3=X> z29UjCF%G$${CNBeU5+RetP%v$1OW|@`|PtUwzpIH&O1~%ohW*HG0o4@{H4_@p5|tx zA`zLNeTF6(%)WH#5{bY4jq%;P5mi=_URQ@)qhWMzj`@KBMx|2n{`g1qm6ZUT`{#cq z@E`xd?0^0zVW*SIGcZAQB1EZ+??RcQ<-Lz%LT9c;k)8yk1hgUc!LvM?XR>m6AI; ziX{204n!hUCC4R*L@X#25)N8A)AOBN61uGM!>z zCLSjmi&32Hk4U8~ip3a{&$f5%T1wt|2Vunu#5dlE_J=>D@UFXvuV0V&mRnFf`Y5LH zaT4R>%m67by+qk#k8$L{0VZ57D);Us@2RKg?C+;X)RNJ<3_-}v1oRPtb{rib*+JxC`Mp(HLN3dA%mzANo=_VY5gM^2MP&79q-M*cP)>Z_o6?J(z zttJx*kB7wYFjAut-5qyug%Os)_RbqD|qe1Nm>)oH{X#Q6J-{Pfv2bHR$=hm~owU-TfSFxk)9%SJvGUY3&lds^$@}1mJcn$hc7EQ`JwrQ)mJbyL8 zh=F=}Gj|qVk5Nd$mr#Wg?!3|Bf5lv)b8gZiZ<*~E=W>T6h5Pe;KkFJOZj!18GG+TvRiwol1Z?S&rp2pEtp14EI6%W13^G4CRW89FI$F&X3NTX^TrV;Kc-OPsE3M{q|hJcLQ@>jA^pN}3L!@X17 zTwco^#g$0IkgL$MLXdEMP7dY9Y%=94sx)eD&Cex05l17>WQ8n^o%y8{L?Rd!M(WtY z2E}@=%3FsnprBr}j_TB}QChtjsWuJcwhdH1cpJ)sbo!1SLOU=(PE5&`)z@)+{0t|j z|B7DkqQa0#dPY8nhE5Tb&XS{sCC3z_7xQc_{hfBkJp!x|cNn`sc5*j01|(vT6;g$Ucq@1n}M5_Lri=Ume?eD6kTZ@Gnx zk}R?}YY@8S*V|+$Y9xj?Azs7AH@fz|?vP z=h1f3_Z=nPxgUFukMEs(0qY7kZiAi0i6Ppo{Y+MC8PF^-F+D`w9p=*%DbB1KhG(aF zW8b@+P044WqLv|xnPYno&?PZqN-JhyXbG*)$xElkSuDAn-a$Xo@DhJIImAe!oYRA0 z&UJRMyT!zL-zqLyA}FO^-aj^uDQhilZV5ORIodT!rzoGXfP@o07x>6_oVM&aoFxfH z&YxoOx9@VZB|<|q&Q#AR9)*s{KfH{h^%!%9_n}|Cf`yy}KO6fq^W|P*#spDk8ZWl@ zA#B`00590wy!Pn;GZfNej&l0QMc)3?DGs#c)7zFH7MSPlcg(bR7jycIz{JQ1=g-g3 zF;v5`a{_H=M`$@=W6)~EEvaF2WRZ~xJ7;FfaLZ~K7+mDY;Y-YDs}M@+xzs()rGXwy zS~aoeT5Kc;`FiLrm?vIqN0c%}-|-Wal$a?hi?gCKkFK}737r^ayC_ClIK)}cFtxX+ zs4k9BUZmh}$6A?djN-msi)CGev%v{^eY1F1g3k~k!xyC*J2mxT;wlf(Kq>>r#*v(C zqsAvgfeN22L5eN~RYHm*MUCXjW-@AOkR;TIgA$|wQqkYhnScC<=>KKj^_6@jUjaB@ z$^R8{?3Gv0XJw&IN%=qeTE6>Tnm_)SJRl#KJ#m79W5*~3vH}4{OeQv(Oq2!!lmorT zj*z6J}fW3 z$oAw4;8c-_`R;D2&zzwUu=Vs1n4P6?&mM{a>$!96dFC1FPn@6v2u@8g?Q~MUcQ2L6 zEQGd8m&p3~W6Fa;d}cGlPA9HspQS31fIxtS{Cs?`zDl0Yw_L7g-8yvR*03ZNKL_t)V zYmnS~FP8;_*i0rAx86#)qXYT#&r=LodVA^Y?M3?g-%|y+XJ#02IuV|Imhwo1g^L&I zG@D8LtLjg3SmCmDU<0m84p&SXaih8u2RzO0PXEiL%A zZe{Jz5CNHt@e?QLFDzv1{{3_h596MhA$a-aM4x^db$vaPr%o|fTuj4>6DV)GiSd2= z7zl?cd+RNN6%|aiwh}BW!}aK+l>XblF}!ad3$Ym4@4Q3)Z+^qn(W6Y+?F7F5bxMEs zGkQP$6n`{I*NPQ1KmR;aMkAl>*+XdOPLz*4LfVcUT-d!EGa&!j&sh71KXCZzrFQ$9X2W;qoiulM zvp74;RA(mxb#-k0_+#8kC6?}Pd^g;H;@7_>Ad@lM)5Bat15Fn$AZl*Lv}X?kIvuM% z{+OkL0z4KA3x$Pvo_K=1`|qc7&mJtPsg&>COUC!VPxqlijJsT@e*9xZ4?RT4>7;XV zlD2LzsO$dNM=n4z>v|%#>0ovWMwh_*=I-`4$Q!+WY$M%EJmWT65aOgh{R&@ZoHA4 zAN`2pAN>ezY3UbsDE7^7QZ+L}SrR;1OoA-FyYHs_;fERR=s?@ohXQbAXCo~rAlu>i zV&#ng#v7R}EM(xwk>!B>8*fnZ_~TqSZ~%+nPx_z!MD<_)O3(4*Ojs;9zV4>c>Hm49)6gfJ$ndgwah*I zFx9{PEu*JS;c_~WJoOZzZ-1MF%Z1HsW@`O<*6rR+*NGFvT`n%=6lzZ#mo9$>R7p{RRV9c6D*d?`Lp+p0Gu0s-`~&Dv13d>_#mNAKgAymQt-e7=o=f+G&W)=EF=<*GWp3T%h_fb8DxF^>%>DL zBFB!g_~x7V!eK_OR?^1D3HJ74ot`G~`s>sHL!W-ipwmg}-n}#eUXzKVZEeI}d4&~# zYI2fZr<18?pJhWlPT>4`F3ip0{qRH9hC(POCRmV48GikB8Yd?y@cS9FSh(0tCfby!V=zRTk>RVgcX0b5U-cIb6 zTaX<;&RU-jLsu7l0|U%D9B92>(wm#fdhkJ}4je!+K2BUF!&6&J>vPXh;`1$o8Ee)c zvRKHSm>?w*!JeMZ;Jfd#W@!o4)D-8>oMEn~ht;E_l!iiBXJ**@lb_HuHb!mIhYxjh zu*qzuJP=^~)mM4{4}V~@#X>a@>F?+GM<20idYURAcKkRtiG(JTi8>&4W`_5keU=?S z4NzjWvKWn0dF~tyfN^q?H-Gs{Hd`z-0$COdy>Gom-p~+DfPQe0<8Qr1gVoAfAY*P0 zx5bUriRjlK&YI zk_f%0Q{bk(d-KtwFyk*DJxmr&5R zNIbB_L~5MO>nn(q1_nVlIHp4sjC20%0vJ~i7v~VNhnOC5A=j*|Lc#GdA$%1F`aO8Zmff~f)ueNo1Nr(c6l zo=r@oB;oVZD=H+Inua8x;^h7|9J$Q|6uBrhI?OZUcncZ`WR?@uNN78Gfk@#B{KW7oy5KdIK_)C|O(x64dJm6qMsvD{*=kai$ws%*(-VloH2*IcmXEmcyddOIYOP z)WrjcSLb5Y#ZjfC(DmyNxM^aB3V#5(8eEH3GQ(oDQ7ImYhS?=Q#S#_jgopWr53@>) zZTDYD>$-%_K1x^-X8PUVB21s4ZO_~Ec+C7wet?g2FL2n}hc%GOet#HKX*MUv=aGg= zX|u~XB~j4j@G;S2$292S;BAzr}RH$%QU zm8Z`?!+z;SJ{ma9j>et5)AvKXwfzW13Epe}lwS87)Ado@*%3_Rz1SrZhEu~tYh+v; zIm@Bh7Urt_#PdXS+1pStPfO$-LMyy@17V>vN0_+ z(lcg88xL}ED!?Ue4r6n(On0BBH|*tnOu+8)GdI}JsL0EZA%*dP7{9|wAmrqvcoAoo zo}r#mM$J}E#e;Zr(wQBcA}vMDfrV)jn^&=apbKr&I`-!2v0b&1L8*+VrYmOIE;T}%Jz zqYw=st*J*+T8c5hfUY-pL+eE(@i6kOo2k5W2Wi_jvs7TJ|Hji46 z6I=3={lG(1-g*^6O*S;GVExXUz!ApVdJ46338z#?<_$ZLWEyCB?iV;u9>o<3k^S9o zQFHrU|haIKsJsJy=x%x^lu~J++JPj=zBI9)a0)M#ck~?6-@VDX+kr zRfI;!V{iXB^Xu0#nw5dNvYZbCQ;b$-L1qaeUzCNAz^DENJn5+no5mQk+Bg|mB9N@g9QJ8sG5A~C1%fpd3@*&DVCv+<0W*CfBLm$tl&30q{oEx^I26o; z;^e4A{N~+P=*iX4GjBue3(!5@Mq6}*!GH$>YC6U~WFUH&KHo)@2?fzJlg$3>PoTS< zj!6^x`Yhtzt*naqk$V?7JJ`#MbMFwlHi$z#N5C(kWqgRhx>V-Ut(>1ag=Jv|-x@t; zos&dHI&YtOm!(FCRYmEupX0dcEnFqTNXuP_0%I7oRlGR7kLPTE;e@A;&rY7@qGOs? z#S%wi^Tea2_@`9-+3uuYF2Ok+M&VNNhXX^H5@`(e%`i1R#a^F>F;y0QV+l%iCA`w# zi?ynfi)JTjx?Jwt`%Pju!3VVA8#A-;$CsFIdmGo;)5zlqhJX5VO6F(qU1%j%kk0JL zMKYGG=*4Q>;TS?xphPZ58VC}M1j#|5G~z@oxcEi;8K%CLNvPV0KOQEy=%Q`jiqKF; zT%$)C6OpFRqbEO|C2bo1XoAUE8{yhDc+)dbhQvfC{Alu5IEON&=Tsan)z?XDNgFUi8o7_ zQ%1SaYQ~qpmOyb02^kC=Ze_}yN38gA1VuJ>O9=Y}NTin$@u$((HN%8OPE59uxFnac zNi#jB2um~&*B0TOcj67DAn2=z#njkrF-AvS_;oeJ4Ov8k3D#7qG5fNJs8W%|BG{*g z(9{_4rHRqYJjmxS;n7?oEp379pon@&DH_Ql85wfKkxU}CEE2;`^p+*^q;h08Hsi_n zQC(k5#2q6n6mo$$6FFL<5-oMo8mi)@cqLL~@(kAN>yXWRNzay}P-J7iAm{4qzR5>_ z+k-@=VLnAl?&A-Tee;bhQ!dat<#@oTR!v2PzXrIMnirhnMR*V9ARi4#azE+;mf40x!LE9r-m zK^9rk#`*Pn3Ka@e;V=TrwdadiF4ZFjY%G_+$w;<+@i?-90n(Dk@F#=6S;=-h7Q;O_ z_(gdu0FlW=AxRFLqCKKC|pHl(n@Gz?!4$=|{ z48ZuAGt|z^keeLq@bEB|9UWhk^%_5U66Kyflm&z20JgzFDq}Hp$uUnYE;4uM5Sv-9 z%bx~}3IfKqHcBQY&;puR4A;N_YrnM3tjYAnK6=16F+qdhPinF~e(oIQ6B8Jd;< zfdhozeV4|eq2+tNv_x#p8bYT}GyUD~((}qITzd6YHja#t#WF|3NBj4qYi%XfQiRjgF!i8p00emjZ&7WrkORzHEHE@gaeF&?fPG*9r9wgG`|pzv#1Ka+1ZV?TNnUv@U}BS+B1Vl2$fk$uG#c#j-G3YZlNv<(fo_Uu6y zi!qW&KvovP0|$`%{W#=uwCmSnd-F}C)6-a3E@wFN?z^N|tt`dkIMUM*+S}30&JqHo zYuDmFe;)C!d<;(~yrvXZIa{06bd zgB-9K4A>+RG9nQIz$t|SL?Sw#ewx&)uSW6Ylk|AKl#h<0Ova=lTeqUwzWx8xRt0|d zJ5rJ*n`YH&+`s%KIZr-G=kep5d*KDv{nI~T8y?1PwITxAA`x_f00PS;4u$M&VipUj zy}jsxQIiQ(VIk6%7WC05vD{ov?cYyEPY+tJm#|n&Bqs;q&>>PB4*Y^ZBs-hv!Gjol zKB7`7vQ3*6-pROZ5Ar032db-6GL z0@}+jXZpSOFor@zDk_M0y%^ftNde{s0l!*J_=zW|35W3r0*Q?q2_85=-hl&D011nQ zw*C9rYPVAgFgVDfLP7dRA5k8QA)TGYsnH<*)1Q_J;GCn07YRWiP+QCJ!GmO3EW{%btl8PPtX9-LJ;()tczrz!b8|#n zTF8h-x!BTz>z#Ml6b_RGM7q2A>%M(RUU`LuS6(4)`*x;(`AgQD%@hK3cJk(@pQ8Nm zLpH}^6axOXHdN!|Gy_G^C=)|N)UnLNk_pR;7g#REm=X@-85yB2=_AqryU9d7d|{vG zMn5ru@7oM3JDw1t2Fp%^^pL5>$SuRlZlL^ACmx6EOW1Y&ZXx`o+~~1A4^(L zfW+g$kZfC%@4266cqPw~o7_KOG?Mc0!>F^f|H1COy>lm$-~A5dfB!clot+fjcH37I z$FJmnM&e&i$4O#3$?VzBSBgf(;Fd&)i@_sS;FHU#T(yRbs!DWCH3(&yXuozDL(Tap zzHud%tP~20H*Pns-y&B?ujA)ie@J?wln+{asMcT2zi<8~ zZg-5gCMVcGz(RP5s{DEW`ClqId13^AC`MMgjbA-e%V(zsiO9tW!X(?*Du`s>qYHlmNlF`$h1jfb@r)9wP8@TVkf62^X z5Nmb~b&q|Y(w$c_=I%i{KgTty)vVDr(mT0?NFJm#G0j7l)zURGOd#PQ)jq(FZ(qf1 zG=j}BPnpKbpMP;Bf;578e3+E@3_tz)2Bs|zY_SkhubCV3l*IAjc6e!UOKEg_xc91N zrY6luEpzOuU5(KjA+b13=HfK<{s`AstY>tvkF=Wk7NP9uKRb}H|>9h*E2Z_{S3`QwY2UGrR+?k0TQRw}k#hyVS3)Zil|6=9#6 zU`=`|##orNY(2YYd+51a%!T>@-aG^2V_v4RE3u~)A{Z*T)HQ-#oy}r>GokcCCMIo6 zMN{zS)e}rD!n5Szl4T6%W$W=Ma*5eO6qcoOGQ&?aQ-gTX!DnaxigcTpnQ}J)l@HfB z6Vhx8&YT4nBx3xbbYkLkVwqBuGCh8q9%;ykq^1I|#*HkH!0B=jtk&X|EFzNYsL>jk z7WEKPx-o=g6pagPmZ``Mh%kyWQDjuGcxjkTeP(jQ0p@&G(w?ZGrTi#M1rFSLFK?ed zMB2{vEM)o6=4WweZ!5m7S7Oh~Mj};{8ke$rNg!w}AeO4(?3s4_`a)(3iqYm77@6t9 zmLn$ESOaM)7UqT-OO0bI$|sVM$((hHlHzQ-GNss53S4dYZUmZb0})8qyNA$Y=8QQ{+B;QP6E0wQ0Na4oUq`Mr&6|NGnN-#r`qWtRq(U0 zV1x85TnkRhF1rkQZXQyp66=JGp0+Nm;wX;N3TnRb9Rg|@#=;E3_66L7)7bVOLwE54 z1wx2mSdDVa73i`u=zZoH8XOJ`Y6(_Hh?z4zjKBF;25fy~fBOn7nN~*X`eCO6*Y;d| zwIzI9c^X@(pQWr6+PnOy3>%45RTGZENZSw?a&VOvVb^NNFc|O|RV);x;ni!HnX}U~ zI!@%Wdfb^>LjDk)BZEXXloH9wKrD;XHZY23Wi=k72A|5snf)K4+`0irzLA7cO6%Dp zsMlP9E3XW#A&1XC-p@jLG5(5r7Kx#g#}HTNGF+TRA}5!D{#LB9UVLj+EEuBnPqkvz z97eImiX(psUCc}NCk{4^&Xe!+5?91YSyN7+_blbI0Ag{7A#Vgrb(CO51QH@rV)b~% zIn1PliKYld-BE;u7GI&9NJ=X1X)(6N5bDZQG@1zVSPakjI9YXi)Or_0{3POP{y6mx zfh$!wlNfzUX4BAA=X%l_MvakIxvbtA|+a`=DO#8Lu&PP z42;ZB6fkmA_I1d8S{#cJvfVQ3f;#dQdWOc%WAxa`w!67?;})hCril4xxJISsH`lMn zI%vZg^I;UM>}slHWPAjt7*hQXesXIK3m!Ypu#a@<5;xV#xU4CQw(eOn^nU*1u0kAB zL(ImO2q)ZJn=W9KdAVqvA{q)%n(*#W02g%J|qq7}^>hbiQy;^H0ezZeUMm2mJ$4wyyXdqu~UxD=Sgm zzLmBA^gYrq+dxWn9oZ{4pjy2et5SkonF#%d5plMz8~s`|d+uQ$xJJ9}h6PdNnb*}cJ>4u5vCCL4Q#9`NQjje769X(s&`F-O-2*^%GMFR+?2!nDBp@VC z0wL4MjG_QAQCUfPX(zAQwo=WPYGI?*OlfaGYOW@h(z?m3` zZrg^?(?eM_x?JW9nDBbZdFdtctX9&kR=iFpCCT%|0H4dnCXa^#z~FXs`qfvd9~dAX z$P9;RZE4|pkB7o!|73eRSEe(V_Ku^4&4U|SnSBO|Oz_Q%X-d?!w@ zE*>XK5U`#*$I|ZItn&NG0hpa-?&L|XN+ieu(*1ry3ky`8Jxd87pPt5MFpzWjFzJ3j z8eq|8W1+pB+T=aPgLQ^b8 z8ju6ut3e( zv*Zf`X-i8CpFGKm*;z_}48NaCyLXdw?i^)6PCQQ6@#9pR&6I~ir2GB22L_<6jV2&7 z7Gw6Q^YK&r<>e@hFSlRC(@5bEe4*3-jkuXnlM z;h^Wp5!O2#%e*R9E0g(+~_|^!pLnY{blFnrt>Q<8eGEPB64*51T?E zasgpvg!%L5+30dDb4Yo;*cKL8Jvc}qptsrZwYRe(3Giw?9xk@Dupu1A2x#qgFS~p$c{!CY-ypyVxcw?As=vbcO&%lunEYFL~tBD$mF3zY>q~k z!F`(zAsnV4Y0Kh*K+I~T$!aCbYGv~9VLbEmlz2Qy0g)guS6xl9&qq#@b0(g&Yw1ZF zy_D2}Hfakl098qw5li}^&q0P*(r@UK08b*heOl5UiAtmY001BWNkl*Dhiv6Ddi*G`DLPc9V(B zi`jL?ZI{?IUHwhJUaRDK@hkcNUlM-bJvn@@Uk>9#DkY-b5%_iIdTns7dp8jyMiCo zt;P`WkuB4+N?6Oz(p&KC8zR!yLDbLFgh%<|9oJ%y%`rH6fm@q2T-8*K z$|z>HdC6X;QYuLoI^+W?Y%dWU!O2zPAph&@S5S~D;giGvi^cK7 zJag^!T%WH)Ht{aX^B-`3b`dw`)zfSZvso~(tDuo9)cLISYp9o0aC6Z$G{#F2;&Bv} z+tFWfA1fYy7~{4rWL$YY#n zS){H)u2J2~Dp5T_Yd<+Y38nM-+_vgkdWPGP1Z~`&wvB75ucv45BnCl5jlYUJ(pMm| zjUrmIkv^y9J6HXP@z#FSQ9Xl`5$bMw1Z&R(8G{o9Lt#d;lnA%1raRV;P9|ZoFF`}j zEzAX6M51;Kekj*9F&7u3Oi4v+vC%BoanTXLXjFsKMMKa*dRitygATzm&MjrdWaVXI ziN?_ROskX4ei3@D44*hc+JcWq3f5pq1PDnS1Si7WUbGXt-HEe6f>|RW z&=0vjEXC-I;u;zyBjP7Z1kOkdp=k|8Yt}Qge-9~QAHG-sr#D38NIMfP zZST9fqrU^D#G|<^VoB8DBajZM`D~&Z2(I^NxpV9!?qE` zK`90CIv&b<92_E|ssx5WgzHJADZ7Mz*Ailxh(@~~mD|aZD2iCDK;Ape=JFcmuMSpBZO2WLT|CNHm{y>kDG)XQe8`I(BBQt3RE{89 ziuH_7Pa@Xmq7))D2!7@)0|Ya5M1yWJ7Z)hZNZ?M)Ad4&5p4LoYY>@1n7;@wo7fR4{ zs!_KOBa>?wl}o9A>=7nLhal`lRG3H8o!?+C5M|ynLcU+aeR=;xx}==p@jg_c5LCT`k1igkGE&a<+1IfU4=^mVk}A`4 zb)t#Y*_)Y*DG14o)Ftv+7tLW(nNC9LMLImd<(VbSx>SfIF(mdGwp3)`S1LfPK^=3` zBnmR^x1h}^C1b|RHnD{BmO}^{849KqxiN0QRav9EqlIown zz{(w0(?32#$<4P?aP1DX>sM2J<4!Vm+<>^Y5mn;`G!@OHu3t^w%Il~|t)n=g<_aN` z>y0&RDp^UHU&f9^Dz{`7u_9l=)S*98=NjY(>o&74w~(H*Z!#JzLV|@4 zTK~#gV~~f|u0fd^=hX07ZeN+rT}|Z(GB=m{PjGpyj_=)bH4Wu@-uUbTax#4U+ie?I zTdw8orD@!O0Q!0#33ZwG;9G0tM9%CsY*w!wumO7l$(t=P@J}go=aogSXj>OIYm^Z zX&F3oiAQfJ;Ni`=tW1OV_q3CtnBj$=Y-QcLbT0fq?7e4roYmF-`Ajv0 z8YjHxd_Vv9T*vFW^x?VYk!C$>uf3nG``+tbr@OIR^}P1ta@MZO}8=BM}pBwT8h-4<`eCyb=16qtZ!K zvU1XNWhew{qCOEQRXBtqA~6ufB7{XTLa`81UkH&{N-PpaAQaA3;0OeBT+Rn9p~`ut`iS(68yR!EInv*c?xBY$ zd+I5U@7hI=(@E-!FQU8qZub52pG*RwM;|5s$tOAc-FHm7-PrEDlZxN}p8EIR!wMWq zP35O16U|$4SgWfk`tnO63m0OZoyA&QjPBJ}$@$H1u)AFNs;e$iW3~F_&d@VC!o~v z_oY4#G^WSzx5q)kjQG3M7Qg->_;{YAI-l1=BO?@_2StJ4`t>NIQA7g+gaLhOD#45l z@@zK3agtE7Y#E7@lXHM&S{mZ3u0q+}4a`-Q1@FBV&(IKAdi`7v6|oraf(4{bPa}!@ z8HoeB0>CE{VbN&FH5&ij1IG;%oF~iTz-2)^t`XqS$O!Y}v5Lk4-`qH09F4~|H6E)N z;I64b<8qM{4*xs0u{h~>z8Wt2gV=deQ;DUglWDil^$h_;%a)NgIf*Dvc8*hzYN65)r2^(EnTz--7UAEx$QP0cie&K*fA>F z+DK|@qIc_7a)0-`f3G_e-+V*#{`<*4eVUYDkl-VaP;}%7s#U8H2n4w9yN`lMgdeU} zn)ovgFjuiq9{*lPP7bJ4WVl=i0Gm*Vc=2LVr>6c*^v=ZNFJi8zihscZ(x<19#-BZ~ zY#ABxruN}@Zf5^rJO<+9bH0y@tD*v3AV5+uI7gVrbM<`Bo0&KvcplK7^m-YcnW6lA z&cw%{;0L*DkCU#V_;-$`rji%;3Bb&MsvGTqCq6#1_;v6{Kf*LILB{knV!)G^hkwl) zWCH`p0IOKc_<{wfr>9ZH<1(>q8QRH7)N!9CR<1-iFhGXIGS@H2?`Jel#+>&{4^+mV zHyVG|^Hr0?=XrLVG>XNEiIN}8drLg7=jV@=|5;&Sh>tGjvieBueLUN5ogYC0~yn9!U#iV`wF=yp+ z%w1h`6}1fw2v)CVaPMB6G8xHRwxGV}9!`Dn1wNqf_S;$W#TOj-)1PpL!$hBbmW(H! z;NaG+bG^FC%h`DJC||t#Dxp{m!;Lpm{^E-qJ8=Ss(MZ?Il@vYwG&A8a{q60zZ@Gne zFTB9fh6W5K6M3(_M$tnLF=ewc*x8Bv_S(&to1`&03A{Gcpe&i9v|2Oh@yt9+gwrvyygNT8kREq!FYf+b! zT-ZEbu>be%2OvUJ08!@pe~ASm@C6aXM2I6{TEG4V{jNh4=2eg^O+XwKLPSU~0v3sc zH#>GRFwcOq)PP$u&2ZBo)^a(UvU~-D+w1bwZDfGHAf@Px^l?L`5 zIg6_(gTY!q)9Fr*9&TX2(}d*O`S=SHs6TO(o*5V8^Hv})E8|$lX@;C047ySz1y!6n zH^|6@kxvhMktZ*tr@0@EI>c*#93m>7&)&UFj7|*j<=zM$?IQYz2MOZk^W(#ehSNEG z{4D9I0$O9U=+o0UH!w({$j;YYAJHW1qM@f5(J>S1*LJXYVw#}ON+2s2lYSiGU*0Fl z*2A$A`;jj$VZUoTy-D9wxH!u06UQ-!MD(kt(5+N)X6ytCNh)9XI|(jL#K#n^XInU? z194prQ<5=;4Fl}+PNG^}h(Tz?>Gtwz?F9T4DJQ6ycZ^Fbt;8BT8Gdaq-Z%cn@aNk}5i96>_BCcd-^o-n z9B0!o126vp|Mv}ej6rfQS%Nqzgh&`e;0E}qDxtu#Oh3a&WH?RCXOU2bRZEr?4Zr~5sT+d}0 zxeR`PhJ>yu-ns1xYJ+}G?l_D6Xg7bqYdJSo7tq>pl8G&6c%-(RjkRT%ru_8oZ0BCh zGVWb_8x0L@47C`zEAOW~kar7FiHt$R4B3%V?yI_m1wJ2zo-ifUCl`*$~DJJ!QHH(W=VE}yQhA;u20 z@T;1I+)!G<*WY}@Y{vk9y7U%SXi^#N=%W8j6Hiqx;mV>Kv;rXw`|G(REaQ=-tLWT& zh{?WQ97O;n~Y;@vG@lj&N()BLN!N}P@j6Ea#IHQywFIa`WZG?_9ecWBX zh~F>2n1pDI1AC9MK^){a>sOE>fu@5eP>v1o-`A|6E?vu>hHa?yW4yWgI&RF*WY_0^ zBXv^7pVmIl23aLt-!8k}>Ef@X3=Xz2R=q%_mEf zKyaXgd&;X=tXqg{z<_D$Aj@*(T%EpvBGg12r_gy?xgx8OYfJK28Sdapxt+8LST=7x zD+`tqvA9u@$Ht^9S(37WuRi$>ale$0H@-!Yzl86=y2TOJ?XXwJ>6u;Pb#iW-b;otMVbRM)-964E`1Q zm<29QHyq}0Yz)z=e9Srl6SfJyYTt$Wx)u0xM2H0*p8NVmJeOo6oS%hlY>=aq$M7$V zp~?e?XO!bToAG8hlD-_y_II){p_=a=dy>S)uPM`yVLCBD(TX}ONB2@I65(jqvum`C z52N+8X@(f+9im9SgnxEUGE-EJC*&hXDB_t{>oG}6INfQ)XSednzfNNjtwb!%Bo?#t z^z-#hx)&qU<#Vj*2>Tj_5$CVNBGb}3)JCJlL7y@k#p1=ZP3hU*un$k=a`G=yxo%Itd4Y z42P@)7Ai1n1I!Ao)K7j(cujzSMuL7+MzN-xbb$tqED>Q$Kq3NCY(WOM?L@z0C&eXY z$W=O`K0iXSm~b>gOei2G5dNq44HpQU3wD9PxnTc`OjcNk;rs6iMj}|Ns#vjoJF2X# z|8dXI+i#Qh^2=nzfyU17zh~Lh6h(31{akA+OIlkgjRVCU2M(awwTnuxmt0`5xf$*D z?bO=s6a!}t9whS3H&nH?&Go1`dzNs0Jqz`E3W4UGJBc+lvC?cN2N-E-VW7UAWn*Kc z0d|XpvAEP%I&%_hy^W0&_4c9-g_t#&NGvNOW&eH@4hQZ~h{nc73Z|xzO;3YTiL9y$ z%ZDGLays#f#b{QoLfF=ZaCDTQQc3-pGX#2jk&cYu5Q&hjUX7)z3(?334uJr3P7XqW z0AE7`X0e#)nl&V4Wud99rTB&$a7;~c?%sP*jf`NHNYFj{C}~wyxW~uYv113>Pd-WQ zFMo;ozyX~9{3qIAkg!5QPF)?bQ>V~-y(sRwi}acrbQ?DkyYx~DfA%vJ>FEgb^NFrm zgYNd*$z8k{ab_lp8*e1(#v75QrJ-H42=Dy)By8G5&ieHTlampyT#4w?ODVkO8pLur zELno+(o2z5RiWOr3Gc#%gs-@Q1NP^it&6*&I1^h-ST>$~WF% z(Ibyw-o72N&xb{;W$gOvDS!1I1>_1A>_enxaUO27S9WQ0D2 zg2bnvroW>DmEVsZDBZswlfgiEYz(79LDC=ofV`##M{_ggXcX%mcToD+V_0_W!UQC| z@(PjaYCNs2xMMN=Klusik3Wv}$PpaDAo_|5YQOk`**$yk_SN&*Iig868g7oBMA5(ewd1P-=%BE4s13Xo||tbg!`7 zC556LJ214g5VKgARI5q<@I!(c4W5n;CdFcePd|-j?OJ9I9KZ-9|KlIbBql;f2NuA8 z|NSIfdo43ZkKzVKF1?fmfBPE)AAEot2tD)=@_X-PV8;$(;V`2M7gDx)GhLs5P84X? z=~z);&+xHh1dK*zmM&$%ci&<4`LMLK&;u+vc8r$hW|U)N*c1v>zx^$NW5-a&$q4g? z4WwUsDFTrQLqh|hci$yD4)ljZA@-d(LBgk>GWF@FwCvf#LZcBy9QbeU?WO#==Mcn8 zoCn^2pH#OS0WhRcFq)Bp)ahgti2m}IB-GVmZfwK`0;&s zfB!w9NCd;$wG{l}4-9lxm;lYq^Jb^Uq@-+PZUUwnZi5MV&5qsHDie;n}@S8(e4?-4xk0J?`C zMp;U;n}y2oUM-$0CyH4*|X0QTeS+unKSq!5gb4I5lgmg!M|h)(e>-edE^m}fB7ZpJ|F%_ z1kX)3QT6)k^i59EJTO4cQ%{kxd^w7;GQtZNBD(!{O5*b=ynH#b2OlKm#v7rw7V-M^ z$QCU^os)xh{d&Y})*xHA4ta7ix=Sv>RaHgKgAbz0%R{|*F^U^+L~+$s2&GbruDS}= ztwXeK9g5ssQkO4Bdev1V-F`c|#fuTAq;R&ajqva=sWKTdfdGykMGedt3{*bvkcI5cGCRq zx0IMn)B&j`69b11Av$=F#c`6aecLv&EEbl>i9}apBf+>FT?R0X6ouFy09I-VE?D=2jop8&gTdLf)RwF7(@gNeDFRKue^-^_!)Xy z&XT`+HF8}N0+A4D6e0pYP5oz?61xaRJV?eo+)?`g7Da@JJORmwkDJPGWWYCqTvUK{ z*g>Hp3twUi0#y={X)9NiEoVGvMwpaL)M7*0Hbf|Y78GH8W-ALr8Eg=W(8U6T6mkxm zZA2FM2;~hE&UOCIzR(%dz8K#FENDmWC`AV05UHvDr+-iDg72K?bJ=38;#&C*~8D3OL=~MRegh zOzK>G3JKG;US{T{VbtgdX*G0qe9KJjG-H|5q@<+c-r2_bbAAfKF8qm693`cATF+A9 zu%Yw1@!8xs(h@l(Z$n(+$0G^g4y4jN>?E{ zI+c;Z7PPA?=>6xrjQ;6Q^l#sR2?Ger001BWNklFEeOD*m;#4SS>*k350qbIqJ>wb9cl z!C>$p@few&iE!wg19wnI*kUF-N6PyLP7(CXqw9DpiDl`0(>R1bc_H|v2ovS(@{AKG zD`mDy}>iy(u44iFg<5{y@U<2__GB;PN<$o;pmDFUZJ%2}_EH ze%T(fD=Y{?PDBbfhs@uQTahBBVYM;y{dqKn!(Agv4uS($GoZ z$O)7_F^=j*l)nC3axYuM(4iB2|LAkLMrX*;YVhwrNJ22mRLBD>%1~vR@D|GvUlgV- zV&@I_cTCQ+;?snYdXxEPq8;h-G6pcw)L2hrpohUcC$6k0GnNU)MFNgR$5E7I;vJh| zpRJRb#o5R;$@HFXX4dJXKUYd9U4eblh&vSGq|`wyE0GC(9}bJ3W`zQGb_S#4BREH= zXqdDkTD%0k!%QX-zMGxIl$(Lw?WI7grX%LUoRL8+RffQBU}x8EEae$QWm3|G9vWIV zlTd9(tnuJCjGUO9Z!X_d8Z*_K__az;AUE zQx)*L&tK-W`WQzX{Uiy?`KqH2^THy$sw|vSQVh0a+MOx*6}imz4KvX?NPUkAqt`-W zG=Qbg%9eT?ZkYy2*hOBlls7+Yz~N2DFgQxCILMZ^KFldqI7fXX1{}OM(}<^b4Y6<` zsS*_*cf5~beh8~7hQ%?1aQHO2f<97}VRruO8}iN#QWJ5K6!Bvp(=%)}GV;!=jO_Y~ z%*CbjeXyA&COc_@Su8FOS=Vktyn820tWJttZbActWa=ka85N@qc#x)t$iFU3C}Wxl z0sQyzW8KJUlB0?`d;~18F0lv}%Vmc|U zBPa1D*l}hifmL#;?)TX2B!Yt%R^qxehHXl@zBm{Nm3uN1o= zLdTwy44AYybC(cFPNBQU#^A7vU}hZ=k$~axe#UJv0+bL?$O($a@Cjr1(-+{;sG0VU z(`&UNDk&wDB14=YVAg9wUAr8cP>NFEXL_I=e|A3NObybA1mBDaVTqiuHb9a>g{A8> z;&~&eQ|%-~0*oDXuvj=tZqS2TEv6X>rkW7bnLcC^8FjIZG>zDZlw=Tb`Y9OG5Eg0C zmgN(+TS*No@puA+Gt?v^pm0`BqAh||?nEh5kQ+)SOO=Q-=11zyMsCt_P39`HL<)pa z0Wkqc0ufr?`zvG5{1+L=PGCLPiDvmlND`AkBp^zZumA)?5dcEL5B6Uddf;5J3k1#u z``=*F)Kql8_yzi!8mj;NXQW!~|KpyKEnCQrSLsB5Z~|N!U&}^;Me$S362R*5km>cJ zGP2izdsU-kv=<%jyXx65RhUv|GUqQEE+{KJ4;FYw06klLTfNk z5sc5IkpxIwE=IR)qsrl!ld_6Li0buJO;3};oUBm8wr#9;I_F5KaG2pe zd#D{9C5JhgD2HCpV!fVXAUhP|#O~cJ>+2)m>qTd`Gu7OTuAzY%AUzbKch@fbZ@q={ zt+(hob&9;QGBRF&ol+nx7-avB9oW0N&^-Ahm3lpG-+oJU!2+@;Cdk{llT<+Bb`##V zjY7R1tzJ*_fdf?h<~N*s_g$jR&Dfnz)XB+oZrVi8lTYH9nIY$zYXE57whi;}Fd6ga zVcN5Y&dV-i_LEPT^!u@G*@E%jdl`J|Eo@>jN|%d)x;pfK{xip#nh+U{gx`Ok>5o1l zl9Yr*D5UrH+wp(dYA&1qCd9<{9k0z03{|qX)D<`Vq>M6!i7= zgo=tV&6`I^D#hN>!KmNQ{Fh$BqSw=Z_%LR`Sz1cz%{SAxZ5!5bnCPZWj5-_$>~=<` zrqJGU3#!UW8bA9CZ!pMkVj@)!Jiy4QQ_M_HBfjDa0>#Bx-+71GJ$vvbB~kjbpP|gp zXYlAzvWttE9v?@)bt_dzj!+DYojZqQ?OHs8gUp^egL`rki(JmcM;}qH*P{eFdV0vY z?m7&geu~B8q2RgaF!_8qr>5v1A4j!m69rdX!MX3g!|CgpKzwiD93Ex}ko@}B=yW=I|M*7+jvmF*(?bz+{k586G3M*_6vgMj zjLAeaUR7fQ4g%V682i8g$xD_HNl#~R`}VmL_8)ve)`ks??ASpF@T8>RvRaYGtE^E0I)HG4#nN2t6K*Dizt+ zT!XKz4bS*EBO(!&++3y`8=c^5jVp-+r4)zejELFHh)hQD-FM?O7%=wqAgQaPPcBEQ(J*uJB)-f{ik^R-#_ij2 z_4hLa)IRkTsbyvK@7jeRCkOld`B()4{QdnnT`qE-ewv|k=jgooW`bL{VjCM{@tbeb zy<-PPw;T0!*YVx6&r;Xa#A?7-Ur%o+MCYTABLCtGOoM}@u31CR&wq~pz4wrW!<^~t z7zyBSB-;e3jPcc396sE(6N#C>yv0BZpmtI1b zlY>&H!!a12|zy38_@4JuEEnBE9SiKrvf1S>^-XgoV zcdj3g+fC=TZRG0p)I=hr%*@bNUr%y>KTCm3mkX(0k65o~Su{#UB!YSWe#C==ERG-A z2=?{Sd+;EuqEU2_2nl*Uq3LNBGba}p>F#Fq@L?9kVrZF@E1WSJSrM;>(*^=K^m;1e z*QtQVY^FMXt?>KtxLlORE3y&*pV>@id@WD_<7P8u%t^nUukt$ox5R+UY(^QsK3`2J zjaPjMy&cs@1Dbx5MtEWf~mvDt=UhK5Xiyg zv%sjGrQ;ba&0Rp)HbshYl6!NOa&d75O#`!}gahQ8M_8Jq!DM!z_JU%hpNBS7(cUtF z1OdT`b3Ax!C8rvU#C$3$N`gG`NEv7Q-S~xKguXtW`}sml;RqH-5QTr1n=UD0H0VK; znTI&2K-qc@N&>hP4$|yOZcV$I)Id62#vxi15>`I`B#N{W3}?o4r6ys(#m0pZ6 zC_{#TP>+cl(w9)7Da2&AlHwDR);d9Af)H0AM3za%#@Gt-6LN_~Cy-bq6ihGThVm;( z3=W~N1vqrlO`tPGg(U%hR7k%HWWgx;LK)Km4=FcY$+Xu(q~kPVs{^A#O4`CQJRkm@ zG=m+NGl)2M9x9s?S5N2kv0;f{W?vq{U3u=*< z)?ku5nbc3>2vtGSLS_=uSo~S&l!N%(;^-bPfmbYgZyrmS7*9;ne9+c|CMGR4*18FFerP^F1nhAtTD+xj!;!q|^lNrJG z!^{r|konyVH|`@{Y^PW(BFPftw7D7aodTpOPQo$^U!OdJtTs$2%}-*Ag3WuHahA-- zo}GzGmx{4#jFHkB{JBL4lapy`Jwqg?40};A^4x4%&YY$vBEnxyh1Cf z>vAw9>5!Ez!g1&%YF_}S-AdoC!<1VB$fl<_*JPml#s^7RR!d`76Vhen%sNcW?ry+8 zZX|R50;bdCSmb^rLIJVEy$rqeCia<5&i0L=yY4!&fAb5(MdkE;aR|#Rud~P+!{5@! z=+ProOA}BcrAy*NxLC%LC(_B?8G+t`IR~u;5v=6mNPuesPp@2Tzf-;YwyQQ}D|qY~Q&JTiHAUxn-m#r*gKh zhb969iYtj^q>~~SqYqn|EzUu%QPFhr3!I`R)Mb7oSrPiX&oW^>Md7j#%4{*Jb}yPg zpQR=iL#m9@*wRFa7ZwJ>XoL~O6&Yk~+(@taF!{w^!ZJ6aSQbX1lWuiC^5g)M(^mRA zXGvZez^$?&@Jq;zXsFY=(F$w`#OWAhxtvlCGgE11A}7M}Gu@nUjNn<7hcGRJ-Z2LU z8;nG9mJ^WYAQi|NY#YNGTa8bq!fcpg=T<$ztcwY2N--KteDm1>67n_@6f8s-%_lrD z!(e(PfznDseknC2YIbXe@syU6o>an@4Ij|2YQtOs(!5OCPc@S<+QCY3jPwLC(>@_1 zJq8M*Q51?q^lm@VVFQ&?30mhYdW(~w)j_h|jzR39BUQq}NABdzwog$`nUM>iKN2NT zE+-?Rz!VPAQ2<#BwI~${gnf%q$u6VQqDLfhk~dh)uS=d~y3b39MAW7jx2QHSG-M<} zn?~wXgiA#wOw3r&%9JGgq^#F0Ai*iZFH)1}Q*nj7fYeY7t1pPyl0cq5gkWYGmvRK`hUv#oWUsl<-pV?G&r?Fqu6h^iS}c<+rjXqZ+YZK;E>5y9(EHW$`5> zhLb6m6mxsVbySKf2@L8e@~z;W`5RcPP9-@eAtDmsjJc73HpF7_E}0kX|CbiD*)ae3#|X}x!IYfL z)OFXfCK|=@#v9CNG$eoU0p6EiCb_$t8NmCiUr`YX5qG(hoks2MpBKq6`Kp?&~84G-hT}SW-g%@#BPm7O@y%aWPB#`w;>C+1aQH3&}ol zV(#R-1~^w$#oF#}eV~L7-l%zks11WQTnMSl)R>fmy77A%mt6Al6kQmR)Jz6bS#bf0L8WIy(;_;9kiQof{GS`Qq zD4sL*iHVeXJQPPFMC0Qvl1Nw-AI~=Cz@No&P_tJi!z2>1#_OGX2B1T$<>L7GO))2V zw;>LGI)PJhpVe`n>f`ro;yyGmCz+PXob1?%GS$;V#m|3EsJIwiJnyEjxdz2cFVXhYQ>0yeHN%fR#zlZnD#iEYllcGf4+_j? zLcod4Of+^o7x{b;pJTzeF9P74LP0PVW0~I%fI%QYuhFp5X8U)Z3<7K8&pIm*(3q6O zdb=G(oVY%&)w0%RBQc(HhvM@(J-$vH(`u=**~no|-m6}%rqt)7I2wurNN~ z&L$=z^mtehi68_zB@zrW85`q0ScZTJt(Fz%=a*DUr$oX!j|W9OM|NqoToaGKE$+h_ zn+l;mebmK)?vn`#m?9B21p@z;#oG#89bb={6B0T;35oD|^U_?%0M`*j#t7YF!#@y}~*HuBDA31Z ztn~Zm=9fUgfutm^wcAlKCpFg@UpEx-+&vy&>r&#e+7-|3wD{)-nUjUfkB@JwR*TkV zqclFAr)A{dp z_F#NWV?cMD^f=!O?NB_{^Uwc&d=0!P9_yLHLJTuA%=dbc00xzc{^VrVjEy0UuaC{Z zrSY7xB_`6El*Ed7j~gq{R8_^2?rwB|U!!4Y`Et?^93UkY!v!3vs-mj9n<5~n)zY+d zDQO1|P#Djb?)B?QYHz31Vj-;45qjqxTJE@mW#{u_!v_3qZPd-qB1%a?{O-FnzVHGS zeSLEhmCrqgb7BJ7=FMnQQ&GJ04u}5vPv)ICL3Uvwo?CAv>({?VD3xB=^j)z3wHD() z)i<$d6k#liI5sDthFHeo#~vbk*B5vM0!}Csx#q8bCF_#Q2t*@@BW}z>_;`Gf?SoT@ zQDT~C<@p=$4^^&cZgnaRDXLhcoNXnN@Z&N}2={q|oliCgHhY$fPPWr_M8 zq8WL7=ih@j5Mfi|od{AD9C96mSdd~%CRfZ~!)J$fqg246qFOAne7+p*r`IsVBL&N- zEnCU6yE-^KX6LorDp{yWrM_v9U%%4J>ra$($7S>Q>({4w;R`)4|7;Q0)|Jy6_VUnw z@1|1b=iQg?MApu)Va)H~g9BevqDbQx7hgpr9A!(#X%wkSZY(GzN`S_p0Y(NU zxozDQxMT)CIrc~VrZB&`?ytzCAtpyYzW>^$}(xX{U#QM6dd=7$^ON!2{^1MBD09rrcqkDg1*h0 zDK2s{Ae!c6aXDMdgAAuxks938OfO@$;(BILA`97B;!@Jq7(^!8fGgr7JaL!=M?T(g zDG}KW>9R2-2(6#8YYxunV zSr%zRM4ZdGr{;FXM)sk}^3l;eLtXj(Hk5KIvA#|rQ zerFAVM`oE#p8#<|j=myf)Dkph;mWcTP4QyWhltoNW~Oiv13DSvi7-EsEoH0S2l>g! z+%C$eT}(Ozgz9RsxXsM#9zdFu#BgpFa%Y$Yvo_@OvN>nrV7{K1V2ftpux~YtRf$54ob%joYs!u&6SZp zBcxTC|6=&RUZQw9fJH1J`JF%DtXoP?Uq3gl zzmi>L3%S_kV^Zy+D=&lfAAW+Wcp)N@g2PY#mXdEiBGn^fP?3bACY}F_z4wf+vdsR! zKd1Mc^piq*2uY}+C3FNtq$xI(pJExij#Hdb(V4OQoKZ&|%P5YD1q8*B9!h9|&;ubM zz4x9|l5=u;{lCbK<66&J&+BKNKYJ|}xw%iSv+sTF`?@ancklg`m0u;nFQaA6G~!-d zf?sil485J+E+y`a_57*#04;`Q5=X*$Jn?V*t?Ue*FyP4-mz&PB2X_AUztAk%9 z+(u1XKkacEBq9-0>Vh;V<+P>CF(||&4S31bB(pQrhT0H|=6nkVk({7_gJu{Mxpb$Nbl<7e0m&#=tSb0Mz}js%W-o*UC9P~P9F@;>=z&%}t%sRw;lO4D9INIrMMjd|Q`r?pFJt(qGXoC_W_J)2u_;n?%QG z79mLl>Ea>c?5*s*JRX0T8_CcqCWR$aKahniCW&xyCDU_79J*vDGAa+Tafq*9PT;Mx zR%&$y!oAJhpW|dJ=kO(F65$n-GE_;Mb1(K;dc?g-rdP|keYl&+J_kxyDt383*|*H4 z?Bh@Hdo*M&yoalg{hn;`Abyn-??bndeeV;LfAk{~O@Q;CcLkR0iZ`J}G&go2Nd&?1&}wcMP(l`~>ld zVceR36Ben8PxtTRvA%kFAOHX$07*naRJqH@)kM;z46?tmoPg8Lx*3bnhD7}B`|pX2 zFz~yj%Lo$%*?ML_hQ#sQoRNhiP|xQTf8^3&HIFX-J82QKae2Bpe|#7BEqETWH}o-dU956Atpw{(a-P0GGgV?7fNXAwNd!x3L;aZdF_X@ zT&=h9$uo0F!p`3IGR|5Cd40wGOk!I zd->Kp&xC?WA~2J%d~w)T4+D@XqfS(bC_;4}A@2qjW3| zi{y0a8SJT<$aGPpiUxRN#zK-rA@C^(D)neQZoc05AnH>m$(Km!iAy2l^KTe8c_PRp zAQ$5e1`tWcDsUv+=$v*#{yXJH1t(K^J z??siFN!Q`Sv;%?FtFg%CjGR7ABar##o5-e2p{1yZ4xnYyB&KiLMCqrW(gGOXew&Qn z|DMXiLh5ZcjH^~LZ_5^18ymUM)P&@@=a}{O+nm_9k2brV3H$b8_}%ZQt*YW$OAC_c zpC|W!|Ci!Dd$2kjG%Z?0{`T#3H8#@U*2ekBNG5LGO2_HbxSURgmMmfB_utdk*oeKg zmA2Sea*B#*Dl8;4GD0;F^Zxq;0|C74?X-x+*dKh5%#|zgT)RfULV^DM_wj~8h;AG9?w{yTq;Gjem%N*^JqJ90;k7= z<))iZgoPm=7+_c`Me+ReL<5mWkB(I@`F!AT5G`ybo=}KuSFbW}V1Rg^k4T>nr`=9! zC`6>7%cu~HR13dj1R{b#^uZup4+sib&DZaTf;rQAek4L*VH8O7`+v@Iw(uVg90cHElHZS92uhlOae)BpPzbRQ{JqX2A{NGv z4hD%1g^&n3DFA~I^mZ^-nRT7l#U&Eq2!%)w1ds?ixCNcAU)ww$QbQr6f=)xp$s{Ng zq*PQO6N2mx0fZ0(gAxf>s;imd^&%IZ#WQIV5lz7mwBFL;VZlZy#U| zg~190;CA` z_erJL#p0iRJ0KF#BiKSFJZle-@r(Hw5Q6!tUwp?nzaNd@S3QECMhLz=D){Pkjv8wy zgeDjyM!0ViiExKPWC*?;1Z-|MDZlUuM=(gbpd$jHI_VcW4Y}Q92tFzU2HozTs~bHM z34wL%5bfKCK{%ND0i#?_is0K$VchFu$bCL!t5)IJzn>JrcYR(j-e8aM!CAK?DQ{p;^jt}vefO-dz+f{u2Ph!%x{tU%yro}MPbw^i3|D}eT4f(|A?@Aq@P zZq+6LAsXQshXVnUEEc8#;Z7%mSFSK@u`u!adKd`cx7kP&)@Y5#gZlN?8L6v7)!B(l zB0==*v$WOM<5nneJn#Tf>(dBGE*Bn!0?CUnBG>Cl5Iz$G zhBO+&fKiPG*`NM|$6!Fz*@<1DpkeJ=`n_KC77L?*?2R|*)#(T|HsTP8aQ)^t$XBeO z=h!h^fcAqAh=1-mYPWC4=J#W~>n?(K+(E;cGx!13yYCYI+;bfN?mHa8AYHfL&YUe< zICJR|1ATo&e)u6tZ@*1zUmw*K6%5~X7qhA(PHVA7sF zG+exht+W(hcsPo?@1~=^9$H(`#K+^EKcA@l{2K?p8}k3{j5=ZM5d%_@2(ef^*5gAi z1t}!v&7iKOn{Jti74N)7T;4*&3Kc=Gn~>bepj5@TJzex?W-^iy!>A&})$&t#rmn=K z%cajI;`o_s*iu&@(xoC%syTA1j*-ZP1f&z_wAeUZdK7!^eB9dUsADFwuY4yBIpZ)- z$i=SE(7bIM%UjPeLEVNrM$SOMk4)Q2=EQCy;zIOXYsC@SK|}Z{Mr4hY96C?4s+g0S z{nQ68G1Sn;Y>|g-)qW-@u5h{JFf}nUzLuWHozO`6(Y+Ma8>yQ-3-QD#E>&D2Mis^8 z^G&!XCQx;?39ZXcVXuqfxM+HN`k0s4piOxyZQ4 zezehpxGjUETJ(hXhv6PHAwq(G*iHT4-@sG4AGb(N=H0gu=JjFRUqbEX13dEd+l-4& zp|*4z*{UM`C(}=NaRt}j+K1=6!)PyDCOJ8i*m23|#eNnfMKRqFkKXG+*-=A*Hi_kv zW}^*;&;~`!OpGTfN(CW1F+(B}+XLii3~0lH3`y#l5En;5{1PIS$qb0xnB_8}W2X=q zHU(#rlF_9Gq&H6^B0Q6*+;kL+BT!6}A(e&W?hE7G_8oNg4v_ypkD-p$(bdz5zo(I4 zZW@zbehS-?iFj{GM?E2e2w6Vvl&Spn+6hu;EoH;fztGbc!@2Xd%ok1JcZ;7V(h<-3 zvvnw{t^9iaBC?|+=_ofb88?5qCxbQf41E2`52)$p)fX0W_sv<<7d2z8Zsg@ZWH4iP zGWK2%Zu=mc9-Bb^1Or9?zJRg5lV9DE!0q$qVC(eLc*??Z)g*p*^D2UaE-qcFC(D?_ zgW2~XQY-0{O0i4Evv}5Xs6)xjRZnGne=4_3c!(rhIy1Y16sMkVxOKor+WEcp-lscV|sU>=Mz_ z(#jL#=P@rPo`HcLN=pv%+?2Jfjfx^d9i+be6n7`g)?r;p4(KZ!OchcJ~Ie14oA{rCmr;m5KT^_MH9> zL&(OXlW$>SR66bLEx7s{`OTCS#35nS=0jw4^FrW-&7|28-Fu z)l(%rmYu_*ggD~l63&$!VwO(FOABtIwX=r$YlX}hwQ)!8Op>G?4qp8f@wF@breGxt z!o`HT4`3J=;?-H}SR9wisqOpG_i6dnf1a;gr|%rS(AyRCz1r^3^J4E5f{|qJJx{qf}Hzr{WIeY`Q!|1 zSQ5FITqST~6{-BiND$8&9oE4te*XN}6dt&1Dvd?e^qn8%&6m@-^UiE~8fvM%+`v7H z)T~>QNSND0+5R@d?2Y{Djy#e>?AkE!qd5qU-yrj`-9F4Uop%OxTs5u37^ zgoWdYoO3IRq-2JZe7KfJle}apVoxIdZU-ajsTkcVB1AfTHY?*(G?*j~^ePpaMmO_i zNlcB-B%}$TP=vTGbt0)=8OmS~nKwYPH^g+2h&U0%h}Eo|n#GcgRCN9T!LB|m-)zP6 z_4o9Zo&-e&84;&godSL3T}(*79aUf)q65v;zx)|`xs2FZnN)1~hUoq}tksR^BW9pY zO<|Wx(C z42WZ7=)6ugZ#hX@P6pCR;rQIcGzG1k)+-3joIs1Y6S_5rkd0xUi!yNv!gm^~_ z3vz>KjNN?KW?_p$j{oMBm?9!Mary|&gW-gYyBk$(E+@_&r?p>+GI14d(L~DH&GcGE zkYq1nNNwOkYc1z{TL~1b#T1oB%}_HfUMuc`IrtKz=^3>#H9Ubx+(gLrggi?8J~>n7 z&7rHi3!`7fv_JoigqsRLDFvwrL?985@!v?eQFL=dZU8tpp>BN1q? ztfZl>jqHjF5`gy3PE>h$I6nA*2*!wqH8W=-I(-_A%SCm2JA(=Z+V*z5U0n<*6hz;1 z54u2rfr}Su2mE*>K19nHdzJ|g0Q2T*R>MC7JTgwLK$#QpbUS-KSci!Y*B zuz<>a`*0|g*q(lx>}Q`P>hZ@>ZQ4ZqrcLCmUXAvaTQK?kbSo5SHfY@wiS+fRF zObp`gZp(=2qbqY67KV=FmT}rUJ8ZU4yDT!Izw`1AA zAD`DtZ(be=pL{~g&Yh@$mhf;qPdtIQstSqUPZcor@L^D?@a*1=ObFDvo_vx@lL^Q8 z@n~Lrk%d40$kjLB{JBC${M+A>`0~qG-EJ!Eb}SnuurMbno4Z1Lzj!v-9LhoFgNYCMA)1-~eS`e~kpNEM837ci(aK z*fB&l8;vO`%szOK*5+pHot?OsEW!T98$?c-LjS2#^rxjUsjv`VVY~?fC*q&~M7C@hokc}hfX-WQWyY2*bRIgy zsKY_m-FM^LxRIXY$H&&a+ioNMv(IQgc#xpeNn3U{Q}*tqueusfZ!c8}1q07M%ScNL zYL^RBZZ7G2_RvyU34MJGs8l5H+J#@Q$6i*(0MNaDJ^gYyx`6>4S}lfMyD+L$ILpg% z0pdUYk;Lbo!@Oq??qHCfIdkZrITM5`f{xj}VewdNcQnUiN)A8h!NTyArPbwwirI*k@{4ibT&LQjQAOINexrezYPSEdmbGfz_ z%hILD6BE&Oc8&ohIXT3<^b%H;3h%jd1c1)z)3GmDK%ll35l}l}0vVrw&d}byhynr3 zvt|+ZkAKkk?|-8Mx}&49KK2;a@^VzcAk{$Hkt6h!mLfNs8IFx5`_LiGgM;{*n=t~$ zM<1ovW;6X;vMoc5FyWbN&QfSx<=ME%f1 zn2#L;z`k}Z*`Iwz-@$`~oKCtYOdxmPJ}y^RQ`_5%Wd z>8PwE(AP(&Qi+8{YJTwBapMQ?~ zzyYqa%9(-gWy=T&Z5MkD28`+H#10K16+o|u*Iy^{kw>U?IIyi>PuA=}kiG=uDZ>8Vqq{D6}^uPnm_~siXKlK!0n>L}@vuh6Wm^O(Xx( zCHiK~B6;gp^oti0bJty{H*G?@X%iFgxd(~WO4q4V3;>?VlWFhiLEheuNUJ6F)mQ1Q zslj>X3?jgvoz3BG+lXszMGN?ok_al5=*!B82Ra7_=@=d+y|k2MpueGkR+EXiW5<{X zSZZoGvS$y8g@xn-lDaysnM|adIKgzlR#?baZ@j=lFD2^}320I7C6KCc(ei4)8gz{rxn|D8~2DT{!F(NTK7|DI4?9do^2 zqWb!fm`q4ktwN&H-8l5!kpBuG=l}5!A`r`Uq%K{5}(mSiWFMS5lCekg3f-7J*@GQdyZaS&2!m zKod0%x7|*H-h$K+k0K%ofBzs+Esac}6S3ZeGbVx#o0ai%qw$6hVpasGs_SMX!cKpp zg@De>aF3JW@LnA0qo9STZVz*uUb2(>5lMzH`Mm5LZlimO1h2XYnJj=gJPzm7sVMYe z;INRR25(=-G&Kau-eNNQ|H6X@l9M+j{uVXyBA79W#SnmkE z_x^>}kAKAJlMGC<^OQy-4 zLWF-d^Tti#__=!OJJqO%)yzy!WY5-8E}ab0dUk-6=uuoQHKpg|xQx(Q*2MIbG>X3) zW~3!RRh>14Pf9xP}ttNZ} zVuArJ#*>FhYU@Vh@G-ey9_=R!nP{zNvdB$pOgi7x{6wR^nug|!WN34+1wAy&2Jj|E zGEou5)z*4y!^DKe#*rMJKyghY=bUcD;VPs~2P(CkA1&3`60}rbxPV?8$v+y7Vog?{ zaCoS1AUhnuXpiT!~66mIw`L{Ol-)_C!Oyz6y3#@`r}McM^Jd}8!m`< zF=#3$QxnG3o^#YjS5f9TNBE$N(LJY7A3uh_sh%U3Tj?*ojP$2Hgt{9Toe)F8WA|Vz zIYFC!n6yXMF&va|?!!-LyHtv;yPXlclV+Qh#Cz7!bE%ZnrU9~0P zVU!JHPYP#y=T|Vk8BMGbFKM=^0?y>t?UB5vxi{k}8^#tEHTf4q}Xv;^{L%NWnK9jf5uU z(Am~Yd|V9wt}SISR?47b1f@evVP^@lR28a#mqc9zA0B#x;fx+)Bra~1>(MprMKy2) zvDwCGS05^ejgd2F$p|WmkI6w}w_-Z5kH{t?I;8AUDiRK zG=-|hUNROg=Euh$q~)XcaJJTxwWfgLw_Ydad>PZM0bCVkLLwC-Cc}UcxJzPSVp8MldkS zjA;>kf4qaLE)m^*79!jt&ei&9i=GX-0#bEJY(DrCos+eUOvpqR5y4LLZr&L9nB5%* z=;&_azP#B42HG$rXwjrkq`s&E%NtvmW-@ZE@iO5nbzE!s7{Bxy<=4&=(2w%hbDOA^ zmeM2Xq0?mMH|?G$ z`~UI|rfapN-&BC@VkM_GJPmJsg~sorp|6hmeV@~K_84Ju8yyX0bpGQVmJAM|XsV*3 zuZH=L#t^BO6BZgrvO0|`pKQjr`3nmAELh9Vle~T|zU^Dc8?m6Wd1$QZLZlUO{x|nw z+4&`h&wh=4g$M0Y5r!Bq-xXJLQ6VBYB?(VtBwd}ubl8=QB&6YpPN1dRMtP+X*SLIC zdIR;ByD>_luxF+tjZhLP_2AZe>5kLjij`qh*He6X6ZW}&oCX-|twqsth81%HXjFr! z!}Pqmvl#FE0QOirTA!Qt>RvME>lu^|qgMoJy--c;3@NdZ62yKPN;0tZHJ}S~AvQ$t zW0Qma@iVX|7)X@p$(CwqYc>&;IE7%yL9AjJhgC{ImVq}YLMk;Pw)NnSop9NrF;`!sf#gm5u@pYenJQ8m1*fEJx&&A(qIn1_EfbkiBFkIS;Hym6?WE ztpt(i|NV@0LvF}_nMiM#;Qwy1T)s?_kijn#vX8H4m@66UL4UnkLIp^xs(wbTwTx8= zjQd4Kc!rQAtrV`)yk2B`_MjEU%o4Jg!-cHr2`(3o{rfQp_w#_z&YfKERG(wF({k`2 z69lw;4lwfSt4tSkkXx-Z{PwrZ6Lio4N8f#yMS>1777Mj&*D}j&CRWhx)I0C6h_SX` zqedeK*Q{ang$rDK?KRXD6LR1_B@d-PGF zTrPY&c8s-(%g<-=?YHAPbco>Q&3v(SD+`}}7T-JXAO?Ep&Sm22)kuqrp}3gsUw_Sl zKmVDF@$ne?`#A&5z3)D*o;bloAmH^P%Fd>vxtTDd5hoC~em#z=Dl7uXV4FM{{nV)p z?%j(O=xb;|tkEDBT89~?P9-`ki-G<7$Fk-d8d&@A!!(FQNJAmyd3hKsD~UCm$6Dp= z*n$1A$FK>R@s-WZq$VaZl#qa^vlB~P9670})ChCY1T4SzUg}Fr@pO07Vm8Cb2uz>O zz?n1j14{}DIQRMIz*tMRm_>`QcXZHv{yd&g2!BHZdHMO&3t9E!^7DzEJD0|fJ|bW; zF`AV{(yh00?fdVEL};TlWeQ~~6d3kg%T0~<>3C%hki#BYaWZO0}T`sDC zbi1AIvu801-x2kPKQMUi9GPY_BBztaiV9L?GP0_waMso$b2yMMT!^i{o`&LLhWh$Q z&CW)do=$a1$yghyv@|BIUCXs^zeNuue45iSPDl#vRu#^-`g@w3*?kiWAyL|Z=XbDs|Hxu69Pp8?;I6x5> zhawchDO5zXH#IRe5I`9hhr7F*L5qc$;bFWpX3%ox4Bo~@=A@_7wsR-pfY)rMuda^F zJ+g;Gr~m*U07*naRC_qEem#SyPBF8u54+pV1z;pCjf5F9&|kicCoGJPk`fjORSqFx z?dh$kK;rYE0?wqRk>PgZ>*^w=v5~G|kOqZJ7%qJ**IX3wVP!Ug;`88hx} z>+v9OYa=EK zGBOxUO2X3C#!yTQlQ(Q&|HmKy+ye2=7hd4pOE01B=%A&fgvs~ZL(~f|;QOEdL7tLA zYE~8=x0{;cVv;=`g0;1n*RSVbUmw!uW}*fLkW^IACxFOdfF(DVaf=pF_3wWZ55zq5 z5c=uUDU-{I@pzC;oQO`Vr9oJ8yTZfC->`w>UwlEx=R>x3En&I2)TE@~Z)(C58Hr*1 zcuqGokjq#l;FLS=psTf&ww4ymf=@^b3TPEt7EUiH;KEm55hkoPx`F~CeLmWXi*X3x z)q;Wo%7n@oLw-K(y}fkV?W6$K)KscJ_<;0|4pe}%rUuk%%;Dk4%w|OC>3FqTu61@Y z6)-9kOy979<9qjF92sGxuaEftepY1Y6dpq!5@som17-!~xzr?x1ha9!55ACI_%(X3{rj4&{$NN)}@kU9$=c zseR=YqN}P1g@qx#>n^rVnZj(ws;3e^{gjH$n@OpyW!P><`PN&|+e_1m6=PL)Q>S7a z9OUvd&!7a7pL-6wTu$(>e`S%dk2ie$F-gK+Dz)3`z5RAPRx7iF`E2{gKZs_G`%VU! zjvl2Fm?@kM!s_d(>Fgv&*kcz0MLTzrE9}3jjt&MpI!G7J2zsDr=T5Tt59dvuaBk2D zf0R3S5+&SI@t-!0D&ZWEF6eT-($g)hK{DZ)!i6LUsc0oUEyio|3>79W4( z(04=rYsIgE(IDuR8iHu?5<=n^p+pKU5n(|k%XGja>OcQ*wIItN`cgF zBU&D!*V>OpYNKFQG#C6P{C*uWn~?<*5-@92G@5M$%p=Sym`u5^147~0EJg|@&qpae zk6i>Bk(3BukO{6))DAIa7q1evd?Pl)B%Hn1Xi#{_m^l&mM_bWJ{U8tE>}bVfbs>q* zq{3WFvNDB!wGy4%jV|b=WyFg&5aj4TJ|XJ6A5b{`^nQDoW`~%C4iSc+gj3&sh&0+o z-REC1Y0$wnsU7)OpAl-j$aHMPYs7qc=>on#rqFE|VM5F}u2k$oJzIf7Z)7wjL}~F! zwBl$q;~c~(quKS-JKPi>&dP;qLcstXSI**>c+pCSND2?b=rL3N>FX5aN1~gk=48)F zJ~;d%x(A{d(%GG|2=qylk=eZz zo^9oPvkZ@P0`h1%Z@u#`6!8w6o?K*-I4T=E`JV@i!JdUo9?QEQT_va*Au;zsh8#Ao zHXo;DSj~WV8qS~uR9^o0!CCZk7ZEZ-g+f8(A~M zK-zdUohBQyU>CmFVMLi?Vza05;rAaAmox+av}8;g4VzByLlPa0e|9=Sub2;u&tM9V zBKqdJjJS=Q=4`4}(LZVY)42bxoxdi=9d5kK3oULl%U}YJq<q!Jpp?jz!g zmx8D;tTr$Goo#g0jZh#_An^yevhCko{^=+M9m7o2Iyv{^8)Qzqoz&fhC{+OlCTB4B zuWzADN=BiV)A`c#MAWvS_Bv7MWW?XPj63eQ9jRAB^Y))$^EYJrB-Ee3O!ven;>s%t z7ppn(m)|h`#V1G!*-@*c7##i7@BM*0SLC4gJGj_c#-X2VBrh999A+gp)60@)1Z+1sqC#l9H$`Ym7!FnaJiCnt)K zF3lno;l&XzV$-7x;lbZ?77)IriP~|A$Y{&t(t-)@4|0;HmN zzW)9aU+%hqI%Xjbe=;roqx^WRjS*!IXi^w(d3fqiy9ir!AF3<^5}$>SOX`S8n}#Ag zp23iqmkt#Zoe+m|VK#QZh=aYoG)h|-ohc$R;N;@TBYgG!8P-I|NYF%4`Qz7=mkw}? z4rF2%8qpwEi#}%leJ0#;FOhSm^WLuiC3}qo`?z6@-cuBv-A$;#k0?cq%~VdCEs6Gs zM&#qHgo#wt>^{ofA~$n1G6p)XGTKtck(d8P!pUnmLQ+m^M=9I{`=JLB$w1@@AoYr9?DtY(*AT1G;&w(N2}ICeTE%#u2faUt%O|4k z{0VBkev~2+E|He7+#H4~O386}Neqe@GzF15eDqiyXzgL-r_aUa*JG2&5F;knkbt$k z9i3RpsMAMwLNtSILky@qIEH(eo~FSvG=M|oB;*?=`ZnB z^Hxj=5~fO~GRH8Hj-F#gC&u7)h4JzO&+%S!A#$0K$kqg2xZ_cdbnYWEUW3{j$Fk}3 zY3eGbG|)_US2s*$w}n_nS)G`~vRl(B?;A!TckuWv zxA3jyI493nkv%(udv2YKxn9m+zc|9Qc{#lG@Ju=_!@TxG5#pFQo?11Tq?OBg?1OJm zNM$_u>y2auLP+d(2#E+t#GnDENQzRWW7ID~E?1)xiEaQkH{=F@b3^|BC8;mHMAcvZ zLXyu%2N3`6yEu02AaLy(T|ndm4{+tX@0i9|ysSBDd5mCH$Aw~pYCKjLSs&5c_Cdi=n!N=4$TRRnkKLM#MAuah!eCn6sC z<$quSTTjo=2)bAZ>Rb=p$b^93_0~QLKsGptT)0*W!5)q9IW-U%7{Gq&6w|hCBLe8C zuI4ARnbjpFjAyKpsQl%ZndA2p(cMi9aP&97A(sE}leAS=)462}GXd}5AaeFqWn41}e^R<0ypXn$4n&wtXz7zc_N&^I>H z_J=>PRIp7{e?J!=cz~G~FQNrHE?=hl{`*-k1lE#)q6G`MMF_wqjgC_F_S;M>DIrq` zI9^$`iltU72FCbYj{V^eWHZLg;|I!q{E@-Uo0%inr1Fn{B$%5^p2>s=xVUQs-5kx&XPpo@OaWS+f1dP`5@s^i0`K&> zbIh!$Al2g`G&;()q9S@OUqMB!(**Guh}U*fKhQNQ~gMxY`g0sqRC zB>v+4_K8HCdjEYAckCbuP|IXg&6>r{U0sap?Ij*KF>V~GFTF(f!GmbGZzoIelQVz) zD-n!w+5~}1cilyFF!(c1NXzT5(+{i^-g)VX6V#kI!BSyOh;M77?bA~^CE28xPk zak;o@Xov{LviuL{=d(ZnsndpsY2LJnsFD&=0r$uV97G|X zkG5~VVYs>ZXa1)8#~(*!Ffct7LI%`*{yFuG@pox}g!XnySFU840PqZc`YFXVHRP3) z5Cs@3D>+b5z+H^BY0Cks9)6f~VVxTN=_f7>4dE#%ApsbiH;<{s#a#LO-f&5c5h-RfGXU}MFpZBsN_0jBlLXsb+rFKa?b}%{=+*c3+m!zB0}Dq-(E|P7eoJe6 zJ8J|#Nor}~aDF~3gmu7v-~g3YD=8%*hlAllh^}Werq4lGWSY$Gh0|ZPa4(8`G zgE2lDfU8eDfnTth5(w?z&tw7kPyo92c53Z*@&(|+x@QmH@7crMf}Mt|t2wfFFH3~$ z6rkq82Z<^vAzfJ0cg~&50%4yC0w)(PB#Qs=+w>L{;VLO%g0KfxtX@r*!@;7yKGZzrFs!M0LiEtUOZkCgJC_5#=U((CQ>{4N)Emy6&p_Gy!_4_@D+ zhZt+wi12sJ#*GYb+x9bOPqVOw=!M@4Zrn)kwrxN2xkYT;NQbZ=i-EX*{*&&_n{n3H z69gn1H&V838?l0ZLj?u+%w|l@&0}YPC!a)QG}5Xcz>7$r5uMYzR-{cd`CFdgN?$RbR1^{JaP!L2+tJ6TaqOoPgv%mGxqTgLX3wLn$>;Fi<`=6N(6yl{pj!xWxfw17cVCZAvI zATunCga{WNWj|K2h=K5M;uhbH%WL4`$FDN;lP8FrFqux1lCrHkaB6*|tyxLD6#fB38_8!B%{Ozyf|$( z)ORkyBCo~TP(@{!jEQbJ5jq{FVHYa30*P9KH9SP6+Dx`I1XEMVS`f>SuZ3`h2)P18 z0SQuZG$N~&0217zVaW7ykOpx(+)Te^9?|IT0yuo2E97&|FHMo?@?aY-uGvElQbIj-i7EzAbQ6%+ZcDSO>no# zapE2)aY=lVI8L#X_#8iW;+oiTu(6FnU_cTeIuh!rf%<4P8ciQf@ALk^KzN@2;GCCr zUAm+-`<{KTz4yA;y|q{QqH?C9PDn#y@w2RWHOHN8M3pg;JjtvmTSlAnB%#m*J{$N1 zGP3=7h^%fL0XyYsWmL?P;kwX|OCZM^OJebk`w9NzYm!1@rcPUd5+%aUvxvMQR0J>> z_OnVD0emzMUnV!;A)~O6XvEKyt+%56d@m}5BrRKyFe?*(Vm9JnkaH(%St5&)>Gt6r z7^ZWyhdEL?im;N{WE4eAj#?ro8WP|Th?sKoy||q1NTO0?vP5oPvyE!c0g^mELL(lc z88TeP7~(WBiNZuue~e7A5TVzH zf6|RIISHrD%Cf4h)K4CUY$;JsghZtVyWK-d8sN55n3F{W6_JTiq|rpCE?R>A=xM~k z05P!$g(?G$Ist3Q$7DE0ECNga<2KH`eUx0afJkWyw?Fs zEH;p)2Fa@1kiEB`0IM+bn(r!FSN|o_uamn1sgPcUVo0%bPYedbsfSA8SnLX zk&-KB+w`eORpso}Tan3A`9VPjp0J1JPAzh~hkKG|u|SqfBp9W3Y=RYqD_K7)ozD-C zb8(=PJ8xb`rg|mbA~QMJQ~!4!oOLr96POKm!JDsUhbI{dxF?zv|C}tyhejbA10I>lf4uO$SaR!R< z5K*lVce;R@&)XT+^jDaM;k?ErpEzc)aDkmBf5*Ee~2|yu` zA&U4>N>zA*Q51?Bd&e8}zmIN|P`g1mbvg!GTj>B4x7~)SvXZvLhtZdnvHEX+Los(Q z&E4Icw%b|$!3RiItl;>bJ&aUTki2sz>G$17>-XPt+Tmc<#~%}_s-k!AUfKb{u3bdu z&ZYav5rzTN{r9u}n{PP(?z;>F-XHylxgUN==ht5|WU*j-=pmLLI6z-*EdypVhOJw< zt+SJc-McZ`Y@DAmh5289&CrDlj9VqHF3@mhag^XJaEFiv|0J z4M_g@N5tVUj^17j)2CDR)mIFkJBQF_Lz|Suj6HkEQYuk>`6bf$f#4~vmR0dXD-mFH zI7oLoui+(F;s6e4vR1BQPq?B{(CMyWI!tmUx;-P#`?*qbXFC7JP_g9ZQl!&e z!A#*wWO-4%&#Q-ICGi8RtH9o6@xwtOVDWlUna!xcHO+V<1$=zoHc2+R9@$lGFYu-x!okh4+XE{SX|`? zEfzE$4;k@30-+G$@o{qE?cuomS@Hh;!60UXfhpG=G8(knYy4IGi_-YtVqhR1EiQ|H zX3WYW$7m!ejwNJJsbK3?nr^y@Rc<#~K$6`~g42m6K8{EpHpA@%a@2;Yfu3 zu`y;}C)fWwS3&+ANiG7~wOVFhC)cRKKtV8w^18Xoi_et^xHLXaZYXqZJ#8KjA&Z5a z>vT#H*O#mKLBw@P5Z9p|t@c_rTO@wXRegwYB|D<*x_KPT&1JeyM?!oaT=8)y#jiIg zl@z@668_OqqMv^Hf8AT5)v_r5TqL_(y3K-dSn(03x}E6N{2Mqi79WQg2zxwCS}fOeMhrAx_dH4B4(%z|ISur2nN;y>JX$SPalK5`>8KeV z2DO@;lP9lXDd|&F$#A>L^7|13!9W1}#KbjxrmN$>Dp$6cHJ}9tJN|+E{8Ne z_R{O*8rEtliO-c7xHvk>lvs?!I3EO3;<_OL#L& z-|4)Di6e+cY1iqP8*djA$1IBXA0mz?#J_QR&c&aeso$bDe*NG0weME zs~AUDahR^^>s1HFRa`8eQi)Y2qs(f(W)m*Q9qv~H3T)TebP+J3)m~Y1Q2O0>n8wENw6);^CLel;oR?l={NO=+5(%1r z{*$4iBEm)^6Lvd+C!QeV*=OlEco3glPWr$8MaHYI(os``#o-|K)Khr><3DIWco26i zM(Fj|nenGT(Rkztp2&ppS&Q>XaqjW>wIVu*hGTQpBU&G{22@J>u%SiYPseSN(9 zo8KS?&Hyw2@ek_Ho+V&1F+6oD74N-Ax807mvlH&WAI0O3V^=6>sH;Oib0*W?eU|}? zg`Tc15_ayS^re?boH2v*`}Y%>Gl%Fs_s}ymgsr<9r$9jYJMSPXD7dlNyFvf6|6vn^ zkqCWA1zv;#0kN2juth%^X-wZ z=&O)1xponQQ4toWn`8b93`_w_Vgh^Xn>Z`6V3?hZKP!XghEBTV4*ClMke^TMEif_&nZdEpl(u2W5iDD zg<48;68L2BYiwn52AhsBt0afN4jsi?Aj300&eptQ)~j;4Cx1HY)J4ecK{C<`STc1b z7-QUW+au_sBAhpsqhC3l8LQTkG-nDG&)i9PMk=1vbc&WQV^jm*$HsW>{ST2UvapJj z^jW##?Pd1!53u;& z+i8CPWAegYx_lmrfBr0vX<4*|j3ljJ#p<8`jBxQZn%f7M8Cl7Wxewyi3($^wn5Npo zz2&<|ie(`ZWFmCslPjCg%GtLN3ZdsR%*|R0%VAX4Y~nRuiR43G+M_es|w$iqr}U zQiLqY7I6Q{V%E&dr>(w&M>eJMs~;^QRpzCrK+g2?5RdPi!nQjrNXE^orE=CS74h`b zi@4Y{z}%@Ze*M%8@|6)nP6Kk^7|%XZ!Hc_Y!tFGYn;0cq;^c`n^RS0~IGi>fNm|6s z@^Y-hPFlQUWJ(ruSLH5Lksv*-b=Vyf^dO`7XFtY2r;O^a>zVudd(2+Hla%}_j#VGR zD9d2}6F;N)*5x?M!BD7V>FdvuR(U7KM@CVS$Mnoi$b^-QMUpV75=hy!lac$~sN5p9XH8{&;dK0t z5b1&>rkP_rI)5`^ub5PE4x5w^3lEn)#cKId+CM%_qBE06x4c2|;>R#MA_%9Ik$=~Nq?XN~sQ!sJUsv1C1!4?m8!y&L_del$-$!>Z?B zLaVo+D4a#knuo}oc{>i5fQJ1?xxM6e7EOB?jk284u0d8s7V-R|pWz%0hx7m#=5S>L*{4 z&LdgVsM2I$H5hQ4&Fm;FV_ilT61$b0ghZx}r!YbC}O=pTCg``-B zMM+cHlDh(W1jqIxJ6m8zZ7p-lWiz<*+ZeZ@MTWPY6 z5tL44e#V0=T5=2iLK&vg3|9Q~r=;Xp;t3?uGdzlO-Yho$<}Z}odJ|o`QR*)AQ1<5R>=hgCs0kiYGaphQSUtrQFTdibZpo_3V!@736Ya z^a5LVJx=khn-SzCk-5B>5tSSHyjjfN^$7ZCl=bT$WN!X8G+qsbVHNimR`SrCrR0cZ ze9?ZA7L5aYf&op?#@MCv98L9LOEiMlK*LZU)%Ib`A}1LVA732%n3k{(k3x*yIzdDI zcN_^0FgZJqu7OTW+7S*2x)>}_a$tB6Ye32I=n#oFEnp%BLxToBH(fxsZYINmD92AX za#~@)xg-ypCYiIX{p_}l;@iBG(VSd9`r-_|6WL6PD>28iF<#X2$)DQLS!ZFfNoY8J zj+TZPW^*ay_B4*{Z{|Y72%(hq44M)_6rttf1V-6hyrBXNms}jJcMwu6A|}bBvALd& zD@#aMiHM2?1VmzFVgaH+5Q$KXC@MuRlmEZf({9iWy5YdNLI3lq|4)A+>vzASgew^p z?S~Ija`-SaffSpKy4qTbKmC+xc01)jTU{Ng)zvKU`AD-`so%Gc{F)kyhK48vPSn;S zI(U#Ozn^sAa%(F|moGEZZYLEOH5v)l*Hf(5qXve%yUA3m5r6Xy%20@bi3x^Io}|QR zMC^1TOi97#_Y?W(&vnT5*5-E#gp!F@=Jx*I&ms zI*Q2a#gv@P(3UM^m6qbUd>Nxcf#!`jNLs#}$@Ax#h(z$*e?QXVVw7exW`ThAsZ%L` z@<|*G4LBnafYZ^u6|!I)Z2?gt+r%gVyq+RB(ng!tKK2}dHxoKB2NB|R%vkhg9f?zT3p5(&~5 zUnFh&cATeAV+{tetX+$8%^DK*dK{q;oyEnZKmR<&#zvf>5YF}MDf{Rn{D%+Y@^~0b zOC$H?mvJ>TAPR-h78N0W@kL^tokYA|4C(06e!nXkS|prr+2Ab_i~lAJHUByj#b5vvu0 zMnmGOuVQO%MimI4mr6;0{dLr9*W&B%$DNWw-^!IN{PB;`zW+WYUhfqL9AM1IKFVDSze}f(;D>BM|~Sb}*Qgg=%n+5HMC+O4<*9NVu^PK_o(3QWEK}y+)v|4g7v= z6&2*~-Ak~egTTZDqiQv&uf2w)wH3MFk1Z#M$;TfDw;O@Uge5td^p8G5n3jg8wH32O zg7k$KFa?7oIGuQuN(NS~B5Cz%f^BWMq*A0m`3Z@4-;M3`Y22X@j+<`6xMBqwg8{q8 zLu*+4DI zdYR-3Mo}m)kBG&BEjycpS6(5dstSo(jdfxI>G(KajRt=FV*+|TnRYuuz^zaq-no;+ z>C>^FKTj+rh13r}#C7o^ns`~pfKW(y*DeH!i3sd=Z29>lzy3Pv*|U+RrD4=+i5ZPJ z($kUt(M18p?d8#CPqh*Pfp^= z%3|`7M+k>PhzthYYBkA!{VU;|90IMaxI`j^&pg8jpq`w>6%1lrz8ux2O~hJT2}>l1 zUU&i30}tRjb&6Oph;#L7jO*4xTN@%ko0>|-E3e>bY(y3caao~2`ugicy1Ed1JWQsg z5qkM$#v2>aghJR93XBQ`dBNZ{r`5!oH7tDQ8JeoANlQt=my<(Dbv0uxEr^GQ2>|+e z^GM#djc9W-F`*EidWys+pTu+G1hGH>M^zQRJMSdi+>AIDV_2gh?bTOtH#H#(1_>-# zLdF+gV6U%7I5~+WB?aLtub^vcA~_hmf=Tv^Utk{?K<0E3NKHla)mM1KVd&|>C6}Xk z{dIbEI+A@p+~F|pJMV;w3Ivxf5m6|R{rcC4R;|K&{ygDun9#Ou3{9CrlF39czMiSi zK8w4d0Z}A^;DHB7{LlYnpso&=&&Nn{F@mR_A~rID$mzshRz~9U&oj~1hScvTSYA%X zci%D5*-6x3z?zhV=(X4A8y!XIa1hMSCj9857=1njMk7JBn&b~Z#GR3WueBAISd8fT z=aJoU2jg{h_yE(|wRmp23HRyKNF)-*OG?l@|2(F~Mns_ytXoIcr=K!%=n!~3*wWGn zzWg%A;bG(s2cDuL6feHWNM|Qfua{7II%)g%VYAr?_xCfYRHFFhFKHbeCE4Ran396~ zuDcLsXQLb(yyD;~EF}5IKPFmQifjISQeSw1j0Yaz((&Usj~^!zi{Y%SWU!|P#lQd& zj|XE;4k49_Kz%(4z{T-#&K^EYhQUCB$3rwPkDyG3@Z?F-VlnI^BgiT$;Lst`ybkK45Ft+c%XKf%ruF=T&zI_C`yIISX zOdrGH!-zI-MwXFrW7Bto{>M@nArYjAVj={{5QvooV&L`qkx632Btp)e>tx88i{F=o zDCpp+#|k*n~@Qol@k&QE1f>;s6*mIO{o(*HVpJ=iI=cE;j#*ZgoN=Pn1*VTk2 z*@eGALL@OnWMYCeag@<)FXGfB2Kz5DsR2)s1VNUXK)}wa@h)VmXCTQ?;*=PuEM3C6 zgfPzXGD30@XFJa!SyqW9D<6p>%7MmjF)o`%peTg|pNAFF1hRA{Y9H9a#XtRpp6&~% zXJ_)ynm-{DjnLJ1j@ zg>MmwrF`9eoPUj1(=>jLk>NqK46uZB=nIVCG*GLh3w z+NLNbxf_Sw!R5d>qd7hX%B9G6+{$NZmpL)rL%Rlixy3YNp*QGa)Br^pYxu6Oo57Ss z`uxd6oeDZ_m-*IslEJVWuTg>~A%P)h2ff-Jq>&;94mr{N{vVVCl^i*HoY0yCzKk7X zNaf(XHAJNJ4)%`-(0fve=$*{WEaTvyk&`+Hp=1>Ru(Os!gu@4=!U}>bzRJ>%;T-Mzolo;kM`nawyc=S(I!3Ka3+cgIrCDd zan5e!xX{Rm*~awL3VP3f!qO@mlQ}|CZo7-V9xZ*J{eu)o7>g*2(iN*wXOLqvnFFZ~jv7rQPFu|zmydIP zs)_?K7wLHm`EBP{>`UpR(Q2nOb0sa8n`zS@$2~E~^t1v__v~kA@+|tnbELUK^jk+c z?r6mqvJe}y5lc?usQD886T{>RML0(FoVGccL`i}xO2p=*c5niHC`_c^!ouQwY6gcG zA%fTyLG26jS=&JzsTw3+DN|B%_+qdQSy?XqJz7d*DVRn(ke3D+H`z!rD9LZOl2+dY zdNaA@OK_SZ9DnC60zDV;2xK^HCS=_mNTOZ_!*;43-$~K!TTsp}2sF21QuTpP;yZ0C`M^PokjgfyZ$5>G5A4BJ7=@{FW8iBOwOr&)_zi z3C@|r`oI32@-3U_I9Y>z-*==)6VZx9$dj|^`0tN#Ug*H#g5)`i80tMmNkC7QPfk|e zQr@oqZ?ZCiM08eCMCCM37}09NT+)qF7%k+|goPH-B<8S-rHPe%@a+i<$!YkbLS&O7 z@CK=!uwk4GlH-#hi9|SInZzEAlIHi3DiBaT&_XOrg{{Ab3Z;tOr#@j^Zo+06BGqDJ zU+K0swo8ofg&=nu5vad^m0EaP`4KIL4_2nWq(gv{c=n1Sz7LtIcN;EH6@ zC~)va$^@q}RpeJ~VLTM(^|PNdVpS6|WMFZ7_-68J#;01*4Vy_1<&z*uK|Q~e;;lE4 zP>|1H%LUH<;n(DcCuur+mL322ITNZAlx>nAo14mnI*Cu)_R}JA;5BBjAo*rIq;W>? z$EO!lAym-UK1yAKg^@lz1*!<1Av@pxYlyMFC>z%mq6qtV=eIp*JKTr@MzWHmeE#19 zcqS5Y7`rIQQ1I@XXSmc5rZhuN)l4<-y>piK7I53`ET5Ie8?PVaVv~)Y(|uHBX*l@t zQO-2_89LR+(sVW2F%z|;Zh9vI%vLISZ{I!!$zeiJMo6dv|1gLAwX{fd*aITYzgG*p z8!3y*In&UICttvsp@W1{Bn(=GbQr_@pRNOprABBPvLc97@YRqWZDtBJ=UWN*a(MsT z5n{P2^u7QE>GOH3_W-T8Byf7FA7N?^;sigP?mh+!)lA#Gj8pyJQ*@^i;c6NAiH2gIF$i0xAJ|eXozon00)J061N-!)WOBO`s_aIKrA`lgjlj7yx zwZ&v6CV)stL?}Qa1UWGvLPRVhC=^}`(!4=8=!OI52K}!g$7i3B+1z~1z7=2vles_rDJ?(w39Y~VEq#rR%zf!4 zhT7Y4U%t#pb~a_Nyn;h0#MIx9bLLDm+qNOd$)W4;VT`%COirCj?&i&O?%z+h+fB(! zFCi{3$Enw&i$+Pj?>;g&ZlrbJKJ;EM;mw;#Sh|$qrX~i*#)#g0Gez6B;j-JgbnznN zQ>QX(=S~J18!_tj^oc~I-*p#$zaQ;|3pi)YU@SSAphCe=V^$ZORFurst6;D3NnIlIC+3kexzn{#z?`EjG8`IDb_7y9b{_@Kh z%w`5_Yq?ZVz_g$Jj0;^|xQB=FuUv_2+cpBp$!L!q!&p>A;VZ8Y%E_VkyYJ}r`^kFs zRVI{5hEAM72e`LxCFhPi==ttD%;7LeufB?U*)qCnY8WvXaNl_+iMQRxg}r<61%vd= zn#I&-p5fw|GfYlQ;J^1?N}ha@?v@tD+S}32nZvw4{fW!t<5=3-=+bD&eCjE3@4g$O zT1_l7ldxJ%C?y4BZ!f;VLA*fc?Ac6i*}_C)BO}0+zx@qKWhLGF_M!K9Q2zYqOnu@B zYX9rMZ~)euZzgy9b{hBX!{_zVQBlF{=bxvyu@S3Yk7vskrabcugWcVXUbw)(^yy4_ z?m5mhG!PyiCvfx4ByHP<#qDOSxf%P68I-;93Lce;o;`c$Pe`Eb)mL#RCNeoR#AI$R zvhCYZS60%vXAe%b8tZ}uWN+L^XKgJyn+^5jkE2<<7>CiwrGWw5OO`Nu*DhLXYH--? z1UGCzx_B|Bo*wjrgM^kZXZp)8Biy=`Ll-WfShkGZjT=#I+s5JQYL0n4+|$xR=8heh z7A?Z9R1$MKF$IHU&zwod?YA?e(J&+uk+p3b1y4LdcU>K3s}=o<70i0`O~&PNcJJSh zZq6L4o_U6(#fv%i=RXq!d_VXBvp)KWvB^mqv|1LowUIn;9smu0{xeA`6~-k?DE|0k zvNmqSn36(Gbv542o2mNb6TEIW7stm5Km9aQUU&iIaxPX^V{yC5_{mQg_Ih#Z^=L;& ziEP+F$q#-&!@hlZJswn#Jx2D{t@JiGW6|jdZ{AE~;X({rE&7fQMk^|q`uy`aghGr> zO@!91BXQd{tid27jg7dcPbdH7m+`CBbba#;TDhE@S6*Qyt zufN8pQlWn3736d0a`Dh1%oYpbhaX0^Vg={F{+eJcM*pHkO!?stX{@UwV6~!MyqKFl z`GltWdaMHjOe|i^f_LAgt+5eTe?NV>xx{wuLU-~cF|L%UQa<$*hQ2=Xv$F}!n1SM# zzeF`{8m&D&=+2&H44CremxPOp>D;>)hfs*>)mKSaw1|sGj$kwzac8zlqpyWn%q$%6IPM+`fGTJsy-l{V8ed*V9&4$DmG!dh=%T z@4JslyB$ME2g1i6C+)V|XlZJ~Gd6~Q%^EJ)?I4w2!JL{ljiTqC!z&b`yKn*dh7G8< zZNu*KG1SyVXvPeN)M^3>1>@(>GpSUP_v))OpE|`@OAAII<^KCgnm3PzJ$n!)B_Vn6 zL9(`Np{cG8kJXCevBwxwDw#AIG4%H{xp*;!yLRFB`_VNvBD?QCQtr8j%e}o=2L}l+ zTZZ7)TNxV}LEF@XIWLdGpZ^?}P>8vw2VrF;;_cgsq^4r1tHTW>fA9fjtCjtmH#70& zmlWT6Dm>_F7$3*2)iOVx8IAGjZHA94WbC?`QXo$ zoV+-URH`5}+{`^IvQcHrFbaf7j2<4Zyp8tm2BM-YG};*VrY)sFRe&cZLpUB{d9;XC z1&bIq8%gykDb&W8C(max8bJ|MvNAfAdD+t#3;PNCVAi;bl7xJ0;s~CQ6S>jOiquLB zsIW#7aQBQ+m0EyQm5Ilf1YSR-sYPg25)vg!vh;Q~DU%R>Urp-a@0seiGCJHw`j&EH z#d@-e+~~qX{B__Mmu6WRNghU~@N(>8HQwn1BxhP6IY{&PW%kF;GBMLbBs0L-mU_(j zVaDdVaVSUW>pVlF^emo5cA{AhB0&o#LkH7V+41LCnee*ER47p^+DIrfV^ah;&_77v z?jWAK15D0T@$tE{^yM1S&4@CpmeF}h$B@`ev?LQ@Rxxe;W}Ico^rr-w%qiha=U#dQ zwFs)hm{ocvttNc2UeXH2Ny&6E)-y=DGo6gulN7lfjLPk3*LrBLGBB2E!>ZJ9phJhL zcnaaXY=$EaBC!OjBT72@%20nXR^}vKnKbKuQsN)p6vo%aiAH}qAfYJ03E{<#Y z>f~9HR~BMRoIvjy!K+NCTBD`6)WW1%z^V5080X3uo&#gaewv#PqMbgzTj(WbaiW@S@%WH++HQGDeFWcdP|Ee7&xYgrmGkt>~KP&dfv`7;!DUL;@d!qn1< z`C<#@As6bHj}f64`NG-c7Ugr|tB=U+(Nc^EM<_rzH-k&>e@Wfd5Y+e)1pZ}9}p)mPgGsc!CWJ`*{P{Vx9C}QuGK&kVZcHEf;)FndR`R*WNxfvLz zCJ@d`;&Rs@%|0Wpr8&5=gqZs+OlFs&FU!W2D8p)YGNK!2pd_78VJ;q%lj9frFwDxq zUzmc+HikXwqg4~clr2L$ImD%|(*))uGEpMIp$Ji5{WZ~rUIN)Bva%GkwKQ-!b_rj3 z3}YZbB$`5J#t6f+#+l5HasF%z##|Mb79?WOgmKyJ?9o?aS(AikN;(539hVKQI2Ol< z%H=pl$1!=%6P`VYdP;x-r+`y0|AWv!zru91n(nqHW^LKb@t1$es^JkzEdjCuUOKaE zBrTd`_KF}*`uVKu6vvW>aL&rWp-M)lmvGGEBe--r(WDG?jb_d_M6inI6IB#3KJMcC zY8^qvN{sGQE*X6EcC~T#cnLvoF^vtan9Xpxr-)!Qi@{MHU+iut7+A=pYZ_-RPIB&i zEf+^h(FLY4WcG03)M>^iXJHOj;PGTox33L%AO*8z4q-(mhQVH1gE35tDlw%d67V@0 zP7Y%$Da4zopxtm9o2`b4`C2CP9VGb0IKJxS4tW_j`3yfDa=(1(dEjJmlrWOFoK~Z33;)cP^yGe$7(Q5mvVWg6}!?vd&61W z>T$#m#E9OJM6cV1NTXwVm7n}9A7Q(XL2VzRsy?h!Jm|o*$~yo6AOJ~3K~xf)>^{~) zbjCQ=3L}^06YM?nJ^uL;^hGv2xkAo$?58cK8|Q347J;6o+D1~AdPypnK$kqszb+od zo@64j)XQkjB%`)L+=eFRln2oy`$+Vw==s@yvDi4m)K~<=r4CAW-pSWv-PqDKctjF3 z327+A8F)n{qzjUnE=gzfqJcnK0m&j6<$fv3 zPN607pR1TSnOrI5L;QCVF!I6+EU2z#3DAGy1Roa_ahJ*E*Bx-@Z*n@6OB?83{nDI_|N~O=dHI`?{*Ud&j0@R z48QjtRW26-p!Z+@;_SYCY<0US11@!R;QH({Rx~z}09ZX98t%A*C4m6b0Y_^qwXLmW za0LL`9Sl;vbt_AJJ}RP7{J`nn<5bc4hP5HeDm7%QQ+*ae#Nj@%zB@X5}^If zH)(zMT{gR1h=8uwUgOByZ?np5W+pIr^e8orjoj&Skpv9A_Z}xc|C~GG7%JwP8otfR zVcFy)OMsHWLH4g*%PlS!*?{-(VfNM6GcOWh8Q|{k=k$^#ltdy_x!r_-?;m)8%y5{M z@wIH>b@txN+9ZEYM{yOs?u7kPl=tFJh4@E|Mveu@BZOAGZgXHx9*u__Y5>u_*r z%N9y~K4wRwM1fOnZP>+P?uf;R*=#hu`6hkuzROCN3o+2~i(fDz60yneXBIGg>=;MZ zuH|-@3nei6-g|U?{yD2%E);;HwwC%I{RofM%Id~OWXF%A{p>S_SL`2`J8-cg0m7mWdr;`%E zuGM0*+X-+5Co2o+{qRFVE*F{Y?MMLa-~UeJ>{-&j{E}JmO>O7xw=*0JvdQa333T3l zH|;VR%j|YkfN9Sj48z0R>i3fb9sy3nap94{#$+2vvx5Yg*7ylx#?E*F(?yM5y6rwIU?0kKX;-&0?{c%tMJC{Q{dF2eBG&l* zqyd5B$N7HkTIRZ3R000?-{;$Z{*#4qor~1fajKyKwadi{AT~VAxwUJNx?C&)#5FaX zIC+v#G|H;DT^e}g5l%!R+~anW2IzO}!27`mB*$eG#NUtp>o$W|OUzw;r%JDT9}~Ba zF8*(KUNmP8&W;XJuik6U92^}T*Ge%eHf_S&+Dg!5A^@1? z%)!&qajhI^^yZr}HZ_rFHeV_AIDbAqzaK|;H&P(yjW@V(@F0fs=aB=tswxIN9@2Yy zu3+B%;SZ=5EV!}ZyFve>DHh+4!~kMpgfTH9K@2f5ybdc0MIzn_KXv=M3Cc^DbVe95 z1lU_U3aWJc(GYHb1iLMQ&jD`31eqdOw^WMmvJ;_YghX!zt7pnM{;y_kyQc!B!^49! z68P|o(>%H zW&4tiJepOBsBe_f{q_7{N+HiIp2H{2)r3b!d3?jeBqyd)q3uQCi%_Z2u)L&%LCtAw zgb{f|Bqxc9L|s_q9;_id()4sh1|y0Mr$(`$Moy@ymF2@pCWD8+(` zC?e`AYg-j7Yh7JkclYhu*0z?nZBal_5m9=FKnQ^p(tFR$WG0j8y?lSjkoEm1eD}k- zu3T5n^?J>`&g99>A6U~8YBqtj)`$6D{)H#$UPE7Mk`a~Q_#rW z^a_N;#>X%{r<~4MGu@JLgc31ofe4>VhTSE^Vzm-0i^1ozk(Qdwz?ch}*F#xWF1_A* zl)@lxvzb765Q*4}P~<@!C&bn|f+sMFS|uU8B!y9#42e>KETBLn7NZC_34}Q?3WxEF z+>GO8+&qdrE(?)NiAdl_9v+RyFTxfXK}l3RXS$^b)lqm|F0OrG5ubiojUXWmza@Y_ zdI}C_fPg$4u}Fr;GfrNKnEE;;!GHu?P>Vn)!Y2WjOF}@Y!YoxY=JF608;)~ShC~iy zRv$j445=s*!Xp?7*dSiXn8!%BM1dtjk4$1?id=y}H$+5UIsuW8fLy@brL!?K_u)U+ zhR-h`At?sAB1q#uUZ6r~L*TX1ZqRdl`v6lHg`*Hi&{@VwQVAJ!*CL2A;q7q{EfFJh zm{G;~QMgBmb%kRK$}qWXBrC&EhD-EPEkKT@HK6eI-nUKA1~N)#vyi=d+cnMgoljDswiE6T;0U-G@@N^C z`w_=^X*P}!UN{Y>IvktOLm;R`s#Y*=v?B^i@p$zF)N&9j@d|{<9Qh@kdj@LOkJ21x7&fmAHXkGG46nXP=Y)aM)atRR%BexO2}PfdseUQ35;3)1?TD;SDrPOkcaMBq_)@ydmWR6)cd0n&(MECDfYv6P@NfFvxAIr$1MTomC$KtLi!l$Ok}&W}i? zz>ffBMiQn05B}H~4X~zL}`FaIm;pQND_5 zwGyY#iD=BkoZJffbZ7AirI<|?G9%&`9~(rLFGj8mP?%AS*gc3X)`v~tV}5Q1;;vz^ z8!@Q`_`PoYdrE^hOXIAHk;-;7N(W zA`}rBD`jY;7fFH$nJ|vbWEF^g^o{FKijxqS)rdVhkh!tDM+o|@garghd?H5ORs`vZ z5Df7A?A81@I)cL~VRlk3ebiIi(?pcd%I#CjxMS5yp8w?(K9`#ZZo8hec}uwe-|sVM z8RdcNZsEG(QXby%K4%>L{9)~8%93K)_lt|RmO)k*t>N~<6-ccWy!p*;?z!e>R!=R4 zt^$r78DwExCXX$dP5QY@^cYoyTY^k0&17A46qP%ASUsOVj!Mrw-;_olE%? z6&be{ad!7XmR=V_gxikTZbLBEN_lA+w_TruUuVGK65)0Wus9@KY&1|+J4(_WU+9jql3Vv zO%(m@Z?x>*&7jRj+tQ_EKl2QI`}Q#g@buG^y!j?QKm35%W<$SxIT24jiSgJmoIW4* z(a{ud-;U|nF#HF7!fM<2y>?i^A;mz71zS6|_%sln%PFcKL_?5nR5)!t5cZS5pJ z$&kar48MO8|Dng@p^X3Fs95}d()@l@{0Cnq-Qz(Ox<~8t5$E?$ViP!laF1sao4^jJ zJf2A`7jH0##p9X8BMAWKTUwar@k~}jjeEUh1cQ^{)8nDTMS18mBN7QYJ|F5}5HS7>BtLl%6 zmn9c2%<*_8v0i#~I#fCxiGctTCU8O`J)X&o@5^$fgyishJY1@;XWDOc zJ}BnFZYFy!TtIW|Umdplu(+U+LRZYM1e zAO;v}Yr|Jkg6*}}$O#5f08+1)@JAk@<=uBFuC68ui12t2+3ig8`-uZ0{C*nGoMC!s z4nzXl&Q2miSSjIv((NYMZYL`cARI8ZwuXhr>eLQ5_m+@wd9uJwn znQz9>^~-bK==G8k8V?Czce#l0dM9yQoL(>S!65OW@$v)$1bx0qj2paOd@dL1mu)u? z0H1Gieo2AT=g(7qS*Ab$tKH62{)07Rb2!Kh`6U@}p{0eX9uEr6IYpLNdvL zmhBL@5|#U4*B?E{)5wF3kAI*F7qA_vHS-EM<*5&@ADBK z3{GNN37M!05dki*7eS~hMFbcv7P@dbx=?3lpvy7gAlKKX>Bm6bTPTGW62E9tMiLbJs}YeNH`+ixfL z+iy8^;snDzJ@n=0vv}7oTE@reZfr!hem$8Vf6R#!CouK*<0vksaMvz0K=-j@Xo1YF zTiLr~2mYZUMu91Byg||C&4`vRMYL`mk@ww)KqR`d;k!crzb6@fWWF)*TM-BZ1Vmyy z1PP)bAXM<$J11$@X5n|l)7E99qqY&NynsMhHm2@TPV8=?r!5YlDxdC_PJaC9993

    bvcn?2n|j&xy&R<5G`} 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%0Ash38*+0QzVSx%g3;8nWC?S3?ZOZjhZX3~ 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

    0R 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

    iR*K>}*|vEG%d^xZ4c4Nj$|e}f|PIr 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

  1. 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 T?myGT#Top(V#&3|zwG~iQW^p! literal 0 HcmV?d00001 From 8e073c3335785de520b7b31a963286b205461ff6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Sep 2022 07:43:01 -0400 Subject: [PATCH 247/364] reference the Howto from the rest of the manual. Spelling fixes. --- doc/src/Howto_peri.rst | 38 +++++++-------- doc/src/Packages_details.rst | 1 + doc/src/compute_damage_atom.rst | 16 ++++--- doc/src/compute_dilatation_atom.rst | 20 ++++---- doc/src/pair_peri.rst | 52 +++++++++++---------- doc/utils/sphinx-config/false_positives.txt | 10 +++- 6 files changed, 77 insertions(+), 60 deletions(-) diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst index 6285036fc8..99586da888 100644 --- a/doc/src/Howto_peri.rst +++ b/doc/src/Howto_peri.rst @@ -16,8 +16,8 @@ model is discretized within LAMMPS as described in the original article :ref:`(Parks) `. An example problem with comments is also included. -Quickstart -"""""""""" +Quick Start +""""""""""" The peridynamics styles are included in the optional :ref:`PERI package `. If your LAMMPS executable does not already include the @@ -54,7 +54,7 @@ Some notes on this input example: - particles must be created on a :doc:`simple cubic lattice ` - using the :doc:`atom style peri ` is required - an :doc:`atom map ` is required for indexing particles -- The :doc:`skin distance ` used when computing neighborlists +- The :doc:`skin distance ` used when computing neighbor lists should be defined appropriately for your choice of simulation parameters. The *skin* should be set to a value such that the peridynamic horizon plus the skin distance is larger than the maximum @@ -254,11 +254,11 @@ extension :math:`\underline{e}^{\rm d}`. not change as bonds break. It is computed with respect to the bond family defined at the reference (initial) configuration. -The nonnegative scalar state :math:`\underline{\omega}` is an *influence -function* :ref:`(Silling 2007) `. For more on influence -functions, see :ref:`(Seleson 2010) `. If an influence -function :math:`\underline{\omega}` depends only upon the scalar -:math:`\left\Vert \boldsymbol{\xi} \right\Vert`, (i.e., +The non-negative scalar state :math:`\underline{\omega}` is an +*influence function* :ref:`(Silling 2007) `. For more on +influence functions, see :ref:`(Seleson 2010) `. If an +influence function :math:`\underline{\omega}` depends only upon the +scalar :math:`\left\Vert \boldsymbol{\xi} \right\Vert`, (i.e., :math:`\underline{\omega}\left<\boldsymbol{\xi}\right> = \underline{\omega}\left<\left\Vert \boldsymbol{\xi} \right\Vert\right>`\ ), then :math:`\underline{\omega}` is a spherical influence function. @@ -369,7 +369,7 @@ critical stretch defined as s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), -where :math:`s_{00}` and :math:`\alpha` are material-dependant +where :math:`s_{00}` and :math:`\alpha` are material-dependent constants. The history function :math:`\mu` breaks bonds when the stretch :math:`s` exceeds the critical stretch :math:`s_0`. @@ -557,7 +557,7 @@ described in the :ref:`Damage section `. Bonds are recorded as broken in a simulation by removing them from the bond family :math:`\mathcal{F}_i` (see \eqref{eqn:BondFamily}). -A naiive implementation would have us first loop over all bonds and +A naive implementation would have us first loop over all bonds and compute :math:`s_{min}` in \eqref{eqn:s0}, then loop over all bonds again and break bonds with a stretch :math:`s > s0` as in \eqref{eqn:mu}, and finally loop over all particles and compute forces @@ -761,20 +761,20 @@ Pitfalls **Parallel Scalability** LAMMPS operates in parallel in a :doc:`spatial-decomposition mode -`, where each processor owns a spatial subdomain of +`, where each processor owns a spatial sub-domain of the overall simulation domain and communicates with its neighboring processors via distributed-memory message passing (MPI) to acquire ghost atom information to allow forces on the atoms it owns to be computed. LAMMPS also uses Verlet neighbor lists which are recomputed every few timesteps as particles move. On these timesteps, particles also migrate to new processors as needed. LAMMPS decomposes the overall -simulation domain so that spatial subdomains of nearly equal volume are -assigned to each processor. When each subdomain contains nearly the same -number of particles, this results in a reasonable load balance among all -processors. As is more typical with some peridynamic simulations, some -subdomains may contain many particles while other subdomains contain few -particles, resulting in a load imbalance that impacts parallel -scalability. +simulation domain so that spatial sub-domains of nearly equal volume are +assigned to each processor. When each sub-domain contains nearly the +same number of particles, this results in a reasonable load balance +among all processors. As is more typical with some peridynamic +simulations, some sub-domains may contain many particles while other +sub-domains contain few particles, resulting in a load imbalance that +impacts parallel scalability. **Setting the "skin" distance** @@ -937,7 +937,7 @@ In line 2 we specify that SI units are to be used. We specify the dimension (3) and boundary conditions ("shrink-wrapped") for the computational domain in lines 3 and 4. In line 5 we specify that peridynamic particles are to be used for this simulation. In line 7, we -set the "skin" distance used in building the LAMMPS neighborlist. In +set the "skin" distance used in building the LAMMPS neighbor list. In line 8 we set the lattice constant (in meters) and in line 10 we define the spatial region where the target will be placed. In line 12 we specify a rectangular box enclosing the target region that defines the diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index f89ab00039..64037e950f 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2200,6 +2200,7 @@ Foster (UTSA). **Supporting info:** * src/PERI: filenames -> commands +* :doc:`Peridynamics Howto ` * `doc/PDF/PDLammps_overview.pdf `_ * `doc/PDF/PDLammps_EPS.pdf `_ * `doc/PDF/PDLammps_VES.pdf `_ diff --git a/doc/src/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst index b75a3ebc57..d396fe7424 100644 --- a/doc/src/compute_damage_atom.rst +++ b/doc/src/compute_damage_atom.rst @@ -24,16 +24,17 @@ Description """"""""""" Define a computation that calculates the per-atom damage for each atom -in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ -for an overview of LAMMPS commands for Peridynamics modeling. +in a group. This is a quantity relevant for :doc:`Peridynamics models +`. See `this document `_ for an +overview of LAMMPS commands for Peridynamics modeling. The "damage" of a Peridynamics particles is based on the bond breakage between the particle and its neighbors. If all the bonds are broken the particle is considered to be fully damaged. -See the `PDLAMMPS user guide `_ for a formal -definition of "damage" and more details about Peridynamics as it is -implemented in LAMMPS. +See the :doc:`Peridynamics Howto ` for a formal definition +of "damage" and more details about Peridynamics as it is implemented in +LAMMPS. This command can be used with all the Peridynamic pair styles. @@ -53,8 +54,9 @@ The per-atom vector values are unitless numbers (damage) :math:`\ge 0.0`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst index 8e3c86a4af..6ccc65dec3 100644 --- a/doc/src/compute_dilatation_atom.rst +++ b/doc/src/compute_dilatation_atom.rst @@ -24,7 +24,8 @@ Description """"""""""" Define a computation that calculates the per-atom dilatation for each -atom in a group. This is a quantity relevant for :doc:`Peridynamics models `. See `this document `_ +atom in a group. This is a quantity relevant for :doc:`Peridynamics +models `. See `this document `_ for an overview of LAMMPS commands for Peridynamics modeling. For small deformation, dilatation of is the measure of the volumetric @@ -32,13 +33,14 @@ strain. The dilatation :math:`\theta` for each peridynamic particle :math:`i` is calculated as a sum over its neighbors with unbroken bonds, where the -contribution of the :math:`ij` pair is a function of the change in bond length -(versus the initial length in the reference state), the volume +contribution of the :math:`ij` pair is a function of the change in bond +length (versus the initial length in the reference state), the volume fraction of the particles and an influence function. See the -`PDLAMMPS user guide `_ for -a formal definition of dilatation. +:doc:`Peridynamics Howto ` for a formal definition of +dilatation. -This command can only be used with a subset of the Peridynamic :doc:`pair styles `: peri/lps, peri/ves and peri/eps. +This command can only be used with a subset of the Peridynamic +:doc:`pair styles `: *peri/lps*, *peri/ves*, and *peri/eps*. The dilatation value will be 0.0 for atoms not in the specified compute group. @@ -56,9 +58,9 @@ The per-atom vector values are unitless numbers :math:`(\theta \ge 0.0)`. Restrictions """""""""""" -This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the -:doc:`Build package ` page for more info. +This compute is part of the PERI package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_peri.rst b/doc/src/pair_peri.rst index 45b406dd61..1fb94acd37 100644 --- a/doc/src/pair_peri.rst +++ b/doc/src/pair_peri.rst @@ -51,8 +51,9 @@ Description """"""""""" The peridynamic pair styles implement material models that can be used -at the mesoscopic and macroscopic scales. See `this document `_ for an overview of LAMMPS commands -for Peridynamics modeling. +at the mesoscopic and macroscopic scales. See `this document +`_ for an overview of LAMMPS commands for +Peridynamics modeling. Style *peri/pmb* implements the Peridynamic bond-based prototype microelastic brittle (PMB) model. @@ -66,26 +67,27 @@ peridynamic viscoelastic solid (VES) model. Style *peri/eps* implements the Peridynamic state-based elastic-plastic solid (EPS) model. -The canonical papers on Peridynamics are :ref:`(Silling 2000) ` -and :ref:`(Silling 2007) `. The implementation of Peridynamics -in LAMMPS is described in :ref:`(Parks) `. Also see the `PDLAMMPS user guide `_ for -more details about its implementation. +The canonical papers on Peridynamics are :ref:`(Silling 2000) +` and :ref:`(Silling 2007) `. The +implementation of Peridynamics in LAMMPS is described in :ref:`(Parks) +`. Also see the :doc:`Peridynamics Howto ` for more +details about its implementation. The peridynamic VES and EPS models in PDLAMMPS were implemented by R. Rahman and J. T. Foster at University of Texas at San Antonio. The original VES formulation is described in "(Mitchell2011)" and the original EPS formulation is in "(Mitchell2011a)". Additional PDF docs -that describe the VES and EPS implementations are include in the -LAMMPS distribution in `doc/PDF/PDLammps_VES.pdf `_ and +that describe the VES and EPS implementations are include in the LAMMPS +distribution in `doc/PDF/PDLammps_VES.pdf `_ and `doc/PDF/PDLammps_EPS.pdf `_. For questions regarding the VES and EPS models in LAMMPS you can contact R. Rahman (rezwanur.rahman at utsa.edu). The following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples above, -or in the data file or restart files read by the -:doc:`read_data ` or :doc:`read_restart ` -commands, or by mixing as described below. +or in the data file or restart files read by the :doc:`read_data +` or :doc:`read_restart ` commands, or by +mixing as described below. For the *peri/pmb* style: @@ -96,8 +98,8 @@ For the *peri/pmb* style: C is the effectively a spring constant for Peridynamic bonds, the horizon is a cutoff distance for truncating interactions, and s00 and -:math:`\alpha` are used as a bond breaking criteria. The units of c are such -that c/distance = stiffness/volume\^2, where stiffness is +:math:`\alpha` are used as a bond breaking criteria. The units of c are +such that c/distance = stiffness/volume\^2, where stiffness is energy/distance\^2 and volume is distance\^3. See the users guide for more details. @@ -110,8 +112,8 @@ For the *peri/lps* style: * :math:`\alpha` (unitless) K is the bulk modulus and G is the shear modulus. The horizon is a -cutoff distance for truncating interactions, and s00 and :math:`\alpha` are -used as a bond breaking criteria. See the users guide for more +cutoff distance for truncating interactions, and s00 and :math:`\alpha` +are used as a bond breaking criteria. See the users guide for more details. For the *peri/ves* style: @@ -125,12 +127,12 @@ For the *peri/ves* style: * m_taubi (unitless) K is the bulk modulus and G is the shear modulus. The horizon is a -cutoff distance for truncating interactions, and s00 and :math:`\alpha` are -used as a bond breaking criteria. m_lambdai and m_taubi are the +cutoff distance for truncating interactions, and s00 and :math:`\alpha` +are used as a bond breaking criteria. m_lambdai and m_taubi are the viscoelastic relaxation parameter and time constant, -respectively. m_lambdai varies within zero to one. For very small -values of m_lambdai the viscoelastic model responds very similar to a -linear elastic model. For details please see the description in +respectively. m_lambdai varies within zero to one. For very small values +of m_lambdai the viscoelastic model responds very similar to a linear +elastic model. For details please see the description in "(Mitchell2011)". For the *peri/eps* style: @@ -165,8 +167,9 @@ shift option. The :doc:`pair_modify ` table and tail options are not relevant for these pair styles. -These pair styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need -to be specified in an input script that reads a restart file. +These pair styles write their information to :doc:`binary restart files +`, so pair_style and pair_coeff commands do not need to be +specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the @@ -177,8 +180,9 @@ These pair styles can only be used via the *pair* keyword of the Restrictions """""""""""" -All of these styles are part of the PERI package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +All of these styles are part of the PERI package. They are only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` page for more info. Related commands """""""""""""""" diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c719620fc6..78d321ec50 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -747,6 +747,7 @@ dirname discoverable discretization discretized +discretizing disp dissipative Dissipative @@ -915,6 +916,7 @@ emax Emax Embt emi +Emmrich emol eN endian @@ -2125,6 +2127,7 @@ modelled modelling Modelling Modine +moduli mofff MOFFF Mohd @@ -2140,6 +2143,7 @@ Monaghan Monaghans monodisperse monodispersity +monolayer monopole monovalent Montalenti @@ -2415,6 +2419,7 @@ normy normz Noskov noslip +notational noticable Nout noutcol @@ -2775,6 +2780,7 @@ ps Ps pscreen pscrozi +Pseudocode pseudodynamics pseudopotential pSp @@ -3134,6 +3140,7 @@ sectoring sed segmental Seifert +Seleson sellerio Sellerio Semaev @@ -3212,7 +3219,7 @@ slategray slater Slepoy Sliozberg -sLLG +sLL sllod sm smallbig @@ -3623,6 +3630,7 @@ unsmoothed unsolvated unsplit unstrained +unstretched untar untilted Unwin From c068c226cc4f3ee1f4554911c1dba84565c3da33 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Sep 2022 09:47:40 -0400 Subject: [PATCH 248/364] consolidate fortran test keeper modules into a single module --- unittest/fortran/keepstuff.f90 | 24 ++---- unittest/fortran/test_fortran_box.f90 | 22 ++--- unittest/fortran/test_fortran_commands.f90 | 14 ++-- unittest/fortran/test_fortran_create.f90 | 12 +-- .../fortran/test_fortran_extract_global.f90 | 80 +++++++++---------- unittest/fortran/test_fortran_get_thermo.f90 | 32 ++++---- unittest/fortran/test_fortran_properties.f90 | 8 +- 7 files changed, 89 insertions(+), 103 deletions(-) diff --git a/unittest/fortran/keepstuff.f90 b/unittest/fortran/keepstuff.f90 index 8a7f530c37..e0e0725c69 100644 --- a/unittest/fortran/keepstuff.f90 +++ b/unittest/fortran/keepstuff.f90 @@ -1,27 +1,19 @@ -MODULE keepcmds +MODULE keepstuff USE liblammps IMPLICIT NONE TYPE(LAMMPS) :: lmp + INTEGER :: mycomm CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & [ CHARACTER(len=40) :: & 'region box block 0 $x 0 2 0 2', & 'create_box 1 box', & 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] -END MODULE keepcmds - -MODULE keepglobal - USE liblammps - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: big_input = & [ CHARACTER(len=40) :: & 'region box block 0 $x 0 3 0 4', & 'create_box 1 box', & 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & [ CHARACTER(len=40) :: & 'create_atoms 1 single &', & ' 0.2 0.1 0.1' ] @@ -30,11 +22,5 @@ MODULE keepglobal 'pair_style lj/cut 2.5', & 'pair_coeff 1 1 1.0 1.0', & 'mass 1 1.0' ] -END MODULE keepglobal - -MODULE keepcreate - USE liblammps - TYPE(LAMMPS) :: lmp - INTEGER :: mycomm -END MODULE keepcreate +END MODULE keepstuff diff --git a/unittest/fortran/test_fortran_box.f90 b/unittest/fortran/test_fortran_box.f90 index 9a2e8207a9..2123ae0c15 100644 --- a/unittest/fortran/test_fortran_box.f90 +++ b/unittest/fortran/test_fortran_box.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepcmds, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args @@ -16,7 +16,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -25,7 +25,7 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_box_setup () BIND(C) USE liblammps - USE keepcmds, ONLY : lmp, demo_input + USE keepstuff, ONLY : lmp, demo_input IMPLICIT NONE CALL lmp%commands_list(demo_input) @@ -33,7 +33,7 @@ END SUBROUTINE f_lammps_box_setup SUBROUTINE f_lammps_delete_everything() BIND(C) USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE CALL lmp%command("delete_atoms group all"); @@ -42,7 +42,7 @@ END SUBROUTINE f_lammps_delete_everything FUNCTION f_lammps_extract_box_xlo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_xlo REAL (c_double) :: boxdim(3) @@ -54,7 +54,7 @@ END FUNCTION f_lammps_extract_box_xlo FUNCTION f_lammps_extract_box_xhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_xhi REAL (c_double) :: boxdim(3) @@ -66,7 +66,7 @@ END FUNCTION f_lammps_extract_box_xhi FUNCTION f_lammps_extract_box_ylo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_ylo REAL (c_double) :: boxdim(3) @@ -78,7 +78,7 @@ END FUNCTION f_lammps_extract_box_ylo FUNCTION f_lammps_extract_box_yhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_yhi REAL (c_double) :: boxdim(3) @@ -90,7 +90,7 @@ END FUNCTION f_lammps_extract_box_yhi FUNCTION f_lammps_extract_box_zlo () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_zlo REAL (c_double) :: boxdim(3) @@ -102,7 +102,7 @@ END FUNCTION f_lammps_extract_box_zlo FUNCTION f_lammps_extract_box_zhi () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_extract_box_zhi REAL (c_double) :: boxdim(3) @@ -114,7 +114,7 @@ END FUNCTION f_lammps_extract_box_zhi SUBROUTINE f_lammps_reset_box_2x () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: newlo(3), newhi(3), xy, yz, xz diff --git a/unittest/fortran/test_fortran_commands.f90 b/unittest/fortran/test_fortran_commands.f90 index a09b492e66..b15360e7d1 100644 --- a/unittest/fortran/test_fortran_commands.f90 +++ b/unittest/fortran/test_fortran_commands.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepcmds, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args @@ -16,7 +16,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -26,7 +26,7 @@ END SUBROUTINE f_lammps_close FUNCTION f_lammps_get_natoms() BIND(C, name="f_lammps_get_natoms") USE ISO_C_BINDING, ONLY: c_null_ptr, c_double USE liblammps - USE keepcmds, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE REAL(c_double) :: f_lammps_get_natoms @@ -36,7 +36,7 @@ END FUNCTION f_lammps_get_natoms SUBROUTINE f_lammps_file() BIND(C, name="f_lammps_file") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp, demo_input, cont_input + USE keepstuff, ONLY: lmp, demo_input, cont_input IMPLICIT NONE INTEGER :: i CHARACTER(len=*), PARAMETER :: demo_file = 'in.test', cont_file = 'in.cont' @@ -58,7 +58,7 @@ END SUBROUTINE f_lammps_file SUBROUTINE f_lammps_command() BIND(C, name="f_lammps_command") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp, demo_input + USE keepstuff, ONLY: lmp, demo_input IMPLICIT NONE INTEGER :: i @@ -70,7 +70,7 @@ END SUBROUTINE f_lammps_command SUBROUTINE f_lammps_commands_list() BIND(C, name="f_lammps_commands_list") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp, demo_input, cont_input + USE keepstuff, ONLY: lmp, demo_input, cont_input IMPLICIT NONE CALL lmp%commands_list(demo_input) @@ -80,7 +80,7 @@ END SUBROUTINE f_lammps_commands_list SUBROUTINE f_lammps_commands_string() BIND(C, name="f_lammps_commands_string") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcmds, ONLY: lmp, demo_input, cont_input + USE keepstuff, ONLY: lmp, demo_input, cont_input IMPLICIT NONE INTEGER :: i CHARACTER(len=512) :: cmds diff --git a/unittest/fortran/test_fortran_create.f90 b/unittest/fortran/test_fortran_create.f90 index 2b5b5c5814..4ea2a33cfe 100644 --- a/unittest/fortran/test_fortran_create.f90 +++ b/unittest/fortran/test_fortran_create.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_no_mpi_no_args() BIND(C, name="f_lammps_no_mpi_no_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepcreate, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_no_mpi_no_args @@ -12,7 +12,7 @@ END FUNCTION f_lammps_no_mpi_no_args FUNCTION f_lammps_no_mpi_with_args() BIND(C, name="f_lammps_no_mpi_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepcreate, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_no_mpi_with_args @@ -27,7 +27,7 @@ FUNCTION f_lammps_open_no_args() BIND(C, name="f_lammps_open_no_args") USE ISO_C_BINDING, ONLY: c_ptr USE MPI, ONLY: MPI_COMM_WORLD, mpi_comm_split USE liblammps - USE keepcreate, ONLY: lmp,mycomm + USE keepstuff, ONLY: lmp,mycomm IMPLICIT NONE TYPE(c_ptr) :: f_lammps_open_no_args INTEGER :: color, key, ierr @@ -43,7 +43,7 @@ FUNCTION f_lammps_open_with_args() BIND(C, name="f_lammps_open_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE MPI, ONLY: MPI_COMM_WORLD, mpi_comm_split USE liblammps - USE keepcreate, ONLY: lmp,mycomm + USE keepstuff, ONLY: lmp,mycomm IMPLICIT NONE TYPE(c_ptr) :: f_lammps_open_with_args INTEGER :: color, key, ierr @@ -61,7 +61,7 @@ END FUNCTION f_lammps_open_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcreate, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -71,7 +71,7 @@ END SUBROUTINE f_lammps_close FUNCTION f_lammps_get_comm() BIND(C, name="f_lammps_get_comm") USE ISO_C_BINDING, ONLY: c_int USE liblammps - USE keepcreate, ONLY: mycomm + USE keepstuff, ONLY: mycomm IMPLICIT NONE INTEGER(c_int) :: f_lammps_get_comm diff --git a/unittest/fortran/test_fortran_extract_global.f90 b/unittest/fortran/test_fortran_extract_global.f90 index 86c999e8f3..f89087869c 100644 --- a/unittest/fortran/test_fortran_extract_global.f90 +++ b/unittest/fortran/test_fortran_extract_global.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepglobal, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & @@ -15,7 +15,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepglobal, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -24,10 +24,10 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_global () BIND(C) USE LIBLAMMPS - USE keepglobal, ONLY : lmp, demo_input, cont_input, pair_input + USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) CALL lmp%commands_list(pair_input) CALL lmp%command('run 0') @@ -35,7 +35,7 @@ END SUBROUTINE f_lammps_setup_extract_global SUBROUTINE f_lammps_setup_full_extract_global () BIND(C) USE LIBLAMMPS - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTERFACE SUBROUTINE f_lammps_setup_extract_global () BIND(C) @@ -53,7 +53,7 @@ END SUBROUTINE f_lammps_setup_full_extract_global FUNCTION f_lammps_extract_global_units () BIND(C) RESULT(success) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: success CHARACTER (LEN=16) :: units @@ -70,7 +70,7 @@ END FUNCTION f_lammps_extract_global_units FUNCTION f_lammps_extract_global_ntimestep () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: ntimestep @@ -81,7 +81,7 @@ FUNCTION f_lammps_extract_global_ntimestep () BIND(C) END FUNCTION f_lammps_extract_global_ntimestep FUNCTION f_lammps_extract_global_ntimestep_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: ntimestep @@ -93,7 +93,7 @@ END FUNCTION f_lammps_extract_global_ntimestep_big FUNCTION f_lammps_extract_global_dt () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double), POINTER :: dt @@ -105,7 +105,7 @@ END FUNCTION f_lammps_extract_global_dt SUBROUTINE f_lammps_extract_global_boxlo (C_boxlo) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double), DIMENSION(3) :: C_boxlo @@ -117,7 +117,7 @@ END SUBROUTINE f_lammps_extract_global_boxlo SUBROUTINE f_lammps_extract_global_boxhi (C_boxhi) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double), DIMENSION(3) :: C_boxhi @@ -129,7 +129,7 @@ END SUBROUTINE f_lammps_extract_global_boxhi FUNCTION f_lammps_extract_global_boxxlo () BIND(C) RESULT(C_boxxlo) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxxlo @@ -141,7 +141,7 @@ END FUNCTION f_lammps_extract_global_boxxlo FUNCTION f_lammps_extract_global_boxxhi () BIND(C) RESULT(C_boxxhi) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxxhi @@ -153,7 +153,7 @@ END FUNCTION f_lammps_extract_global_boxxhi FUNCTION f_lammps_extract_global_boxylo () BIND(C) RESULT(C_boxylo) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxylo @@ -165,7 +165,7 @@ END FUNCTION f_lammps_extract_global_boxylo FUNCTION f_lammps_extract_global_boxyhi () BIND(C) RESULT(C_boxyhi) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxyhi @@ -177,7 +177,7 @@ END FUNCTION f_lammps_extract_global_boxyhi FUNCTION f_lammps_extract_global_boxzlo () BIND(C) RESULT(C_boxzlo) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxzlo @@ -189,7 +189,7 @@ END FUNCTION f_lammps_extract_global_boxzlo FUNCTION f_lammps_extract_global_boxzhi () BIND(C) RESULT(C_boxzhi) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_boxzhi @@ -201,7 +201,7 @@ END FUNCTION f_lammps_extract_global_boxzhi SUBROUTINE f_lammps_extract_global_periodicity (C_periodicity) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), DIMENSION(3) :: C_periodicity @@ -213,7 +213,7 @@ END SUBROUTINE f_lammps_extract_global_periodicity FUNCTION f_lammps_extract_global_triclinic () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: triclinic @@ -225,7 +225,7 @@ END FUNCTION f_lammps_extract_global_triclinic FUNCTION f_lammps_extract_global_xy () BIND(C) RESULT(C_xy) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_xy @@ -237,7 +237,7 @@ END FUNCTION f_lammps_extract_global_xy FUNCTION f_lammps_extract_global_xz () BIND(C) RESULT(C_xz) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_xz @@ -249,7 +249,7 @@ END FUNCTION f_lammps_extract_global_xz FUNCTION f_lammps_extract_global_yz () BIND(C) RESULT(C_yz) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_yz @@ -261,7 +261,7 @@ END FUNCTION f_lammps_extract_global_yz FUNCTION f_lammps_extract_global_natoms () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: natoms @@ -272,7 +272,7 @@ FUNCTION f_lammps_extract_global_natoms () BIND(C) END FUNCTION f_lammps_extract_global_natoms FUNCTION f_lammps_extract_global_natoms_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: natoms @@ -284,7 +284,7 @@ END FUNCTION f_lammps_extract_global_natoms_big FUNCTION f_lammps_extract_global_nbonds () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nbonds @@ -295,7 +295,7 @@ FUNCTION f_lammps_extract_global_nbonds () BIND(C) END FUNCTION f_lammps_extract_global_nbonds FUNCTION f_lammps_extract_global_nbonds_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: nbonds @@ -307,7 +307,7 @@ END FUNCTION f_lammps_extract_global_nbonds_big FUNCTION f_lammps_extract_global_nangles () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nangles @@ -318,7 +318,7 @@ FUNCTION f_lammps_extract_global_nangles () BIND(C) END FUNCTION f_lammps_extract_global_nangles FUNCTION f_lammps_extract_global_nangles_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: nangles @@ -330,7 +330,7 @@ END FUNCTION f_lammps_extract_global_nangles_big FUNCTION f_lammps_extract_global_ndihedrals () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: ndihedrals @@ -341,7 +341,7 @@ FUNCTION f_lammps_extract_global_ndihedrals () BIND(C) END FUNCTION f_lammps_extract_global_ndihedrals FUNCTION f_lammps_extract_global_ndihedrals_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: ndihedrals @@ -353,7 +353,7 @@ END FUNCTION f_lammps_extract_global_ndihedrals_big FUNCTION f_lammps_extract_global_nimpropers () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nimpropers @@ -364,7 +364,7 @@ FUNCTION f_lammps_extract_global_nimpropers () BIND(C) END FUNCTION f_lammps_extract_global_nimpropers FUNCTION f_lammps_extract_global_nimpropers_big () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int64_t), POINTER :: nimpropers @@ -377,7 +377,7 @@ END FUNCTION f_lammps_extract_global_nimpropers_big FUNCTION f_lammps_extract_global_ntypes () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: ntypes @@ -389,7 +389,7 @@ END FUNCTION f_lammps_extract_global_ntypes FUNCTION f_lammps_extract_global_nlocal () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nlocal @@ -401,7 +401,7 @@ END FUNCTION f_lammps_extract_global_nlocal FUNCTION f_lammps_extract_global_nghost () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nghost @@ -413,7 +413,7 @@ END FUNCTION f_lammps_extract_global_nghost FUNCTION f_lammps_extract_global_nmax () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int), POINTER :: nmax @@ -425,7 +425,7 @@ END FUNCTION f_lammps_extract_global_nmax FUNCTION f_lammps_extract_global_boltz () BIND(C) RESULT(C_k_B) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_k_B @@ -437,7 +437,7 @@ END FUNCTION f_lammps_extract_global_boltz FUNCTION f_lammps_extract_global_hplanck () BIND(C) RESULT(C_h) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: C_h @@ -449,7 +449,7 @@ END FUNCTION f_lammps_extract_global_hplanck FUNCTION f_lammps_extract_global_angstrom () BIND(C) RESULT(Angstrom) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: Angstrom @@ -461,7 +461,7 @@ END FUNCTION f_lammps_extract_global_angstrom FUNCTION f_lammps_extract_global_femtosecond () BIND(C) RESULT(fs) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE REAL (C_double) :: fs diff --git a/unittest/fortran/test_fortran_get_thermo.f90 b/unittest/fortran/test_fortran_get_thermo.f90 index 2b11470090..d1b193e188 100644 --- a/unittest/fortran/test_fortran_get_thermo.f90 +++ b/unittest/fortran/test_fortran_get_thermo.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_with_args() BIND(C) USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepglobal, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args @@ -16,7 +16,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepglobal, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -25,10 +25,10 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_get_thermo_setup () BIND(C) USE liblammps - USE keepglobal, ONLY : lmp, demo_input, cont_input, pair_input + USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) CALL lmp%commands_list(pair_input) END SUBROUTINE f_lammps_get_thermo_setup @@ -36,7 +36,7 @@ END SUBROUTINE f_lammps_get_thermo_setup FUNCTION f_lammps_get_thermo_natoms () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_natoms @@ -46,7 +46,7 @@ END FUNCTION f_lammps_get_thermo_natoms FUNCTION f_lammps_get_thermo_dt () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_dt @@ -56,7 +56,7 @@ END FUNCTION f_lammps_get_thermo_dt FUNCTION f_lammps_get_thermo_vol () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_vol @@ -66,7 +66,7 @@ END FUNCTION f_lammps_get_thermo_vol FUNCTION f_lammps_get_thermo_lx () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_lx @@ -76,7 +76,7 @@ END FUNCTION f_lammps_get_thermo_lx FUNCTION f_lammps_get_thermo_ly () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_ly @@ -86,7 +86,7 @@ END FUNCTION f_lammps_get_thermo_ly FUNCTION f_lammps_get_thermo_lz () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_lz @@ -96,7 +96,7 @@ END FUNCTION f_lammps_get_thermo_lz FUNCTION f_lammps_get_thermo_xlo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_xlo @@ -106,7 +106,7 @@ END FUNCTION f_lammps_get_thermo_xlo FUNCTION f_lammps_get_thermo_xhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_xhi @@ -116,7 +116,7 @@ END FUNCTION f_lammps_get_thermo_xhi FUNCTION f_lammps_get_thermo_ylo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_ylo @@ -126,7 +126,7 @@ END FUNCTION f_lammps_get_thermo_ylo FUNCTION f_lammps_get_thermo_yhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_yhi @@ -136,7 +136,7 @@ END FUNCTION f_lammps_get_thermo_yhi FUNCTION f_lammps_get_thermo_zlo () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_zlo @@ -146,7 +146,7 @@ END FUNCTION f_lammps_get_thermo_zlo FUNCTION f_lammps_get_thermo_zhi () BIND (C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps - USE keepglobal, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (c_double) :: f_lammps_get_thermo_zhi diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 00e083b301..ab1c32738b 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -1,7 +1,7 @@ FUNCTION f_lammps_version () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_version @@ -11,7 +11,7 @@ END FUNCTION f_lammps_version SUBROUTINE f_lammps_memory_usage (meminfo) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL (C_double), DIMENSION(3), INTENT(OUT) :: meminfo @@ -21,7 +21,7 @@ END SUBROUTINE f_lammps_memory_usage FUNCTION f_lammps_get_mpi_comm () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE liblammps - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER (C_int) :: f_lammps_get_mpi_comm @@ -30,7 +30,7 @@ END FUNCTION f_lammps_get_mpi_comm FUNCTION f_lammps_extract_setting (Cstr) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER (C_int) :: f_lammps_extract_setting From 3ab8f6ea163bbcd2cd17c3aadc09af890e5b0442 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 29 Sep 2022 09:14:49 -0500 Subject: [PATCH 249/364] Finished docs for everything currently implemented --- doc/src/Fortran.rst | 105 +++++++++++++++++++++++++++++++----- doc/src/Library_objects.rst | 1 + src/library.cpp | 16 +++--- 3 files changed, 102 insertions(+), 20 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 9bcf34a2d1..d041946470 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -649,7 +649,40 @@ Procedures Bound to the lammps Derived Type will print the *y*-coordinate of the sixth atom on this processor (note the transposition of the two indices). This is not a choice, but rather a consequence of the different conventions adopted by the Fortran - and C standards decades ago. + and C standards decades ago: in C, the block of data + + .. parsed-literal:: + + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + + interpreted as a :math:`4\times4` matrix would be + + .. math:: + + \begin{bmatrix} + 1 & 2 & 3 & 4 \\ + 5 & 6 & 7 & 8 \\ + 9 & 10 & 11 & 12 \\ + 13 & 14 & 15 & 16 + \end{bmatrix}, + + that is, in row-major order. In Fortran, the same block of data is + interpreted in column-major order, namely, + + .. math:: + + \begin{bmatrix} + 1 & 5 & 9 & 13 \\ + 2 & 6 & 10 & 14 \\ + 3 & 7 & 11 & 15 \\ + 4 & 8 & 12 & 16 + \end{bmatrix}. + + This difference in interpretation of the same block of data by the two + languages means, in effect, that matrices from C or C++ will be + transposed when interpreted in Fortran. + + .. note:: If you would like the indices to start at 0 instead of 1 (which follows typical notation in C and C++, but not Fortran), you can create another @@ -776,7 +809,7 @@ Procedures Bound to the lammps Derived Type -------- -.. f:function:: extract_fix(id, style, type, [nrow,] [ncol]) +.. f:function:: extract_fix(id, style, type[, nrow][, ncol]) This function calls :c:func:`lammps_extract_fix` and returns a pointer to LAMMPS data tied to the :cpp:class:`Fix` class, specifically data provided @@ -884,7 +917,9 @@ Procedures Bound to the lammps Derived Type be of type ``REAL(C_double)`` and have appropriate rank (i.e., ``DIMENSION(:)`` if expecting per-atom or local vector data and ``DIMENSION(:,:)`` if expecting per-atom or local array data). If expecting - global or per-atom data, it should have the ``POINTER`` attribute. + local or per-atom data, it should have the ``POINTER`` attribute, but + if expecting global data, it should be an ordinary (non-``POINTER``) + variable. .. admonition:: Array index order @@ -970,26 +1005,72 @@ Procedures Bound to the lammps Derived Type .. f:subroutine:: flush_buffers -.. - TODO + This function calls :cpp:func:`lammps_flush_buffers`, which flushes buffered + output to be written to screen and logfile. This can simplify capturing + output from LAMMPS library calls. + + .. versionadded:: TBD -------- .. f:function:: is_running -.. - TODO + Check if LAMMPS is currently inside a run or minimization. + + .. versionadded:: TBD + + This function can be used from signal handlers or multi-threaded + applications to determine if the LAMMPS instance is currently active. + + :r logical: ``.FALSE.`` if idle or ``.TRUE.`` if active -------- .. f:function:: has_error -.. - TODO + Check if there is a (new) error message available. + + .. versionadded:: TBD + + This function can be used to query if an error inside of LAMMPS + has thrown a :ref:`C++ exception `. + + .. note:: + + This function will always report "no error" when the LAMMPS library + has been compiled without ``-DLAMMPS_EXCEPTIONS``, which turns fatal + errors aborting LAMMPS into C++ exceptions. You can use the library + function :cpp:func:`lammps_config_has_exceptions` to check if this is + the case. + + :r logical: ``.TRUE.`` if there is an error. -------- -.. f:subroutine:: get_last_error_message +.. f:subroutine:: get_last_error_message(buffer[,status]) -.. - TODO + Copy the last error message into the provided buffer. + + .. versionadded:: TBD + + This function can be used to retrieve the error message that was set + in the event of an error inside of LAMMPS that resulted in a + :ref:`C++ exception `. A suitable buffer for a string has + to be provided. If the internally-stored error message is longer than the + string and the string does not have ``ALLOCATABLE`` length, it will be + truncated accordingly. The optional argument *status* indicates the + kind of error: a "1" indicates an error that occurred on all MPI ranks and + is often recoverable, while a "2" indicates an abort that would happen only + in a single MPI rank and thus may not be recoverable, as other MPI ranks may + be waiting on the failing MPI rank(s) to send messages. + + .. note:: + + This function will do nothing when the LAMMPS library has been + compiled without ``-DLAMMPS_EXCEPTIONS``, which turns errors aborting + LAMMPS into C++ exceptions. You can use the function + :f:func:`config_has_exceptions` to check whethher this is the case. + + :p character(len=\*) buffer: string buffer to copy the error message into + :o integer(C_int) status [optional]: 1 when all ranks had the error, + 2 on a single-rank error. diff --git a/doc/src/Library_objects.rst b/doc/src/Library_objects.rst index 6604236f5e..8ebecfcc94 100644 --- a/doc/src/Library_objects.rst +++ b/doc/src/Library_objects.rst @@ -6,6 +6,7 @@ fixes, or variables in LAMMPS using the following functions: - :cpp:func:`lammps_extract_compute` - :cpp:func:`lammps_extract_fix` +- :cpp:func:`lammps_extract_variable_datatype` - :cpp:func:`lammps_extract_variable` - :cpp:func:`lammps_set_variable` diff --git a/src/library.cpp b/src/library.cpp index bb9d42aa99..cd4742a2e4 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2139,7 +2139,7 @@ with the specified name. See :cpp:enum:`_LMP_VAR_CONST` for valid values. Callers of :cpp:func:`lammps_extract_variable` can use this information to decide how to cast the (void*) pointer and access the data. -..versionadded:: TBD +.. versionadded:: TBD \endverbatim * @@ -5635,9 +5635,9 @@ has thrown a :ref:`C++ exception `. .. note:: This function will always report "no error" when the LAMMPS library - has been compiled without ``-DLAMMPS_EXCEPTIONS`` which turns fatal - errors aborting LAMMPS into a C++ exceptions. You can use the library - function :cpp:func:`lammps_config_has_exceptions` to check if this is + has been compiled without ``-DLAMMPS_EXCEPTIONS``, which turns fatal + errors aborting LAMMPS into C++ exceptions. You can use the library + function :cpp:func:`lammps_config_has_exceptions` to check whether this is the case. \endverbatim * @@ -5667,15 +5667,15 @@ error message is longer, it will be truncated accordingly. The return value of the function corresponds to the kind of error: a "1" indicates an error that occurred on all MPI ranks and is often recoverable, while a "2" indicates an abort that would happen only in a single MPI rank -and thus may not be recoverable as other MPI ranks may be waiting on +and thus may not be recoverable, as other MPI ranks may be waiting on the failing MPI ranks to send messages. .. note:: This function will do nothing when the LAMMPS library has been - compiled without ``-DLAMMPS_EXCEPTIONS`` which turns errors aborting - LAMMPS into a C++ exceptions. You can use the library function - :cpp:func:`lammps_config_has_exceptions` to check if this is the case. + compiled without ``-DLAMMPS_EXCEPTIONS``, which turns errors aborting + LAMMPS into C++ exceptions. You can use the library function + :cpp:func:`lammps_config_has_exceptions` to check whether this is the case. \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. From c6eb6d858b7a62d7a7344fcef776b36c3b273786 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Sep 2022 12:04:43 -0400 Subject: [PATCH 250/364] implement numbered equations and equation references --- doc/src/Howto_peri.rst | 70 ++++++++++++------- .../sphinx-config/_static/css/lammps.css | 8 +++ 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst index 99586da888..ff303f16aa 100644 --- a/doc/src/Howto_peri.rst +++ b/doc/src/Howto_peri.rst @@ -130,13 +130,15 @@ notation of :ref:`(Silling 2007) `, we write the peridynamic equation of motion as .. math:: - + :label: periNewtonII \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = - \int_{\mathcal{H}_{\mathbf{x}}} \left\{ \underline{\mathbf{T}}\left[ - \mathbf{x},t \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> - - \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} - {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), + \int_{\mathcal{H}_{\mathbf{x}}} \left\{ + \underline{\mathbf{T}}\left[\mathbf{x},t + \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> - + \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t + \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), where :math:`\rho` represents the mass density, :math:`\underline{\mathbf{T}}` the force vector state, and @@ -147,7 +149,7 @@ where :math:`\rho` represents the mass density, radius :math:`\delta>0` centered at :math:`\mathbf{x}`. :math:`\delta` is called the *horizon*, and is analogous to the cutoff radius used in molecular dynamics. Conditions on :math:`\underline{\mathbf{T}}` for -which \eqref{eqn:NewtonII} satisfies the balance of linear and angular +which :math:numref:`periNewtonII` satisfies the balance of linear and angular momentum are given in :ref:`(Silling 2007) `. We consider only force vector states that can be written as @@ -161,6 +163,7 @@ with :math:`\underline{t}` a *scalar force state* and state*, defined by .. math:: + :label: periM \underline{\mathbf{M}}\left< \boldsymbol{\xi} \right> = \left\{ \begin{array}{cl} @@ -192,6 +195,7 @@ along with the horizon :math:`\delta`. The LPS model has a force scalar state .. math:: + :label: periLPSState \underline{t} = \frac{3K\theta}{m}\underline{\omega}\,\underline{x} + \alpha \underline{\omega}\,\underline{e}^{\rm d}, @@ -210,6 +214,7 @@ the reference position scalar state :math:`\underline{x}` so that defined as .. math:: + :label: periWeightedVolume m\left[ \mathbf{x} \right] = \int_{\mathcal{H}_\mathbf{x}} \underline{\omega} \left<\boldsymbol{\xi}\right> @@ -291,6 +296,7 @@ and the horizon :math:`\delta`. The PMB model is expressed using the scalar force state field .. math:: + :label: periPMBState \underline{t}\left[ \mathbf{x},t \right]\left< \boldsymbol{\xi} \right> = \frac{1}{2} f\left( \boldsymbol{\eta} ,\boldsymbol{\xi} \right), @@ -298,17 +304,21 @@ with :math:`f` a scalar-valued function. We assume that :math:`f` takes the form .. math:: + f = c s, where .. math:: + :label: peric + c = \frac{18K}{\pi \delta^4}, with :math:`K` the bulk modulus and :math:`\delta` the horizon, and :math:`s` the bond stretch, defined as .. math:: + :label: peristretch s(t,\mathbf{\eta},\mathbf{\xi}) = \frac{ \left\Vert {\mathbf{\eta}+\mathbf{\xi}} \right\Vert - \left\Vert {\mathbf{\xi}} \right\Vert }{\left\Vert {\mathbf{\xi}} \right\Vert}. @@ -320,9 +330,10 @@ appropriate for 3D models only. For more on the origins of the constant :math:`c`, see :ref:`(Silling 2005) `. For the derivation of :math:`c` for 1D and 2D models, see :ref:`(Emmrich) `. -Given \eqref{eqn:PMBState}, \eqref{eqn:NewtonII} reduces to +Given :math:numref:`periPMBState`, :math:numref:`periNewtonII` reduces to .. math:: + :label: periPMBEOM \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_\mathbf{x}} \mathbf{f} \left( \boldsymbol{\eta},\boldsymbol{\xi} \right){d}V_{\boldsymbol{\xi}} + \mathbf{b}(\mathbf{x},t), @@ -352,6 +363,7 @@ Define :math:`\mu` to be the history-dependent scalar boolean function .. math:: + :label: perimu \mu(t,\mathbf{\eta},\mathbf{\xi}) = \left\{ \begin{array}{cl} @@ -366,6 +378,7 @@ where :math:`\mathbf{\eta}^\prime = \textbf{u}(\textbf{x}^{\prime critical stretch defined as .. math:: + :label: peris0 s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), @@ -388,6 +401,7 @@ Following :ref:`(Silling) `, we can define the damage at a point :math:`\textbf{x}` as .. math:: + :label: peridamage \varphi(\textbf{x}, t) = 1 - \frac{\int_{\mathcal{H}_{\textbf{x}}} \mu(t,\mathbf{\eta},\mathbf{\xi}) dV_{\textbf{x}^\prime} }{ \int_{\mathcal{H}_{\textbf{x}}} dV_{\textbf{x}^\prime} }. @@ -395,7 +409,7 @@ point :math:`\textbf{x}` as Discrete Peridynamic Model and LAMMPS Implementation """""""""""""""""""""""""""""""""""""""""""""""""""" -In LAMMPS, instead of \eqref{eqn:NewtonII}, we model this equation of +In LAMMPS, instead of :math:numref:`periNewtonII`, we model this equation of motion: .. math:: @@ -409,7 +423,7 @@ where we explicitly track and store at each timestep the positions and not the displacements of the particles. We observe that :math:`\ddot{\textbf{y}}(\textbf{x}, t) = \ddot{\textbf{x}} + \ddot{\textbf{u}}(\textbf{x}, t) = \ddot{\textbf{u}}(\textbf{x}, t)`, so -that this is equivalent to \eqref{eqn:NewtonII}. +that this is equivalent to :math:numref:`periNewtonII`. Spatial Discretization ^^^^^^^^^^^^^^^^^^^^^^ @@ -422,12 +436,14 @@ denote the family of particles for which particle :math:`i` shares a bond in the reference configuration. That is, .. math:: + :label: periBondFamily \mathcal{F}_i = \{ p ~ | ~ \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert \leq \delta \}. -The discretized equation of motion replaces \eqref{eqn:NewtonII} with +The discretized equation of motion replaces :math:numref:`periNewtonII` with .. math:: + :label: peridiscreteNewtonII \rho \ddot{\textbf{y}}_i^n = \sum_{p \in \mathcal{F}_i} @@ -444,25 +460,29 @@ In the model discussed so far, particles interact only through their bond forces. A particle with no bonds becomes a free non-interacting particle. To account for contact forces, short-range forces are introduced :ref:`(Silling 2007) `. We add to the force in -\eqref{eqn:discreteNewtonII} the following force +:math:numref:`peridiscreteNewtonII` the following force .. math:: + :label: perifS \textbf{f}_S(\textbf{y}_p,\textbf{y}_i) = \min \left\{ 0, \frac{c_S}{\delta}(\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert - d_{pi}) \right\} \frac{\textbf{y}_p-\textbf{y}_i}{\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert}, where :math:`d_{pi}` is the short-range interaction distance between particles :math:`p` and :math:`i`, and :math:`c_S` is a multiple of the -constant :math:`c` from \eqref{eqn:c}. Note that the short-range force +constant :math:`c` from :math:numref:`peric`. Note that the short-range force is always repulsive, never attractive. In practice, we choose .. math:: + :label: pericS + c_S = 15 \frac{18K}{\pi \delta^4}. For the short-range interaction distance, we choose :ref:`(Silling 2007) ` .. math:: + :label: perid d_{pi} = \min \left\{ 0.9 \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert, 1.35 (r_p + r_i) \right\}, @@ -488,16 +508,16 @@ short-range family of particles Modification to the Particle Volume ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The right-hand side of \eqref{eqn:discreteNewtonII} may be thought of as -a midpoint quadrature of \eqref{eqn:NewtonII}. To slightly improve the +The right-hand side of :math:numref:`peridiscreteNewtonII` may be thought of as +a midpoint quadrature of :math:numref:`periNewtonII`. To slightly improve the accuracy of this quadrature, we discuss a modification to the particle -volume used in \eqref{eqn:discreteNewtonII}. In a situation where two +volume used in :math:numref:`peridiscreteNewtonII`. In a situation where two particles share a bond with :math:`\left\Vert { \textbf{x}_p - \textbf{x}_i }\right\Vert = \delta`, for example, we suppose that only approximately half the volume of each particle is "seen" by the other :ref:`(Silling 2007) `. When computing the force of each particle on the other we use :math:`V_p / 2` rather than :math:`V_p` in -\eqref{eqn:discreteNewtonII}. As such, we introduce a nodal volume +:math:numref:`peridiscreteNewtonII`. As such, we introduce a nodal volume scaling function for all bonded particles where :math:`\delta - r_i \leq \left\Vert { \textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta` (see the Figure below). @@ -555,12 +575,12 @@ Breaking Bonds During the course of simulation, it may be necessary to break bonds, as described in the :ref:`Damage section `. Bonds are recorded as broken in a simulation by removing them from the bond family -:math:`\mathcal{F}_i` (see \eqref{eqn:BondFamily}). +:math:`\mathcal{F}_i` (see :math:numref:`periBondFamily`). A naive implementation would have us first loop over all bonds and -compute :math:`s_{min}` in \eqref{eqn:s0}, then loop over all bonds +compute :math:`s_{min}` in :math:numref:`peris0`, then loop over all bonds again and break bonds with a stretch :math:`s > s0` as in -\eqref{eqn:mu}, and finally loop over all particles and compute forces +:math:numref:`perimu`, and finally loop over all particles and compute forces for the next step of :ref:`Algorithm 1 `. For reasons of computational efficiency, we will utilize the values of :math:`s_0` from the *previous* timestep when deciding to break a bond. @@ -602,7 +622,7 @@ routines in :ref:`Algorithm 3 ` and :ref:`Algorithm 4 | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} - | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in \eqref{eqn:cS}*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :math:numref:`pericS`*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **end for** | **end for** @@ -675,7 +695,7 @@ A sketch of the PMB model implementation in the PERI package appears in | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} - | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in \eqref{eqn:cS}*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :math:numref:`pericS`*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **end for** | **end for** @@ -684,7 +704,7 @@ A sketch of the PMB model implementation in the PERI package appears in | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = r - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` - | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in \eqref{eqn:c}*} + | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in :math:numref:`peric`*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** | Break :math:`i`'s bond with :math:`j` {:math:`j`\ *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} @@ -699,7 +719,7 @@ A sketch of the PMB model implementation in the PERI package appears in Damage ^^^^^^ -The damage associated with every particle (see \eqref{eqn:damage}) can +The damage associated with every particle (see :math:numref:`peridamage`) can optionally be computed and output with a LAMMPS data dump. To do this, your input script must contain the command :doc:`compute damage/atom ` This enables a LAMMPS per-atom compute to @@ -880,7 +900,7 @@ three times the lattice constant.) The target is a cylinder of diameter lattice contains 103,110 particles. Each particle :math:`i` has volume fraction :math:`V_i = 1.25 \times 10^{-10} \textrm{m}^3`. -The spring constant in the PMB material model is (see \eqref{eqn:c}) +The spring constant in the PMB material model is (see :math:numref:`peric`) .. math:: c = \frac{18k}{\pi \delta^4} = \frac{18 (14.9 \times 10^9)}{ \pi (1.5 \times 10^{-3})^4} \approx 1.6863 \times 10^{22}. @@ -927,7 +947,7 @@ the distance from the atom to the center of the indenter, and :math:`R` is the radius of the projectile. The force is repulsive and :math:`F(r) = 0` for :math:`r > R`. For our problem, the projectile radius :math:`R = 0.05` m, and we have chosen :math:`k_s = 1.0 \times 10^{17}` (compare -with \eqref{eqn:c} above). +with :math:numref:`peric` above). Writing the LAMMPS Input File ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/utils/sphinx-config/_static/css/lammps.css b/doc/utils/sphinx-config/_static/css/lammps.css index cbf08c3da1..2a5b425535 100644 --- a/doc/utils/sphinx-config/_static/css/lammps.css +++ b/doc/utils/sphinx-config/_static/css/lammps.css @@ -1,3 +1,11 @@ +.math { + text-align: left; +} + +.eqno { + float: right; +} + .wy-nav-content { max-width: 100% !important; } From 6962b43e701987357b8031484fa4372908e58c35 Mon Sep 17 00:00:00 2001 From: Evan Weinberg Date: Thu, 29 Sep 2022 09:56:20 -0700 Subject: [PATCH 251/364] Pack idxcg_block in with idxz --- src/KOKKOS/pair_snap_kokkos.h | 4 ++-- src/KOKKOS/sna_kokkos.h | 16 ++++++++------- src/KOKKOS/sna_kokkos_impl.h | 37 ++++++++++++++++++++++------------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h index 86b9f0d492..b8160c318b 100644 --- a/src/KOKKOS/pair_snap_kokkos.h +++ b/src/KOKKOS/pair_snap_kokkos.h @@ -103,10 +103,10 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int tile_size_pre_ui = 4; static constexpr int team_size_compute_ui = sizeof(real_type) == 4 ? 8 : 4; static constexpr int tile_size_transform_ui = 4; - static constexpr int tile_size_compute_zi = 4; + static constexpr int tile_size_compute_zi = 8; static constexpr int tile_size_compute_bi = 4; static constexpr int tile_size_transform_bi = 4; - static constexpr int tile_size_compute_yi = 4; + static constexpr int tile_size_compute_yi = 8; static constexpr int team_size_compute_fused_deidrj = sizeof(real_type) == 4 ? 4 : 2; #endif diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h index 62567c71a7..2efd9133ac 100644 --- a/src/KOKKOS/sna_kokkos.h +++ b/src/KOKKOS/sna_kokkos.h @@ -67,19 +67,19 @@ struct alignas(8) FullHalfMapper { struct alignas(16) idxz_struct { reax_int4 j1_j2_j_jjuhalf; reax_int4 mabminmax; - reax_int4 nanb; + reax_int4 nanb_idxcg; idxz_struct() = default; KOKKOS_INLINE_FUNCTION - idxz_struct(int j1, int j2, int j, int ma1min, int ma2max, int mb1min, int mb2max, int na, int nb, int jju_half) + idxz_struct(int j1, int j2, int j, int ma1min, int ma2max, int mb1min, int mb2max, int na, int nb, int jju_half, int idxcg) : j1_j2_j_jjuhalf{j1, j2, j, jju_half}, mabminmax{ma1min, ma2max, mb1min, mb2max}, - nanb{na, nb, 0, 0} + nanb_idxcg{na, nb, idxcg, 0} { } KOKKOS_INLINE_FUNCTION - void get_zi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb) { + void get_zi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb, int &idxcg) { reax_int4 pack1 = this->j1_j2_j_jjuhalf; j1 = pack1.i0; j2 = pack1.i1; @@ -89,13 +89,14 @@ struct alignas(16) idxz_struct { ma2max = pack2.i1; mb1min = pack2.i2; mb2max = pack2.i3; - reax_int4 pack3 = this->nanb; + reax_int4 pack3 = this->nanb_idxcg; na = pack3.i0; nb = pack3.i1; + idxcg = pack3.i2; } KOKKOS_INLINE_FUNCTION - void get_yi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb, int& jju_half) { + void get_yi(int &j1, int &j2, int &j, int &ma1min, int &ma2max, int &mb1min, int &mb2max, int &na, int &nb, int& jju_half, int& idxcg) { reax_int4 pack1 = this->j1_j2_j_jjuhalf; j1 = pack1.i0; j2 = pack1.i1; @@ -106,9 +107,10 @@ struct alignas(16) idxz_struct { ma2max = pack2.i1; mb1min = pack2.i2; mb2max = pack2.i3; - reax_int4 pack3 = this->nanb; + reax_int4 pack3 = this->nanb_idxcg; na = pack3.i0; nb = pack3.i1; + idxcg = pack3.i2; } KOKKOS_INLINE_FUNCTION diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h index ee2237d31d..2769d132cb 100644 --- a/src/KOKKOS/sna_kokkos_impl.h +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -241,7 +241,9 @@ void SNAKokkos::build_indexlist() MemKK::realloc_kokkos(idxz_block,"SNAKokkos::idxz_block", jdim,jdim,jdim); auto h_idxz_block = Kokkos::create_mirror_view(idxz_block); + // fused table for idxz and idxcg_block idxz_count = 0; + idxcg_count = 0; for (int j1 = 0; j1 <= twojmax; j1++) for (int j2 = 0; j2 <= j1; j2++) for (int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { @@ -251,7 +253,7 @@ void SNAKokkos::build_indexlist() // multiply and divide by j+1 factors // account for multiplicity of 1, 2, or 3 - for (int mb = 0; 2*mb <= j; mb++) + for (int mb = 0; 2*mb <= j; mb++) { for (int ma = 0; ma <= j; ma++) { int ma1min = MAX(0, (2 * ma - j - j2 + j1) / 2); int ma2max = (2 * ma - j - (2 * ma1min - j1) + j2) / 2; @@ -266,11 +268,18 @@ void SNAKokkos::build_indexlist() const int jju_half = h_idxu_half_block[j] + (j+1)*mb + ma; // idxz_struct's constructor handles all of the data packing - h_idxz(idxz_count) = idxz_struct(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); + h_idxz(idxz_count) = idxz_struct(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg_count); idxz_count++; } + } + + // there are different loop bounds for idxcg_count + for (int m1 = 0; m1 <= j1; m1++) + for (int m2 = 0; m2 <= j2; m2++) + idxcg_count++; } + Kokkos::deep_copy(idxz,h_idxz); Kokkos::deep_copy(idxz_block,h_idxz_block); @@ -662,10 +671,10 @@ KOKKOS_INLINE_FUNCTION void SNAKokkos::compute_zi(const int& iatom_mod, const int& jjz, const int& iatom_div) { - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb; - idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg; + idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg); - const real_type* cgblock = cglist.data() + idxcg_block(j1, j2, j); + const real_type* cgblock = cglist.data() + idxcg; int idouble = 0; @@ -784,10 +793,10 @@ void SNAKokkos::compute_yi(int iatom_mod, const Kokkos::View &beta_pack) { - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half; - idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg; + idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg); - const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); + const real_type *cgblock = cglist.data() + idxcg; //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; //int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; @@ -1242,10 +1251,10 @@ void SNAKokkos::compute_zi_cpu(const int& const int iatom = iter / idxz_max; const int jjz = iter % idxz_max; - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb; - idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg; + idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg); - const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); + const real_type *cgblock = cglist.data() + idxcg; int idouble = 0; @@ -1405,10 +1414,10 @@ void SNAKokkos::compute_yi_cpu(int iter, const int iatom = iter / idxz_max; const int jjz = iter % idxz_max; - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half; - idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg; + idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg); - const real_type *cgblock = cglist.data() + idxcg_block(j1,j2,j); + const real_type *cgblock = cglist.data() + idxcg; //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; //int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; From 09948f11bed1f9f2657319dce212f0eb0c1e8f31 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Sep 2022 13:54:09 -0400 Subject: [PATCH 252/364] make equation references explicit since .. math:: + :label: does not work with latex --- doc/src/Howto_peri.rst | 119 +++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/doc/src/Howto_peri.rst b/doc/src/Howto_peri.rst index ff303f16aa..4c78d04833 100644 --- a/doc/src/Howto_peri.rst +++ b/doc/src/Howto_peri.rst @@ -129,8 +129,9 @@ collectively on all points interacting with that point. Using the notation of :ref:`(Silling 2007) `, we write the peridynamic equation of motion as +.. _periNewtonII: + .. math:: - :label: periNewtonII \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_{\mathbf{x}}} \left\{ @@ -138,7 +139,7 @@ peridynamic equation of motion as \right]\left<\mathbf{x}^{\prime}-\mathbf{x} \right> - \underline{\mathbf{T}}\left[\mathbf{x}^{\prime},t \right]\left<\mathbf{x}-\mathbf{x}^{\prime} \right> \right\} - {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), + {d}V_{\mathbf{x}^\prime} + \mathbf{b}(\mathbf{x},t), \qquad\qquad\textrm{(1)} where :math:`\rho` represents the mass density, :math:`\underline{\mathbf{T}}` the force vector state, and @@ -149,7 +150,7 @@ where :math:`\rho` represents the mass density, radius :math:`\delta>0` centered at :math:`\mathbf{x}`. :math:`\delta` is called the *horizon*, and is analogous to the cutoff radius used in molecular dynamics. Conditions on :math:`\underline{\mathbf{T}}` for -which :math:numref:`periNewtonII` satisfies the balance of linear and angular +which :ref:`(1) ` satisfies the balance of linear and angular momentum are given in :ref:`(Silling 2007) `. We consider only force vector states that can be written as @@ -163,7 +164,6 @@ with :math:`\underline{t}` a *scalar force state* and state*, defined by .. math:: - :label: periM \underline{\mathbf{M}}\left< \boldsymbol{\xi} \right> = \left\{ \begin{array}{cl} @@ -172,7 +172,7 @@ state*, defined by } & \left\Vert \boldsymbol{\xi} + \boldsymbol{\eta} \right\Vert \neq 0 \\ \boldsymbol{0} & \textrm{otherwise} \end{array} - \right. . + \right. . \qquad\qquad\textrm{(2)} Such force states correspond to so-called *ordinary* materials :ref:`(Silling 2007) `. These are the materials for which @@ -195,10 +195,9 @@ along with the horizon :math:`\delta`. The LPS model has a force scalar state .. math:: - :label: periLPSState \underline{t} = \frac{3K\theta}{m}\underline{\omega}\,\underline{x} + - \alpha \underline{\omega}\,\underline{e}^{\rm d}, + \alpha \underline{\omega}\,\underline{e}^{\rm d}, \qquad\qquad\textrm{(3)} with :math:`K` the bulk modulus and :math:`\alpha` related to the shear modulus :math:`G` as @@ -214,12 +213,11 @@ the reference position scalar state :math:`\underline{x}` so that defined as .. math:: - :label: periWeightedVolume m\left[ \mathbf{x} \right] = \int_{\mathcal{H}_\mathbf{x}} \underline{\omega} \left<\boldsymbol{\xi}\right> \underline{x}\left<\boldsymbol{\xi} \right> - \underline{x}\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi} }. + \underline{x}\left<\boldsymbol{\xi} \right>{d}V_{\boldsymbol{\xi} }. \qquad\qquad\textrm{(4)} Let @@ -295,10 +293,11 @@ and the horizon :math:`\delta`. The PMB model is expressed using the scalar force state field -.. math:: - :label: periPMBState +.. _periPMBState: - \underline{t}\left[ \mathbf{x},t \right]\left< \boldsymbol{\xi} \right> = \frac{1}{2} f\left( \boldsymbol{\eta} ,\boldsymbol{\xi} \right), +.. math:: + + \underline{t}\left[ \mathbf{x},t \right]\left< \boldsymbol{\xi} \right> = \frac{1}{2} f\left( \boldsymbol{\eta} ,\boldsymbol{\xi} \right), \qquad\qquad\textrm{(5)} with :math:`f` a scalar-valued function. We assume that :math:`f` takes the form @@ -309,16 +308,16 @@ the form where -.. math:: - :label: peric +.. _peric: - c = \frac{18K}{\pi \delta^4}, +.. math:: + + c = \frac{18K}{\pi \delta^4}, \qquad\qquad\textrm{(6)} with :math:`K` the bulk modulus and :math:`\delta` the horizon, and :math:`s` the bond stretch, defined as .. math:: - :label: peristretch s(t,\mathbf{\eta},\mathbf{\xi}) = \frac{ \left\Vert {\mathbf{\eta}+\mathbf{\xi}} \right\Vert - \left\Vert {\mathbf{\xi}} \right\Vert }{\left\Vert {\mathbf{\xi}} \right\Vert}. @@ -330,12 +329,11 @@ appropriate for 3D models only. For more on the origins of the constant :math:`c`, see :ref:`(Silling 2005) `. For the derivation of :math:`c` for 1D and 2D models, see :ref:`(Emmrich) `. -Given :math:numref:`periPMBState`, :math:numref:`periNewtonII` reduces to +Given :ref:`(5) `, :ref:`(1) ` reduces to .. math:: - :label: periPMBEOM - \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_\mathbf{x}} \mathbf{f} \left( \boldsymbol{\eta},\boldsymbol{\xi} \right){d}V_{\boldsymbol{\xi}} + \mathbf{b}(\mathbf{x},t), + \rho(\mathbf{x}) \ddot{\mathbf{u}}(\mathbf{x},t) = \int_{\mathcal{H}_\mathbf{x}} \mathbf{f} \left( \boldsymbol{\eta},\boldsymbol{\xi} \right){d}V_{\boldsymbol{\xi}} + \mathbf{b}(\mathbf{x},t), \qquad\qquad\textrm{(7)} with @@ -362,14 +360,15 @@ the *critical stretch* criterion. Define :math:`\mu` to be the history-dependent scalar boolean function +.. _perimu: + .. math:: - :label: perimu \mu(t,\mathbf{\eta},\mathbf{\xi}) = \left\{ \begin{array}{cl} 1 & \mbox{if $s(t^\prime,\mathbf{\eta},\mathbf{\xi})< \min \left(s_0(t^\prime,\mathbf{\eta},\mathbf{\xi}) , s_0(t^\prime,\mathbf{\eta}^\prime,\mathbf{\xi}^\prime) \right)$ for all $0 \leq t^\prime \leq t$} \\ 0 & \mbox{otherwise} - \end{array}\right\}. + \end{array}\right\}. \qquad\qquad\textrm{(8)} where :math:`\mathbf{\eta}^\prime = \textbf{u}(\textbf{x}^{\prime \prime},t) - \textbf{u}(\textbf{x}^\prime,t)` and @@ -377,10 +376,11 @@ where :math:`\mathbf{\eta}^\prime = \textbf{u}(\textbf{x}^{\prime \textbf{x}^\prime`. Here, :math:`s_0(t,\mathbf{\eta},\mathbf{\xi})` is a critical stretch defined as -.. math:: - :label: peris0 +.. _peris0: - s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), +.. math:: + + s_0(t,\mathbf{\eta},\mathbf{\xi}) = s_{00} - \alpha s_{\min}(t,\mathbf{\eta},\mathbf{\xi}), \qquad s_{\min}(t) = \min_{\mathbf{\xi}} s(t,\mathbf{\eta},\mathbf{\xi}), \qquad\qquad\textrm{(9)} where :math:`s_{00}` and :math:`\alpha` are material-dependent constants. The history function :math:`\mu` breaks bonds when the @@ -400,16 +400,17 @@ should be broken. Following :ref:`(Silling) `, we can define the damage at a point :math:`\textbf{x}` as +.. _peridamageeq: + .. math:: - :label: peridamage \varphi(\textbf{x}, t) = 1 - \frac{\int_{\mathcal{H}_{\textbf{x}}} \mu(t,\mathbf{\eta},\mathbf{\xi}) dV_{\textbf{x}^\prime} - }{ \int_{\mathcal{H}_{\textbf{x}}} dV_{\textbf{x}^\prime} }. + }{ \int_{\mathcal{H}_{\textbf{x}}} dV_{\textbf{x}^\prime} }. \qquad\qquad\textrm{(10)} Discrete Peridynamic Model and LAMMPS Implementation """""""""""""""""""""""""""""""""""""""""""""""""""" -In LAMMPS, instead of :math:numref:`periNewtonII`, we model this equation of +In LAMMPS, instead of :ref:`(1) `, we model this equation of motion: .. math:: @@ -423,7 +424,7 @@ where we explicitly track and store at each timestep the positions and not the displacements of the particles. We observe that :math:`\ddot{\textbf{y}}(\textbf{x}, t) = \ddot{\textbf{x}} + \ddot{\textbf{u}}(\textbf{x}, t) = \ddot{\textbf{u}}(\textbf{x}, t)`, so -that this is equivalent to :math:numref:`periNewtonII`. +that this is equivalent to :ref:`(1) `. Spatial Discretization ^^^^^^^^^^^^^^^^^^^^^^ @@ -435,21 +436,23 @@ where each particle :math:`i` is associated with some volume fraction denote the family of particles for which particle :math:`i` shares a bond in the reference configuration. That is, -.. math:: - :label: periBondFamily - - \mathcal{F}_i = \{ p ~ | ~ \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert \leq \delta \}. - -The discretized equation of motion replaces :math:numref:`periNewtonII` with +.. _periBondFamily: + +.. math:: + + \mathcal{F}_i = \{ p ~ | ~ \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert \leq \delta \}. \qquad\qquad\textrm{(11)} + +The discretized equation of motion replaces :ref:`(1) ` with + +.. _peridiscreteNewtonII: .. math:: - :label: peridiscreteNewtonII \rho \ddot{\textbf{y}}_i^n = \sum_{p \in \mathcal{F}_i} \left\{ \underline{\mathbf{T}}\left[ \textbf{x}_i,t \right]\left<\textbf{x}_p^{\prime}-\textbf{x}_i \right> - \underline{\mathbf{T}}\left[\textbf{x}_p,t \right]\left<\textbf{x}_i-\textbf{x}_p \right> \right\} - V_{p} + \textbf{b}_i^n, + V_{p} + \textbf{b}_i^n, \qquad\qquad\textrm{(12)} where :math:`n` is the timestep number and subscripts denote the particle number. @@ -460,31 +463,30 @@ In the model discussed so far, particles interact only through their bond forces. A particle with no bonds becomes a free non-interacting particle. To account for contact forces, short-range forces are introduced :ref:`(Silling 2007) `. We add to the force in -:math:numref:`peridiscreteNewtonII` the following force +:ref:`(12) ` the following force .. math:: - :label: perifS \textbf{f}_S(\textbf{y}_p,\textbf{y}_i) = \min \left\{ 0, \frac{c_S}{\delta}(\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert - d_{pi}) \right\} - \frac{\textbf{y}_p-\textbf{y}_i}{\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert}, + \frac{\textbf{y}_p-\textbf{y}_i}{\left\Vert {\textbf{y}_p-\textbf{y}_i} \right\Vert}, \qquad\qquad\textrm{(13)} where :math:`d_{pi}` is the short-range interaction distance between particles :math:`p` and :math:`i`, and :math:`c_S` is a multiple of the -constant :math:`c` from :math:numref:`peric`. Note that the short-range force +constant :math:`c` from :ref:`(6) `. Note that the short-range force is always repulsive, never attractive. In practice, we choose -.. math:: - :label: pericS +.. _pericS: - c_S = 15 \frac{18K}{\pi \delta^4}. +.. math:: + + c_S = 15 \frac{18K}{\pi \delta^4}. \qquad\qquad\textrm{(14)} For the short-range interaction distance, we choose :ref:`(Silling 2007) ` .. math:: - :label: perid - d_{pi} = \min \left\{ 0.9 \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert, 1.35 (r_p + r_i) \right\}, + d_{pi} = \min \left\{ 0.9 \left\Vert {\textbf{x}_p - \textbf{x}_i} \right\Vert, 1.35 (r_p + r_i) \right\}, \qquad\qquad\textrm{(15)} where :math:`r_i` is called the *node radius* of particle :math:`i`. Given a discrete lattice, we choose :math:`r_i` to be half @@ -508,16 +510,16 @@ short-range family of particles Modification to the Particle Volume ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The right-hand side of :math:numref:`peridiscreteNewtonII` may be thought of as -a midpoint quadrature of :math:numref:`periNewtonII`. To slightly improve the +The right-hand side of :ref:`(12) ` may be thought of as +a midpoint quadrature of :ref:`(1) `. To slightly improve the accuracy of this quadrature, we discuss a modification to the particle -volume used in :math:numref:`peridiscreteNewtonII`. In a situation where two +volume used in :ref:`(12) `. In a situation where two particles share a bond with :math:`\left\Vert { \textbf{x}_p - \textbf{x}_i }\right\Vert = \delta`, for example, we suppose that only approximately half the volume of each particle is "seen" by the other :ref:`(Silling 2007) `. When computing the force of each particle on the other we use :math:`V_p / 2` rather than :math:`V_p` in -:math:numref:`peridiscreteNewtonII`. As such, we introduce a nodal volume +:ref:`(12) `. As such, we introduce a nodal volume scaling function for all bonded particles where :math:`\delta - r_i \leq \left\Vert { \textbf{x}_p - \textbf{x}_i } \right\Vert \leq \delta` (see the Figure below). @@ -575,12 +577,12 @@ Breaking Bonds During the course of simulation, it may be necessary to break bonds, as described in the :ref:`Damage section `. Bonds are recorded as broken in a simulation by removing them from the bond family -:math:`\mathcal{F}_i` (see :math:numref:`periBondFamily`). +:math:`\mathcal{F}_i` (see :ref:`(11) `). A naive implementation would have us first loop over all bonds and -compute :math:`s_{min}` in :math:numref:`peris0`, then loop over all bonds +compute :math:`s_{min}` in :ref:`(9) `, then loop over all bonds again and break bonds with a stretch :math:`s > s0` as in -:math:numref:`perimu`, and finally loop over all particles and compute forces +:ref:`(8) `, and finally loop over all particles and compute forces for the next step of :ref:`Algorithm 1 `. For reasons of computational efficiency, we will utilize the values of :math:`s_0` from the *previous* timestep when deciding to break a bond. @@ -622,7 +624,7 @@ routines in :ref:`Algorithm 3 ` and :ref:`Algorithm 4 | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} - | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :math:numref:`pericS`*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :ref:`(14) `*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **end for** | **end for** @@ -695,7 +697,7 @@ A sketch of the PMB model implementation in the PERI package appears in | **for all** particles :math:`j \in \mathcal{F}^S_i` (the short-range family of nodes for particle :math:`i`) **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = \min \{ 0, r - d \}` {*Short-range forces are only repulsive, never attractive*} - | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :math:numref:`pericS`*} + | :math:`k = \frac{c_S}{\delta} V_k dr` {:math:`c_S` *defined in :ref:`(14) `*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **end for** | **end for** @@ -704,7 +706,7 @@ A sketch of the PMB model implementation in the PERI package appears in | **for all** particles :math:`j` sharing an unbroken bond with particle :math:`i` **do** | :math:`r = \left\Vert {\textbf{y}_j - \textbf{y}_i} \right\Vert` | :math:`dr = r - \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert` - | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in :math:numref:`peric`*} + | :math:`k = \frac{c}{\left\Vert {\textbf{x}_i - \textbf{x}_j} \right\Vert} \nu(\textbf{x}_i - \textbf{x}_j) V_j dr` {:math:`c` *defined in :ref:`(6) `*} | :math:`\textbf{f} = \textbf{f} + k \frac{\textbf{y}_j-\textbf{y}_i}{\left\Vert {\textbf{y}_j-\textbf{y}_i} \right\Vert}` | **if** :math:`(dr / \left\Vert {\textbf{x}_j - \textbf{x}_i} \right\Vert) > \min(s_0(i), s_0(j))` **then** | Break :math:`i`'s bond with :math:`j` {:math:`j`\ *'s bond with* :math:`i` *will be broken when this loop iterates on* :math:`j`} @@ -719,7 +721,7 @@ A sketch of the PMB model implementation in the PERI package appears in Damage ^^^^^^ -The damage associated with every particle (see :math:numref:`peridamage`) can +The damage associated with every particle (see :ref:`(10) `) can optionally be computed and output with a LAMMPS data dump. To do this, your input script must contain the command :doc:`compute damage/atom ` This enables a LAMMPS per-atom compute to @@ -900,9 +902,10 @@ three times the lattice constant.) The target is a cylinder of diameter lattice contains 103,110 particles. Each particle :math:`i` has volume fraction :math:`V_i = 1.25 \times 10^{-10} \textrm{m}^3`. -The spring constant in the PMB material model is (see :math:numref:`peric`) +The spring constant in the PMB material model is (see :ref:`(6) `) .. math:: + c = \frac{18k}{\pi \delta^4} = \frac{18 (14.9 \times 10^9)}{ \pi (1.5 \times 10^{-3})^4} \approx 1.6863 \times 10^{22}. The CFL analysis from :ref:`(Silling2005) ` shows that a @@ -947,7 +950,7 @@ the distance from the atom to the center of the indenter, and :math:`R` is the radius of the projectile. The force is repulsive and :math:`F(r) = 0` for :math:`r > R`. For our problem, the projectile radius :math:`R = 0.05` m, and we have chosen :math:`k_s = 1.0 \times 10^{17}` (compare -with :math:numref:`peric` above). +with :ref:`(6) ` above). Writing the LAMMPS Input File ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From a7071fea78a9ae0f5b919e4e2d1501439a1da171 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 29 Sep 2022 19:28:15 -0500 Subject: [PATCH 253/364] Wrote docs for extract_fix,extract_variable; fixed python so it knows about string variables; doc typo fixes; part of extract_variable unit test --- doc/src/Fortran.rst | 323 ++++++++++++++++-- fortran/lammps.f90 | 305 ++++++++++++++--- python/lammps/core.py | 27 +- src/library.cpp | 22 +- unittest/fortran/CMakeLists.txt | 5 + unittest/fortran/atomdata.txt | 8 + unittest/fortran/greetings.txt | 9 + .../fortran/test_fortran_extract_variable.f90 | 161 +++++++++ unittest/fortran/wrap_extract_variable.cpp | 87 +++++ 9 files changed, 861 insertions(+), 86 deletions(-) create mode 100644 unittest/fortran/atomdata.txt create mode 100644 unittest/fortran/greetings.txt create mode 100644 unittest/fortran/test_fortran_extract_variable.f90 create mode 100644 unittest/fortran/wrap_extract_variable.cpp diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index d041946470..3112440bb0 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -389,6 +389,12 @@ Procedures Bound to the lammps Derived Type :r real(c_double): number of atoms + .. note:: + + If you would prefer to get the number of atoms in its native format + (i.e., as a 32- or 64-bit integer, depending on how LAMMPS was compiled), + this can be extracted with :f:func:`extract_global`. + -------- .. f:function:: get_thermo(name) @@ -575,7 +581,26 @@ Procedures Bound to the lammps Derived Type greater than or equal to the length of the string (not including the terminal ``NULL`` character) that LAMMPS returns. If the variable's length is too short, the string will be truncated. As usual in Fortran, - strings are padded with spaces at the end. + strings are padded with spaces at the end. If you use an allocatable + string, the string **must be allocated** prior to calling this function, + but you can automatically reallocate it to the correct length after the + function returns, viz., + + .. code-block :: Fortran + + PROGRAM test + USE LIBLAMMPS + TYPE(lammps) :: lmp + CHARACTER(LEN=:), ALLOCATABLE :: str + lmp = lammps() + CALL lmp%command('units metal') + ALLOCATE ( CHARACTER(LEN=80) :: str ) + str = lmp%extract_global('units') + str = TRIM(str) ! re-allocates to length len_trim(str) here + PRINT*, LEN(str), LEN_TRIM(str) + END PROGRAM test + + will print the number 5 (the length of the word "metal") twice. :p character(len=\*) name: string with the name of the property to extract :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment @@ -737,8 +762,8 @@ Procedures Bound to the lammps Derived Type Two-dimensional arrays returned from :f:func:`extract_compute` will be **transposed** from equivalent arrays in C, and they will be indexed - from 1 instead of 0. See the similar note under - :f:func:`extract_atom` for further details. + from 1 instead of 0. See the note at :f:func:`extract_atom` for + further details. The following combinations are possible (assuming ``lmp`` is the name of your LAMMPS instance): @@ -749,7 +774,7 @@ Procedures Bound to the lammps Derived Type * - Style - Type - - Pointer type to assign to + - Type to assign to - Returned data * - ``lmp%style%global`` - ``lmp%type%scalar`` @@ -786,7 +811,7 @@ Procedures Bound to the lammps Derived Type :p integer(c_int) type: value indicating the type of data to extract (scalar, vector, or array) :r polymorphic: pointer to LAMMPS data. The left-hand side of the assignment - should be a C-compatible pointer (e.g., ``REAL (C_double), POINTER :: x``) + should be a C-compatible pointer (e.g., ``REAL (c_double), POINTER :: x``) to the extracted property. If expecting vector data, the pointer should have dimension ":"; if expecting array (matrix) data, the pointer should have dimension ":,:". @@ -828,10 +853,76 @@ Procedures Bound to the lammps Derived Type user wishes LAMMPS to return. The *ncol* variable is optional for global scalar or vector data, and both *nrow* and *ncol* are optional when a global scalar is requested, as well as when per-atom or local data are - requested. + requested. The following combinations are possible (assuming ``lmp`` is the + name of your LAMMPS instance): + + .. list-table:: + :header-rows: 1 + :widths: auto + + * - Style + - Type + - nrow + - ncol + - Type to assign to + - Returned data + * - ``lmp%style%global`` + - ``lmp%type%scalar`` + - Ignored + - Ignored + - ``REAL(c_double)`` + - Global scalar + * - ``lmp%style%global`` + - ``lmp%type%vector`` + - Required + - Ignored + - ``REAL(c_double)`` + - Element of global vector + * - ``lmp%style%global`` + - ``lmp%type%array`` + - Required + - Required + - ``REAL(c_double)`` + - Element of global array + * - ``lmp%style%atom`` + - ``lmp%type%scalar`` + - + - + - + - (not allowed) + * - ``lmp%style%atom`` + - ``lmp%type%vector`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%atom`` + - ``lmp%type%array`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array + * - ``lmp%style%local`` + - ``lmp%type%scalar`` + - + - + - + - (not allowed) + * - ``lmp%style%local`` + - ``lmp%type%vector`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:), POINTER`` + - Per-atom vector + * - ``lmp%style%local`` + - ``lmp%type%array`` + - Ignored + - Ignored + - ``REAL(c_double), DIMENSION(:,:), POINTER`` + - Per-atom array In the case of global data, this function returns a value of type - ``real(C_double)``. For per-atom or local data, this function does not + ``real(c_double)``. For per-atom or local data, this function does not return a value but instead associates the pointer on the left side of the assignment to point to internal LAMMPS data. Pointers must be of the correct data type to point to said data (i.e., ``REAL(c_double)``) and have @@ -914,7 +1005,7 @@ Procedures Bound to the lammps Derived Type :p integer(c_int) ncol: column index (only used for global arrays) :r polymorphic: LAMMPS data (for global data) or a pointer to LAMMPS data (for per-atom or local data). The left-hand side of the assignment should - be of type ``REAL(C_double)`` and have appropriate rank (i.e., + be of type ``REAL(c_double)`` and have appropriate rank (i.e., ``DIMENSION(:)`` if expecting per-atom or local vector data and ``DIMENSION(:,:)`` if expecting per-atom or local array data). If expecting local or per-atom data, it should have the ``POINTER`` attribute, but @@ -950,7 +1041,7 @@ Procedures Bound to the lammps Derived Type This function returns the values of the variables, not pointers to them. Vectors pointing to *atom*-style variables should be of type - ``REAL(C_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and either have + ``REAL(c_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and either have the ``ALLOCATABLE`` attribute or be long enough to contain the data without reallocation. @@ -977,19 +1068,20 @@ Procedures Bound to the lammps Derived Type :p character(len=\*) name: variable name to evaluate :o character(len=\*) group [optional]: group for which to extract per-atom data (if absent, use "all") - :r polymorphic: scalar of type ``REAL(C_double)`` (for *equal*-style + :r polymorphic: scalar of type ``REAL(c_double)`` (for *equal*-style variables and others that are *equal*-compatible), vector of type - ``REAL(C_double), DIMENSION(nlocal)`` for *atom*-style variables, or - ``CHARACTER(LEN=:), ALLOCATABLE`` for *string*-style and compatible - variables. Non-allocatable strings whose length is too short to hold the - result will be truncated. + ``REAL(c_double), DIMENSION(nlocal)`` for *atom*-style variables, or + ``CHARACTER(LEN=*)`` for *string*-style and compatible variables. Strings + whose length is too short to hold the result will be truncated. + Allocatable strings must be allocated before this function is called; + see note at :f:func:`extract_global` regarding allocatable strings. .. note:: LAMMPS cannot easily check if it is valid to access the data referenced by the variables (e.g., computes, fixes, or thermodynamic info), so it may fail with an error. The caller has to make certain - that the data are extracted only when it safe to evaluate the variable + that the data are extracted only when it is safe to evaluate the variable and thus an error and crash are avoided. -------- @@ -1003,7 +1095,187 @@ Procedures Bound to the lammps Derived Type -------- -.. f:subroutine:: flush_buffers +.. f:subroutine:: get_os_info(buffer) + + This function can be used to retrieve detailed information about the hosting + operating system and compiler/runtime environment. + + .. versionadded:: TBD + + A suitable buffer has to be provided. The assembled text will be truncated + to not overflow this buffer. The string is typically a few hundred bytes + long. + +-------- + +.. f:function:: config_has_mpi_support() + + This function is used to query whether LAMMPS was compiled with a real MPI + library or in serial. + + .. versionadded:: TBD + + :r logical: ``.FALSE.`` when compiled with STUBS, ``.TRUE.`` if complied + with MPI. + +-------- + +.. f:function:: config_has_gzip_support() + + Check if the LAMMPS library supports reading or writing compressed + files via a pipe to gzip or similar compression programs. + + .. versionadded:: TBD + + Several LAMMPS commands (e.g., :doc:`read_data`, :doc:`write_data`, + :doc:`dump styles atom, custom, and xyz `) support reading and writing + compressed files via creating a pipe to the ``gzip`` program. This function + checks whether this feature was :ref:`enabled at compile time `. + It does **not** check whether ``gzip`` or any other supported compression + programs themselves are installed and usable. + + :r logical: + +-------- + +.. f:function:: config_has_png_support() + + Check if the LAMMPS library supports writing PNG format images. + + .. versionadded:: TBD + + The LAMMPS :doc:`dump style image ` supports writing multiple + image file formats. Most of them, however, need support from an external + library, and using that has to be :ref:`enabled at compile time `. + This function checks whether support for the `PNG image file format + `_ is available + in the current LAMMPS library. + + :r logical: + +-------- + +.. f:function:: config_has_jpeg_support() + + Check if the LAMMPS library supports writing JPEG format images. + + .. versionadded:: TBD + + The LAMMPS :doc:`dump style image ` supports writing multiple + image file formats. Most of them, however, need support from an external + library, and using that has to be :ref:`enabled at compile time `. + This function checks whether support for the `JPEG image file format + `_ is available in the current LAMMPS library. + + :r logical: + +-------- + +.. f:function:: config_has_ffmpeg_support() + + Check if the LAMMPS library supports creating movie files via a pipe to + ffmpeg. + + .. versionadded:: TBD + + The LAMMPS :doc:`dump style movie ` supports generating movies + from images on-the-fly via creating a pipe to the + `ffmpeg `_ program. + This function checks whether this feature was + :ref:`enabled at compile time `. + It does **not** check whether the ``ffmpeg`` itself is installed and usable. + + :r logical: + +-------- + +.. f:function:: config_has_exceptions() + + Check whether LAMMPS errors will throw C++ exceptions. + + .. versionadded:: TBD + + In case of an error, LAMMPS will either abort or throw a C++ exception. + The latter has to be :ref:`enabled at compile time `. + This function checks if exceptions were enabled. + + When using the library interface with C++ exceptions enabled, the library + interface functions will "catch" them, and the error status can then be + checked by calling :f:func:`has_error`. The most recent error message can be + retrieved via :f:func:`get_last_error_message`. + This can allow one to restart a calculation or delete and recreate + the LAMMPS instance when a C++ exception occurs. One application + of using exceptions this way is the :ref:`lammps_shell`. If C++ + exceptions are disabled and an error happens during a call to + LAMMPS or the Fortran API, the application will terminate. + + :r logical: + +-------- + +.. f:function:: config_has_package(name) + + Check whether a specific package has been included in LAMMPS + + .. versionadded:: TBD + + This function checks whether the LAMMPS library in use includes the specific + :doc:`LAMMPS package ` provided as argument. + + :r logical: + +-------- + +.. f:function:: config_package_count() + + Count the number of installed packages in the LAMMPS library. + + .. versionadded:: TBD + + This function counts how many :doc:`LAMMPS packages ` are + included in the LAMMPS library in use. It directly calls the C library + function :cpp:func:`lammps_config_package_count`. + + :r integer(c_int): number of packages installed + +-------- + +.. f:subroutine:: config_package_name(idx, buffer) + + Get the name of a package in the list of installed packages in the LAMMPS + library. + + .. versionadded:: TBD + + This subroutine copies the name of the package with the index *idx* into the + provided string *buffer*. If the name of the package exceeds the length of + the buffer, it will be truncated accordingly. If the index is out of range, + *buffer* is set to an empty string. + + :p integer(c_int) idx: index of the package in the list of included packages + :math:`(0 \le idx < \text{package count})` + :p character(len=\*) buffer: string to hold the name of the package + +-------- + +.. f:subroutine:: installed_packages(package[, length]) + + Obtain a list of the names of enabled packages in the LAMMPS shared library + and store it in *package*. + + This function is analogous to the :py:func`installed_packages` function in + the Python API. The optional argument *length* sets the length of each + string in the vector *package* (default: 31). + + :p character(len=:) package [dimension(:),allocatable]: list of packages; + *must* have the ``ALLOCATABLE`` attribute and be of rank-1 + (``DIMENSION(:)``) with allocatable length. + :o integer length [optional]: length of each string in the list. + Default: 31. + +-------- + +.. f:subroutine:: flush_buffers() This function calls :cpp:func:`lammps_flush_buffers`, which flushes buffered output to be written to screen and logfile. This can simplify capturing @@ -1013,7 +1285,7 @@ Procedures Bound to the lammps Derived Type -------- -.. f:function:: is_running +.. f:function:: is_running() Check if LAMMPS is currently inside a run or minimization. @@ -1026,7 +1298,18 @@ Procedures Bound to the lammps Derived Type -------- -.. f:function:: has_error +.. f:subroutine:: force_timeout() + + Force a timeout to stop an ongoing run cleanly. + + .. versionadded:: TBD + + This function can be used from signal handlers or multi-threaded + applications to cleanly terminate an ongoing run. + +-------- + +.. f:function:: has_error() Check if there is a (new) error message available. @@ -1069,8 +1352,8 @@ Procedures Bound to the lammps Derived Type This function will do nothing when the LAMMPS library has been compiled without ``-DLAMMPS_EXCEPTIONS``, which turns errors aborting LAMMPS into C++ exceptions. You can use the function - :f:func:`config_has_exceptions` to check whethher this is the case. + :f:func:`config_has_exceptions` to check whether this is the case. :p character(len=\*) buffer: string buffer to copy the error message into - :o integer(C_int) status [optional]: 1 when all ranks had the error, + :o integer(c_int) status [optional]: 1 when all ranks had the error, 2 on a single-rank error. diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 9f49a1fcb5..eb83ce3058 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -32,7 +32,6 @@ MODULE LIBLAMMPS USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_associated, & c_loc, c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, & c_f_pointer - USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : ERROR_UNIT IMPLICIT NONE PRIVATE @@ -80,36 +79,48 @@ MODULE LIBLAMMPS END TYPE lammps_type TYPE lammps - TYPE(c_ptr) :: handle - TYPE(lammps_style) :: style - TYPE(lammps_type) :: type - CONTAINS - PROCEDURE :: close => lmp_close - PROCEDURE :: error => lmp_error - PROCEDURE :: file => lmp_file - PROCEDURE :: command => lmp_command - PROCEDURE :: commands_list => lmp_commands_list - PROCEDURE :: commands_string => lmp_commands_string - PROCEDURE :: get_natoms => lmp_get_natoms - PROCEDURE :: get_thermo => lmp_get_thermo - PROCEDURE :: extract_box => lmp_extract_box - PROCEDURE :: reset_box => lmp_reset_box - PROCEDURE :: memory_usage => lmp_memory_usage - PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm - PROCEDURE :: extract_setting => lmp_extract_setting - PROCEDURE :: extract_global => lmp_extract_global - PROCEDURE :: extract_atom => lmp_extract_atom - PROCEDURE :: extract_compute => lmp_extract_compute - PROCEDURE :: extract_fix => lmp_extract_fix - PROCEDURE :: extract_variable => lmp_extract_variable + TYPE(c_ptr) :: handle = c_null_ptr + TYPE(lammps_style) :: style + TYPE(lammps_type) :: type + CONTAINS + PROCEDURE :: close => lmp_close + PROCEDURE :: error => lmp_error + PROCEDURE :: file => lmp_file + PROCEDURE :: command => lmp_command + PROCEDURE :: commands_list => lmp_commands_list + PROCEDURE :: commands_string => lmp_commands_string + PROCEDURE :: get_natoms => lmp_get_natoms + PROCEDURE :: get_thermo => lmp_get_thermo + PROCEDURE :: extract_box => lmp_extract_box + PROCEDURE :: reset_box => lmp_reset_box + PROCEDURE :: memory_usage => lmp_memory_usage + PROCEDURE :: get_mpi_comm => lmp_get_mpi_comm + PROCEDURE :: extract_setting => lmp_extract_setting + PROCEDURE :: extract_global => lmp_extract_global + PROCEDURE :: extract_atom => lmp_extract_atom + PROCEDURE :: extract_compute => lmp_extract_compute + PROCEDURE :: extract_fix => lmp_extract_fix + PROCEDURE :: extract_variable => lmp_extract_variable ! - PROCEDURE :: version => lmp_version + PROCEDURE :: version => lmp_version + PROCEDURE,NOPASS :: get_os_info => lmp_get_os_info + PROCEDURE,NOPASS :: config_has_mpi_support => lmp_config_has_mpi_support + PROCEDURE,NOPASS :: config_has_gzip_support => lmp_config_has_gzip_support + PROCEDURE,NOPASS :: config_has_png_support => lmp_config_has_png_support + PROCEDURE,NOPASS :: config_has_jpeg_support => lmp_config_has_jpeg_support + PROCEDURE,NOPASS :: config_has_ffmpeg_support & + => lmp_config_has_ffmpeg_support + PROCEDURE,NOPASS :: config_has_exceptions => lmp_config_has_exceptions + PROCEDURE,NOPASS :: config_has_package => lmp_config_has_package + PROCEDURE,NOPASS :: config_package_count => lammps_config_package_count + PROCEDURE,NOPASS :: config_package_name => lmp_config_package_name + PROCEDURE,NOPASS :: installed_packages => lmp_installed_packages ! - PROCEDURE :: flush_buffers => lmp_flush_buffers - PROCEDURE :: is_running => lmp_is_running -! force_timeout - PROCEDURE :: has_error => lmp_has_error - PROCEDURE :: get_last_error_message => lmp_get_last_error_message + PROCEDURE :: flush_buffers => lmp_flush_buffers + PROCEDURE :: is_running => lmp_is_running + PROCEDURE :: force_timeout => lmp_force_timeout + PROCEDURE :: has_error => lmp_has_error + PROCEDURE :: get_last_error_message => lmp_get_last_error_message END TYPE lammps INTERFACE lammps @@ -180,6 +191,9 @@ MODULE LIBLAMMPS MODULE PROCEDURE assign_double_to_lammps_fix_data, & assign_doublevec_to_lammps_fix_data, & assign_doublemat_to_lammps_fix_data + ! Variables, too + MODULE PROCEDURE assign_double_to_lammps_variable_data, & + assign_string_to_lammps_variable_data END INTERFACE ! interface definitions for calling functions in library.cpp @@ -412,17 +426,69 @@ MODULE LIBLAMMPS INTEGER(c_int) :: lammps_version END FUNCTION lammps_version - !SUBROUTINE lammps_get_os_info + SUBROUTINE lammps_get_os_info (buffer, buf_size) BIND(C) + IMPORT :: C_ptr, C_int + IMPLICIT NONE + TYPE (C_ptr), VALUE :: buffer + INTEGER (C_int), VALUE :: buf_size + END SUBROUTINE lammps_get_os_info - !LOGICAL FUNCTION lammps_config_has_mpi_support - !LOGICAL FUNCTION lammps_config_has_gzip_support - !LOGICAL FUNCTION lammps_config_has_png_support - !LOGICAL FUNCTION lammps_config_has_jpeg_support - !LOGICAL FUNCTION lammps_config_has_ffmpeg_support - !LOGICAL FUNCTION lammps_config_has_exceptions - !LOGICAL FUNCTION lammps_config_has_package - !INTEGER (C_int) FUNCTION lammps_config_package_count - !SUBROUTINE lammps_config_package_name + FUNCTION lammps_config_has_mpi_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_mpi_support + END FUNCTION lammps_config_has_mpi_support + + FUNCTION lammps_config_has_gzip_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_gzip_support + END FUNCTION lammps_config_has_gzip_support + + FUNCTION lammps_config_has_png_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_png_support + END FUNCTION lammps_config_has_png_support + + FUNCTION lammps_config_has_jpeg_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_jpeg_support + END FUNCTION lammps_config_has_jpeg_support + + FUNCTION lammps_config_has_ffmpeg_support() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER(c_int) :: lammps_config_has_ffmpeg_support + END FUNCTION lammps_config_has_ffmpeg_support + + FUNCTION lammps_config_has_exceptions() BIND(C) + IMPORT :: c_int + IMPLICIT NONE + INTEGER (c_int) :: lammps_config_has_exceptions + END FUNCTION lammps_config_has_exceptions + + FUNCTION lammps_config_has_package(name) BIND(C) + IMPORT :: C_int, C_ptr + IMPLICIT NONE + TYPE (C_ptr), VALUE :: name + INTEGER (c_int) :: lammps_config_has_package + END FUNCTION lammps_config_has_package + + FUNCTION lammps_config_package_count() BIND(C) + IMPORT :: C_int + IMPLICIT NONE + INTEGER (C_int) :: lammps_config_package_count + END FUNCTION lammps_config_package_count + + FUNCTION lammps_config_package_name (idx, buffer, buf_size) BIND(C) + IMPORT :: C_int, C_ptr + IMPLICIT NONE + INTEGER (C_int) :: lammps_config_package_name + INTEGER (C_int), VALUE :: idx, buf_size + TYPE (C_ptr), VALUE :: buffer + END FUNCTION lammps_config_package_name !LOGICAL FUNCTION lammps_config_accelerator !LOGICAL FUNCTION lammps_has_gpu_device @@ -474,7 +540,11 @@ MODULE LIBLAMMPS TYPE(c_ptr), VALUE :: handle END FUNCTION lammps_is_running - !SUBROUTINE lammps_force_timeout + SUBROUTINE lammps_force_timeout (handle) BIND(C) + IMPORT :: c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + END SUBROUTINE lammps_force_timeout INTEGER (C_int) FUNCTION lammps_has_error (handle) BIND(C) IMPORT :: c_ptr, c_int @@ -622,14 +692,14 @@ CONTAINS END SUBROUTINE lmp_commands_string ! equivalent function to lammps_get_natoms - DOUBLE PRECISION FUNCTION lmp_get_natoms(self) + REAL (c_double) FUNCTION lmp_get_natoms(self) CLASS(lammps) :: self lmp_get_natoms = lammps_get_natoms(self%handle) END FUNCTION lmp_get_natoms ! equivalent function to lammps_get_thermo - REAL (C_double) FUNCTION lmp_get_thermo(self,name) + REAL (c_double) FUNCTION lmp_get_thermo(self,name) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*) :: name TYPE(C_ptr) :: Cname @@ -1025,6 +1095,7 @@ CONTAINS CALL lammps_free(Cname) CALL lammps_free(Cgroup) + variable_data%lammps_instance => self SELECT CASE (datatype) CASE (LMP_VAR_EQUAL) variable_data%datatype = DATA_DOUBLE @@ -1059,12 +1130,125 @@ CONTAINS lmp_version = lammps_version(self%handle) END FUNCTION lmp_version - ! equivalent function to lammps_is_running - LOGICAL FUNCTION lmp_is_running(self) - CLASS(lammps), INTENT(IN) :: self + ! equivalent function to lammps_get_os_info + SUBROUTINE lmp_get_os_info (buffer) + CHARACTER(LEN=*) :: buffer + INTEGER(c_int) :: buf_size + CHARACTER(LEN=1,KIND=c_char), DIMENSION(LEN(buffer)), TARGET :: Cbuffer + TYPE(c_ptr) :: ptr + INTEGER :: i - lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) - END FUNCTION lmp_is_running + buffer = '' + ptr = C_LOC(Cbuffer(1)) + buf_size = LEN(buffer) + CALL lammps_get_os_info (ptr, buf_size) + DO i=1,buf_size + IF ( Cbuffer(i) == C_NULL_CHAR ) EXIT + buffer(i:i) = Cbuffer(i) + END DO + END SUBROUTINE lmp_get_os_info + + ! equivalent function to lammps_config_has_mpi_support + LOGICAL FUNCTION lmp_config_has_mpi_support() + INTEGER(c_int) :: has_mpi_support + + has_mpi_support = lammps_config_has_mpi_support() + lmp_config_has_mpi_support = (has_mpi_support /= 0_c_int) + END FUNCTION lmp_config_has_mpi_support + + ! equivalent function to lammps_config_has_gzip_support + LOGICAL FUNCTION lmp_config_has_gzip_support() + INTEGER(c_int) :: has_gzip_support + + has_gzip_support = lammps_config_has_gzip_support() + lmp_config_has_gzip_support = (has_gzip_support /= 0_c_int) + END FUNCTION lmp_config_has_gzip_support + + ! equivalent function to lammps_config_has_png_support + LOGICAL FUNCTION lmp_config_has_png_support() + INTEGER(C_int) :: has_png_support + + has_png_support = lammps_config_has_png_support() + lmp_config_has_png_support = (has_png_support /= 0_c_int) + END FUNCTION lmp_config_has_png_support + + ! equivalent function to lammps_config_has_jpeg_support + LOGICAL FUNCTION lmp_config_has_jpeg_support() + INTEGER(c_int) :: has_jpeg_support + + has_jpeg_support = lammps_config_has_jpeg_support() + lmp_config_has_jpeg_support = (has_jpeg_support /= 0_c_int) + END FUNCTION lmp_config_has_jpeg_support + + ! equivalent function to lammps_config_has_ffmpeg_support + LOGICAL FUNCTION lmp_config_has_ffmpeg_support() + INTEGER(c_int) :: has_ffmpeg_support + + has_ffmpeg_support = lammps_config_has_ffmpeg_support() + lmp_config_has_ffmpeg_support = (has_ffmpeg_support /= 0_c_int) + END FUNCTION lmp_config_has_ffmpeg_support + + ! equivalent function to lammps_config_has_exceptions + LOGICAL FUNCTION lmp_config_has_exceptions() + INTEGER(c_int) :: has_exceptions + + has_exceptions = lammps_config_has_exceptions() + lmp_config_has_exceptions = (has_exceptions /= 0_c_int) + END FUNCTION lmp_config_has_exceptions + + ! equivalent function to lammps_config_has_package + LOGICAL FUNCTION lmp_config_has_package(name) + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER (c_int) :: has_package + TYPE (c_ptr) :: Cname + + Cname = f2c_string(name) + has_package = lammps_config_has_package(Cname) + lmp_config_has_package = (has_package /= 0_c_int) + CALL lammps_free(Cname) + END FUNCTION lmp_config_has_package + + ! equivalent subroutine to lammps_config_package_name + SUBROUTINE lmp_config_package_name (idx, buffer) + INTEGER, INTENT(IN) :: idx + CHARACTER(LEN=*), INTENT(OUT) :: buffer + INTEGER(c_int) :: Cidx, Csuccess + TYPE(c_ptr) :: Cptr + CHARACTER(LEN=1,KIND=c_char), TARGET :: Cbuffer(LEN(buffer)+1) + INTEGER :: i, strlen + + Cidx = idx - 1 + Cptr = C_LOC(Cbuffer(1)) + Csuccess = lammps_config_package_name(Cidx, Cptr, LEN(buffer)+1) + buffer = '' + IF ( Csuccess /= 0_c_int ) THEN + strlen = c_strlen(Cptr) + FORALL ( i = 1:strlen ) + buffer(i:i) = Cbuffer(i) + END FORALL + END IF + END SUBROUTINE lmp_config_package_name + + ! equivalent function to Python routine .installed_packages() + SUBROUTINE lmp_installed_packages (package, length) + CHARACTER(LEN=:), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: package + INTEGER, INTENT(IN), OPTIONAL :: length + INTEGER, PARAMETER :: MAX_BUFFER_LENGTH = 31 + INTEGER :: i, npackage, buf_length + + IF ( PRESENT(length) ) THEN + buf_length = length + ELSE + buf_length = MAX_BUFFER_LENGTH + END IF + + IF ( ALLOCATED(package) ) DEALLOCATE(package) + npackage = lammps_config_package_count() + ALLOCATE( CHARACTER(LEN=MAX_BUFFER_LENGTH) :: package(npackage) ) + DO i=1, npackage + CALL lmp_config_package_name(i, package(i)) + END DO + END SUBROUTINE lmp_installed_packages ! equivalent function to lammps_flush_buffers SUBROUTINE lmp_flush_buffers(self) @@ -1073,6 +1257,20 @@ CONTAINS CALL lammps_flush_buffers(self%handle) END SUBROUTINE lmp_flush_buffers + ! equivalent function to lammps_is_running + LOGICAL FUNCTION lmp_is_running(self) + CLASS(lammps), INTENT(IN) :: self + + lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) + END FUNCTION lmp_is_running + + ! equivalent function to lammps_force_timeout + SUBROUTINE lmp_force_timeout (self) + CLASS(lammps), INTENT(IN) :: self + + CALL lammps_force_timeout(self%handle) + END SUBROUTINE + ! equivalent function to lammps_has_error LOGICAL FUNCTION lmp_has_error(self) CLASS(lammps), INTENT(IN) :: self @@ -1264,6 +1462,17 @@ CONTAINS END IF END SUBROUTINE assign_doublevec_to_lammps_variable_data + SUBROUTINE assign_string_to_lammps_variable_data (lhs, rhs) + CHARACTER(LEN=*), INTENT(OUT) :: lhs + CLASS(lammps_variable_data), INTENT(IN) :: rhs + + IF ( rhs%datatype == DATA_STRING ) THEN + lhs = rhs%str + ELSE + CALL assignment_error(rhs, 'string') + END IF + END SUBROUTINE assign_string_to_lammps_variable_data + ! ---------------------------------------------------------------------- ! Generic function to catch all errors in assignments of LAMMPS data to ! user-space variables/pointers @@ -1292,6 +1501,8 @@ CONTAINS str1 = 'vector of doubles' CASE (DATA_DOUBLE_2D) str1 = 'matrix of doubles' + CASE (DATA_STRING) + str1 = 'string' CASE DEFAULT str1 = 'that type' END SELECT diff --git a/python/lammps/core.py b/python/lammps/core.py index aa4aae13db..45f49332a7 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -301,6 +301,8 @@ class lammps(object): self.lib.lammps_extract_fix.argtypes = [c_void_p, c_char_p, c_int, c_int, c_int, c_int] self.lib.lammps_extract_variable.argtypes = [c_void_p, c_char_p, c_char_p] + self.lib.lammps_extract_variable_datatype.argtypes = [c_void_p, c_char_p] + self.lib.lammps_extract_variable_datatype.restype = c_int self.lib.lammps_fix_external_get_force.argtypes = [c_void_p, c_char_p] self.lib.lammps_fix_external_get_force.restype = POINTER(POINTER(c_double)) @@ -1083,21 +1085,22 @@ class lammps(object): # for vector, must copy nlocal returned values to local c_double vector # memory was allocated by library interface function - def extract_variable(self, name, group=None, vartype=LMP_VAR_EQUAL): + def extract_variable(self, name, group=None, vartype=None): """ Evaluate a LAMMPS variable and return its data This function is a wrapper around the function - :cpp:func:`lammps_extract_variable` of the C-library interface, + :cpp:func:`lammps_extract_variable` of the C library interface, evaluates variable name and returns a copy of the computed data. The memory temporarily allocated by the C-interface is deleted after the data is copied to a Python variable or list. The variable must be either an equal-style (or equivalent) - variable or an atom-style variable. The variable type has to - provided as ``vartype`` parameter which may be one of two constants: - ``LMP_VAR_EQUAL`` or ``LMP_VAR_ATOM``; it defaults to - equal-style variables. - The group parameter is only used for atom-style variables and - defaults to the group "all" if set to ``None``, which is the default. + variable or an atom-style variable. The variable type can be + provided as the ``vartype`` parameter, which may be one of several + constants: ``LMP_VAR_EQUAL``, ``LMP_VAR_ATOM``, or ``LMP_VAR_STRING``. + If omitted or ``None``, LAMMPS will determine its value for you based on + a call to :cpp:func:`lammps_extract_variable_datatype` from the C library + interface. The group parameter is only used for atom-style variables and + defaults to the group "all". :param name: name of the variable to execute :type name: string @@ -1111,6 +1114,9 @@ class lammps(object): if name: name = name.encode() else: return None if group: group = group.encode() + if vartype is None : + vartype = self.lib.lammps_extract_variable_datatype(self.lmp, name) + #vartype = LMP_VAR_EQUAL if vartype == LMP_VAR_EQUAL: self.lib.lammps_extract_variable.restype = POINTER(c_double) with ExceptionCheck(self): @@ -1130,6 +1136,11 @@ class lammps(object): self.lib.lammps_free(ptr) else: return None return result + elif vartype == LMP_VAR_STRING : + self.lib.lammps_extract_variable.restype = c_char_p + with ExceptionCheck(self) : + ptr = self.lib.lammps_extract_variable(self.lmp, name, group) + return ptr.decode('utf-8') return None # ------------------------------------------------------------------------- diff --git a/src/library.cpp b/src/library.cpp index cd4742a2e4..194c0d9674 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4572,8 +4572,8 @@ int lammps_config_has_gzip_support() { \verbatim embed:rst The LAMMPS :doc:`dump style image ` supports writing multiple -image file formats. Most of them need, however, support from an external -library and using that has to be :ref:`enabled at compile time `. +image file formats. Most of them, however, need support from an external +library, and using that has to be :ref:`enabled at compile time `. This function checks whether support for the `PNG image file format `_ is available in the current LAMMPS library. @@ -4591,8 +4591,8 @@ int lammps_config_has_png_support() { \verbatim embed:rst The LAMMPS :doc:`dump style image ` supports writing multiple -image file formats. Most of them need, however, support from an external -library and using that has to be :ref:`enabled at compile time `. +image file formats. Most of them, however, need support from an external +library, and using that has to be :ref:`enabled at compile time `. This function checks whether support for the `JPEG image file format `_ is available in the current LAMMPS library. \endverbatim @@ -4609,7 +4609,7 @@ int lammps_config_has_jpeg_support() { \verbatim embed:rst The LAMMPS :doc:`dump style movie ` supports generating movies -from images on-the-fly via creating a pipe to the +from images on-the-fly via creating a pipe to the `ffmpeg `_ program. This function checks whether this feature was :ref:`enabled at compile time `. It does **not** check whether the ``ffmpeg`` itself is installed and usable. @@ -4623,14 +4623,14 @@ int lammps_config_has_ffmpeg_support() { /* ---------------------------------------------------------------------- */ -/** Check whether LAMMPS errors will throw a C++ exception +/** Check whether LAMMPS errors will throw C++ exceptions. * \verbatim embed:rst -In case of errors LAMMPS will either abort or throw a C++ exception. +In case of an error, LAMMPS will either abort or throw a C++ exception. The latter has to be :ref:`enabled at compile time `. This function checks if exceptions were enabled. -When using the library interface and C++ exceptions are enabled, +When using the library interface with C++ exceptions enabled, the library interface functions will "catch" them and the error status can then be checked by calling :cpp:func:`lammps_has_error` and the most recent error message @@ -4649,10 +4649,10 @@ int lammps_config_has_exceptions() { /* ---------------------------------------------------------------------- */ -/** Check if a specific package has been included in LAMMPS +/** Check whether a specific package has been included in LAMMPS * \verbatim embed:rst -This function checks if the LAMMPS library in use includes the +This function checks whether the LAMMPS library in use includes the specific :doc:`LAMMPS package ` provided as argument. \endverbatim * @@ -5609,7 +5609,7 @@ int lammps_is_running(void *handle) return lmp->update->whichflag; } -/** Force a timeout to cleanly stop an ongoing run +/** Force a timeout to stop an ongoing run cleanly. * * This function can be used from signal handlers or multi-threaded * applications to cleanly terminate an ongoing run. diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index fc0d0dc956..796416b7fb 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -69,6 +69,11 @@ if(CMAKE_Fortran_COMPILER) target_link_libraries(test_fortran_extract_fix PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractFix COMMAND test_fortran_extract_fix) + add_executable(test_fortran_extract_variable wrap_extract_variable.cpp test_fortran_extract_variable.f90) + target_link_libraries(test_fortran_extract_variable PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranExtractVariable COMMAND test_fortran_extract_variable) + + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/atomdata.txt b/unittest/fortran/atomdata.txt new file mode 100644 index 0000000000..83a34e9f2b --- /dev/null +++ b/unittest/fortran/atomdata.txt @@ -0,0 +1,8 @@ +3 +2 1.6 +1 5.2 +3 -1.4 + +2 +3 2.5 +1 -1.1 diff --git a/unittest/fortran/greetings.txt b/unittest/fortran/greetings.txt new file mode 100644 index 0000000000..cb547f0adf --- /dev/null +++ b/unittest/fortran/greetings.txt @@ -0,0 +1,9 @@ +hello +god dag +hola +bonjour +guten Tag +konnichiwa +shalom +salve +goedendag diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 new file mode 100644 index 0000000000..fda68b0cad --- /dev/null +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -0,0 +1,161 @@ +MODULE keepvar + USE liblammps + IMPLICIT NONE + TYPE(LAMMPS) :: lmp + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(LEN=40) :: & + 'region box block 0 $x 0 3 0 4', & + 'create_box 1 box', & + 'create_atoms 1 single 1.0 1.0 ${zpos}' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & + [ CHARACTER(LEN=40) :: & + 'create_atoms 1 single &', & + ' 0.2 0.1 0.1', & + 'create_atoms 1 single 0.5 0.5 0.5' ] + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & + [ CHARACTER(LEN=40) :: & + 'pair_style lj/cut 2.5', & + 'pair_coeff 1 1 1.0 1.0', & + 'mass 1 2.0' ] + CHARACTER(LEN=60), DIMENSION(4), PARAMETER :: py_input = & + [ CHARACTER(LEN=60) :: & + 'python square_it input 1 v_lp return v_square here """', & + 'def square_it(N) :', & + ' return N*N', & + '"""' ] + +CONTAINS + + FUNCTION absolute_path(filename) + CHARACTER(LEN=:), ALLOCATABLE :: absolute_path + CHARACTER(LEN=*), INTENT(IN) :: filename + CHARACTER(LEN=:), ALLOCATABLE :: test_input_directory + +print *, 'GOT HERE! filename is ', filename + test_input_directory = lmp%extract_variable('input_dir') +print *, ' test_input_directory is ', test_input_directory + absolute_path = test_input_directory // '/' // TRIM(filename) + END FUNCTION absolute_path + +END MODULE keepvar + +FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) + USE ISO_C_BINDING, ONLY: c_ptr, c_char, c_int, c_size_t, c_f_pointer + USE liblammps + USE keepvar, ONLY: lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: argc + TYPE(c_ptr), VALUE :: argv + TYPE(c_ptr), DIMENSION(:), POINTER :: Fargv + INTEGER, PARAMETER :: ARG_LENGTH = 80 + TYPE(c_ptr) :: f_lammps_with_C_args + CHARACTER(LEN=ARG_LENGTH), DIMENSION(argc) :: args + CHARACTER(LEN=1,KIND=c_char), DIMENSION(:), POINTER :: Cstr + INTEGER :: i, length, j + + INTERFACE + FUNCTION c_strlen (str) BIND(C,name='strlen') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: str + INTEGER(c_size_t) :: c_strlen + END FUNCTION c_strlen + END INTERFACE + + CALL C_F_POINTER(argv, Fargv, [argc]) + DO i = 1, argc + args(i) = '' + length = c_strlen(Fargv(i)) + CALL C_F_POINTER(Fargv(i), Cstr, [length]) + FORALL (j = 1:length) + args(i)(j:j) = Cstr(j) + END FORALL + END DO + + lmp = lammps(args) + f_lammps_with_C_args = lmp%handle +END FUNCTION f_lammps_with_C_args + +SUBROUTINE f_lammps_close() BIND(C) + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepvar, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_extract_variable () BIND(C) + USE LIBLAMMPS + USE keepvar, ONLY : lmp, demo_input, cont_input, pair_input, absolute_path + IMPLICIT NONE + + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) + CALL lmp%command('variable idx index "hello" "goodbye"') + CALL lmp%command('variable lp loop 10') + CALL lmp%command('variable lp_pad loop 10 pad') + !CALL lmp%command('variable wld world "group1" "group2" "group3"') + CALL lmp%command('variable wld world "group1"') + CALL lmp%command('variable uni universe "universe1" "universeA"') + CALL lmp%command('variable ulp uloop 2') + CALL lmp%command('variable str index "this is a string"') + CALL lmp%command('variable fmt format lp %.6G') + CALL lmp%command('variable fmt_pad format lp %0.6g') + CALL lmp%command('variable shell getenv SHELL') +! CALL lmp%command('variable greet file ' // absolute_path('greetings.txt')) +! CALL lmp%command('variable atfile atomfile ' // absolute_path('atomdata.txt') + IF ( lmp%config_has_package('PYTHON') ) THEN + CALL lmp%command('variable py python square_it') + END IF + CALL lmp%command('variable time timer') + CALL lmp%command('variable int internal 4') + CALL lmp%command("variable nat equal count(all)") + CALL lmp%command("variable ts equal step") +END SUBROUTINE f_lammps_setup_extract_variable + +FUNCTION f_lammps_extract_variable_index_1 () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int) :: f_lammps_extract_variable_index_1 + CHARACTER(LEN=80) :: str + + str = lmp%extract_variable("idx") + IF ( trim(str) == 'hello' ) THEN + f_lammps_extract_variable_index_1 = 1_c_int + ELSE + f_lammps_extract_variable_index_1 = 0_c_int + END IF +END FUNCTION f_lammps_extract_variable_index_1 + +FUNCTION f_lammps_extract_variable_index_2 () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int) :: f_lammps_extract_variable_index_2 + CHARACTER(LEN=80) :: str + + str = lmp%extract_variable("idx") + IF ( trim(str) == 'goodbye' ) THEN + f_lammps_extract_variable_index_2 = 1_c_int + ELSE + f_lammps_extract_variable_index_2 = 0_c_int + END IF +END FUNCTION f_lammps_extract_variable_index_2 + +FUNCTION f_lammps_extract_variable_loop () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int) :: f_lammps_extract_variable_loop + CHARACTER(LEN=80) :: loop + + loop = lmp%extract_variable('lp') + READ(loop,*) f_lammps_extract_variable_loop +END FUNCTION f_lammps_extract_variable_loop diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp new file mode 100644 index 0000000000..0e3ffecfac --- /dev/null +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -0,0 +1,87 @@ +// unit tests for extracting compute data from a LAMMPS instance through the +// Fortran wrapper +#include + +#include "lammps.h" +#include "library.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +#define STRINGIFY(val) XSTR(val) +#define XSTR(val) #val + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_c_args(int,char**); +void f_lammps_close(); +void f_lammps_setup_extract_variable(); +int f_lammps_extract_variable_index_1(); +int f_lammps_extract_variable_index_2(); +int f_lammps_extract_variable_loop(); +double f_lammps_extract_variable_loop_pad(); +void f_lammps_setup_extract_variable_world(); +void f_lammps_setup_extract_variable_universe(); +int f_lammps_setup_extract_variable_uloop(); +void f_lammps_setup_extract_variable_string(); +void f_lammps_setup_extract_variable_format(); +void f_lammps_setup_extract_variable_getenv(); +void f_lammps_setup_extract_variable_file(); +void f_lammps_setup_extract_variable_atomfile(); +double f_lammps_setup_extract_variable_python(); +double f_lammps_setup_extract_variable_timer(); +double f_lammps_setup_extract_variable_internal(); +double f_lammps_extract_variable_equal_natoms(); +double f_lammps_extract_variable_equal_dt(); +double f_lammps_extract_variable_vector(int); +double f_lammps_extract_variable_atom(int); +} + +class LAMMPS_extract_variable : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_extract_variable() = default; + ~LAMMPS_extract_variable() override = default; + + void SetUp() override + { + const char *args[] = {"LAMMPS_Fortran_test", "-l", "none", + "-echo", "screen", "-nocite", "-var", + "input_dir", STRINGIFY(TEST_INPUT_FOLDER), + "-var", "zpos", "1.5", "-var", "x", "2"}; + char** argv = (char**) args; + int argc = sizeof(args) / sizeof(const char*); + ::testing::internal::CaptureStdout(); +std::fprintf(stderr,"THIS IS A TEST\n"); + lmp = (LAMMPS_NS::LAMMPS*)f_lammps_with_c_args(argc, argv); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_extract_variable, index) +{ + f_lammps_setup_extract_variable(); + EXPECT_EQ(f_lammps_extract_variable_index_1(), 1); + EXPECT_EQ(f_lammps_extract_variable_index_2(), 0); + lammps_command(lmp, "next idx"); + EXPECT_EQ(f_lammps_extract_variable_index_1(), 0); + EXPECT_EQ(f_lammps_extract_variable_index_2(), 1); +}; + +TEST_F(LAMMPS_extract_variable, loop) +{ + f_lammps_setup_extract_variable(); + EXPECT_EQ(f_lammps_extract_variable_loop(), 1); +}; From 8ee17edcab2b4c7b681e805a098f84f6ddea4190 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Thu, 29 Sep 2022 23:39:39 -0500 Subject: [PATCH 254/364] Implemented more unit tests; stuck on atomfile --- fortran/lammps.f90 | 1 + unittest/fortran/CMakeLists.txt | 2 +- unittest/fortran/greetings.txt | 4 +- .../fortran/test_fortran_extract_variable.f90 | 214 +++++++++++++++--- unittest/fortran/wrap_extract_variable.cpp | 146 ++++++++++-- 5 files changed, 318 insertions(+), 49 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index eb83ce3058..7fe5e7fd8a 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -193,6 +193,7 @@ MODULE LIBLAMMPS assign_doublemat_to_lammps_fix_data ! Variables, too MODULE PROCEDURE assign_double_to_lammps_variable_data, & + assign_doublevec_to_lammps_variable_data, & assign_string_to_lammps_variable_data END INTERFACE diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 796416b7fb..8aaff70041 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -70,10 +70,10 @@ if(CMAKE_Fortran_COMPILER) add_test(NAME FortranExtractFix COMMAND test_fortran_extract_fix) add_executable(test_fortran_extract_variable wrap_extract_variable.cpp test_fortran_extract_variable.f90) + target_compile_definitions(test_fortran_extract_variable PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(test_fortran_extract_variable PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractVariable COMMAND test_fortran_extract_variable) - else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/greetings.txt b/unittest/fortran/greetings.txt index cb547f0adf..9cccccc35d 100644 --- a/unittest/fortran/greetings.txt +++ b/unittest/fortran/greetings.txt @@ -1,8 +1,8 @@ hello -god dag +god_dag hola bonjour -guten Tag +guten_Tag konnichiwa shalom salve diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index fda68b0cad..46a4609e08 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -29,18 +29,42 @@ CONTAINS FUNCTION absolute_path(filename) CHARACTER(LEN=:), ALLOCATABLE :: absolute_path CHARACTER(LEN=*), INTENT(IN) :: filename - CHARACTER(LEN=:), ALLOCATABLE :: test_input_directory + CHARACTER(LEN=256) :: test_input_directory -print *, 'GOT HERE! filename is ', filename test_input_directory = lmp%extract_variable('input_dir') -print *, ' test_input_directory is ', test_input_directory - absolute_path = test_input_directory // '/' // TRIM(filename) + absolute_path = TRIM(test_input_directory) // '/' // TRIM(filename) END FUNCTION absolute_path + FUNCTION f2c_string(f_string) RESULT(ptr) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr, c_size_t, & + c_null_char, C_F_POINTER + CHARACTER(LEN=*), INTENT(IN) :: f_string + CHARACTER(LEN=1, KIND=c_char), POINTER :: c_string(:) + TYPE(c_ptr) :: ptr + INTEGER(c_size_t) :: i, n + + INTERFACE + FUNCTION lammps_malloc(size) BIND(C, name='malloc') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + INTEGER(c_size_t), VALUE :: size + TYPE(c_ptr) :: lammps_malloc + END FUNCTION lammps_malloc + END INTERFACE + + n = LEN_TRIM(f_string) + ptr = lammps_malloc(n+1) + CALL C_F_POINTER(ptr, c_string, [1]) + DO i=1, n + c_string(i) = f_string(i:i) + END DO + c_string(n+1) = c_null_char + END FUNCTION f2c_string + END MODULE keepvar FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) - USE ISO_C_BINDING, ONLY: c_ptr, c_char, c_int, c_size_t, c_f_pointer + USE ISO_C_BINDING, ONLY: c_ptr, c_char, c_int, c_size_t, C_F_POINTER USE liblammps USE keepvar, ONLY: lmp IMPLICIT NONE @@ -87,33 +111,36 @@ SUBROUTINE f_lammps_close() BIND(C) END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_variable () BIND(C) - USE LIBLAMMPS - USE keepvar, ONLY : lmp, demo_input, cont_input, pair_input, absolute_path - IMPLICIT NONE + USE LIBLAMMPS + USE keepvar, ONLY : lmp, demo_input, cont_input, pair_input, absolute_path + IMPLICIT NONE - CALL lmp%commands_list(demo_input) - CALL lmp%commands_list(cont_input) - CALL lmp%commands_list(pair_input) - CALL lmp%command('variable idx index "hello" "goodbye"') - CALL lmp%command('variable lp loop 10') - CALL lmp%command('variable lp_pad loop 10 pad') - !CALL lmp%command('variable wld world "group1" "group2" "group3"') - CALL lmp%command('variable wld world "group1"') - CALL lmp%command('variable uni universe "universe1" "universeA"') - CALL lmp%command('variable ulp uloop 2') - CALL lmp%command('variable str index "this is a string"') - CALL lmp%command('variable fmt format lp %.6G') - CALL lmp%command('variable fmt_pad format lp %0.6g') - CALL lmp%command('variable shell getenv SHELL') -! CALL lmp%command('variable greet file ' // absolute_path('greetings.txt')) -! CALL lmp%command('variable atfile atomfile ' // absolute_path('atomdata.txt') - IF ( lmp%config_has_package('PYTHON') ) THEN - CALL lmp%command('variable py python square_it') - END IF - CALL lmp%command('variable time timer') - CALL lmp%command('variable int internal 4') - CALL lmp%command("variable nat equal count(all)") - CALL lmp%command("variable ts equal step") + CALL lmp%command('atom_modify map array') + CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(pair_input) + CALL lmp%command('variable idx index "hello" "goodbye"') + CALL lmp%command('variable lp loop 10') + CALL lmp%command('variable lp_pad loop 10 pad') + CALL lmp%command('variable wld world "group1"') + CALL lmp%command('variable uni universe "universe1" "universeA"') + CALL lmp%command('variable ulp uloop 2') + CALL lmp%command('variable str string "this is a string"') + CALL lmp%command('variable ex equal exp(v_lp)') + CALL lmp%command('variable fmt format ex %.6G') + CALL lmp%command('variable fmt_pad format ex %08.6g') + ! USERNAME should exist on all platforms (incl. Windows) + CALL lmp%command('variable username getenv USERNAME') + CALL lmp%command('variable greeting file ' // absolute_path('greetings.txt')) + CALL lmp%command('variable atfile atomfile ' & + // absolute_path('atomdata.txt')) + IF ( lmp%config_has_package('PYTHON') ) THEN + CALL lmp%command('variable py python square_it') + END IF + CALL lmp%command('variable time timer') + CALL lmp%command('variable int internal 4') + CALL lmp%command("variable nat equal count(all)") + CALL lmp%command("variable ts equal step") END SUBROUTINE f_lammps_setup_extract_variable FUNCTION f_lammps_extract_variable_index_1 () BIND(C) @@ -159,3 +186,128 @@ FUNCTION f_lammps_extract_variable_loop () BIND(C) loop = lmp%extract_variable('lp') READ(loop,*) f_lammps_extract_variable_loop END FUNCTION f_lammps_extract_variable_loop + +FUNCTION f_lammps_extract_variable_loop_pad () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_loop_pad + CHARACTER(LEN=20) :: loop + + loop = lmp%extract_variable('lp_pad') + f_lammps_extract_variable_loop_pad = f2c_string(loop) +END FUNCTION f_lammps_extract_variable_loop_pad + +FUNCTION f_lammps_extract_variable_world () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_world + CHARACTER(LEN=20) :: world + + world = lmp%extract_variable('wld') + f_lammps_extract_variable_world = f2c_string(world) +END FUNCTION f_lammps_extract_variable_world + +FUNCTION f_lammps_extract_variable_universe () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_universe + CHARACTER(LEN=20) :: universe + + universe = lmp%extract_variable('uni') + f_lammps_extract_variable_universe = f2c_string(universe) +END FUNCTION f_lammps_extract_variable_universe + +FUNCTION f_lammps_extract_variable_uloop () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int) :: f_lammps_extract_variable_uloop + CHARACTER(LEN=80) :: uloop + + uloop = lmp%extract_variable('ulp') + READ(uloop,*) f_lammps_extract_variable_uloop +END FUNCTION f_lammps_extract_variable_uloop + +FUNCTION f_lammps_extract_variable_string () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_string + CHARACTER(LEN=20) :: string + + string = lmp%extract_variable('str') + f_lammps_extract_variable_string = f2c_string(string) +END FUNCTION f_lammps_extract_variable_string + +FUNCTION f_lammps_extract_variable_format () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_format + CHARACTER(LEN=20) :: form + + form = lmp%extract_variable('fmt') + f_lammps_extract_variable_format = f2c_string(form) +END FUNCTION f_lammps_extract_variable_format + +FUNCTION f_lammps_extract_variable_format_pad () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_format_pad + CHARACTER(LEN=20) :: form + + form = lmp%extract_variable('fmt_pad') + f_lammps_extract_variable_format_pad = f2c_string(form) +END FUNCTION f_lammps_extract_variable_format_pad + +FUNCTION f_lammps_extract_variable_getenv () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_getenv + CHARACTER(LEN=20) :: string + + string = lmp%extract_variable('username') + f_lammps_extract_variable_getenv = f2c_string(string) +END FUNCTION f_lammps_extract_variable_getenv + +FUNCTION f_lammps_extract_variable_file () BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_extract_variable_file + CHARACTER(LEN=40) :: string + + string = lmp%extract_variable('greeting') + f_lammps_extract_variable_file = f2c_string(string) +END FUNCTION f_lammps_extract_variable_file + +FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_variable_atomfile + REAL(c_double), DIMENSION(:), POINTER :: atom_data + + atom_data = lmp%extract_variable('atfile') +print*, 'TESTING: atom_data is', atom_data + f_lammps_extract_variable_atomfile = atom_data(i) +END FUNCTION f_lammps_extract_variable_atomfile diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index 0e3ffecfac..3d139c222a 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -1,13 +1,14 @@ // unit tests for extracting compute data from a LAMMPS instance through the // Fortran wrapper -#include #include "lammps.h" #include "library.h" #include #include +#include #include #include +#include #include "gtest/gtest.h" @@ -22,18 +23,19 @@ void f_lammps_setup_extract_variable(); int f_lammps_extract_variable_index_1(); int f_lammps_extract_variable_index_2(); int f_lammps_extract_variable_loop(); -double f_lammps_extract_variable_loop_pad(); -void f_lammps_setup_extract_variable_world(); -void f_lammps_setup_extract_variable_universe(); -int f_lammps_setup_extract_variable_uloop(); -void f_lammps_setup_extract_variable_string(); -void f_lammps_setup_extract_variable_format(); -void f_lammps_setup_extract_variable_getenv(); -void f_lammps_setup_extract_variable_file(); -void f_lammps_setup_extract_variable_atomfile(); -double f_lammps_setup_extract_variable_python(); -double f_lammps_setup_extract_variable_timer(); -double f_lammps_setup_extract_variable_internal(); +char* f_lammps_extract_variable_loop_pad(); +char* f_lammps_extract_variable_world(); +char* f_lammps_extract_variable_universe(); +int f_lammps_extract_variable_uloop(); +char* f_lammps_extract_variable_string(); +char* f_lammps_extract_variable_format(); +char* f_lammps_extract_variable_format_pad(); +char* f_lammps_extract_variable_getenv(); +char* f_lammps_extract_variable_file(); +double f_lammps_extract_variable_atomfile(int); +double f_lammps_extract_variable_python(); +double f_lammps_extract_variable_timer(); +double f_lammps_extract_variable_internal(); double f_lammps_extract_variable_equal_natoms(); double f_lammps_extract_variable_equal_dt(); double f_lammps_extract_variable_vector(int); @@ -55,7 +57,6 @@ protected: char** argv = (char**) args; int argc = sizeof(args) / sizeof(const char*); ::testing::internal::CaptureStdout(); -std::fprintf(stderr,"THIS IS A TEST\n"); lmp = (LAMMPS_NS::LAMMPS*)f_lammps_with_c_args(argc, argv); std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); @@ -83,5 +84,120 @@ TEST_F(LAMMPS_extract_variable, index) TEST_F(LAMMPS_extract_variable, loop) { f_lammps_setup_extract_variable(); - EXPECT_EQ(f_lammps_extract_variable_loop(), 1); + int i; + for ( i = 1; i <= 10; i++ ) { + EXPECT_EQ(f_lammps_extract_variable_loop(), i); + lammps_command(lmp, "next lp"); + } +}; + +TEST_F(LAMMPS_extract_variable, loop_pad) +{ + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char* fstr; + for ( i = 1; i <= 10; i++ ) { + std::sprintf(str,"%02d",i); + fstr = f_lammps_extract_variable_loop_pad(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp_pad"); + } +}; + +TEST_F(LAMMPS_extract_variable, world) +{ + f_lammps_setup_extract_variable(); + char* fstr = f_lammps_extract_variable_world(); + EXPECT_STREQ(fstr, "group1"); + std::free(fstr); +}; + +TEST_F(LAMMPS_extract_variable, universe) +{ + f_lammps_setup_extract_variable(); + char* fstr = f_lammps_extract_variable_universe(); + EXPECT_STREQ(fstr, "universe1"); + std::free(fstr); +}; + +TEST_F(LAMMPS_extract_variable, uloop) +{ + f_lammps_setup_extract_variable(); + EXPECT_EQ(f_lammps_extract_variable_uloop(), 1); +}; + +TEST_F(LAMMPS_extract_variable, string) +{ + f_lammps_setup_extract_variable(); + char* fstr = f_lammps_extract_variable_string(); + EXPECT_STREQ(fstr, "this is a string"); + std::free(fstr); +}; + +TEST_F(LAMMPS_extract_variable, format) +{ + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char* fstr; + for ( i = 1; i <= 10; i++ ) { + std::sprintf(str,"%.6G",std::exp(i)); + fstr = f_lammps_extract_variable_format(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp"); + } +}; + +TEST_F(LAMMPS_extract_variable, format_pad) +{ + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char* fstr; + for ( i = 1; i <= 10; i++ ) { + std::sprintf(str,"%08.6G",std::exp(i)); + fstr = f_lammps_extract_variable_format_pad(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp"); + } +}; + +TEST_F(LAMMPS_extract_variable, getenv) +{ + f_lammps_setup_extract_variable(); + char *env = std::getenv("USERNAME"); + char *fenv = f_lammps_extract_variable_getenv(); + EXPECT_STREQ(fenv, env); + std::free(fenv); +}; + +TEST_F(LAMMPS_extract_variable, file) +{ + f_lammps_setup_extract_variable(); + int i; + const char* str[9] = {"hello","god_dag","hola","bonjour","guten_Tag", + "konnichiwa","shalom","salve","goedendag"}; + char* fstr; + for ( i = 0; i < 9; i++ ) { + fstr = f_lammps_extract_variable_file(); + EXPECT_STREQ(fstr, str[i]); + std::free(fstr); + lammps_command(lmp, "next greeting"); + } +}; + +TEST_F(LAMMPS_extract_variable, atomfile) +{ + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), 5.2); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 1.6); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), -1.4); +/* lammps_command(lmp, "next atfile"); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), -1.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), 2.5); */ }; From 038ad3a0382c11257e7ebc522b5503c1df8eb187 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 09:02:14 -0400 Subject: [PATCH 255/364] portability improvement --- src/utils.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 6483997dc9..e293b6c67b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1815,7 +1815,7 @@ re_t re_compile(re_ctx_t context, const char *pattern) /* Private functions: */ static int matchdigit(char c) { - return ((c >= '0') && (c <= '9')); + return isdigit(c); } static int matchint(char c) @@ -1830,12 +1830,12 @@ static int matchfloat(char c) static int matchalpha(char c) { - return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); + return isalpha(c); } static int matchwhitespace(char c) { - return ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r') || (c == '\f') || (c == '\v')); + return isspace(c); } static int matchalphanum(char c) From fce0877cac802ccca78299b318a4b48d70e019de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 09:49:57 -0400 Subject: [PATCH 256/364] update and remove obsolete parts --- doc/src/Speed_packages.rst | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/doc/src/Speed_packages.rst b/doc/src/Speed_packages.rst index 74d470c9fd..22616c5da4 100644 --- a/doc/src/Speed_packages.rst +++ b/doc/src/Speed_packages.rst @@ -117,33 +117,15 @@ script. with all its accelerator packages installed. Note however that the INTEL and KOKKOS packages require you to choose one of their hardware options when building for a specific platform. I.e. CPU or - Phi option for the INTEL package. Or the OpenMP, Cuda, or Phi - option for the KOKKOS package. + Phi option for the INTEL package. Or the OpenMP, Cuda, Hip, Sycl, + or Phi option for the KOKKOS package. Or the OpenCL, Hip, or Cuda + for the GPU package. These are the exceptions. You cannot build a single executable with: * both the INTEL Phi and KOKKOS Phi options * the INTEL Phi or Kokkos Phi option, and the GPU package -See the examples/accelerate/README and make.list files for sample -Make.py commands that build LAMMPS with any or all of the accelerator -packages. As an example, here is a command that builds with all the -GPU related packages installed (GPU, KOKKOS with Cuda), including -settings to build the needed auxiliary GPU libraries for Kepler GPUs: - -.. code-block:: bash - - Make.py -j 16 -p omp gpu kokkos -cc nvcc wrap=mpi -gpu mode=double arch=35 -kokkos cuda arch=35 lib-all file mpi - -The examples/accelerate directory also has input scripts that can be -used with all of the accelerator packages. See its README file for -details. - -Likewise, the bench directory has FERMI and KEPLER and PHI -sub-directories with Make.py commands and input scripts for using all -the accelerator packages on various machines. See the README files in -those directories. - As mentioned above, the `Benchmark page `_ of the LAMMPS website gives performance results for the various accelerator packages for several of the standard LAMMPS benchmark problems, as a function of problem From ec0bc5aa5e7728aeffb2ce9772e7487827dcf973 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 09:57:42 -0400 Subject: [PATCH 257/364] improve detection of invalid format strings. allow to replace format style variables --- src/variable.cpp | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 83280bcc67..61e29f4186 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -389,19 +389,32 @@ void Variable::set(int narg, char **arg) // 3rd is filled on retrieval } else if (strcmp(arg[1],"format") == 0) { + constexpr char validfmt[] = "% ?-?[0-9]*\\.?[0-9]*[efgEFG]"; if (narg != 4) error->all(FLERR,"Illegal variable command: expected 4 arguments but found {}", narg); - if (find(arg[0]) >= 0) return; - if (nvar == maxvar) grow(); - style[nvar] = FORMAT; - num[nvar] = 3; - which[nvar] = 0; - pad[nvar] = 0; - if (!utils::strmatch(arg[3],"%[0-9 ]*\\.[0-9]+[efgEFG]")) - error->all(FLERR,"Incorrect conversion in format string"); - data[nvar] = new char*[num[nvar]]; - copy(2,&arg[2],data[nvar]); - data[nvar][2] = new char[VALUELENGTH]; - strcpy(data[nvar][2],"(undefined)"); + int ivar = find(arg[0]); + if (ivar >= 0) { + if (style[ivar] != FORMAT) + error->all(FLERR,"Cannot redefine variable as a different style"); + if (!utils::strmatch(arg[3], validfmt)) + error->all(FLERR,"Incorrect conversion in format string"); + delete[] data[ivar][0]; + delete[] data[ivar][1]; + data[ivar][0] = utils::strdup(arg[2]); + data[ivar][1] = utils::strdup(arg[3]); + replaceflag = 1; + } else { + if (nvar == maxvar) grow(); + style[nvar] = FORMAT; + num[nvar] = 3; + which[nvar] = 0; + pad[nvar] = 0; + if (!utils::strmatch(arg[3], validfmt)) + error->all(FLERR,"Incorrect conversion in format string"); + data[nvar] = new char*[num[nvar]]; + copy(2,&arg[2],data[nvar]); + data[nvar][2] = new char[VALUELENGTH]; + strcpy(data[nvar][2],"(undefined)"); + } // EQUAL // replace pre-existing var if also style EQUAL (allows it to be reset) From 08acd321f188dc1abade31b7dc84e140f869f8d2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 09:58:05 -0400 Subject: [PATCH 258/364] add more dedicated tests for format style variables --- unittest/commands/test_variables.cpp | 38 ++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index a64a75e2fe..94dbf742be 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -219,7 +219,7 @@ TEST_F(VariableTest, CreateDelete) TEST_FAILURE(".*ERROR: All universe/uloop variables must have same # of values.*", command("variable ten4 uloop 2");); TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", - command("variable ten11 format two \"%08f\"");); + command("variable ten11 format two \"%08x\"");); TEST_FAILURE(".*ERROR: Variable name 'ten@12' must have only letters, numbers, or undersc.*", command("variable ten@12 index one two three");); TEST_FAILURE(".*ERROR: Variable evaluation before simulation box is defined.*", @@ -281,7 +281,7 @@ TEST_F(VariableTest, AtomicSystem) TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", command("variable one atom x");); TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", - command("variable one vector f_press");); + command("variable id vector f_press");); TEST_FAILURE(".*ERROR on proc 0: Cannot open file variable file test_variable.xxx.*", command("variable ten1 atomfile test_variable.xxx");); TEST_FAILURE(".*ERROR: Variable loop: has a circular dependency.*", @@ -638,6 +638,40 @@ TEST_F(VariableTest, Label2TypeMolecular) ASSERT_THAT(variable->retrieve("d1"), StrEq("1")); ASSERT_THAT(variable->retrieve("i1"), StrEq("1")); } + +TEST_F(VariableTest, Format) +{ + BEGIN_HIDE_OUTPUT(); + command("variable idx index -0.625"); + command("variable one equal -0.625"); + command("variable two equal 1.0e-20"); + command("variable f1idx format idx \"%8.4f\""); + command("variable f1one format one \"%8.4f\""); + command("variable f1two format two \"%8.4f\""); + command("variable f2one format one \"%.2F\""); + command("variable f2two format two \"% .25F\""); + command("variable f3one format one \"%5f\""); + command("variable f3two format two \"%f\""); + END_HIDE_OUTPUT(); + EXPECT_THAT(variable->retrieve("one"), StrEq("-0.625")); + EXPECT_THAT(variable->retrieve("two"), StrEq("1e-20")); + EXPECT_EQ(variable->retrieve("f1idx"), nullptr); // cannot format index style variables + EXPECT_THAT(variable->retrieve("f1one"), StrEq(" -0.6250")); + EXPECT_THAT(variable->retrieve("f1two"), StrEq(" 0.0000")); + EXPECT_THAT(variable->retrieve("f2one"), StrEq("-0.62")); + EXPECT_THAT(variable->retrieve("f2two"), StrEq(" 0.0000000000000000000100000")); + EXPECT_THAT(variable->retrieve("f3one"), StrEq("-0.625000")); + EXPECT_THAT(variable->retrieve("f3two"), StrEq("0.000000")); + + BEGIN_HIDE_OUTPUT(); + command("variable f1one format one \"%-8.4f\""); + END_HIDE_OUTPUT(); + EXPECT_THAT(variable->retrieve("f1one"), StrEq("-0.6250 ")); + + TEST_FAILURE(".*ERROR: Illegal variable command.*", command("variable xxx format \"xxx\"");); + TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", + command("variable f2one equal 0.5");); +} } // namespace LAMMPS_NS int main(int argc, char **argv) From a9701f54cb501a11ab9ca1b075342c0f060f0677 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 30 Sep 2022 14:53:37 -0400 Subject: [PATCH 259/364] HIP tuning --- src/KOKKOS/pair_snap_kokkos.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h index b8160c318b..2937359822 100644 --- a/src/KOKKOS/pair_snap_kokkos.h +++ b/src/KOKKOS/pair_snap_kokkos.h @@ -95,7 +95,7 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int tile_size_compute_zi = 2; static constexpr int tile_size_compute_bi = 2; static constexpr int tile_size_transform_bi = 2; - static constexpr int tile_size_compute_yi = 8; + static constexpr int tile_size_compute_yi = 2; static constexpr int team_size_compute_fused_deidrj = 2; #else static constexpr int team_size_compute_neigh = 4; From 172106717d8dabd9c96d5f2daeae4c24cd8c0b1e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 15:05:41 -0400 Subject: [PATCH 260/364] must match the entire string --- src/variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variable.cpp b/src/variable.cpp index 61e29f4186..1142c6b27b 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -389,7 +389,7 @@ void Variable::set(int narg, char **arg) // 3rd is filled on retrieval } else if (strcmp(arg[1],"format") == 0) { - constexpr char validfmt[] = "% ?-?[0-9]*\\.?[0-9]*[efgEFG]"; + constexpr char validfmt[] = "^% ?-?[0-9]*\\.?[0-9]*[efgEFG]$"; if (narg != 4) error->all(FLERR,"Illegal variable command: expected 4 arguments but found {}", narg); int ivar = find(arg[0]); if (ivar >= 0) { From b48868d70bb3a027370868fddf6e93ef68329681 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 15:05:56 -0400 Subject: [PATCH 261/364] better document format style variable behavior --- doc/src/variable.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 969c3f1fe2..46d38975bb 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -319,11 +319,12 @@ in the input script, or if the script is read again in a loop. The other difference is that *string* performs variable substitution even if the string parameter is quoted. -For the *format* style, an equal-style variable is specified along -with a C-style format string, e.g. "%f" or "%.10g", which must be -appropriate for formatting a double-precision floating-point value. -The default format is "%.15g". This variable style allows an -equal-style variable to be formatted precisely when it is evaluated. +For the *format* style, an equal-style or compatible variable is +specified along with a C-style format string, e.g. "%f" or "%.10g", +which must be appropriate for formatting a double-precision +floating-point value and may not have extra characters. The default +format is "%.15g". This variable style allows an equal-style variable +to be formatted precisely when it is evaluated. Note that if you simply wish to print a variable value with desired precision to the screen or logfile via the :doc:`print ` or From cbe83701c167f0b6a6c3214e49b840dc9a4281db Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 15:06:25 -0400 Subject: [PATCH 262/364] better checking for valid data for format style variables --- src/variable.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/variable.cpp b/src/variable.cpp index 1142c6b27b..e38dd4cd29 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -392,6 +392,11 @@ void Variable::set(int narg, char **arg) constexpr char validfmt[] = "^% ?-?[0-9]*\\.?[0-9]*[efgEFG]$"; if (narg != 4) error->all(FLERR,"Illegal variable command: expected 4 arguments but found {}", narg); int ivar = find(arg[0]); + int jvar = find(arg[2]); + if (jvar < 0) + error->all(FLERR, "Variable {}: format variable {} does not exist", arg[0], arg[2]); + if (!equalstyle(jvar)) + error->all(FLERR, "Variable {}: format variable {} has incompatible style", arg[0], arg[2]); if (ivar >= 0) { if (style[ivar] != FORMAT) error->all(FLERR,"Cannot redefine variable as a different style"); @@ -953,8 +958,11 @@ char *Variable::retrieve(const char *name) str = data[ivar][1]; } else if (style[ivar] == FORMAT) { int jvar = find(data[ivar][0]); - if (jvar == -1) return nullptr; - if (!equalstyle(jvar)) return nullptr; + if (jvar < 0) + error->all(FLERR, "Variable {}: format variable {} does not exist", names[ivar],data[ivar][0]); + if (!equalstyle(jvar)) + error->all(FLERR, "Variable {}: format variable {} has incompatible style", + names[ivar],data[ivar][0]); double answer = compute_equal(jvar); sprintf(data[ivar][2],data[ivar][1],answer); str = data[ivar][2]; From 2538929d76d5281ebbd2097bd967961a093d2fb3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 15:06:46 -0400 Subject: [PATCH 263/364] update tests for recent changes and with more death tests. --- unittest/commands/test_variables.cpp | 67 +++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index 94dbf742be..c2a5acd1b8 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -642,35 +642,82 @@ TEST_F(VariableTest, Label2TypeMolecular) TEST_F(VariableTest, Format) { BEGIN_HIDE_OUTPUT(); - command("variable idx index -0.625"); - command("variable one equal -0.625"); - command("variable two equal 1.0e-20"); - command("variable f1idx format idx \"%8.4f\""); + command("variable idx index -0.625"); + command("variable one equal -0.625"); + command("variable two equal 1.0e-20"); + command("variable three equal 1.0e10"); command("variable f1one format one \"%8.4f\""); - command("variable f1two format two \"%8.4f\""); - command("variable f2one format one \"%.2F\""); + command("variable f1two format two %8.4f"); + command("variable f2one format one %.2F"); command("variable f2two format two \"% .25F\""); command("variable f3one format one \"%5f\""); - command("variable f3two format two \"%f\""); + command("variable f3two format two %f"); + command("variable e1one format one \"%14.4e\""); + command("variable e1two format two %-14.4e"); + command("variable e2one format one %.2E"); + command("variable e2two format two \"% .15E\""); + command("variable e3one format one \"%5e\""); + command("variable e3two format two %e"); + command("variable g1one format one %14.4g"); + command("variable g1two format two \"%-14.4g\""); + command("variable g2one format one %.2G"); + command("variable g2two format two \"% .15G\""); + command("variable g3one format one \"%5g\""); + command("variable g3two format two \"%g\""); END_HIDE_OUTPUT(); EXPECT_THAT(variable->retrieve("one"), StrEq("-0.625")); EXPECT_THAT(variable->retrieve("two"), StrEq("1e-20")); - EXPECT_EQ(variable->retrieve("f1idx"), nullptr); // cannot format index style variables EXPECT_THAT(variable->retrieve("f1one"), StrEq(" -0.6250")); EXPECT_THAT(variable->retrieve("f1two"), StrEq(" 0.0000")); EXPECT_THAT(variable->retrieve("f2one"), StrEq("-0.62")); EXPECT_THAT(variable->retrieve("f2two"), StrEq(" 0.0000000000000000000100000")); EXPECT_THAT(variable->retrieve("f3one"), StrEq("-0.625000")); EXPECT_THAT(variable->retrieve("f3two"), StrEq("0.000000")); + EXPECT_THAT(variable->retrieve("e1one"), StrEq(" -6.2500e-01")); + EXPECT_THAT(variable->retrieve("e1two"), StrEq("1.0000e-20 ")); + EXPECT_THAT(variable->retrieve("e2one"), StrEq("-6.25E-01")); + EXPECT_THAT(variable->retrieve("e2two"), StrEq(" 9.999999999999999E-21")); + EXPECT_THAT(variable->retrieve("e3one"), StrEq("-6.250000e-01")); + EXPECT_THAT(variable->retrieve("e3two"), StrEq("1.000000e-20")); + EXPECT_THAT(variable->retrieve("g1one"), StrEq(" -0.625")); + EXPECT_THAT(variable->retrieve("g1two"), StrEq("1e-20 ")); + EXPECT_THAT(variable->retrieve("g2one"), StrEq("-0.62")); + EXPECT_THAT(variable->retrieve("g2two"), StrEq(" 1E-20")); + EXPECT_THAT(variable->retrieve("g3one"), StrEq("-0.625")); + EXPECT_THAT(variable->retrieve("g3two"), StrEq("1e-20")); BEGIN_HIDE_OUTPUT(); - command("variable f1one format one \"%-8.4f\""); + command("variable f1one format one \"%-8.4f\""); + command("variable two delete"); + command("variable two index 12.5"); + command("variable f1three format three %g"); + command("variable three delete"); END_HIDE_OUTPUT(); EXPECT_THAT(variable->retrieve("f1one"), StrEq("-0.6250 ")); - TEST_FAILURE(".*ERROR: Illegal variable command.*", command("variable xxx format \"xxx\"");); + TEST_FAILURE(".*ERROR: Variable f1idx: format variable idx has incompatible style.*", + command("variable f1idx format idx %8.4f");); + TEST_FAILURE(".*ERROR: Variable f1two: format variable two has incompatible style.*", + variable->retrieve("f1two");); + TEST_FAILURE(".*ERROR: Variable f1idx: format variable yyy does not exist.*", + command("variable f1idx format yyy %8.4f");); + TEST_FAILURE(".*ERROR: Variable f1three: format variable three does not exist.*", + variable->retrieve("f1three");); TEST_FAILURE(".*ERROR: Cannot redefine variable as a different style.*", command("variable f2one equal 0.5");); + TEST_FAILURE(".*ERROR: Illegal variable command.*", command("variable xxx format \"xxx\"");); + TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + command("variable xxx format one \"xxx\"");); + TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + command("variable xxx format one \"%d\"");); + TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + command("variable xxx format one \"%g%g\"");); + TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + command("variable xxx format one \"%g%5\"");); + TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + command("variable xxx format one \"%g%%\"");); + // TEST_FAILURE(".*ERROR: Incorrect conversion in format string.*", + // command("print \"${f1idx}\"");); } } // namespace LAMMPS_NS From 756d24ff9e3426c4f9f65c769f3d80b60611c95d Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 16:02:26 -0500 Subject: [PATCH 264/364] Implemented vector-style variables in C, Python, and Fortran APIs; unit test and more for Fortran/extract_variable --- fortran/lammps.f90 | 40 ++++++-- python/lammps/constants.py | 3 +- python/lammps/core.py | 20 ++++ src/library.cpp | 44 ++++++--- src/library.h | 7 +- .../fortran/test_fortran_extract_variable.f90 | 96 ++++++++++++++++--- unittest/fortran/wrap_extract_variable.cpp | 68 ++++++++++++- 7 files changed, 241 insertions(+), 37 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 7fe5e7fd8a..563c96024d 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -66,8 +66,9 @@ MODULE LIBLAMMPS LMP_ERROR_WORLD = 4, & ! error on comm->world LMP_ERROR_UNIVERSE = 8, & ! error on comm->universe LMP_VAR_EQUAL = 0, & ! equal-style variables (and compatible) - LMP_VAR_ATOM = 1, & ! atom-style variables (and compatible) - LMP_VAR_STRING = 2 ! string variables (and compatible) + LMP_VAR_ATOM = 1, & ! atom-style variables + LMP_VAR_VECTOR = 2, & ! vector variables + LMP_VAR_STRING = 3 ! string variables (everything else) ! "Constants" to use with extract_compute and friends TYPE lammps_style @@ -1078,12 +1079,13 @@ CONTAINS CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: group TYPE(lammps_variable_data) :: variable_data - TYPE(c_ptr) :: Cptr, Cname, Cgroup + TYPE(c_ptr) :: Cptr, Cname, Cgroup, Cveclength INTEGER :: length, i CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Cstring INTEGER(c_int) :: datatype - REAL(c_double), POINTER :: double - REAL(c_double), DIMENSION(:), POINTER :: double_vec + REAL(c_double), POINTER :: double => NULL() + REAL(c_double), DIMENSION(:), POINTER :: double_vec => NULL() + INTEGER(c_int), POINTER :: Clength => NULL() Cname = f2c_string(name) IF ( PRESENT(group) ) THEN @@ -1107,8 +1109,27 @@ CONTAINS variable_data%datatype = DATA_DOUBLE_1D length = lmp_extract_setting(self, 'nlocal') CALL C_F_POINTER(Cptr, double_vec, [length]) + IF ( ALLOCATED(variable_data%r64_vec) ) & + DEALLOCATE(variable_data%r64_vec) + ALLOCATE( variable_data%r64_vec(length) ) variable_data%r64_vec = double_vec CALL lammps_free(Cptr) + CASE (LMP_VAR_VECTOR) + variable_data%datatype = DATA_DOUBLE_1D + Cgroup = f2c_string('LMP_SIZE_VECTOR') ! must match library.cpp + Cname = f2c_string(name) + Cveclength = lammps_extract_variable(self%handle, Cname, Cgroup) + CALL C_F_POINTER(Cveclength, Clength) + length = Clength + CALL lammps_free(Cgroup) + CALL lammps_free(Cname) + CALL lammps_free(Cveclength) + CALL C_F_POINTER(Cptr, double_vec, [length]) + IF ( ALLOCATED(variable_data%r64_vec) ) & + DEALLOCATE(variable_data%r64_vec) + ALLOCATE( variable_data%r64_vec(length) ) + variable_data%r64_vec = double_vec + ! DO NOT deallocate the C pointer CASE (LMP_VAR_STRING) variable_data%datatype = DATA_STRING length = c_strlen(Cptr) @@ -1117,6 +1138,11 @@ CONTAINS FORALL ( i=1:length ) variable_data%str(i:i) = Cstring(i) END FORALL + ! DO NOT deallocate the C pointer + CASE (-1) + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'Variable "' // TRIM(name) // & + '" not found [Fortran/extract_variable]') CASE DEFAULT CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'Unknown variable type returned from & @@ -1453,10 +1479,12 @@ CONTAINS END SUBROUTINE assign_double_to_lammps_variable_data SUBROUTINE assign_doublevec_to_lammps_variable_data (lhs, rhs) - REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs + REAL(c_double), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + IF ( ALLOCATED(lhs) ) DEALLOCATE(lhs) + ALLOCATE( lhs(SIZE(rhs%r64_vec)) ) lhs = rhs%r64_vec ELSE CALL assignment_error(rhs, 'vector of doubles') diff --git a/python/lammps/constants.py b/python/lammps/constants.py index 6a7fda85a8..a76be819fe 100644 --- a/python/lammps/constants.py +++ b/python/lammps/constants.py @@ -42,7 +42,8 @@ LMP_ERROR_UNIVERSE = 8 LMP_VAR_EQUAL = 0 LMP_VAR_ATOM = 1 -LMP_VAR_STRING = 2 +LMP_VAR_VECTOR = 2 +LMP_VAR_STRING = 3 # ------------------------------------------------------------------------- diff --git a/python/lammps/core.py b/python/lammps/core.py index 45f49332a7..b7f3ada6a6 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1136,6 +1136,26 @@ class lammps(object): self.lib.lammps_free(ptr) else: return None return result + elif vartype == LMP_VAR_VECTOR : + nvector = 0 + self.lib.lammps_extract_variable.restype = POINTER(c_int) + ptr = self.lib.lammps_extract_variable(self.lmp,name, + 'LMP_SIZE_VECTOR'.encode()) + if ptr : + nvector = ptr[0] + self.lib.lammps_free(ptr) + else : + return None + self.lib.lammps_extract_variable.restype = POINTER(c_double) + result = (c_double*nvector)() + values = self.lib.lammps_extract_variable(self.lmp,name,group) + if values : + for i in range(nvector) : + result[i] = values[i] + # do NOT free the values pointer (points to internal vector data) + return result + else : + return None elif vartype == LMP_VAR_STRING : self.lib.lammps_extract_variable.restype = c_char_p with ExceptionCheck(self) : diff --git a/src/library.cpp b/src/library.cpp index 194c0d9674..1e0c438984 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2043,16 +2043,19 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, This function returns a pointer to data from a LAMMPS :doc:`variable` identified by its name. When the variable is either an *equal*\ -style -compatible or an *atom*\ -style variable the variable is evaluated and -the corresponding value(s) returned. Variables of style *internal* -are compatible with *equal*\ -style variables and so are *python*\ --style variables, if they return a numeric value. For other -variable styles their string value is returned. The function returns +compatible variable, a *vector*\ -style variable, or an *atom*\ -style +variable, the variable is evaluated and the corresponding value(s) returned. +Variables of style *internal* are compatible with *equal*\ -style variables and +so are *python*\ -style variables, if they return a numeric value. For other +variable styles, their string value is returned. The function returns ``NULL`` when a variable of the provided *name* is not found or of an incompatible style. The *group* argument is only used for *atom*\ --style variables and ignored otherwise. If set to ``NULL`` when -extracting data from and *atom*\ -style variable, the group is assumed -to be "all". +-style variables and ignored otherwise, with one exception: for style *vector*, +if *group* is "GET_VECTOR_SIZE", the returned pointer will yield the length +of the vector to be returned when dereferenced. This pointer must be +deallocated after the value is read to avoid a memory leak. +If *group* is set to ``NULL`` when extracting data from an *atom*\ -style +variable, the group is assumed to be "all". When requesting data from an *equal*\ -style or compatible variable this function allocates storage for a single double value, copies the @@ -2066,15 +2069,23 @@ use to avoid a memory leak. Example: double value = *dptr; lammps_free((void *)dptr); -For *atom*\ -style variables the data returned is a pointer to an +For *atom*\ -style variables, the return value is a pointer to an allocated block of storage of double of the length ``atom->nlocal``. Since the data returned are a copy, the location will persist, but its content will not be updated in case the variable is re-evaluated. To avoid a memory leak, this pointer needs to be freed after use in the calling program. +For *vector*\ -style variables, the returned pointer is to actual LAMMPS data. +The pointer should not be deallocated. Its length depends on the variable, +compute, or fix data used to construct the *vector*\ -style variable. +This length can be fetched by calling this function with *group* set to the +constant "LMP_SIZE_VECTOR", which returns a ``void\*`` pointer that can be +dereferenced to an integer that is the length of the vector. This pointer +needs to be deallocated when finished with it to avoid memory leaks. + For other variable styles the returned pointer needs to be cast to -a char pointer. +a char pointer. It should not be deallocated. .. code-block:: c @@ -2084,7 +2095,7 @@ a char pointer. .. note:: LAMMPS cannot easily check if it is valid to access the data - referenced by the variables (e.g., computes or fixes or thermodynamic + referenced by the variables (e.g., computes, fixes, or thermodynamic info), so it may fail with an error. The caller has to make certain that the data are extracted only when it safe to evaluate the variable and thus an error or crash are avoided. @@ -2118,6 +2129,15 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) auto vector = (double *) malloc(nlocal*sizeof(double)); lmp->input->variable->compute_atom(ivar,igroup,vector,1,0); return (void *) vector; + } else if (lmp->input->variable->vectorstyle(ivar)) { + double *values = nullptr; + int nvector = lmp->input->variable->compute_vector(ivar, &values); + if ( group != nullptr && strcmp(group,"LMP_SIZE_VECTOR") == 0 ) { + int* nvecptr = (int *) malloc(sizeof(int)); + *nvecptr = nvector; + return (void *) nvecptr; + } else + return (void *) values; } else { return lmp->input->variable->retrieve(name); } @@ -2162,6 +2182,8 @@ int lammps_extract_variable_datatype(void *handle, const char *name) return LMP_VAR_EQUAL; else if (lmp->input->variable->atomstyle(ivar)) return LMP_VAR_ATOM; + else if (lmp->input->variable->vectorstyle(ivar)) + return LMP_VAR_VECTOR; else return LMP_VAR_STRING; } diff --git a/src/library.h b/src/library.h index 2eadb9c5f3..9adb274518 100644 --- a/src/library.h +++ b/src/library.h @@ -97,9 +97,10 @@ enum _LMP_ERROR_CONST { * and fortran/lammps.f90 */ enum _LMP_VAR_CONST { - LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ - LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ - LMP_VAR_STRING = 2 /*!< return value will be a string (catch-all) */ + LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ + LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ + LMP_VAR_VECTOR = 2, /*!< compatible with vector-style variables */ + LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ }; /* Ifdefs to allow this file to be included in C and C++ programs */ diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index 46a4609e08..de0e588b86 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -17,12 +17,6 @@ MODULE keepvar 'pair_style lj/cut 2.5', & 'pair_coeff 1 1 1.0 1.0', & 'mass 1 2.0' ] - CHARACTER(LEN=60), DIMENSION(4), PARAMETER :: py_input = & - [ CHARACTER(LEN=60) :: & - 'python square_it input 1 v_lp return v_square here """', & - 'def square_it(N) :', & - ' return N*N', & - '"""' ] CONTAINS @@ -115,6 +109,14 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) USE keepvar, ONLY : lmp, demo_input, cont_input, pair_input, absolute_path IMPLICIT NONE + ! Had to do this one as one string because lammps_commands_list and + ! lammps_commands_string do not play well with triple quotes + CHARACTER(LEN=256), PARAMETER :: py_input = & + 'python square_it input 1 v_lp return v_py format ff here """' & + // NEW_LINE(' ') // 'def square_it(N) :' & + // NEW_LINE(' ') // ' return N*N' & + // NEW_LINE(' ') // '"""' + CALL lmp%command('atom_modify map array') CALL lmp%commands_list(demo_input) CALL lmp%commands_list(cont_input) @@ -135,12 +137,17 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) CALL lmp%command('variable atfile atomfile ' & // absolute_path('atomdata.txt')) IF ( lmp%config_has_package('PYTHON') ) THEN - CALL lmp%command('variable py python square_it') + CALL lmp%command(py_input) + CALL lmp%command('variable py python square_it') END IF CALL lmp%command('variable time timer') CALL lmp%command('variable int internal 4') - CALL lmp%command("variable nat equal count(all)") - CALL lmp%command("variable ts equal step") + CALL lmp%command('variable at_z atom z') + CALL lmp%command("compute COM all com") ! defines a global vector + CALL lmp%command("variable center vector c_COM") + ! make sure COM is computable... + CALL lmp%command("thermo_style custom step pe c_COM[1] v_center[1]") + CALL lmp%command("run 0") ! so c_COM and v_center have values END SUBROUTINE f_lammps_setup_extract_variable FUNCTION f_lammps_extract_variable_index_1 () BIND(C) @@ -305,9 +312,76 @@ FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C) IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(c_double) :: f_lammps_extract_variable_atomfile - REAL(c_double), DIMENSION(:), POINTER :: atom_data + REAL(c_double), DIMENSION(:), ALLOCATABLE :: atom_data atom_data = lmp%extract_variable('atfile') -print*, 'TESTING: atom_data is', atom_data f_lammps_extract_variable_atomfile = atom_data(i) END FUNCTION f_lammps_extract_variable_atomfile + +FUNCTION f_lammps_extract_variable_python(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_variable_python + + f_lammps_extract_variable_python = lmp%extract_variable('py') +END FUNCTION f_lammps_extract_variable_python + +FUNCTION f_lammps_extract_variable_timer() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + REAL(c_double) :: f_lammps_extract_variable_timer + + f_lammps_extract_variable_timer = lmp%extract_variable('time') +END FUNCTION f_lammps_extract_variable_timer + +FUNCTION f_lammps_extract_variable_internal() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + REAL(c_double) :: f_lammps_extract_variable_internal + + f_lammps_extract_variable_internal = lmp%extract_variable('int') +END FUNCTION f_lammps_extract_variable_internal + +FUNCTION f_lammps_extract_variable_equal() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + REAL(c_double) :: f_lammps_extract_variable_equal + + f_lammps_extract_variable_equal = lmp%extract_variable('ex') +END FUNCTION f_lammps_extract_variable_equal + +FUNCTION f_lammps_extract_variable_atom(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_variable_atom + REAL(c_double), DIMENSION(:), ALLOCATABLE :: atom + + atom = lmp%extract_variable('at_z') ! z-coordinates + f_lammps_extract_variable_atom = atom(i) +END FUNCTION f_lammps_extract_variable_atom + +FUNCTION f_lammps_extract_variable_vector(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_variable_vector + REAL(c_double), DIMENSION(:), ALLOCATABLE :: vector + + vector = lmp%extract_variable('center') ! z-coordinates + f_lammps_extract_variable_vector = vector(i) +END FUNCTION f_lammps_extract_variable_vector +! vim: sts=2 ts=2 sw=2 et diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index 3d139c222a..d209b4c59b 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -9,6 +9,9 @@ #include #include #include +#include +#include +#include #include "gtest/gtest.h" @@ -36,10 +39,9 @@ double f_lammps_extract_variable_atomfile(int); double f_lammps_extract_variable_python(); double f_lammps_extract_variable_timer(); double f_lammps_extract_variable_internal(); -double f_lammps_extract_variable_equal_natoms(); -double f_lammps_extract_variable_equal_dt(); -double f_lammps_extract_variable_vector(int); +double f_lammps_extract_variable_equal(); double f_lammps_extract_variable_atom(int); +double f_lammps_extract_variable_vector(int); } class LAMMPS_extract_variable : public ::testing::Test { @@ -196,8 +198,64 @@ TEST_F(LAMMPS_extract_variable, atomfile) EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), 5.2); EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 1.6); EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), -1.4); -/* lammps_command(lmp, "next atfile"); + lammps_command(lmp, "next atfile"); EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), -1.1); EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), 2.5); */ + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), 2.5); +}; + +TEST_F(LAMMPS_extract_variable, python) +{ + if ( lammps_config_has_package("PYTHON") ) { + f_lammps_setup_extract_variable(); + for (int i = 1; i <= 10; i++) { + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_python(), + static_cast(i*i)); + lammps_command(lmp, "next lp"); + } + } +}; + +TEST_F(LAMMPS_extract_variable, timer) +{ + f_lammps_setup_extract_variable(); + double initial_t, final_t; + initial_t = f_lammps_extract_variable_timer(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + lammps_command(lmp,"variable time timer"); // update the time + final_t = f_lammps_extract_variable_timer(); + EXPECT_GT(final_t, initial_t + 0.1); +}; + +TEST_F(LAMMPS_extract_variable, internal) +{ + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_internal(), 4.0); +}; + +TEST_F(LAMMPS_extract_variable, equal) +{ + f_lammps_setup_extract_variable(); + int i; + for ( i = 1; i <= 10; i++ ) { + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_equal(), + std::exp(static_cast(i))); + lammps_command(lmp, "next lp"); + } +}; + +TEST_F(LAMMPS_extract_variable, atom) +{ + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(3), 0.5); +}; + +TEST_F(LAMMPS_extract_variable, vector) +{ + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(1), (1+0.2+0.5)/3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(2), (1+0.1+0.5)/3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(3), (1.5+0.1+0.5)/3.0); }; From d301ff9961e115f1e8cf6597f85cd005749f16c3 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 18:31:18 -0500 Subject: [PATCH 265/364] Added set_variable and a test for it --- fortran/lammps.f90 | 31 +++++++++++++++++-- .../fortran/test_fortran_extract_variable.f90 | 17 ++++++++-- unittest/fortran/wrap_extract_variable.cpp | 5 +++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 563c96024d..ddd82719d8 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -102,6 +102,7 @@ MODULE LIBLAMMPS PROCEDURE :: extract_compute => lmp_extract_compute PROCEDURE :: extract_fix => lmp_extract_fix PROCEDURE :: extract_variable => lmp_extract_variable + PROCEDURE :: set_variable => lmp_set_variable ! PROCEDURE :: version => lmp_version PROCEDURE,NOPASS :: get_os_info => lmp_get_os_info @@ -386,7 +387,12 @@ MODULE LIBLAMMPS TYPE(c_ptr) :: lammps_extract_variable END FUNCTION lammps_extract_variable - !INTEGER (c_int) lammps_set_variable + FUNCTION lammps_set_variable (handle, name, str) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE (c_ptr), VALUE :: handle, name, str + INTEGER (c_int) :: lammps_set_variable + END FUNCTION lammps_set_variable !SUBROUTINE lammps_gather_atoms @@ -1150,7 +1156,26 @@ CONTAINS END SELECT END FUNCTION lmp_extract_variable - ! equivalent function to lammps_version() + ! equivalent function to lammps_set_variable + SUBROUTINE lmp_set_variable (self, name, str) + CLASS(lammps), INTENT(IN) :: self + CHARACTER (LEN=*), INTENT(IN) :: name, str + INTEGER :: err + TYPE(C_ptr) :: Cstr, Cname + + Cstr = f2c_string(str) + Cname = f2c_string(name) + err = lammps_set_variable(self%handle, Cname, Cstr) + CALL lammps_free(Cname) + CALL lammps_free(Cstr) + IF ( err /= 0 ) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'WARNING: unable to set string variable "' // name & + // '" [Fortran/set_variable]') + END IF + END SUBROUTINE lmp_set_variable + + ! equivalent function to lammps_version INTEGER FUNCTION lmp_version(self) CLASS(lammps), INTENT(IN) :: self @@ -1321,7 +1346,7 @@ CONTAINS length = LEN(buffer) Cptr = f2c_string(buffer) Cstatus = lammps_get_last_error_message(self%handle, Cptr, length) - length = MIN(LEN(buffer), c_strlen(Cptr)) + length = MIN(LEN(buffer, c_size_t), c_strlen(Cptr)) CALL C_F_POINTER(Cptr, Cbuffer, [length]) FORALL ( i=1:length ) buffer(i:i) = Cbuffer(i) diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index de0e588b86..267b5e1139 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -248,10 +248,9 @@ FUNCTION f_lammps_extract_variable_string () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS USE keepvar, ONLY : lmp, f2c_string - IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_string - CHARACTER(LEN=20) :: string + CHARACTER(LEN=40) :: string string = lmp%extract_variable('str') f_lammps_extract_variable_string = f2c_string(string) @@ -287,7 +286,7 @@ FUNCTION f_lammps_extract_variable_getenv () BIND(C) USE keepvar, ONLY : lmp, f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_getenv - CHARACTER(LEN=20) :: string + CHARACTER(LEN=40) :: string string = lmp%extract_variable('username') f_lammps_extract_variable_getenv = f2c_string(string) @@ -384,4 +383,16 @@ FUNCTION f_lammps_extract_variable_vector(i) BIND(C) vector = lmp%extract_variable('center') ! z-coordinates f_lammps_extract_variable_vector = vector(i) END FUNCTION f_lammps_extract_variable_vector + +SUBROUTINE f_lammps_set_variable_string() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE LIBLAMMPS + USE keepvar, ONLY : lmp, f2c_string + IMPLICIT NONE + CHARACTER(LEN=40) :: string + + string = "this is the new string" + CALL lmp%set_variable('str', string) +END SUBROUTINE f_lammps_set_variable_string + ! vim: sts=2 ts=2 sw=2 et diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index d209b4c59b..ba439fbda4 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -42,6 +42,7 @@ double f_lammps_extract_variable_internal(); double f_lammps_extract_variable_equal(); double f_lammps_extract_variable_atom(int); double f_lammps_extract_variable_vector(int); +void f_lammps_set_variable_string(); } class LAMMPS_extract_variable : public ::testing::Test { @@ -136,6 +137,10 @@ TEST_F(LAMMPS_extract_variable, string) char* fstr = f_lammps_extract_variable_string(); EXPECT_STREQ(fstr, "this is a string"); std::free(fstr); + f_lammps_set_variable_string(); + fstr = f_lammps_extract_variable_string(); + EXPECT_STREQ(fstr, "this is the new string"); + std::free(fstr); }; TEST_F(LAMMPS_extract_variable, format) From c61b356a7118a411dba088072d74645a9b66702d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 19:48:56 -0400 Subject: [PATCH 266/364] clarify LJ energy function component of the quartic bond style --- doc/src/bond_quartic.rst | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/doc/src/bond_quartic.rst b/doc/src/bond_quartic.rst index 1f9f9bf4e9..cda30cfd95 100644 --- a/doc/src/bond_quartic.rst +++ b/doc/src/bond_quartic.rst @@ -28,11 +28,18 @@ The *quartic* bond style uses the potential .. math:: - E = K (r - R_c)^ 2 (r - R_c - B_1) (r - R_c - B_2) + U_0 + 4 \epsilon \left[ \left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6 \right] + \epsilon + E & = E_q + E_{LJ} \\ + E_q & = K (r - R_c)^ 2 (r - R_c - B_1) (r - R_c - B_2) + U_0 \\ + E_{LJ} & = \left\{ \begin{array} {l@{\quad:\quad}l} + 4 \epsilon \left[ \left(\frac{\sigma}{r}\right)^{12} - \left(\frac{\sigma}{r}\right)^6 \right] + \epsilon & r < 2^{\frac{1}{6}}, \epsilon = 1, \sigma = 1 \\ + 0 & r >= 2^{\frac{1}{6}} + \end{array} \right. to define a bond that can be broken as the simulation proceeds (e.g. -due to a polymer being stretched). The :math:`\sigma` and :math:`\epsilon` used in the -LJ portion of the formula are both set equal to 1.0 by LAMMPS. +due to a polymer being stretched). The :math:`\sigma` and +:math:`\epsilon` used in the LJ portion of the formula are both set +equal to 1.0 by LAMMPS and the LJ portion is cut off at its minimum, +i.e. at :math:`r_c = 2^{\frac{1}{6}}`. The following coefficients must be defined for each bond type via the :doc:`bond_coeff ` command as in the example above, or in @@ -46,9 +53,9 @@ or :doc:`read_restart ` commands: * :math:`U_0` (energy) This potential was constructed to mimic the FENE bond potential for -coarse-grained polymer chains. When monomers with :math:`\sigma = \epsilon = 1.0` -are used, the following choice of parameters gives a quartic potential that -looks nearly like the FENE potential: +coarse-grained polymer chains. When monomers with :math:`\sigma = +\epsilon = 1.0` are used, the following choice of parameters gives a +quartic potential that looks nearly like the FENE potential: .. math:: From 953c3d0cadc2d5edd6c6643dad3febd7043ce30d Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 18:50:16 -0500 Subject: [PATCH 267/364] spell check; updated false positives; whitespace --- doc/src/Fortran.rst | 34 ++--- doc/utils/sphinx-config/false_positives.txt | 3 + fortran/lammps.f90 | 152 ++++++++++---------- 3 files changed, 96 insertions(+), 93 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 3112440bb0..7b3e20b978 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -180,7 +180,7 @@ The C library interface allows the :doc:`extraction of different kinds of information ` about the active simulation instance and also---in some cases---to apply modifications to it. In some cases, the C library interface makes pointers to internal data -structures accessible; when accessing them through the library interfaces, +structures accessible; when accessing them through the library interfaces, special care is needed to avoid data corruption and crashes. Please see the documentation of the individual type-bound procedures for details. @@ -651,7 +651,7 @@ Procedures Bound to the lammps Derived Type Two-dimensional arrays returned from :f:func:`extract_atom` will be **transposed** from equivalent arrays in C, and they will be indexed from 1 instead of 0. For example, in C, - + .. code-block:: C void *lmp; @@ -712,13 +712,13 @@ Procedures Bound to the lammps Derived Type If you would like the indices to start at 0 instead of 1 (which follows typical notation in C and C++, but not Fortran), you can create another pointer and associate it thus: - + .. code-block:: Fortran REAL(c_double), DIMENSION(:,:), POINTER :: x, x0 x = lmp%extract_atom("x") x0(0:,0:) => x - + The above would cause the dimensions of *x* to be (1:3, 1:nmax) and those of *x0* to be (0:2, 0:nmax-1). @@ -886,9 +886,9 @@ Procedures Bound to the lammps Derived Type - Element of global array * - ``lmp%style%atom`` - ``lmp%type%scalar`` - - - - - - + - + - + - - (not allowed) * - ``lmp%style%atom`` - ``lmp%type%vector`` @@ -904,9 +904,9 @@ Procedures Bound to the lammps Derived Type - Per-atom array * - ``lmp%style%local`` - ``lmp%type%scalar`` - - - - - - + - + - + - - (not allowed) * - ``lmp%style%local`` - ``lmp%type%vector`` @@ -986,7 +986,7 @@ Procedures Bound to the lammps Derived Type The pointers returned by this function for per-atom or local data are generally not persistent, since the computed data may be redistributed, reallocated, and reordered at every invocation of the fix. It is thus - advisable to reinvoke this function before the data are accessed or to + advisable to re-invoke this function before the data are accessed or to make a copy if the data are to be used after other LAMMPS commands have been issued. @@ -1133,7 +1133,7 @@ Procedures Bound to the lammps Derived Type checks whether this feature was :ref:`enabled at compile time `. It does **not** check whether ``gzip`` or any other supported compression programs themselves are installed and usable. - + :r logical: -------- @@ -1244,7 +1244,7 @@ Procedures Bound to the lammps Derived Type Get the name of a package in the list of installed packages in the LAMMPS library. - + .. versionadded:: TBD This subroutine copies the name of the package with the index *idx* into the @@ -1272,7 +1272,7 @@ Procedures Bound to the lammps Derived Type (``DIMENSION(:)``) with allocatable length. :o integer length [optional]: length of each string in the list. Default: 31. - + -------- .. f:subroutine:: flush_buffers() @@ -1293,7 +1293,7 @@ Procedures Bound to the lammps Derived Type This function can be used from signal handlers or multi-threaded applications to determine if the LAMMPS instance is currently active. - + :r logical: ``.FALSE.`` if idle or ``.TRUE.`` if active -------- @@ -1303,7 +1303,7 @@ Procedures Bound to the lammps Derived Type Force a timeout to stop an ongoing run cleanly. .. versionadded:: TBD - + This function can be used from signal handlers or multi-threaded applications to cleanly terminate an ongoing run. @@ -1325,7 +1325,7 @@ Procedures Bound to the lammps Derived Type errors aborting LAMMPS into C++ exceptions. You can use the library function :cpp:func:`lammps_config_has_exceptions` to check if this is the case. - + :r logical: ``.TRUE.`` if there is an error. -------- diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c719620fc6..b39ec746f1 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -78,6 +78,7 @@ Alexey ali aliceblue Allinger +allocatable allocator allocators allosws @@ -657,6 +658,7 @@ Dcut de dE De +deallocate deallocated debye Debye @@ -691,6 +693,7 @@ dequidt Dequidt der dereference +dereferenced derekt Deresiewicz Derjagin diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index ddd82719d8..0ec58c7914 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -43,7 +43,7 @@ MODULE LIBLAMMPS ! src/library.h and python/lammps/constants.py ! ! These are NOT part of the API (the part the user sees) - INTEGER (c_int), PARAMETER :: & + INTEGER(c_int), PARAMETER :: & LAMMPS_INT = 0, & ! 32-bit integer (array) LAMMPS_INT_2D = 1, & ! two-dimensional 32-bit integer array LAMMPS_DOUBLE = 2, & ! 64-bit double (array) @@ -329,7 +329,7 @@ MODULE LIBLAMMPS INTEGER(c_int) :: lammps_extract_global_datatype END FUNCTION lammps_extract_global_datatype - FUNCTION c_strlen (str) BIND(C,name='strlen') + FUNCTION c_strlen(str) BIND(C,name='strlen') IMPORT :: c_ptr, c_size_t IMPLICIT NONE TYPE(c_ptr), INTENT(IN), VALUE :: str @@ -387,11 +387,11 @@ MODULE LIBLAMMPS TYPE(c_ptr) :: lammps_extract_variable END FUNCTION lammps_extract_variable - FUNCTION lammps_set_variable (handle, name, str) BIND(C) + FUNCTION lammps_set_variable(handle, name, str) BIND(C) IMPORT :: c_int, c_ptr IMPLICIT NONE - TYPE (c_ptr), VALUE :: handle, name, str - INTEGER (c_int) :: lammps_set_variable + TYPE(c_ptr), VALUE :: handle, name, str + INTEGER(c_int) :: lammps_set_variable END FUNCTION lammps_set_variable !SUBROUTINE lammps_gather_atoms @@ -415,15 +415,15 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_scatter_subset !(generic / id, type, and image are special) / requires LAMMPS_BIGBIG - !INTEGER (C_int) FUNCTION lammps_create_atoms + !INTEGER(c_int) FUNCTION lammps_create_atoms - !INTEGER (C_int) FUNCTION lammps_find_pair_neighlist + !INTEGER(c_int) FUNCTION lammps_find_pair_neighlist - !INTEGER (C_int) FUNCTION lammps_find_fix_neighlist + !INTEGER(c_int) FUNCTION lammps_find_fix_neighlist - !INTEGER (C_int) FUNCTION lammps_find_compute_neighlist + !INTEGER(c_int) FUNCTION lammps_find_compute_neighlist - !INTEGER (C_int) FUNCTION lammps_neighlist_num_elements + !INTEGER(c_int) FUNCTION lammps_neighlist_num_elements !SUBROUTINE lammps_neighlist_element_neighbors @@ -434,11 +434,11 @@ MODULE LIBLAMMPS INTEGER(c_int) :: lammps_version END FUNCTION lammps_version - SUBROUTINE lammps_get_os_info (buffer, buf_size) BIND(C) + SUBROUTINE lammps_get_os_info(buffer, buf_size) BIND(C) IMPORT :: C_ptr, C_int IMPLICIT NONE - TYPE (C_ptr), VALUE :: buffer - INTEGER (C_int), VALUE :: buf_size + TYPE(C_ptr), VALUE :: buffer + INTEGER(C_int), VALUE :: buf_size END SUBROUTINE lammps_get_os_info FUNCTION lammps_config_has_mpi_support() BIND(C) @@ -474,28 +474,28 @@ MODULE LIBLAMMPS FUNCTION lammps_config_has_exceptions() BIND(C) IMPORT :: c_int IMPLICIT NONE - INTEGER (c_int) :: lammps_config_has_exceptions + INTEGER(c_int) :: lammps_config_has_exceptions END FUNCTION lammps_config_has_exceptions FUNCTION lammps_config_has_package(name) BIND(C) IMPORT :: C_int, C_ptr IMPLICIT NONE - TYPE (C_ptr), VALUE :: name - INTEGER (c_int) :: lammps_config_has_package + TYPE(C_ptr), VALUE :: name + INTEGER(c_int) :: lammps_config_has_package END FUNCTION lammps_config_has_package FUNCTION lammps_config_package_count() BIND(C) IMPORT :: C_int IMPLICIT NONE - INTEGER (C_int) :: lammps_config_package_count + INTEGER(C_int) :: lammps_config_package_count END FUNCTION lammps_config_package_count - FUNCTION lammps_config_package_name (idx, buffer, buf_size) BIND(C) + FUNCTION lammps_config_package_name(idx, buffer, buf_size) BIND(C) IMPORT :: C_int, C_ptr IMPLICIT NONE - INTEGER (C_int) :: lammps_config_package_name - INTEGER (C_int), VALUE :: idx, buf_size - TYPE (C_ptr), VALUE :: buffer + INTEGER(C_int) :: lammps_config_package_name + INTEGER(C_int), VALUE :: idx, buf_size + TYPE(C_ptr), VALUE :: buffer END FUNCTION lammps_config_package_name !LOGICAL FUNCTION lammps_config_accelerator @@ -503,18 +503,18 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_get_gpu_device !LOGICAL FUNCTION lammps_has_id - !INTEGER (C_int) FUNCTION lammps_id_count + !INTEGER(C_int) FUNCTION lammps_id_count !SUBROUTINE lammps_id_name - !INTEGER (C_int) FUNCTION lammps_plugin_count + !INTEGER(C_int) FUNCTION lammps_plugin_count !SUBROUTINE lammps_plugin_name !Both of these use LAMMPS_BIGBIG - !INTEGER (LAMMPS_imageint) FUNCTION lammps_encode_image_flags + !INTEGER(LAMMPS_imageint) FUNCTION lammps_encode_image_flags !SUBROUTINE lammps_decode_image_flags !SUBROUTINE lammps_set_fix_external_callback ! may have trouble.... - !FUNCTION lammps_fix_external_get_force() ! returns real(c_double) (:) + !FUNCTION lammps_fix_external_get_force() ! returns real(c_double)(:) !SUBROUTINE lammps_fix_external_set_energy_global !SUBROUTINE lammps_fix_external_set_energy_peratom @@ -523,7 +523,7 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_fix_external_set_vector_length !SUBROUTINE lammps_fix_external_set_vector - SUBROUTINE lammps_flush_buffers (handle) BIND(C) + SUBROUTINE lammps_flush_buffers(handle) BIND(C) IMPORT :: C_ptr IMPLICIT NONE TYPE(C_ptr), VALUE :: handle @@ -548,19 +548,19 @@ MODULE LIBLAMMPS TYPE(c_ptr), VALUE :: handle END FUNCTION lammps_is_running - SUBROUTINE lammps_force_timeout (handle) BIND(C) + SUBROUTINE lammps_force_timeout(handle) BIND(C) IMPORT :: c_ptr IMPLICIT NONE TYPE(c_ptr), VALUE :: handle END SUBROUTINE lammps_force_timeout - INTEGER (C_int) FUNCTION lammps_has_error (handle) BIND(C) + INTEGER(C_int) FUNCTION lammps_has_error(handle) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE TYPE(c_ptr), VALUE :: handle END FUNCTION lammps_has_error - INTEGER (c_int) FUNCTION lammps_get_last_error_message & + INTEGER(c_int) FUNCTION lammps_get_last_error_message & (handle, buffer, buf_size) BIND(C) IMPORT :: c_ptr, c_int, c_char IMPLICIT NONE @@ -700,14 +700,14 @@ CONTAINS END SUBROUTINE lmp_commands_string ! equivalent function to lammps_get_natoms - REAL (c_double) FUNCTION lmp_get_natoms(self) + REAL(c_double) FUNCTION lmp_get_natoms(self) CLASS(lammps) :: self lmp_get_natoms = lammps_get_natoms(self%handle) END FUNCTION lmp_get_natoms ! equivalent function to lammps_get_thermo - REAL (c_double) FUNCTION lmp_get_thermo(self,name) + REAL(c_double) FUNCTION lmp_get_thermo(self,name) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*) :: name TYPE(C_ptr) :: Cname @@ -724,7 +724,7 @@ CONTAINS REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: xy, yz, xz LOGICAL, INTENT(OUT), OPTIONAL :: pflags(3), boxflag INTEGER(c_int), TARGET :: C_pflags(3), C_boxflag - TYPE (c_ptr) :: ptr(7) + TYPE(c_ptr) :: ptr(7) ptr = c_null_ptr IF ( PRESENT(boxlo) ) ptr(1) = C_LOC(boxlo(1)) @@ -752,7 +752,7 @@ CONTAINS SUBROUTINE lmp_memory_usage(self,meminfo) CLASS(lammps), INTENT(IN) :: self INTEGER, PARAMETER :: MEMINFO_ELEM = 3 - REAL (c_double), DIMENSION(MEMINFO_ELEM), INTENT(OUT) :: meminfo + REAL(c_double), DIMENSION(MEMINFO_ELEM), INTENT(OUT) :: meminfo CALL lammps_memory_usage(self%handle,meminfo) END SUBROUTINE lmp_memory_usage @@ -765,7 +765,7 @@ CONTAINS END FUNCTION lmp_get_mpi_comm ! equivalent function to lammps_extract_setting - INTEGER (c_int) FUNCTION lmp_extract_setting(self, keyword) + INTEGER(c_int) FUNCTION lmp_extract_setting(self, keyword) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: keyword TYPE(c_ptr) :: Ckeyword @@ -778,7 +778,7 @@ CONTAINS ! equivalent function to lammps_extract_global ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS - FUNCTION lmp_extract_global(self, name) RESULT (global_data) + FUNCTION lmp_extract_global(self, name) RESULT(global_data) CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: global_data @@ -849,7 +849,7 @@ CONTAINS ! equivalent function to lammps_extract_atom ! the assignment is actually overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS - FUNCTION lmp_extract_atom (self, name) RESULT (peratom_data) + FUNCTION lmp_extract_atom(self, name) RESULT(peratom_data) CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: name TYPE(lammps_data) :: peratom_data @@ -916,7 +916,7 @@ CONTAINS ! equivalent function to lammps_extract_compute ! the assignment operator is overloaded so as to bind the pointers to ! lammps data based on the information available from LAMMPS - FUNCTION lmp_extract_compute (self, id, style, type) RESULT (compute_data) + FUNCTION lmp_extract_compute(self, id, style, type) RESULT(compute_data) CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: id INTEGER(c_int), INTENT(IN) :: style, type @@ -980,7 +980,7 @@ CONTAINS CALL lammps_free(Cid) END FUNCTION lmp_extract_compute - FUNCTION lmp_extract_fix(self, id, style, type, nrow, ncol) RESULT (fix_data) + FUNCTION lmp_extract_fix(self, id, style, type, nrow, ncol) RESULT(fix_data) CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: id INTEGER(c_int), INTENT(IN) :: style, type @@ -1079,7 +1079,7 @@ CONTAINS END FUNCTION lmp_extract_fix ! equivalent function to lammps_extract_variable - FUNCTION lmp_extract_variable(self, name, group) RESULT (variable_data) + FUNCTION lmp_extract_variable(self, name, group) RESULT(variable_data) CLASS(lammps), INTENT(IN), TARGET :: self CHARACTER(LEN=*), INTENT(IN) :: name CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: group @@ -1157,9 +1157,9 @@ CONTAINS END FUNCTION lmp_extract_variable ! equivalent function to lammps_set_variable - SUBROUTINE lmp_set_variable (self, name, str) + SUBROUTINE lmp_set_variable(self, name, str) CLASS(lammps), INTENT(IN) :: self - CHARACTER (LEN=*), INTENT(IN) :: name, str + CHARACTER(LEN=*), INTENT(IN) :: name, str INTEGER :: err TYPE(C_ptr) :: Cstr, Cname @@ -1183,7 +1183,7 @@ CONTAINS END FUNCTION lmp_version ! equivalent function to lammps_get_os_info - SUBROUTINE lmp_get_os_info (buffer) + SUBROUTINE lmp_get_os_info(buffer) CHARACTER(LEN=*) :: buffer INTEGER(c_int) :: buf_size CHARACTER(LEN=1,KIND=c_char), DIMENSION(LEN(buffer)), TARGET :: Cbuffer @@ -1193,7 +1193,7 @@ CONTAINS buffer = '' ptr = C_LOC(Cbuffer(1)) buf_size = LEN(buffer) - CALL lammps_get_os_info (ptr, buf_size) + CALL lammps_get_os_info(ptr, buf_size) DO i=1,buf_size IF ( Cbuffer(i) == C_NULL_CHAR ) EXIT buffer(i:i) = Cbuffer(i) @@ -1251,8 +1251,8 @@ CONTAINS ! equivalent function to lammps_config_has_package LOGICAL FUNCTION lmp_config_has_package(name) CHARACTER(LEN=*), INTENT(IN) :: name - INTEGER (c_int) :: has_package - TYPE (c_ptr) :: Cname + INTEGER(c_int) :: has_package + TYPE(c_ptr) :: Cname Cname = f2c_string(name) has_package = lammps_config_has_package(Cname) @@ -1261,7 +1261,7 @@ CONTAINS END FUNCTION lmp_config_has_package ! equivalent subroutine to lammps_config_package_name - SUBROUTINE lmp_config_package_name (idx, buffer) + SUBROUTINE lmp_config_package_name(idx, buffer) INTEGER, INTENT(IN) :: idx CHARACTER(LEN=*), INTENT(OUT) :: buffer INTEGER(c_int) :: Cidx, Csuccess @@ -1282,7 +1282,7 @@ CONTAINS END SUBROUTINE lmp_config_package_name ! equivalent function to Python routine .installed_packages() - SUBROUTINE lmp_installed_packages (package, length) + SUBROUTINE lmp_installed_packages(package, length) CHARACTER(LEN=:), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: package INTEGER, INTENT(IN), OPTIONAL :: length INTEGER, PARAMETER :: MAX_BUFFER_LENGTH = 31 @@ -1317,7 +1317,7 @@ CONTAINS END FUNCTION lmp_is_running ! equivalent function to lammps_force_timeout - SUBROUTINE lmp_force_timeout (self) + SUBROUTINE lmp_force_timeout(self) CLASS(lammps), INTENT(IN) :: self CALL lammps_force_timeout(self%handle) @@ -1365,7 +1365,7 @@ CONTAINS ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS data ! ---------------------------------------------------------------------- - SUBROUTINE assign_int_to_lammps_data (lhs, rhs) + SUBROUTINE assign_int_to_lammps_data(lhs, rhs) INTEGER(c_int), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1376,7 +1376,7 @@ CONTAINS END IF END SUBROUTINE assign_int_to_lammps_data - SUBROUTINE assign_int64_to_lammps_data (lhs, rhs) + SUBROUTINE assign_int64_to_lammps_data(lhs, rhs) INTEGER(c_int64_t), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1387,7 +1387,7 @@ CONTAINS END IF END SUBROUTINE assign_int64_to_lammps_data - SUBROUTINE assign_intvec_to_lammps_data (lhs, rhs) + SUBROUTINE assign_intvec_to_lammps_data(lhs, rhs) INTEGER(c_int), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1398,7 +1398,7 @@ CONTAINS END IF END SUBROUTINE assign_intvec_to_lammps_data - SUBROUTINE assign_int64vec_to_lammps_data (lhs, rhs) + SUBROUTINE assign_int64vec_to_lammps_data(lhs, rhs) INTEGER(c_int64_t), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1409,7 +1409,7 @@ CONTAINS END IF END SUBROUTINE assign_int64vec_to_lammps_data - SUBROUTINE assign_double_to_lammps_data (lhs, rhs) + SUBROUTINE assign_double_to_lammps_data(lhs, rhs) REAL(c_double), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1420,7 +1420,7 @@ CONTAINS END IF END SUBROUTINE assign_double_to_lammps_data - SUBROUTINE assign_doublevec_to_lammps_data (lhs, rhs) + SUBROUTINE assign_doublevec_to_lammps_data(lhs, rhs) REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1431,7 +1431,7 @@ CONTAINS END IF END SUBROUTINE assign_doublevec_to_lammps_data - SUBROUTINE assign_doublemat_to_lammps_data (lhs, rhs) + SUBROUTINE assign_doublemat_to_lammps_data(lhs, rhs) REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1442,7 +1442,7 @@ CONTAINS END IF END SUBROUTINE assign_doublemat_to_lammps_data - SUBROUTINE assign_string_to_lammps_data (lhs, rhs) + SUBROUTINE assign_string_to_lammps_data(lhs, rhs) CHARACTER(LEN=*), INTENT(OUT) :: lhs CLASS(lammps_data), INTENT(IN) :: rhs @@ -1456,7 +1456,7 @@ CONTAINS ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS *fix* data ! ---------------------------------------------------------------------- - SUBROUTINE assign_double_to_lammps_fix_data (lhs, rhs) + SUBROUTINE assign_double_to_lammps_fix_data(lhs, rhs) REAL(c_double), INTENT(OUT) :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs @@ -1467,7 +1467,7 @@ CONTAINS END IF END SUBROUTINE assign_double_to_lammps_fix_data - SUBROUTINE assign_doublevec_to_lammps_fix_data (lhs, rhs) + SUBROUTINE assign_doublevec_to_lammps_fix_data(lhs, rhs) REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs @@ -1478,7 +1478,7 @@ CONTAINS END IF END SUBROUTINE assign_doublevec_to_lammps_fix_data - SUBROUTINE assign_doublemat_to_lammps_fix_data (lhs, rhs) + SUBROUTINE assign_doublemat_to_lammps_fix_data(lhs, rhs) REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs @@ -1492,7 +1492,7 @@ CONTAINS ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS *variable* data ! ---------------------------------------------------------------------- - SUBROUTINE assign_double_to_lammps_variable_data (lhs, rhs) + SUBROUTINE assign_double_to_lammps_variable_data(lhs, rhs) REAL(c_double), INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs @@ -1503,7 +1503,7 @@ CONTAINS END IF END SUBROUTINE assign_double_to_lammps_variable_data - SUBROUTINE assign_doublevec_to_lammps_variable_data (lhs, rhs) + SUBROUTINE assign_doublevec_to_lammps_variable_data(lhs, rhs) REAL(c_double), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs @@ -1516,7 +1516,7 @@ CONTAINS END IF END SUBROUTINE assign_doublevec_to_lammps_variable_data - SUBROUTINE assign_string_to_lammps_variable_data (lhs, rhs) + SUBROUTINE assign_string_to_lammps_variable_data(lhs, rhs) CHARACTER(LEN=*), INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs @@ -1531,31 +1531,31 @@ CONTAINS ! Generic function to catch all errors in assignments of LAMMPS data to ! user-space variables/pointers ! ---------------------------------------------------------------------- - SUBROUTINE assignment_error (type1, str2) + SUBROUTINE assignment_error(type1, str2) CLASS(lammps_data_baseclass), INTENT(IN) :: type1 - CHARACTER (LEN=*), INTENT(IN) :: str2 - CHARACTER (LEN=:), ALLOCATABLE :: str1 + CHARACTER(LEN=*), INTENT(IN) :: str2 + CHARACTER(LEN=:), ALLOCATABLE :: str1 - SELECT CASE (type1%datatype) - CASE (DATA_INT) + SELECT CASE(type1%datatype) + CASE(DATA_INT) str1 = 'scalar int' - CASE (DATA_INT_1D) + CASE(DATA_INT_1D) str1 = 'vector of ints' - CASE (DATA_INT_2D) + CASE(DATA_INT_2D) str1 = 'matrix of ints' - CASE (DATA_INT64) + CASE(DATA_INT64) str1 = 'scalar long int' - CASE (DATA_INT64_1D) + CASE(DATA_INT64_1D) str1 = 'vector of long ints' - CASE (DATA_INT64_2D) + CASE(DATA_INT64_2D) str1 = 'matrix of long ints' - CASE (DATA_DOUBLE) + CASE(DATA_DOUBLE) str1 = 'scalar double' - CASE (DATA_DOUBLE_1D) + CASE(DATA_DOUBLE_1D) str1 = 'vector of doubles' - CASE (DATA_DOUBLE_2D) + CASE(DATA_DOUBLE_2D) str1 = 'matrix of doubles' - CASE (DATA_STRING) + CASE(DATA_STRING) str1 = 'string' CASE DEFAULT str1 = 'that type' From bbc08bbf1feafa6f5d8af28f7c7b7dc219f4d442 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 19:53:11 -0400 Subject: [PATCH 268/364] make capitalization consistent --- doc/src/Speed_packages.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Speed_packages.rst b/doc/src/Speed_packages.rst index 22616c5da4..f5ce57b94a 100644 --- a/doc/src/Speed_packages.rst +++ b/doc/src/Speed_packages.rst @@ -117,9 +117,9 @@ script. with all its accelerator packages installed. Note however that the INTEL and KOKKOS packages require you to choose one of their hardware options when building for a specific platform. I.e. CPU or - Phi option for the INTEL package. Or the OpenMP, Cuda, Hip, Sycl, - or Phi option for the KOKKOS package. Or the OpenCL, Hip, or Cuda - for the GPU package. + Phi option for the INTEL package. Or the OpenMP, CUDA, HIP, SYCL, + or Phi option for the KOKKOS package. Or the OpenCL, HIP, or CUDA + option for the GPU package. These are the exceptions. You cannot build a single executable with: From 6dea4d50d61c829f13af7e2ca652d119c15a76d4 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 19:51:56 -0500 Subject: [PATCH 269/364] Fixed oversight in edits to example in Fortran doc page --- doc/src/Fortran.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 7b3e20b978..73e3499565 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -193,17 +193,17 @@ Below is an example demonstrating some of the possible uses. USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int64_t USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY : OUTPUT_UNIT TYPE(lammps) :: lmp - INTEGER(KIND=c_int64_t) :: natoms + INTEGER(KIND=c_int64_t), POINTER :: natoms REAL(KIND=c_double), POINTER :: dt INTEGER(KIND=c_int64_t), POINTER :: ntimestep REAL(KIND=c_double) :: pe, ke lmp = lammps() CALL lmp%file('in.sysinit') - natoms = lmp%extract_setting('natoms') - WRITE(OUTPUT_UNIT,'(A,I8,A)') 'Running a simulation with', natoms, ' atoms' - WRITE(OUTPUT_UNIT,'(I8,A,I8,A,I3,A)') lmp%extract_setting('nlocal'), & - ' local and', lmp%extract_setting('nghost'), ' ghost atom. ', & + natoms = lmp%extract_global('natoms') + WRITE(OUTPUT_UNIT,'(A,I0,A)') 'Running a simulation with', natoms, ' atoms' + WRITE(OUTPUT_UNIT,'(I0,A,I0,A,I0,A)') lmp%extract_setting('nlocal'), & + ' local and', lmp%extract_setting('nghost'), ' ghost atoms. ', & lmp%extract_setting('ntypes'), ' atom types' CALL lmp%command('run 2 post no') From eac855343fee8b64f2ab1c4eb8ccddd13386ccb2 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 19:54:58 -0500 Subject: [PATCH 270/364] Spacing --- doc/src/Fortran.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 73e3499565..2d03f135a9 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -201,9 +201,9 @@ Below is an example demonstrating some of the possible uses. lmp = lammps() CALL lmp%file('in.sysinit') natoms = lmp%extract_global('natoms') - WRITE(OUTPUT_UNIT,'(A,I0,A)') 'Running a simulation with', natoms, ' atoms' + WRITE(OUTPUT_UNIT,'(A,I0,A)') 'Running a simulation with ', natoms, ' atoms' WRITE(OUTPUT_UNIT,'(I0,A,I0,A,I0,A)') lmp%extract_setting('nlocal'), & - ' local and', lmp%extract_setting('nghost'), ' ghost atoms. ', & + ' local and ', lmp%extract_setting('nghost'), ' ghost atoms. ', & lmp%extract_setting('ntypes'), ' atom types' CALL lmp%command('run 2 post no') From 9c314966aebe7b626a8fc3d0aa6c2bbc56a08f2c Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 19:58:56 -0500 Subject: [PATCH 271/364] More spacing --- doc/src/Fortran.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 2d03f135a9..c17c39db72 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -209,12 +209,12 @@ Below is an example demonstrating some of the possible uses. CALL lmp%command('run 2 post no') dt = lmp%extract_global('dt') ntimestep = lmp%extract_global('ntimestep') - WRITE(OUTPUT_UNIT,'(A,I4,A,F4.1,A)') 'At step:', ntimestep, & + WRITE(OUTPUT_UNIT,'(A,I0,A,F4.1,A)') 'At step: ', ntimestep, & ' Changing timestep from', dt, ' to 0.5' dt = 0.5_c_double CALL lmp%command('run 2 post no') - WRITE(OUTPUT_UNIT,'(A,I0)') 'At step:', ntimestep + WRITE(OUTPUT_UNIT,'(A,I0)') 'At step: ', ntimestep pe = lmp%get_thermo('pe') ke = lmp%get_thermo('ke') PRINT*, 'PE = ', pe From 9183c0e1c80014f5463ea84d9b23a3f1f2396b89 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 20:02:23 -0500 Subject: [PATCH 272/364] Removed commented-out line now that I know it works --- python/lammps/core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index b7f3ada6a6..fb2be48feb 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1116,7 +1116,6 @@ class lammps(object): if group: group = group.encode() if vartype is None : vartype = self.lib.lammps_extract_variable_datatype(self.lmp, name) - #vartype = LMP_VAR_EQUAL if vartype == LMP_VAR_EQUAL: self.lib.lammps_extract_variable.restype = POINTER(c_double) with ExceptionCheck(self): From da2f7f6fad196b588dba7b7e12d8348e3000219d Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 20:14:40 -0500 Subject: [PATCH 273/364] Forgot to put LMP_VAR_VECTOR in the documentation --- python/lammps/core.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index fb2be48feb..074e579d13 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1096,11 +1096,12 @@ class lammps(object): The variable must be either an equal-style (or equivalent) variable or an atom-style variable. The variable type can be provided as the ``vartype`` parameter, which may be one of several - constants: ``LMP_VAR_EQUAL``, ``LMP_VAR_ATOM``, or ``LMP_VAR_STRING``. - If omitted or ``None``, LAMMPS will determine its value for you based on - a call to :cpp:func:`lammps_extract_variable_datatype` from the C library - interface. The group parameter is only used for atom-style variables and - defaults to the group "all". + constants: ``LMP_VAR_EQUAL``, ``LMP_VAR_ATOM``, ``LMP_VAR_VECTOR``, + or ``LMP_VAR_STRING``. If omitted or ``None``, LAMMPS will determine its + value for you based on a call to + :cpp:func:`lammps_extract_variable_datatype` from the C library interface. + The group parameter is only used for atom-style variables and defaults to + the group "all". :param name: name of the variable to execute :type name: string From 27d9e313f5d382ec128622a03502c961e72b92c1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Sep 2022 21:42:04 -0400 Subject: [PATCH 274/364] convert compute chunk/spread/atom --- src/compute_chunk_spread_atom.cpp | 156 +++++++++++++++--------------- src/compute_chunk_spread_atom.h | 17 +++- 2 files changed, 88 insertions(+), 85 deletions(-) diff --git a/src/compute_chunk_spread_atom.cpp b/src/compute_chunk_spread_atom.cpp index 34f39413f3..c34da3e2c0 100644 --- a/src/compute_chunk_spread_atom.cpp +++ b/src/compute_chunk_spread_atom.cpp @@ -32,8 +32,7 @@ using namespace LAMMPS_NS; ComputeChunkSpreadAtom:: ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - idchunk(nullptr), ids(nullptr), which(nullptr), argindex(nullptr), value2index(nullptr) + Compute(lmp, narg, arg), idchunk(nullptr) { if (narg < 5) error->all(FLERR,"Illegal compute chunk/spread/atom command"); @@ -54,32 +53,27 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : // parse values - which = new int[nargnew]; - argindex = new int[nargnew]; - ids = new char*[nargnew]; - value2index = new int[nargnew]; - nvalues = 0; - - for (iarg = 0; iarg < nargnew; iarg++) { - ids[nvalues] = nullptr; - + values.clear(); + for (iarg = 0; iarg < nargnew; ++iarg) { ArgInfo argi(arg[iarg], ArgInfo::COMPUTE|ArgInfo::FIX); - which[nvalues] = argi.get_type(); - argindex[nvalues] = argi.get_index1(); - ids[nvalues] = argi.copy_name(); + value_t val; + val.which = argi.get_type(); + val.argindex = argi.get_index1(); + val.id = argi.get_name(); + val.val.c = nullptr; - if ((which[nvalues] == ArgInfo::UNKNOWN) || (which[nvalues] == ArgInfo::NONE) + if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR,"Illegal compute chunk/spread/atom command"); + error->all(FLERR,"Illegal compute chunk/spread/atom argument: {}", arg[iarg]); - nvalues++; + values.push_back(val); } // if wildcard expansion occurred, free earg memory from expand_args() if (expand) { - for (int i = 0; i < nargnew; i++) delete [] earg[i]; + for (int i = 0; i < nargnew; i++) delete[] earg[i]; memory->sfree(earg); } @@ -87,38 +81,45 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : // for compute, must calculate per-chunk values, i.e. style ends in "/chunk" // for fix, assume a global vector or array is per-chunk data - for (int i = 0; i < nvalues; i++) { - if (which[i] == ArgInfo::COMPUTE) { - auto icompute = modify->get_compute_by_id(ids[i]); + for (auto &val : values) { + if (val.which == ArgInfo::COMPUTE) { + auto icompute = modify->get_compute_by_id(val.id); if (!icompute) - error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", ids[i]); + error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", val.id); if (!utils::strmatch(icompute->style,"/chunk$")) - error->all(FLERR,"Compute for compute chunk/spread/atom " - "does not calculate per-chunk values"); + error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate per-chunk values", + val.id); - if (argindex[i] == 0) { + if (val.argindex == 0) { if (!icompute->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom compute does not calculate global vector"); + error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate global vector", + val.id); } else { if (!icompute->array_flag) - error->all(FLERR,"Compute chunk/spread/atom compute does not calculate global array"); - if (argindex[i] > icompute->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom compute array is accessed out-of-range"); + error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate global array", + val.id); + if (val.argindex > icompute->size_array_cols) + error->all(FLERR,"Compute chunk/spread/atom compute {} array is accessed out-of-range", + val.id); } + val.val.c = icompute; - } else if (which[i] == ArgInfo::FIX) { - auto ifix = modify->get_fix_by_id(ids[i]); + } else if (val.which == ArgInfo::FIX) { + auto ifix = modify->get_fix_by_id(val.id); if (ifix) - error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", ids[i]); - if (argindex[i] == 0) { + error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", val.id); + if (val.argindex == 0) { if (!ifix->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom fix does not calculate global vector"); + error->all(FLERR,"Compute chunk/spread/atom {} fix does not calculate global vector", + val.id); } else { if (!ifix->array_flag) - error->all(FLERR,"Compute chunk/spread/atom fix does not calculate global array"); - if (argindex[i] > ifix->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom fix array is accessed out-of-range"); + error->all(FLERR,"Compute chunk/spread/atom {} fix does not calculate global array", + val.id); + if (val.argindex > ifix->size_array_cols) + error->all(FLERR,"Compute chunk/spread/atom fix {} array is accessed out-of-range", + val.id); } } } @@ -126,8 +127,8 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : // this compute produces a peratom vector or array peratom_flag = 1; - if (nvalues == 1) size_peratom_cols = 0; - else size_peratom_cols = nvalues; + if (values.size() == 1) size_peratom_cols = 0; + else size_peratom_cols = values.size(); // per-atom vector or array @@ -140,13 +141,7 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : ComputeChunkSpreadAtom::~ComputeChunkSpreadAtom() { - delete [] idchunk; - - delete [] which; - delete [] argindex; - for (int i = 0; i < nvalues; i++) delete [] ids[i]; - delete [] ids; - delete [] value2index; + delete[] idchunk; memory->destroy(vector_atom); memory->destroy(array_atom); @@ -160,18 +155,16 @@ void ComputeChunkSpreadAtom::init() // set indices of all computes,fixes,variables - for (int m = 0; m < nvalues; m++) { - if (which[m] == ArgInfo::COMPUTE) { - int icompute = modify->find_compute(ids[m]); - if (icompute < 0) - error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", ids[m]); - value2index[m] = icompute; + for (auto &val : values) { + if (val.which == ArgInfo::COMPUTE) { + val.val.c = modify->get_compute_by_id(val.id); + if (!val.val.c) + error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", val.id); - } else if (which[m] == ArgInfo::FIX) { - int ifix = modify->find_fix(ids[m]); - if (ifix < 0) - error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", ids[m]); - value2index[m] = ifix; + } else if (val.which == ArgInfo::FIX) { + val.val.f = modify->get_fix_by_id(val.id); + if (!val.val.f) + error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", val.id); } } } @@ -182,7 +175,8 @@ void ComputeChunkSpreadAtom::init_chunk() { cchunk = dynamic_cast(modify->get_compute_by_id(idchunk)); if (!cchunk) - error->all(FLERR,"Chunk/atom compute does not exist for compute chunk/spread/atom {}", idchunk); + error->all(FLERR,"Chunk/atom compute {} does not exist for compute chunk/spread/atom " + "or is of invalid style", idchunk); if (strcmp(cchunk->style,"chunk/atom") != 0) error->all(FLERR,"Compute chunk/spread/atom {} does not use chunk/atom compute", idchunk); } @@ -196,14 +190,14 @@ void ComputeChunkSpreadAtom::compute_peratom() // grow local vector_atom or array_atom if necessary if (atom->nmax > nmax) { - if (nvalues == 1) { + if (values.size() == 1) { memory->destroy(vector_atom); nmax = atom->nmax; memory->create(vector_atom,nmax,"chunk/spread/atom:vector_atom"); } else { memory->destroy(array_atom); nmax = atom->nmax; - memory->create(array_atom,nmax,nvalues,"chunk/spread/atom:array_atom"); + memory->create(array_atom,nmax,values.size(),"chunk/spread/atom:array_atom"); } } @@ -221,35 +215,35 @@ void ComputeChunkSpreadAtom::compute_peratom() int *mask = atom->mask; int nlocal = atom->nlocal; - int i,m,n,index,nstride; + int index,nstride; double *ptr; - for (m = 0; m < nvalues; m++) { - n = value2index[m]; + int m = 0; + for (auto &val : values) { // copy compute/fix values into vector_atom or array_atom // nstride between values for each atom - if (nvalues == 1) { + if (values.size() == 1) { ptr = vector_atom; nstride = 1; } else { ptr = &array_atom[0][m]; - nstride = nvalues; + nstride = values.size(); } // invoke compute if not previously invoked - if (which[m] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[n]; + if (val.which == ArgInfo::COMPUTE) { + Compute *compute = val.val.c; - if (argindex[m] == 0) { + if (val.argindex == 0) { if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { compute->compute_vector(); compute->invoked_flag |= Compute::INVOKED_VECTOR; } double *cvector = compute->vector; - for (i = 0; i < nlocal; i++, ptr += nstride) { + for (int i = 0; i < nlocal; i++, ptr += nstride) { *ptr = 0.0; if (!(mask[i] & groupbit)) continue; index = ichunk[i]-1; @@ -262,9 +256,9 @@ void ComputeChunkSpreadAtom::compute_peratom() compute->compute_array(); compute->invoked_flag |= Compute::INVOKED_ARRAY; } - int icol = argindex[m]-1; + int icol = val.argindex-1; double **carray = compute->array; - for (i = 0; i < nlocal; i++, ptr += nstride) { + for (int i = 0; i < nlocal; i++, ptr += nstride) { *ptr = 0.0; if (!(mask[i] & groupbit)) continue; index = ichunk[i]-1; @@ -277,15 +271,15 @@ void ComputeChunkSpreadAtom::compute_peratom() // are assuming the fix global vector/array is per-chunk data // check if index exceeds fix output length/rows - } else if (which[m] == ArgInfo::FIX) { - auto &fix = modify->get_fix_list()[n]; + } else if (val.which == ArgInfo::FIX) { + Fix *fix = val.val.f; if (update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix used in compute chunk/spread/atom not " - "computed at compatible time"); + error->all(FLERR,"Fix {} used in compute chunk/spread/atom not computed at compatible time", + val.id); - if (argindex[m] == 0) { + if (val.argindex == 0) { int nfix = fix->size_vector; - for (i = 0; i < nlocal; i++, ptr += nstride) { + for (int i = 0; i < nlocal; i++, ptr += nstride) { *ptr = 0.0; if (!(mask[i] & groupbit)) continue; index = ichunk[i]-1; @@ -294,9 +288,9 @@ void ComputeChunkSpreadAtom::compute_peratom() } } else { - int icol = argindex[m]-1; + int icol = val.argindex-1; int nfix = fix->size_array_rows; - for (i = 0; i < nlocal; i++, ptr += nstride) { + for (int i = 0; i < nlocal; i++, ptr += nstride) { *ptr = 0.0; if (!(mask[i] & groupbit)) continue; index = ichunk[i]-1; @@ -305,6 +299,7 @@ void ComputeChunkSpreadAtom::compute_peratom() } } } + ++m; } } @@ -314,6 +309,7 @@ void ComputeChunkSpreadAtom::compute_peratom() double ComputeChunkSpreadAtom::memory_usage() { - double bytes = (double)nmax*nvalues * sizeof(double); + double bytes = (double)nmax*values.size() * sizeof(double); + bytes += values.size() * sizeof(value_t); return bytes; } diff --git a/src/compute_chunk_spread_atom.h b/src/compute_chunk_spread_atom.h index 926c5650b5..870fa47c9c 100644 --- a/src/compute_chunk_spread_atom.h +++ b/src/compute_chunk_spread_atom.h @@ -33,13 +33,20 @@ class ComputeChunkSpreadAtom : public Compute { double memory_usage() override; protected: - int mode, nvalues; - char *idchunk; - char **ids; - int *which, *argindex, *value2index; + struct value_t { + int which; + int argindex; + std::string id; + union { + class Compute *c; + class Fix *f; + } val; + }; + std::vector values; - int nmax; + char *idchunk; class ComputeChunkAtom *cchunk; + int nmax; void init_chunk(); }; From 2f5e0646d9bd61dc040c126b77576ecc3599ea3c Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Fri, 30 Sep 2022 21:55:50 -0500 Subject: [PATCH 275/364] Fixed typo in test_fortran_properties --- unittest/fortran/test_fortran_properties.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 36b1c30638..153cab8c77 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -53,7 +53,7 @@ END FUNCTION f_lammps_extract_setting FUNCTION f_lammps_has_error () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int - USE keepcmds, ONLY : lmp + USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE INTEGER(C_int) :: f_lammps_has_error From b9cc150f4433c32c95c81b3e63fe5805b4313cec Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 01:06:18 -0400 Subject: [PATCH 276/364] add unit test for chunks --- src/fix_vector.cpp | 4 +- unittest/commands/CMakeLists.txt | 15 +- unittest/commands/test_compute_chunk.cpp | 182 +++++++++++++++++++++++ 3 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 unittest/commands/test_compute_chunk.cpp diff --git a/src/fix_vector.cpp b/src/fix_vector.cpp index 38169bfcff..e160bd5b4d 100644 --- a/src/fix_vector.cpp +++ b/src/fix_vector.cpp @@ -38,6 +38,8 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : nevery = utils::inumeric(FLERR, arg[3], false, lmp); if (nevery <= 0) error->all(FLERR, "Invalid fix vector every argument: {}", nevery); + // parse values + values.clear(); for (int iarg = 4; iarg < narg; iarg++) { ArgInfo argi(arg[iarg]); @@ -48,7 +50,7 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : val.id = argi.get_name(); val.val.c = nullptr; - if ((argi.get_type() == ArgInfo::UNKNOWN) || (argi.get_type() == ArgInfo::NONE) || + if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) error->all(FLERR, "Invalid fix vector argument: {}", arg[iarg]); diff --git a/unittest/commands/CMakeLists.txt b/unittest/commands/CMakeLists.txt index 858e6068e0..c9a7c7df59 100644 --- a/unittest/commands/CMakeLists.txt +++ b/unittest/commands/CMakeLists.txt @@ -58,10 +58,17 @@ target_compile_definitions(test_reset_ids PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CU target_link_libraries(test_reset_ids PRIVATE lammps GTest::GMock) add_test(NAME ResetIDs COMMAND test_reset_ids) -add_executable(test_compute_global test_compute_global.cpp) -target_compile_definitions(test_compute_global PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(test_compute_global PRIVATE lammps GTest::GMock) -add_test(NAME ComputeGlobal COMMAND test_compute_global) +if(PKG_MOLECULE) + add_executable(test_compute_global test_compute_global.cpp) + target_compile_definitions(test_compute_global PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(test_compute_global PRIVATE lammps GTest::GMock) + add_test(NAME ComputeGlobal COMMAND test_compute_global) + + add_executable(test_compute_chunk test_compute_chunk.cpp) + target_compile_definitions(test_compute_chunk PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) + target_link_libraries(test_compute_chunk PRIVATE lammps GTest::GMock) + add_test(NAME ComputeChunk COMMAND test_compute_chunk) +endif() add_executable(test_mpi_load_balancing test_mpi_load_balancing.cpp) target_link_libraries(test_mpi_load_balancing PRIVATE lammps GTest::GMock) diff --git a/unittest/commands/test_compute_chunk.cpp b/unittest/commands/test_compute_chunk.cpp new file mode 100644 index 0000000000..a60e6fbf36 --- /dev/null +++ b/unittest/commands/test_compute_chunk.cpp @@ -0,0 +1,182 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "../testing/core.h" +#include "info.h" +#include "lammps.h" +#include "library.h" +#include "utils.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include +#include + +// whether to print verbose output (i.e. not capturing LAMMPS screen output). +bool verbose = false; + +namespace LAMMPS_NS { + +#define STRINGIFY(val) XSTR(val) +#define XSTR(val) #val + +class ComputeChunkTest : public LAMMPSTest { +protected: + void SetUp() override + { + testbinary = "ComputeChunkTest"; + LAMMPSTest::SetUp(); + if (info->has_style("atom", "full")) { + BEGIN_HIDE_OUTPUT(); + command("variable input_dir index \"" STRINGIFY(TEST_INPUT_FOLDER) "\""); + command("include \"${input_dir}/in.fourmol\""); + command("group allwater molecule 3:6"); + command("region half block 0.0 INF INF INF INF INF"); + command("compute tags all property/atom id"); + command("compute bin1d all chunk/atom bin/1d x lower 3.0 units box"); + command("compute bin2d all chunk/atom bin/2d x lower 3.0 y lower 3.0 units box"); + command("compute bin3d all chunk/atom bin/3d x lower 3.0 y lower 3.0 z lower 3.0 units " + "box"); + command("compute binsph all chunk/atom bin/sphere 0.0 0.0 0.0 0.01 6.01 6 units box"); + command("compute bincyl all chunk/atom bin/cylinder z lower 3.0 1.0 1.0 0.01 6.01 6 " + "units box"); + command("compute mols all chunk/atom molecule"); + command("compute types all chunk/atom type"); + END_HIDE_OUTPUT(); + } + } + + double get_scalar(const char *id) + { + return *(double *)lammps_extract_compute(lmp, id, LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR); + } + + double *get_vector(const char *id) + { + return (double *)lammps_extract_compute(lmp, id, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR); + } + + double **get_array(const char *id) + { + return (double **)lammps_extract_compute(lmp, id, LMP_STYLE_GLOBAL, LMP_TYPE_ARRAY); + } + + double *get_peratom(const char *id) + { + return (double *)lammps_extract_compute(lmp, id, LMP_STYLE_ATOM, LMP_TYPE_VECTOR); + } +}; + +static constexpr int chunk1d[] = {0, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 3, + 4, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 2, 2, 2}; +static constexpr int chalf1d[] = {0, 0, 3, 0, 0, 0, 3, 3, 3, 3, 3, 3, 4, 4, 3, + 4, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 0, 0, 0}; +static constexpr int chunk2d[] = {0, 9, 14, 8, 9, 8, 13, 13, 13, 13, 13, 12, 18, 18, 13, + 18, 12, 12, 14, 14, 14, 17, 17, 17, 14, 14, 14, 7, 7, 7}; +static constexpr int chunk3d[] = {0, 43, 68, 38, 43, 38, 63, 62, 63, 63, 63, 58, 88, 88, 62, + 88, 58, 59, 67, 67, 67, 82, 82, 82, 69, 69, 69, 34, 34, 34}; +static constexpr int chunksph[] = {0, 3, 4, 2, 3, 2, 2, 3, 2, 2, 3, 4, 4, 5, 4, + 4, 4, 4, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 5}; +static constexpr int chunkcyl[] = {0, 8, 13, 8, 13, 8, 8, 7, 8, 8, 13, 18, 13, 18, 12, + 13, 18, 19, 12, 7, 17, 27, 27, 27, 14, 14, 19, 29, 29, 29}; +static constexpr int chunkmol[] = {0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6}; +static constexpr int chunktyp[] = {0, 3, 2, 1, 2, 2, 1, 4, 3, 2, 1, 2, 1, 2, 2, + 2, 1, 4, 4, 2, 2, 5, 2, 2, 5, 2, 2, 5, 2, 2}; + +TEST_F(ComputeChunkTest, ChunkAtom) +{ + if (lammps_get_natoms(lmp) == 0.0) GTEST_SKIP(); + + BEGIN_HIDE_OUTPUT(); + command("pair_style lj/cut/coul/cut 10.0"); + command("pair_coeff * * 0.01 3.0"); + command("bond_style harmonic"); + command("bond_coeff * 100.0 1.5"); + command("dump d1 all custom 1 binsph.lammpstrj id c_binsph"); + command("dump d2 all custom 1 bincyl.lammpstrj id c_bincyl"); + command("dump d3 all custom 1 types.lammpstrj id c_types"); + command("run 0 post no"); + END_HIDE_OUTPUT(); + + const int natoms = lammps_get_natoms(lmp); + EXPECT_EQ(get_scalar("bin1d"), 5); + EXPECT_EQ(get_scalar("bin2d"), 25); + EXPECT_EQ(get_scalar("bin3d"), 125); + EXPECT_EQ(get_scalar("binsph"), 6); + EXPECT_EQ(get_scalar("bincyl"), 30); + EXPECT_EQ(get_scalar("mols"), 6); + EXPECT_EQ(get_scalar("types"), 5); + + auto cbin1d = get_peratom("bin1d"); + auto cbin2d = get_peratom("bin2d"); + auto cbin3d = get_peratom("bin3d"); + auto cbinsph = get_peratom("binsph"); + auto cbincyl = get_peratom("bincyl"); + auto cmols = get_peratom("mols"); + auto ctypes = get_peratom("types"); + auto tag = get_peratom("tags"); + + for (int i = 0; i < natoms; ++i) { + EXPECT_EQ(cbin1d[i], chunk1d[(int)tag[i]]); + EXPECT_EQ(cbin2d[i], chunk2d[(int)tag[i]]); + EXPECT_EQ(cbin3d[i], chunk3d[(int)tag[i]]); + EXPECT_EQ(cbinsph[i], chunksph[(int)tag[i]]); + EXPECT_EQ(cbincyl[i], chunkcyl[(int)tag[i]]); + EXPECT_EQ(cmols[i], chunkmol[(int)tag[i]]); + EXPECT_EQ(ctypes[i], chunktyp[(int)tag[i]]); + } + + BEGIN_HIDE_OUTPUT(); + command("uncompute bin1d"); + command("compute bin1d all chunk/atom bin/1d x lower 0.2 units reduced region half"); + command("uncompute bin3d"); + command("compute bin3d all chunk/atom bin/3d x lower 3.0 y lower 3.0 z lower 3.0 " + "compress yes units box"); + END_HIDE_OUTPUT(); + EXPECT_EQ(get_scalar("bin1d"), 5); + EXPECT_EQ(get_scalar("bin3d"), 150); + + cbin1d = get_peratom("bin1d"); + tag = get_peratom("tags"); + for (int i = 0; i < natoms; ++i) { + EXPECT_EQ(cbin1d[i], chalf1d[(int)tag[i]]); + } +} + +} // namespace LAMMPS_NS + +int main(int argc, char **argv) +{ + MPI_Init(&argc, &argv); + ::testing::InitGoogleMock(&argc, argv); + + if (LAMMPS_NS::platform::mpi_vendor() == "Open MPI" && !Info::has_exceptions()) + std::cout << "Warning: using OpenMPI without exceptions. Death tests will be skipped\n"; + + // handle arguments passed via environment variable + if (const char *var = getenv("TEST_ARGS")) { + std::vector env = LAMMPS_NS::utils::split_words(var); + for (auto arg : env) { + if (arg == "-v") { + verbose = true; + } + } + } + + if ((argc > 1) && (strcmp(argv[1], "-v") == 0)) verbose = true; + + int rv = RUN_ALL_TESTS(); + MPI_Finalize(); + return rv; +} From eeff6aa06c09d3335fc0dfc6fc354e918ab6cad1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 13:34:55 -0400 Subject: [PATCH 277/364] make sure to always look up the region to avoid null pointer dereference --- src/compute_chunk_atom.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index ccd5da433f..013efb8c50 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -906,7 +906,11 @@ void ComputeChunkAtom::assign_chunk_ids() // update region if necessary - if (regionflag) region->prematch(); + if (regionflag) { + region = domain->get_region_by_id(idregion); + if (!region) error->all(FLERR, "Region {} for compute chunk/atom does not exist", idregion); + region->prematch(); + } // exclude = 1 if atom is not assigned to a chunk // exclude atoms not in group or not in optional region From 3980344b673fea4c1340dfb8976af801b164c3db Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 13:35:19 -0400 Subject: [PATCH 278/364] add tests for compute property/chunk angmom/chunk ,com/chunk, dipole/chunk --- unittest/commands/test_compute_chunk.cpp | 118 ++++++++++++++++++++++- 1 file changed, 113 insertions(+), 5 deletions(-) diff --git a/unittest/commands/test_compute_chunk.cpp b/unittest/commands/test_compute_chunk.cpp index a60e6fbf36..74198cb6f4 100644 --- a/unittest/commands/test_compute_chunk.cpp +++ b/unittest/commands/test_compute_chunk.cpp @@ -23,7 +23,8 @@ #include // whether to print verbose output (i.e. not capturing LAMMPS screen output). -bool verbose = false; +bool verbose = false; +static constexpr double EPSILON = 1.0e-6; namespace LAMMPS_NS { @@ -103,9 +104,8 @@ TEST_F(ComputeChunkTest, ChunkAtom) command("pair_coeff * * 0.01 3.0"); command("bond_style harmonic"); command("bond_coeff * 100.0 1.5"); - command("dump d1 all custom 1 binsph.lammpstrj id c_binsph"); - command("dump d2 all custom 1 bincyl.lammpstrj id c_bincyl"); - command("dump d3 all custom 1 types.lammpstrj id c_types"); + command("dump 1 all custom 1 compute_chunk_atom.lammpstrj " + "id c_bin1d c_bin2d c_bin3d c_binsph c_bincyl c_mols c_types c_tags"); command("run 0 post no"); END_HIDE_OUTPUT(); @@ -145,15 +145,123 @@ TEST_F(ComputeChunkTest, ChunkAtom) "compress yes units box"); END_HIDE_OUTPUT(); EXPECT_EQ(get_scalar("bin1d"), 5); - EXPECT_EQ(get_scalar("bin3d"), 150); + EXPECT_EQ(get_scalar("bin3d"), 12); cbin1d = get_peratom("bin1d"); tag = get_peratom("tags"); for (int i = 0; i < natoms; ++i) { EXPECT_EQ(cbin1d[i], chalf1d[(int)tag[i]]); } + + // cleanup + platform::unlink("compute_chunk_atom.lammpstrj"); } +TEST_F(ComputeChunkTest, PropertyChunk) +{ + if (lammps_get_natoms(lmp) == 0.0) GTEST_SKIP(); + + BEGIN_HIDE_OUTPUT(); + command("pair_style lj/cut/coul/cut 10.0"); + command("pair_coeff * * 0.01 3.0"); + command("bond_style harmonic"); + command("bond_coeff * 100.0 1.5"); + command("uncompute bin3d"); + command("compute bin3d all chunk/atom bin/3d x lower 3.0 y lower 3.0 z lower 3.0 " + "compress yes units box"); + command("compute prop1 all property/chunk bin1d count"); + command("compute prop2 all property/chunk bin2d count"); + command("compute prop3 all property/chunk bin3d id count"); + command("fix hist1 all ave/time 1 1 1 c_prop1 mode vector"); + command("fix hist2 all ave/time 1 1 1 c_prop2 mode vector"); + command("fix hist3 all ave/time 1 1 1 c_prop3[*] mode vector"); + command("run 0 post no"); + END_HIDE_OUTPUT(); + + auto cprop1 = get_vector("prop1"); + EXPECT_EQ(cprop1[0], 0); + EXPECT_EQ(cprop1[1], 7); + EXPECT_EQ(cprop1[2], 16); + EXPECT_EQ(cprop1[3], 6); + EXPECT_EQ(cprop1[4], 0); + + auto cprop2 = get_vector("prop2"); + int nempty = 0; + int ncount = 0; + for (int i = 0; i < 25; ++i) { + if (cprop2[i] == 0) + ++nempty; + else + ncount += cprop2[i]; + } + EXPECT_EQ(nempty, 17); + EXPECT_EQ(ncount, 29); + + auto cprop3 = get_array("prop3"); + EXPECT_EQ(cprop3[0][0], 34); + EXPECT_EQ(cprop3[1][0], 38); + EXPECT_EQ(cprop3[2][0], 43); + EXPECT_EQ(cprop3[3][0], 58); + EXPECT_EQ(cprop3[4][0], 59); + EXPECT_EQ(cprop3[5][0], 62); + EXPECT_EQ(cprop3[6][0], 63); + EXPECT_EQ(cprop3[7][0], 67); + EXPECT_EQ(cprop3[8][0], 68); + EXPECT_EQ(cprop3[9][0], 69); + EXPECT_EQ(cprop3[10][0], 82); + EXPECT_EQ(cprop3[11][0], 88); + + EXPECT_EQ(cprop3[0][1], 3); + EXPECT_EQ(cprop3[1][1], 2); + EXPECT_EQ(cprop3[2][1], 2); + EXPECT_EQ(cprop3[3][1], 2); + EXPECT_EQ(cprop3[4][1], 1); + EXPECT_EQ(cprop3[5][1], 2); + EXPECT_EQ(cprop3[6][1], 4); + EXPECT_EQ(cprop3[7][1], 3); + EXPECT_EQ(cprop3[8][1], 1); + EXPECT_EQ(cprop3[9][1], 3); + EXPECT_EQ(cprop3[10][1], 3); + EXPECT_EQ(cprop3[11][1], 3); +} + +TEST_F(ComputeChunkTest, ChunkComputes) +{ + if (lammps_get_natoms(lmp) == 0.0) GTEST_SKIP(); + + BEGIN_HIDE_OUTPUT(); + command("pair_style lj/cut/coul/cut 10.0"); + command("pair_coeff * * 0.01 3.0"); + command("bond_style harmonic"); + command("bond_coeff * 100.0 1.5"); + command("compute ang all angmom/chunk mols"); + command("compute com all com/chunk mols"); + command("compute dip all dipole/chunk mols geometry"); + command("fix hist1 all ave/time 1 1 1 c_ang[*] c_com[*] c_dip[*] mode vector"); + command("run 0 post no"); + END_HIDE_OUTPUT(); + auto cang = get_array("ang"); + auto ccom = get_array("com"); + auto cdip = get_array("dip"); + EXPECT_NEAR(cang[0][0], -0.0190698, EPSILON); + EXPECT_NEAR(cang[0][1], -0.0281453, EPSILON); + EXPECT_NEAR(cang[0][2], -0.0335739, EPSILON); + EXPECT_NEAR(cang[5][0], 0.00767837, EPSILON); + EXPECT_NEAR(cang[5][1], -0.00303138, EPSILON); + EXPECT_NEAR(cang[5][2], 0.00740977, EPSILON); + EXPECT_NEAR(ccom[1][0], 2.2705137, EPSILON); + EXPECT_NEAR(ccom[1][1], -1.2103888, EPSILON); + EXPECT_NEAR(ccom[1][2], -0.585817, EPSILON); + EXPECT_NEAR(ccom[5][0], -1.9828469, EPSILON); + EXPECT_NEAR(ccom[5][1], -4.1735122, EPSILON); + EXPECT_NEAR(ccom[5][2], 2.0485, EPSILON); + EXPECT_NEAR(cdip[0][3], 0.359122, EPSILON); + EXPECT_NEAR(cdip[1][3], 0.684537, EPSILON); + EXPECT_NEAR(cdip[2][3], 0.502726, EPSILON); + EXPECT_NEAR(cdip[3][3], 0.508459, EPSILON); + EXPECT_NEAR(cdip[4][3], 0.497574, EPSILON); + EXPECT_NEAR(cdip[5][3], 0.49105, EPSILON); +} } // namespace LAMMPS_NS int main(int argc, char **argv) From aac61cbabb30d2e11c3352c0510091746fcb860a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 18:01:17 -0400 Subject: [PATCH 279/364] test more /chunk computes --- unittest/commands/test_compute_chunk.cpp | 88 +++++++++++++++++++----- 1 file changed, 70 insertions(+), 18 deletions(-) diff --git a/unittest/commands/test_compute_chunk.cpp b/unittest/commands/test_compute_chunk.cpp index 74198cb6f4..5792ee725d 100644 --- a/unittest/commands/test_compute_chunk.cpp +++ b/unittest/commands/test_compute_chunk.cpp @@ -23,8 +23,10 @@ #include // whether to print verbose output (i.e. not capturing LAMMPS screen output). -bool verbose = false; -static constexpr double EPSILON = 1.0e-6; +bool verbose = false; + +// we compare floating point numbers with 8 digits precision after the decimal point +static constexpr double EPSILON = 1.0e-8; namespace LAMMPS_NS { @@ -237,30 +239,80 @@ TEST_F(ComputeChunkTest, ChunkComputes) command("compute ang all angmom/chunk mols"); command("compute com all com/chunk mols"); command("compute dip all dipole/chunk mols geometry"); - command("fix hist1 all ave/time 1 1 1 c_ang[*] c_com[*] c_dip[*] mode vector"); + command("compute gyr all gyration/chunk mols"); + command("compute mom all inertia/chunk mols"); + command("compute omg all omega/chunk mols"); + command("compute tmp all temp/chunk mols com yes"); + command("compute trq all torque/chunk mols"); + command("compute vcm all vcm/chunk mols"); + command("fix hist1 all ave/time 1 1 1 c_ang[*] c_com[*] c_dip[*] c_gyr c_mom[*] c_omg[*] " + "c_trq[*] c_vcm[*] mode vector file all_chunk.dat format %15.8f"); + command("fix hist2 all ave/time 1 1 1 c_tmp mode vector file vec_chunk.dat format %15.8f"); command("run 0 post no"); END_HIDE_OUTPUT(); auto cang = get_array("ang"); auto ccom = get_array("com"); auto cdip = get_array("dip"); - EXPECT_NEAR(cang[0][0], -0.0190698, EPSILON); - EXPECT_NEAR(cang[0][1], -0.0281453, EPSILON); - EXPECT_NEAR(cang[0][2], -0.0335739, EPSILON); + auto cgyr = get_vector("gyr"); + auto cmom = get_array("mom"); + auto comg = get_array("omg"); + auto ctmp = get_vector("tmp"); + auto ctrq = get_array("trq"); + auto cvcm = get_array("vcm"); + EXPECT_NEAR(cang[0][0], -0.01906982, EPSILON); + EXPECT_NEAR(cang[0][1], -0.02814532, EPSILON); + EXPECT_NEAR(cang[0][2], -0.03357393, EPSILON); EXPECT_NEAR(cang[5][0], 0.00767837, EPSILON); EXPECT_NEAR(cang[5][1], -0.00303138, EPSILON); EXPECT_NEAR(cang[5][2], 0.00740977, EPSILON); - EXPECT_NEAR(ccom[1][0], 2.2705137, EPSILON); - EXPECT_NEAR(ccom[1][1], -1.2103888, EPSILON); - EXPECT_NEAR(ccom[1][2], -0.585817, EPSILON); - EXPECT_NEAR(ccom[5][0], -1.9828469, EPSILON); - EXPECT_NEAR(ccom[5][1], -4.1735122, EPSILON); - EXPECT_NEAR(ccom[5][2], 2.0485, EPSILON); - EXPECT_NEAR(cdip[0][3], 0.359122, EPSILON); - EXPECT_NEAR(cdip[1][3], 0.684537, EPSILON); - EXPECT_NEAR(cdip[2][3], 0.502726, EPSILON); - EXPECT_NEAR(cdip[3][3], 0.508459, EPSILON); - EXPECT_NEAR(cdip[4][3], 0.497574, EPSILON); - EXPECT_NEAR(cdip[5][3], 0.49105, EPSILON); + EXPECT_NEAR(ccom[1][0], 2.27051374, EPSILON); + EXPECT_NEAR(ccom[1][1], -1.21038876, EPSILON); + EXPECT_NEAR(ccom[1][2], -0.58581655, EPSILON); + EXPECT_NEAR(ccom[5][0], -1.98284693, EPSILON); + EXPECT_NEAR(ccom[5][1], -4.17351226, EPSILON); + EXPECT_NEAR(ccom[5][2], 2.04850072, EPSILON); + EXPECT_NEAR(cmom[2][0], 4.28810281, EPSILON); + EXPECT_NEAR(cmom[2][1], 4.99562488, EPSILON); + EXPECT_NEAR(cmom[2][2], 5.34954800, EPSILON); + EXPECT_NEAR(cmom[5][0], 3.06867233, EPSILON); + EXPECT_NEAR(cmom[5][1], 5.24202887, EPSILON); + EXPECT_NEAR(cmom[5][2], 6.06478557, EPSILON); + EXPECT_NEAR(comg[3][0], -0.00349423, EPSILON); + EXPECT_NEAR(comg[3][1], -0.00025062, EPSILON); + EXPECT_NEAR(comg[3][2], -0.00323573, EPSILON); + EXPECT_NEAR(comg[5][0], 0.00437315, EPSILON); + EXPECT_NEAR(comg[5][1], 0.00029335, EPSILON); + EXPECT_NEAR(comg[5][2], 0.00268517, EPSILON); + EXPECT_NEAR(ctrq[4][0], -0.94086086, EPSILON); + EXPECT_NEAR(ctrq[4][1], 0.56227336, EPSILON); + EXPECT_NEAR(ctrq[4][2], 0.75139995, EPSILON); + EXPECT_NEAR(ctrq[5][0], -0.07066910, EPSILON); + EXPECT_NEAR(ctrq[5][1], -0.58556032, EPSILON); + EXPECT_NEAR(ctrq[5][2], -0.81513604, EPSILON); + EXPECT_NEAR(cvcm[0][0], -0.00011274, EPSILON); + EXPECT_NEAR(cvcm[0][1], 0.00071452, EPSILON); + EXPECT_NEAR(cvcm[0][2], -0.00017908, EPSILON); + EXPECT_NEAR(cvcm[5][0], -0.00063326, EPSILON); + EXPECT_NEAR(cvcm[5][1], 0.00007092, EPSILON); + EXPECT_NEAR(cvcm[5][2], 0.00045545, EPSILON); + EXPECT_NEAR(cdip[0][3], 0.35912150, EPSILON); + EXPECT_NEAR(cdip[1][3], 0.68453713, EPSILON); + EXPECT_NEAR(cdip[2][3], 0.50272643, EPSILON); + EXPECT_NEAR(cdip[3][3], 0.50845862, EPSILON); + EXPECT_NEAR(cdip[4][3], 0.49757365, EPSILON); + EXPECT_NEAR(cdip[5][3], 0.49105019, EPSILON); + EXPECT_NEAR(cgyr[0], 1.48351858, EPSILON); + EXPECT_NEAR(cgyr[1], 1.56649567, EPSILON); + EXPECT_NEAR(cgyr[2], 0.55196552, EPSILON); + EXPECT_NEAR(cgyr[3], 0.54573649, EPSILON); + EXPECT_NEAR(cgyr[4], 0.54793875, EPSILON); + EXPECT_NEAR(cgyr[5], 0.54708204, EPSILON); + EXPECT_NEAR(ctmp[0], 1.08268576, EPSILON); + EXPECT_NEAR(ctmp[1], 1.61905718, EPSILON); + EXPECT_NEAR(ctmp[2], 1.41991778, EPSILON); + EXPECT_NEAR(ctmp[3], 0.55484671, EPSILON); + EXPECT_NEAR(ctmp[4], -0.06062938, EPSILON); + EXPECT_NEAR(ctmp[5], -0.09219489, EPSILON); } } // namespace LAMMPS_NS From 69ca7105ef78e11582bc76ea2d46ef84a34acc63 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 20:22:30 -0400 Subject: [PATCH 280/364] provide some more details about typesetting special characters and math --- doc/src/Build_manual.rst | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index 1ef0a80549..a920688923 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -216,9 +216,20 @@ be multiple tests run automatically: - A test that only standard, printable ASCII text characters are used. This runs the command ``env LC_ALL=C grep -n '[^ -~]' src/*.rst`` and thus prints all offending lines with filename and line number - prepended to the screen. Special characters like the Angstrom - :math:`\mathrm{\mathring{A}}` should be typeset with embedded math - (like this ``:math:`\mathrm{\mathring{A}}```\ ). + prepended to the screen. Special characters like greek letters + (:math:`\alpha~~\sigma~~\epsilon`), super- or subscripts + (:math:`x^2~~\mathrm{U}_{LJ}`), mathematical expressions + (:math:`\frac{1}{2}\mathrm{N}~~x\to\infty`), or the Angstrom symbol + (:math:`\AA`) should be typeset with embedded LaTeX (like this + ``:math:`\alpha \sigma \epsilon```, ``:math:`x^2 \mathrm{E}_{LJ}```, + ``:math:`\frac{1}{2}\mathrm{N} x\to\infty```, or ``:math:`\AA```\ ). + +- Embedded LaTeX is rendered in HTML output with `MathJax + `_ and in PDF output by passing the embedded + text to LaTeX. Some care has to be taken, though, since there are + limitations which macros and features can be used in either mode, so + it is recommended to always check whether any new or changed + documentation does translate and render correctly with either output. - A test whether all styles are documented and listed in their respective overview pages. A typical output with warnings looks like this: From 39ea6ef30e23d609a646240db9a8554ad53738ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 20:23:32 -0400 Subject: [PATCH 281/364] make \AA macro available in :math: for HTML and PDF use the (newly redefined) \AA macro for Angstrom symbol throughout instead of either \mathring{A} or AA --- doc/src/bond_mm3.rst | 10 +++++----- doc/src/compute_chunk_atom.rst | 3 +-- doc/src/compute_displace_atom.rst | 2 +- doc/src/compute_entropy_atom.rst | 4 ++-- doc/src/compute_rigid_local.rst | 3 +-- doc/src/compute_saed.rst | 2 +- doc/src/compute_temp_ramp.rst | 2 +- doc/src/compute_xrd.rst | 2 +- doc/src/create_atoms.rst | 2 +- doc/src/displace_atoms.rst | 2 +- doc/src/dump.rst | 2 +- doc/src/dump_modify.rst | 6 +++--- doc/src/fix_acks2_reaxff.rst | 4 ++-- doc/src/fix_append_atoms.rst | 2 +- doc/src/fix_bocs.rst | 6 +++--- doc/src/fix_imd.rst | 4 ++-- doc/src/fix_qeq_reaxff.rst | 2 +- doc/src/kspace_style.rst | 2 +- doc/src/pair_airebo.rst | 6 +++--- doc/src/pair_smtbq.rst | 16 ++++++++-------- doc/src/pair_zbl.rst | 2 +- doc/src/run_style.rst | 4 ++-- doc/utils/sphinx-config/conf.py.in | 14 ++++++++++++-- 23 files changed, 55 insertions(+), 47 deletions(-) diff --git a/doc/src/bond_mm3.rst b/doc/src/bond_mm3.rst index aa219f0cc7..585794da65 100644 --- a/doc/src/bond_mm3.rst +++ b/doc/src/bond_mm3.rst @@ -26,14 +26,14 @@ as defined in :ref:`(Allinger) ` .. math:: - E = K (r - r_0)^2 \left[ 1 - 2.55(r-r_0) + (7/12) 2.55^2(r-r_0)^2 \right] + E = K (r - r_0)^2 \left[ 1 - 2.55(r-r_0) + \frac{7}{12} 2.55^2(r-r_0)^2 \right] where :math:`r_0` is the equilibrium value of the bond, and :math:`K` is a -prefactor. The anharmonic prefactors have units angstrom\^(-n): --2.55 angstrom\^(-1) and (7/12)2.55\^2 angstrom\^(-2). The code takes +prefactor. The anharmonic prefactors have units :math:`\AA^{-n}`: +:math:`-2.55 \AA^{-1}` and :math:`\frac{7}{12} 2.55^2 \AA^{-2}`. The code takes care of the necessary unit conversion for these factors internally. -Note that the MM3 papers contains an error in Eq (1): -(7/12)2.55 should be replaced with (7/12)2.55\^2 +Note that the MM3 papers contain an error in Eq (1): +:math:`\frac{7}{12} 2.55` should be replaced with :math:`\frac{7}{12} 2.55^2` The following coefficients must be defined for each bond type via the :doc:`bond_coeff ` command as in the example above, or in diff --git a/doc/src/compute_chunk_atom.rst b/doc/src/compute_chunk_atom.rst index d151692771..9bca1e26d1 100644 --- a/doc/src/compute_chunk_atom.rst +++ b/doc/src/compute_chunk_atom.rst @@ -602,8 +602,7 @@ be used. For non-orthogonal (triclinic) simulation boxes, only the *reduced* option may be used. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` -for units = *real* or *metal*). +:doc:`units ` command (e.g., :math:`\AA` for units = *real* or *metal*). A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacing. A *reduced* value means normalized diff --git a/doc/src/compute_displace_atom.rst b/doc/src/compute_displace_atom.rst index fc063cea50..5d52ab947d 100644 --- a/doc/src/compute_displace_atom.rst +++ b/doc/src/compute_displace_atom.rst @@ -95,7 +95,7 @@ something like the following commands: refresh c_dsp delay 100 The :doc:`dump_modify thresh ` command will only output -atoms that have displaced more than :math:`0.6~\mathrm{\mathring A}` on each +atoms that have displaced more than :math:`0.6~\AA` on each snapshot (assuming metal units). The dump_modify *refresh* option triggers a call to this compute at the end of every dump. diff --git a/doc/src/compute_entropy_atom.rst b/doc/src/compute_entropy_atom.rst index 78f784ff75..612fc28365 100644 --- a/doc/src/compute_entropy_atom.rst +++ b/doc/src/compute_entropy_atom.rst @@ -97,13 +97,13 @@ by the corresponding volume. This option can be useful when dealing with inhomogeneous systems such as those that have surfaces. Here are typical input parameters for fcc aluminum (lattice -constant :math:`4.05~\mathrm{\mathring A}`), +constant :math:`4.05~\AA`), .. parsed-literal:: compute 1 all entropy/atom 0.25 5.7 avg yes 3.7 -and for bcc sodium (lattice constant 4.23 Angstroms), +and for bcc sodium (lattice constant :math:`4.23~\AA`), .. parsed-literal:: diff --git a/doc/src/compute_rigid_local.rst b/doc/src/compute_rigid_local.rst index 456fc57c38..91e0dc0acf 100644 --- a/doc/src/compute_rigid_local.rst +++ b/doc/src/compute_rigid_local.rst @@ -109,8 +109,7 @@ The *mass* attribute is the total mass of the rigid body. There are two options for outputting the coordinates of the center of mass (COM) of the body. The *x*, *y*, *z* attributes write the COM "unscaled", in the appropriate distance :doc:`units ` -(:math:`\mathrm{\mathring A}`, -sigma, etc). Use *xu*, *yu*, *zu* if you want the COM "unwrapped" by +(:math:`\AA`, :math:`\sigma`, etc). Use *xu*, *yu*, *zu* if you want the COM "unwrapped" by the image flags for each body. Unwrapped means that if the body COM has passed through a periodic boundary one or more times, the value is generated what the COM coordinate would be if it had not been diff --git a/doc/src/compute_saed.rst b/doc/src/compute_saed.rst index 1a746ab7b9..c2e1f3d1e0 100644 --- a/doc/src/compute_saed.rst +++ b/doc/src/compute_saed.rst @@ -86,7 +86,7 @@ will defined using the *c* values for the spacing along each reciprocal lattice axis. Note that manual mapping of the reciprocal space mesh is good for comparing diffraction results from multiple simulations; however it can reduce the likelihood that Bragg reflections will be satisfied -unless small spacing parameters (:math:`<0.05~\mathrm{\mathring A}^-1`) +unless small spacing parameters (:math:`<0.05~\AA^-1`) are implemented. Meshes with manual spacing do not require a periodic boundary. diff --git a/doc/src/compute_temp_ramp.rst b/doc/src/compute_temp_ramp.rst index 5c18243c23..2e170316fb 100644 --- a/doc/src/compute_temp_ramp.rst +++ b/doc/src/compute_temp_ramp.rst @@ -58,7 +58,7 @@ constant, and :math:`T` is the absolute temperature. The *units* keyword determines the meaning of the distance units used for coordinates (*clo*, *chi*) and velocities (*vlo*, *vhi*). A *box* value selects standard distance units as defined by the :doc:`units ` -command (e.g., :math:`\mathrm{\mathring{A}}` for units = real or metal). A +command (e.g., :math:`\AA` for units = real or metal). A *lattice* value means the distance units are in lattice spacings (i.e., velocity in lattice spacings per unit time). The :doc:`lattice ` command must have been previously used to define the lattice spacing. diff --git a/doc/src/compute_xrd.rst b/doc/src/compute_xrd.rst index 10ee35496d..8673ce9199 100644 --- a/doc/src/compute_xrd.rst +++ b/doc/src/compute_xrd.rst @@ -91,7 +91,7 @@ reciprocal lattice axis. Note that manual mapping of the reciprocal space mesh is good for comparing diffraction results from multiple simulations; however, it can reduce the likelihood that Bragg reflections will be satisfied unless small spacing parameters -(:math:`< 0.05~\mathrm{\mathring{A}}^{-1}`) are implemented. +(:math:`< 0.05~\AA^{-1}`) are implemented. Meshes with manual spacing do not require a periodic boundary. The limits of the reciprocal lattice mesh are determined by range of diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index 17df11a5bf..95d0abd240 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -464,7 +464,7 @@ The *units* keyword determines the meaning of the distance units used to specify the coordinates of the one particle created by the *single* style, or the overlap distance *Doverlap* by the *overlap* keyword. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring{A}}` for +:doc:`units ` command (e.g., :math:`\AA` for units = *real* or *metal*\ . A *lattice* value means the distance units are in lattice spacings. diff --git a/doc/src/displace_atoms.rst b/doc/src/displace_atoms.rst index d9bf367ec4..0055fd584f 100644 --- a/doc/src/displace_atoms.rst +++ b/doc/src/displace_atoms.rst @@ -104,7 +104,7 @@ atom's rotation. Distance units for displacements and the origin point of the *rotate* style are determined by the setting of *box* or *lattice* for the *units* keyword. *Box* means distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` for +:doc:`units ` command (e.g., :math:`\AA` for *real* or *metal* units). *Lattice* means distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacing. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index f069911096..7ac6a7ed54 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -693,7 +693,7 @@ charge. There are several options for outputting atom coordinates. The *x*, *y*, and *z* attributes write atom coordinates "unscaled", in the -appropriate distance :doc:`units ` (:math:`\mathrm{\mathring A}`, +appropriate distance :doc:`units ` (:math:`\AA`, :math:`\sigma`, etc.). Use *xs*, *ys*, and *zs* if you want the coordinates "scaled" to the box size so that each value is 0.0 to 1.0. If the simulation box is triclinic (tilted), then all atom coords will diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index 0d059581eb..52a36e1b00 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -632,7 +632,7 @@ calculates the displacement of each atom from its reference position. The "4" index is the scalar displacement; 1, 2, and 3 are the :math:`xyz` components of the displacement. The :doc:`dump_modify thresh ` command will cause only atoms that have displaced more than -:math:`0.6~\mathrm{\mathring A}` to be output on a given snapshot (assuming +:math:`0.6~\AA` to be output on a given snapshot (assuming metal units). However, note that when an atom is output, we also need to update the reference position for that atom to its new coordinates. So that it will not be output in every snapshot thereafter. That reference position is @@ -675,7 +675,7 @@ value of *yes* means atom coords are written in normalized units from 0.0 to 1.0 in each box dimension. If the simulation box is triclinic (tilted), then all atom coords will still be between 0.0 and 1.0. A value of *no* means they are written in absolute distance units -(e.g., :math:`\mathrm{\mathring A}` or :math:`\sigma`). +(e.g., :math:`\AA` or :math:`\sigma`). Using this keyword will reset all custom header names set with *dump_modify colname* to their respective default values. @@ -687,7 +687,7 @@ when writing to XTC files. By default, they are initialized for whatever :doc:`units ` style is being used, to write out coordinates in nanometers and time in picoseconds. For example, for *real* units, LAMMPS defines *sfactor* = 0.1 and *tfactor* = 0.001, since the -:math:`\mathrm{\mathring A}` and fs used by *real* units are 0.1 nm and +:math:`\AA` and fs used by *real* units are 0.1 nm and 0.001 ps, respectively. If you are using a units system with distance and time units far from nm and ps, you may wish to write XTC files with different units, since the compression algorithm used in XTC files is diff --git a/doc/src/fix_acks2_reaxff.rst b/doc/src/fix_acks2_reaxff.rst index 9f7cc5303d..ebb1b48051 100644 --- a/doc/src/fix_acks2_reaxff.rst +++ b/doc/src/fix_acks2_reaxff.rst @@ -71,7 +71,7 @@ potential in eV, *gamma*, the valence orbital exponent, and *bcut*, the bond cutoff distance. Note that these 4 quantities are also in the ReaxFF potential file, except that eta is defined here as twice the eta value in the ReaxFF file. Note that unlike the rest of LAMMPS, the units -of this fix are hard-coded to be :math:`\mathrm{\mathring{A}}`, eV, and +of this fix are hard-coded to be :math:`\AA`, eV, and electronic charge. The optional *maxiter* keyword allows changing the max number @@ -111,7 +111,7 @@ LAMMPS was built with that package. See the :doc:`Build package This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for -periodic cell dimensions less than :math:`10~\mathrm{\mathring{A}}`. +periodic cell dimensions less than :math:`10~\AA`. This fix may be used in combination with :doc:`fix efield ` and will apply the external electric field during charge equilibration, diff --git a/doc/src/fix_append_atoms.rst b/doc/src/fix_append_atoms.rst index 7c52d9b431..c31d4ff9da 100644 --- a/doc/src/fix_append_atoms.rst +++ b/doc/src/fix_append_atoms.rst @@ -79,7 +79,7 @@ measured from zhi and is set with the *extent* argument. The *units* keyword determines the meaning of the distance units used to define a wall position, but only when a numeric constant is used. A *box* value selects standard distance units as defined by the -:doc:`units ` command (e.g., :math:`\mathrm{\mathring A}` +:doc:`units ` command (e.g., :math:`\AA` for units = real or metal. A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to diff --git a/doc/src/fix_bocs.rst b/doc/src/fix_bocs.rst index 566bf8e68d..018418c538 100644 --- a/doc/src/fix_bocs.rst +++ b/doc/src/fix_bocs.rst @@ -59,7 +59,7 @@ Note both the COMMA and the SPACE separating the volume's value and its corresponding pressure correction. The volumes in the file must be uniformly spaced. Both the volumes and the pressure corrections should be provided in the proper units, e.g. if you are using *units real*, -the volumes should all be in cubic angstroms, and the pressure corrections +the volumes should all be in cubic Angstroms, and the pressure corrections should all be in atmospheres. Furthermore, the table should start/end at a volume considerably smaller/larger than you expect your system to sample during the simulation. If the system ever reaches a volume outside of the @@ -72,8 +72,8 @@ With the *analytic* option, the arguments are as follows: ... analytic V_avg N_particles N_coeff Coeff_1 Coeff_2 ... Coeff_N Note that *V_avg* and *Coeff_i* should all be in the proper units, e.g. if you -are using *units real*, *V_avg* should be in cubic angstroms, and the -coefficients should all be in atmospheres \* cubic angstroms. +are using *units real*, *V_avg* should be in cubic Angstroms, and the +coefficients should all be in atmospheres \* cubic Angstroms. ---------- diff --git a/doc/src/fix_imd.rst b/doc/src/fix_imd.rst index 06d8787b1b..e29da08c4c 100644 --- a/doc/src/fix_imd.rst +++ b/doc/src/fix_imd.rst @@ -88,8 +88,8 @@ to send "unwrapped" coordinates to the IMD client that undo the wrapping back of coordinates into the principle unit cell, as done by default in LAMMPS. The *fscale* keyword allows to apply a scaling factor to forces transmitted by the IMD client. The IMD protocols -stipulates that forces are transferred in kcal/mol/angstrom under the -assumption that coordinates are given in angstrom. For LAMMPS runs +stipulates that forces are transferred in kcal/mol/Angstrom under the +assumption that coordinates are given in Angstrom. For LAMMPS runs with different units or as a measure to tweak the forces generated by the manipulation of the IMD client, this option allows to make adjustments. diff --git a/doc/src/fix_qeq_reaxff.rst b/doc/src/fix_qeq_reaxff.rst index 906847f90a..db9015f187 100644 --- a/doc/src/fix_qeq_reaxff.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -124,7 +124,7 @@ LAMMPS was built with that package. See the :doc:`Build package This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for -periodic cell dimensions less than 10 angstroms. +periodic cell dimensions less than 10 Angstroms. This fix may be used in combination with :doc:`fix efield ` and will apply the external electric field during charge equilibration, diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index 0852a728a4..cbaa82d547 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -301,7 +301,7 @@ and for mixed periodic and non-periodic boundaries. MSM is most competitive versus Ewald and PPPM when only relatively low accuracy forces, about 1e-4 relative error or less accurate, are needed. Note that use of a larger Coulombic cutoff (i.e. 15 -angstroms instead of 10 angstroms) provides better MSM accuracy for +Angstroms instead of 10 Angstroms) provides better MSM accuracy for both the real space and grid computed forces. Currently calculation of the full pressure tensor in MSM is expensive. diff --git a/doc/src/pair_airebo.rst b/doc/src/pair_airebo.rst index b250064476..9a1e4e5518 100644 --- a/doc/src/pair_airebo.rst +++ b/doc/src/pair_airebo.rst @@ -102,7 +102,7 @@ a few fitted spline values are slightly different. For most cases the statistical averages as the original REBO potential from which it was derived. The :math:`E^{\text{REBO}}` term in the AIREBO potential gives the model its reactive capabilities and only describes short-ranged C-C, C-H and H-H -interactions (:math:`r < 2` Angstroms). These interactions have strong +interactions (:math:`r < 2 \AA`). These interactions have strong coordination-dependence through a bond order parameter, which adjusts the attraction between the I,J atoms based on the position of other nearby atoms and thus has 3- and 4-body dependence. @@ -116,9 +116,9 @@ interactions is determined by the *cutoff* argument to the pair_style command which is a scale factor. For each type pair (C-C, C-H, H-H) the cutoff is obtained by multiplying the scale factor by the sigma value defined in the potential file for that type pair. In the -standard AIREBO potential, :math:`\sigma_{CC} = 3.4` Angstroms, so with a scale +standard AIREBO potential, :math:`\sigma_{CC} = 3.4 \AA`, so with a scale factor of 3.0 (the argument in pair_style), the resulting :math:`E^{\text{LJ}}` cutoff -would be 10.2 Angstroms. +would be :math:`10.2 \AA`. By default, the longer-ranged interaction is smoothly switched off between 2.16 and 3.0 :math:`\sigma`. By specifying *cutoff_min* in addition diff --git a/doc/src/pair_smtbq.rst b/doc/src/pair_smtbq.rst index 50b4afaf2d..ea55b2f2d9 100644 --- a/doc/src/pair_smtbq.rst +++ b/doc/src/pair_smtbq.rst @@ -182,19 +182,19 @@ For each cations (metal): * Potential parameter: - If type of potential is 'second_moment' : A (eV), *p*, - :math:`\zeta^0` (eV) and *q*, :math:`r_{c1} (\mathrm{\mathring{A}})`, :math:`r_{c2} - (\mathrm{\mathring{A}})` and :math:`r_0 (\mathrm{\mathring{A}})` - - If type of potential is 'buck' : *C* (eV) and :math:`\rho (\mathrm{\mathring{A}})` + :math:`\zeta^0` (eV) and *q*, :math:`r_{c1} (\AA)`, :math:`r_{c2} + (\AA)` and :math:`r_0 (\AA)` + - If type of potential is 'buck' : *C* (eV) and :math:`\rho (\AA)` - If type of potential is 'buckPlusAttr' : *C* (eV) and :math:`\rho - (\mathrm{\mathring{A}})` *D* (eV), *B* :math:`(\mathrm{\mathring{A}}^{-1})`, :math:`r^{OO}_1 (\mathrm{\mathring{A}})` and - :math:`r^{OO}_2 (\mathrm{\mathring{A}})` + (\AA)` *D* (eV), *B* :math:`(\AA^{-1})`, :math:`r^{OO}_1 (\AA)` and + :math:`r^{OO}_2 (\AA)` * Divider line 4) Tables parameters: * Cutoff radius for the Coulomb interaction (:math:`R_{coul}`) -* Starting radius (:math:`r_{min} = 1,18845 \mathrm{\mathring{A}}`) and increments - (:math:`dr = 0.001 \mathrm{\mathring{A}}`) for creating the potential table. +* Starting radius (:math:`r_{min} = 1,18845 \AA`) and increments + (:math:`dr = 0.001 \AA`) for creating the potential table. * Divider line 5) Rick model parameter: @@ -208,7 +208,7 @@ For each cations (metal): 6) Coordination parameter: * First (:math:`r_{1n}`) and second (:math:`r_{2n}`) neighbor distances - in angstrom + in Angstrom * Divider line 7) Charge initialization mode: diff --git a/doc/src/pair_zbl.rst b/doc/src/pair_zbl.rst index 6c698b23d2..1986fffa4d 100644 --- a/doc/src/pair_zbl.rst +++ b/doc/src/pair_zbl.rst @@ -73,7 +73,7 @@ be included in a pair_coeff command. The numerical values of the exponential decay constants in the screening function depend on the unit of distance. In the above - equation they are given for units of angstroms. LAMMPS will + equation they are given for units of Angstroms. LAMMPS will automatically convert these values to the distance unit of the specified LAMMPS :doc:`units ` setting. The values of Z should always be given as multiples of a proton's charge, e.g. 29.0 for diff --git a/doc/src/run_style.rst b/doc/src/run_style.rst index e8ba264495..aaa6b6bad5 100644 --- a/doc/src/run_style.rst +++ b/doc/src/run_style.rst @@ -221,7 +221,7 @@ impropers, and dihedrals can be computed on this innermost 0.5 fs step. The outermost timestep cannot be greater than 4.0 fs without risking energy drift. Smooth switching of forces between the levels of the rRESPA hierarchy is also necessary to avoid drift, and a 1-2 -angstrom "healing distance" (the distance between the outer and inner +Angstrom "healing distance" (the distance between the outer and inner cutoffs) works reasonably well. We thus recommend the following settings for use of the *respa* style without SHAKE in biomolecular simulations: @@ -277,7 +277,7 @@ Even a LJ system can benefit from rRESPA if the interactions are divided by the inner, middle and outer keywords. A 2-fold or more speedup can be obtained while maintaining good energy conservation. In real units, for a pure LJ fluid at liquid density, with a sigma of -3.0 angstroms, and epsilon of 0.1 Kcal/mol, the following settings +3.0 Angstroms, and epsilon of 0.1 Kcal/mol, the following settings seem to work well: .. code-block:: LAMMPS diff --git a/doc/utils/sphinx-config/conf.py.in b/doc/utils/sphinx-config/conf.py.in index c89aa8b4ae..c94fcaf1d2 100644 --- a/doc/utils/sphinx-config/conf.py.in +++ b/doc/utils/sphinx-config/conf.py.in @@ -159,7 +159,6 @@ pygments_style = 'default' # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False - # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for @@ -264,8 +263,18 @@ else: html_math_renderer = 'mathjax' # use relative path for mathjax, so it is looked for in the -# html tree and the manual becomes readable when offline +# html tree and the manual becomes readable when offline mathjax_path = 'mathjax/es5/tex-mml-chtml.js' + +# hack to enable use of \AA in :math: +rst_prolog = r""" + +.. only:: html + + :math:`\renewcommand{\AA}{\text{Å}}` + +""" + # -- Options for LaTeX output --------------------------------------------- latex_elements = { @@ -278,6 +287,7 @@ latex_elements = { # Additional stuff for the LaTeX preamble. 'preamble': r''' \setcounter{tocdepth}{2} +\renewcommand{\AA}{\mbox{\textrm{\r{A}}}} ''' } From c777434b72780ad72f65c43e656e033c35f43737 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Oct 2022 21:05:16 -0400 Subject: [PATCH 282/364] use kcal consistently --- doc/src/pair_charmm.rst | 2 +- doc/src/run_style.rst | 2 +- doc/src/units.rst | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/pair_charmm.rst b/doc/src/pair_charmm.rst index 768ede1320..8ff6508dea 100644 --- a/doc/src/pair_charmm.rst +++ b/doc/src/pair_charmm.rst @@ -144,7 +144,7 @@ artifacts. conversion factor used internally in the code, from the LAMMPS value to the CHARMM value, as if it were effectively a parameter of the force field. This is because the CHARMM code uses a slightly - different value for the this conversion factor in :doc:`real units ` (Kcal/mole), namely CHARMM = 332.0716, LAMMPS = + different value for the this conversion factor in :doc:`real units ` (kcal/mol), namely CHARMM = 332.0716, LAMMPS = 332.06371. This is to enable more precise agreement by LAMMPS with the CHARMM force field energies and forces, when using one of these two CHARMM pair styles. diff --git a/doc/src/run_style.rst b/doc/src/run_style.rst index aaa6b6bad5..e1dda78374 100644 --- a/doc/src/run_style.rst +++ b/doc/src/run_style.rst @@ -277,7 +277,7 @@ Even a LJ system can benefit from rRESPA if the interactions are divided by the inner, middle and outer keywords. A 2-fold or more speedup can be obtained while maintaining good energy conservation. In real units, for a pure LJ fluid at liquid density, with a sigma of -3.0 Angstroms, and epsilon of 0.1 Kcal/mol, the following settings +3.0 Angstroms, and epsilon of 0.1 kcal/mol, the following settings seem to work well: .. code-block:: LAMMPS diff --git a/doc/src/units.rst b/doc/src/units.rst index da81c17078..2554806fb5 100644 --- a/doc/src/units.rst +++ b/doc/src/units.rst @@ -30,7 +30,7 @@ and dump files. Typically, this command is used at the very beginning of an input script. For all units except *lj*, LAMMPS uses physical constants from -www.physics.nist.gov. For the definition of Kcal in real units, +www.physics.nist.gov. For the definition of kcal in real units, LAMMPS uses the thermochemical calorie = 4.184 J. The choice you make for units simply sets some internal conversion @@ -102,17 +102,17 @@ For style *real*, these are the units: * mass = grams/mole * distance = Angstroms * time = femtoseconds -* energy = Kcal/mole +* energy = kcal/mol * velocity = Angstroms/femtosecond -* force = Kcal/mole-Angstrom -* torque = Kcal/mole +* force = (kcal/mol)/Angstrom +* torque = kcal/mol * temperature = Kelvin * pressure = atmospheres * dynamic viscosity = Poise * charge = multiple of electron charge (1.0 is a proton) * dipole = charge\*Angstroms * electric field = volts/Angstrom -* density = gram/cm\^dim +* density = g/cm\^dim For style *metal*, these are the units: From 39ff5c57225dd173c78f0dd7a0657d5a39ead4ed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 2 Oct 2022 14:48:17 -0400 Subject: [PATCH 283/364] remove unused enums --- src/fix_vector.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/fix_vector.cpp b/src/fix_vector.cpp index e160bd5b4d..f1da015382 100644 --- a/src/fix_vector.cpp +++ b/src/fix_vector.cpp @@ -25,9 +25,6 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum { ONE, RUNNING, WINDOW }; -enum { SCALAR, VECTOR }; - /* ---------------------------------------------------------------------- */ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : From d7ff6337ede05299cbb6057ab0898bc6ec3a5902 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 2 Oct 2022 14:48:53 -0400 Subject: [PATCH 284/364] refactor fix ave/time to use array of struct --- src/fix_ave_time.cpp | 633 ++++++++++++++++++++----------------------- src/fix_ave_time.h | 25 +- 2 files changed, 313 insertions(+), 345 deletions(-) diff --git a/src/fix_ave_time.cpp b/src/fix_ave_time.cpp index 1a437783e7..3eeed90e2f 100644 --- a/src/fix_ave_time.cpp +++ b/src/fix_ave_time.cpp @@ -19,6 +19,7 @@ #include "fix_ave_time.h" #include "arg_info.h" +#include "comm.h" #include "compute.h" #include "error.h" #include "input.h" @@ -32,22 +33,18 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{ONE,RUNNING,WINDOW}; -enum{SCALAR,VECTOR}; +enum{ ONE, RUNNING, WINDOW }; +enum{ SCALAR, VECTOR }; /* ---------------------------------------------------------------------- */ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - nvalues(0), which(nullptr), argindex(nullptr), value2index(nullptr), - offcol(nullptr), varlen(nullptr), ids(nullptr), - fp(nullptr), offlist(nullptr), format(nullptr), format_user(nullptr), + nvalues(0), fp(nullptr), offlist(nullptr), format(nullptr), format_user(nullptr), vector(nullptr), vector_total(nullptr), vector_list(nullptr), column(nullptr), array(nullptr), array_total(nullptr), array_list(nullptr) { - if (narg < 7) error->all(FLERR,"Illegal fix ave/time command"); - - MPI_Comm_rank(world,&me); + if (narg < 7) utils::missing_cmd_args(FLERR, "fix ave/time", error); nevery = utils::inumeric(FLERR,arg[3],false,lmp); nrepeat = utils::inumeric(FLERR,arg[4],false,lmp); @@ -62,18 +59,17 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : // then read options so know mode = SCALAR/VECTOR before re-reading values nvalues = 0; - int iarg = 6; while (iarg < narg) { - if ((strncmp(arg[iarg],"c_",2) == 0) || - (strncmp(arg[iarg],"f_",2) == 0) || - (strncmp(arg[iarg],"v_",2) == 0)) { + if (utils::strmatch(arg[iarg],"^[cfv]_")) { nvalues++; iarg++; } else break; } + if (nvalues == 0) + error->all(FLERR,"No values from computes, fixes, or variables used in fix ave/time command"); - if (nvalues == 0) error->all(FLERR,"No values in fix ave/time command"); + // parse optional keywords options(iarg,narg,arg); @@ -83,7 +79,6 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : int expand = 0; char **earg; nvalues = utils::expand_args(FLERR,nvalues,&arg[6],mode,earg,lmp); - keyword.resize(nvalues); key2col.clear(); if (earg != &arg[6]) expand = 1; @@ -91,132 +86,126 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : // parse values - which = new int[nvalues]; - argindex = new int[nvalues]; - value2index = new int[nvalues]; - offcol = new int[nvalues]; - varlen = new int[nvalues]; - ids = new char*[nvalues]; - + values.clear(); for (int i = 0; i < nvalues; i++) { ArgInfo argi(arg[i]); - keyword[i] = arg[i]; + + value_t val; + val.keyword = arg[i]; key2col[arg[i]] = i; if ((argi.get_type() == ArgInfo::NONE) || (argi.get_type() == ArgInfo::UNKNOWN) || (argi.get_dim() > 1)) - error->all(FLERR,"Invalid fix ave/time command"); + error->all(FLERR,"Invalid fix ave/time argument: {}", arg[i]); - which[i] = argi.get_type(); - argindex[i] = argi.get_index1(); - ids[i] = argi.copy_name(); + val.which = argi.get_type(); + val.argindex = argi.get_index1(); + val.varlen = 0; + val.offcol = 0; + val.id = argi.get_name(); + val.val.c = nullptr; + + values.push_back(val); } + if (nvalues != (int)values.size()) + error->all(FLERR, "Could not parse value data consistently for fix ave/time"); // set off columns now that nvalues is finalized - for (int i = 0; i < nvalues; i++) offcol[i] = 0; for (int i = 0; i < noff; i++) { if (offlist[i] < 1 || offlist[i] > nvalues) - error->all(FLERR,"Invalid fix ave/time off column"); - offcol[offlist[i]-1] = 1; + error->all(FLERR,"Invalid fix ave/time off column: {}", offlist[i]); + values[offlist[i]-1].offcol = 1; } // setup and error check // for fix inputs, check that fix frequency is acceptable // set variable_length if any compute is variable length - if (nevery <= 0 || nrepeat <= 0 || nfreq <= 0) - error->all(FLERR,"Illegal fix ave/time command"); + if (nevery <= 0) + error->all(FLERR,"Illegal fix ave/time nevery value: {}", nevery); + if (nrepeat <= 0) + error->all(FLERR,"Illegal fix ave/time nrepeat value: {}", nrepeat); + if (nfreq <= 0) + error->all(FLERR,"Illegal fix ave/time nfreq value: {}", nfreq); if (nfreq % nevery || nrepeat*nevery > nfreq) - error->all(FLERR,"Illegal fix ave/time command"); + error->all(FLERR,"Inconsistent fix ave/time nevery/nrepeat/nfreq values"); if (ave != RUNNING && overwrite) - error->all(FLERR,"Illegal fix ave/time command"); + error->all(FLERR,"Fix ave/time overwrite keyword requires ave running setting"); - for (int i = 0; i < nvalues; i++) { - varlen[i] = 0; + for (auto &val : values) { - if (which[i] == ArgInfo::COMPUTE && mode == SCALAR) { - int icompute = modify->find_compute(ids[i]); - if (icompute < 0) - error->all(FLERR,"Compute ID for fix ave/time does not exist"); - if (argindex[i] == 0 && modify->compute[icompute]->scalar_flag == 0) - error->all(FLERR,"Fix ave/time compute does not calculate a scalar"); - if (argindex[i] && modify->compute[icompute]->vector_flag == 0) - error->all(FLERR,"Fix ave/time compute does not calculate a vector"); - if (argindex[i] && argindex[i] > modify->compute[icompute]->size_vector && - modify->compute[icompute]->size_vector_variable == 0) - error->all(FLERR, - "Fix ave/time compute vector is accessed out-of-range"); - if (argindex[i] && modify->compute[icompute]->size_vector_variable) - varlen[i] = 1; + if ((val.which == ArgInfo::COMPUTE) && (mode == SCALAR)) { + val.val.c = modify->get_compute_by_id(val.id); + if (!val.val.c) error->all(FLERR,"Compute ID {} for fix ave/time does not exist", val.id); + if (val.argindex == 0 && (val.val.c->scalar_flag == 0)) + error->all(FLERR,"Fix ave/time compute {} does not calculate a scalar", val.id); + if (val.argindex && (val.val.c->vector_flag == 0)) + error->all(FLERR,"Fix ave/time compute {} does not calculate a vector", val.id); + if (val.argindex && (val.argindex > val.val.c->size_vector) && + (val.val.c->size_vector_variable == 0)) + error->all(FLERR, "Fix ave/time compute {} vector is accessed out-of-range", val.id); + if (val.argindex && val.val.c->size_vector_variable) val.varlen = 1; - } else if (which[i] == ArgInfo::COMPUTE && mode == VECTOR) { - int icompute = modify->find_compute(ids[i]); - if (icompute < 0) - error->all(FLERR,"Compute ID for fix ave/time does not exist"); - if (argindex[i] == 0 && modify->compute[icompute]->vector_flag == 0) - error->all(FLERR,"Fix ave/time compute does not calculate a vector"); - if (argindex[i] && modify->compute[icompute]->array_flag == 0) - error->all(FLERR,"Fix ave/time compute does not calculate an array"); - if (argindex[i] && - argindex[i] > modify->compute[icompute]->size_array_cols) - error->all(FLERR,"Fix ave/time compute array is accessed out-of-range"); - if (argindex[i] == 0 && modify->compute[icompute]->size_vector_variable) - varlen[i] = 1; - if (argindex[i] && modify->compute[icompute]->size_array_rows_variable) - varlen[i] = 1; + } else if ((val.which == ArgInfo::COMPUTE) && (mode == VECTOR)) { + val.val.c = modify->get_compute_by_id(val.id); + if (!val.val.c) error->all(FLERR,"Compute ID {} for fix ave/time does not exist", val.id); + if ((val.argindex == 0) && (val.val.c->vector_flag == 0)) + error->all(FLERR,"Fix ave/time compute {} does not calculate a vector", val.id); + if (val.argindex && (val.val.c->array_flag == 0)) + error->all(FLERR,"Fix ave/time compute {} does not calculate an array", val.id); + if (val.argindex && (val.argindex > val.val.c->size_array_cols)) + error->all(FLERR,"Fix ave/time compute {} array is accessed out-of-range", val.id); + if ((val.argindex == 0) && (val.val.c->size_vector_variable)) val.varlen = 1; + if (val.argindex && (val.val.c->size_array_rows_variable)) val.varlen = 1; - } else if (which[i] == ArgInfo::FIX && mode == SCALAR) { - int ifix = modify->find_fix(ids[i]); - if (ifix < 0) - error->all(FLERR,"Fix ID for fix ave/time does not exist"); - if (argindex[i] == 0 && modify->fix[ifix]->scalar_flag == 0) - error->all(FLERR,"Fix ave/time fix does not calculate a scalar"); - if (argindex[i] && modify->fix[ifix]->vector_flag == 0) - error->all(FLERR,"Fix ave/time fix does not calculate a vector"); - if (argindex[i] && modify->fix[ifix]->size_vector_variable) - error->all(FLERR,"Fix ave/time fix vector cannot be variable length"); - if (argindex[i] && argindex[i] > modify->fix[ifix]->size_vector) - error->all(FLERR,"Fix ave/time fix vector is accessed out-of-range"); - if (nevery % modify->fix[ifix]->global_freq) - error->all(FLERR, - "Fix for fix ave/time not computed at compatible time"); + } else if ((val.which == ArgInfo::FIX) && (mode == SCALAR)) { + val.val.f = modify->get_fix_by_id(val.id); + if (!val.val.f) error->all(FLERR,"Fix ID {} for fix ave/time does not exist", val.id); + if ((val.argindex == 0) && (val.val.f->scalar_flag == 0)) + error->all(FLERR,"Fix ave/time fix {} does not calculate a scalar", val.id); + if (val.argindex && (val.val.f->vector_flag == 0)) + error->all(FLERR,"Fix ave/time fix {} does not calculate a vector", val.id); + if (val.argindex && (val.val.f->size_vector_variable)) + error->all(FLERR,"Fix ave/time fix {} vector cannot be variable length", val.id); + if (val.argindex && (val.argindex > val.val.f->size_vector)) + error->all(FLERR,"Fix ave/time fix {} vector is accessed out-of-range", val.id); + if (nevery % val.val.f->global_freq) + error->all(FLERR, "Fix {} for fix ave/time not computed at compatible time", val.id); - } else if (which[i] == ArgInfo::FIX && mode == VECTOR) { - int ifix = modify->find_fix(ids[i]); - if (ifix < 0) - error->all(FLERR,"Fix ID for fix ave/time does not exist"); - if (argindex[i] == 0 && modify->fix[ifix]->vector_flag == 0) - error->all(FLERR,"Fix ave/time fix does not calculate a vector"); - if (argindex[i] && modify->fix[ifix]->array_flag == 0) - error->all(FLERR,"Fix ave/time fix does not calculate an array"); - if (argindex[i] && modify->fix[ifix]->size_array_rows_variable) - error->all(FLERR,"Fix ave/time fix array cannot be variable length"); - if (argindex[i] && argindex[i] > modify->fix[ifix]->size_array_cols) - error->all(FLERR,"Fix ave/time fix array is accessed out-of-range"); - if (nevery % modify->fix[ifix]->global_freq) - error->all(FLERR, - "Fix for fix ave/time not computed at compatible time"); + } else if ((val.which == ArgInfo::FIX) && (mode == VECTOR)) { + val.val.f = modify->get_fix_by_id(val.id); + if (!val.val.f) error->all(FLERR,"Fix ID {} for fix ave/time does not exist", val.id); + if ((val.argindex == 0) && (val.val.f->vector_flag == 0)) + error->all(FLERR,"Fix ave/time fix {} does not calculate a vector", val.id); + if (val.argindex && (val.val.f->array_flag == 0)) + error->all(FLERR,"Fix ave/time fix {} does not calculate an array", val.id); + if (val.argindex && (val.val.f->size_array_rows_variable)) + error->all(FLERR,"Fix ave/time fix {} array cannot be variable length", val.id); + if (val.argindex && (val.argindex > val.val.f->size_array_cols)) + error->all(FLERR,"Fix ave/time fix {} array is accessed out-of-range", val.id); + if (nevery % val.val.f->global_freq) + error->all(FLERR, "Fix {} for fix ave/time not computed at compatible time", val.id); - } else if (which[i] == ArgInfo::VARIABLE && mode == SCALAR) { - int ivariable = input->variable->find(ids[i]); + } else if ((val.which == ArgInfo::VARIABLE) && (mode == SCALAR)) { + int ivariable = input->variable->find(val.id.c_str()); if (ivariable < 0) - error->all(FLERR,"Variable name for fix ave/time does not exist"); - if (argindex[i] == 0 && input->variable->equalstyle(ivariable) == 0) - error->all(FLERR,"Fix ave/time variable is not equal-style variable"); - if (argindex[i] && input->variable->vectorstyle(ivariable) == 0) - error->all(FLERR,"Fix ave/time variable is not vector-style variable"); + error->all(FLERR,"Variable name {} for fix ave/time does not exist", val.id); + if ((val.argindex == 0) && (input->variable->equalstyle(ivariable) == 0)) + error->all(FLERR,"Fix ave/time variable {} is not equal-style variable", val.id); + if ((val.argindex) && (input->variable->vectorstyle(ivariable) == 0)) + error->all(FLERR,"Fix ave/time variable {} is not vector-style variable", val.id); - } else if (which[i] == ArgInfo::VARIABLE && mode == VECTOR) { - int ivariable = input->variable->find(ids[i]); + } else if ((val.which == ArgInfo::VARIABLE) && (mode == VECTOR)) { + int ivariable = input->variable->find(val.id.c_str()); if (ivariable < 0) - error->all(FLERR,"Variable name for fix ave/time does not exist"); - if (argindex[i] == 0 && input->variable->vectorstyle(ivariable) == 0) - error->all(FLERR,"Fix ave/time variable is not vector-style variable"); - if (argindex[i]) - error->all(FLERR,"Fix ave/time mode vector variable cannot be indexed"); - varlen[i] = 1; + error->all(FLERR,"Variable name {} for fix ave/time does not exist", val.id); + if ((val.argindex == 0) && (input->variable->vectorstyle(ivariable) == 0)) + error->all(FLERR,"Fix ave/time variable {} is not vector-style variable", val.id); + if (val.argindex) + error->all(FLERR,"Fix ave/time mode vector variable {} cannot be indexed", val.id); + val.varlen = 1; } } @@ -225,9 +214,9 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : all_variable_length = 1; any_variable_length = 0; - for (int i = 0; i < nvalues; i++) { - if (varlen[i] == 0) all_variable_length = 0; - if (varlen[i]) any_variable_length = 1; + for (auto &val : values) { + if (val.varlen == 0) all_variable_length = 0; + if (val.varlen) any_variable_length = 1; } // if VECTOR mode, check that all columns are same length @@ -245,19 +234,18 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : // only if nrepeat > 1 or ave = RUNNING/WINDOW, // so that locking spans multiple timesteps - if (any_variable_length && - (nrepeat > 1 || ave == RUNNING || ave == WINDOW)) { - for (int i = 0; i < nvalues; i++) - if (varlen[i] && which[i] == ArgInfo::COMPUTE) - modify->get_compute_by_id(ids[i])->lock_enable(); - lockforever = 0; + if (any_variable_length && ((nrepeat > 1) || (ave == RUNNING) || (ave == WINDOW))) { + for (auto &val : values) { + if (val.varlen && val.which == ArgInfo::COMPUTE) val.val.c->lock_enable(); + lockforever = 0; + } } // print file comment lines // for mode = VECTOR, cannot use arg to print // since array args may have been expanded to multiple vectors - if (fp && me == 0) { + if (fp && comm->me == 0) { clearerr(fp); if (title1) fprintf(fp,"%s\n",title1); else fprintf(fp,"# Time-averaged data for fix %s\n",id); @@ -300,8 +288,7 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (mode == SCALAR) { vector = new double[nvalues]; vector_total = new double[nvalues]; - if (ave == WINDOW) - memory->create(vector_list,nwindow,nvalues,"ave/time:vector_list"); + if (ave == WINDOW) memory->create(vector_list,nwindow,nvalues,"ave/time:vector_list"); } else allocate_arrays(); // this fix produces either a global scalar or vector or array @@ -314,17 +301,16 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (mode == SCALAR) { if (nvalues == 1) { scalar_flag = 1; - if (which[0] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[modify->find_compute(ids[0])]; - if (argindex[0] == 0) extscalar = compute->extscalar; - else if (compute->extvector >= 0) extscalar = compute->extvector; - else extscalar = compute->extlist[argindex[0]-1]; - } else if (which[0] == ArgInfo::FIX) { - Fix *fix = modify->fix[modify->find_fix(ids[0])]; - if (argindex[0] == 0) extscalar = fix->extscalar; - else if (fix->extvector >= 0) extscalar = fix->extvector; - else extscalar = fix->extlist[argindex[0]-1]; - } else if (which[0] == ArgInfo::VARIABLE) { + auto &val = values[0]; + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) extscalar = val.val.c->extscalar; + else if (val.val.c->extvector >= 0) extscalar = val.val.c->extvector; + else extscalar = val.val.c->extlist[val.argindex-1]; + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) extscalar = val.val.f->extscalar; + else if (val.val.f->extvector >= 0) extscalar = val.val.f->extvector; + else extscalar = val.val.f->extlist[val.argindex-1]; + } else if (val.which == ArgInfo::VARIABLE) { extscalar = 0; } @@ -333,47 +319,46 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : size_vector = nrows = nvalues; extvector = -1; extlist = new int[nvalues]; - for (int i = 0; i < nvalues; i++) { - if (which[i] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[modify->find_compute(ids[i])]; - if (argindex[i] == 0) extlist[i] = compute->extscalar; - else if (compute->extvector >= 0) extlist[i] = compute->extvector; - else extlist[i] = compute->extlist[argindex[i]-1]; - } else if (which[i] == ArgInfo::FIX) { - Fix *fix = modify->fix[modify->find_fix(ids[i])]; - if (argindex[i] == 0) extlist[i] = fix->extscalar; - else if (fix->extvector >= 0) extlist[i] = fix->extvector; - else extlist[i] = fix->extlist[argindex[i]-1]; - } else if (which[i] == ArgInfo::VARIABLE) { + int i = 0; + for (auto &val : values) { + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) extlist[i] = val.val.c->extscalar; + else if (val.val.c->extvector >= 0) extlist[i] = val.val.c->extvector; + else extlist[i] = val.val.c->extlist[val.argindex-1]; + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) extlist[i] = val.val.f->extscalar; + else if (val.val.f->extvector >= 0) extlist[i] = val.val.f->extvector; + else extlist[i] = val.val.f->extlist[val.argindex-1]; + } else if (val.which == ArgInfo::VARIABLE) { extlist[i] = 0; } + ++i; } } } else { if (nvalues == 1) { + auto &val = values[0]; vector_flag = 1; size_vector = nrows; if (all_variable_length) size_vector_variable = 1; - if (which[0] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[modify->find_compute(ids[0])]; - if (argindex[0] == 0) { - extvector = compute->extvector; + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) { + extvector = val.val.c->extvector; if (extvector == -1) { extlist = new int[nrows]; - for (int i = 0; i < nrows; i++) extlist[i] = compute->extlist[i]; + for (int i = 0; i < nrows; i++) extlist[i] = val.val.c->extlist[i]; } - } else extvector = compute->extarray; - } else if (which[0] == ArgInfo::FIX) { - Fix *fix = modify->fix[modify->find_fix(ids[0])]; - if (argindex[0] == 0) { - extvector = fix->extvector; + } else extvector = val.val.c->extarray; + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) { + extvector = val.val.f->extvector; if (extvector == -1) { extlist = new int[nrows]; - for (int i = 0; i < nrows; i++) extlist[i] = fix->extlist[i]; + for (int i = 0; i < nrows; i++) extlist[i] = val.val.f->extlist[i]; } - } else extvector = fix->extarray; - } else if (which[0] == ArgInfo::VARIABLE) { + } else extvector = val.val.f->extarray; + } else if (val.which == ArgInfo::VARIABLE) { extlist = new int[nrows]; for (int i = 0; i < nrows; i++) extlist[i] = 0; } @@ -383,26 +368,25 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : size_array_rows = nrows; size_array_cols = nvalues; if (all_variable_length) size_array_rows_variable = 1; - int value; - for (int i = 0; i < nvalues; i++) { - if (which[i] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[modify->find_compute(ids[i])]; - if (argindex[i] == 0) value = compute->extvector; - else value = compute->extarray; - } else if (which[i] == ArgInfo::FIX) { - Fix *fix = modify->fix[modify->find_fix(ids[i])]; - if (argindex[i] == 0) value = fix->extvector; - else value = fix->extarray; - } else if (which[i] == ArgInfo::VARIABLE) { - value = 0; + int extvalue = 0; + extarray = -2; + for (auto &val : values) { + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) extvalue = val.val.c->extvector; + else extvalue = val.val.c->extarray; + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) extvalue = val.val.f->extvector; + else extvalue = val.val.f->extarray; + } else if (val.which == ArgInfo::VARIABLE) { + extvalue = 0; } - if (value == -1) - error->all(FLERR,"Fix ave/time cannot set output array " - "intensive/extensive from these inputs"); - if (i == 0) extarray = value; - else if (value != extarray) - error->all(FLERR,"Fix ave/time cannot set output array " - "intensive/extensive from these inputs"); + if (extvalue == -1) + error->all(FLERR,"Fix ave/time cannot set output array intensive/extensive " + "from these inputs"); + if (extarray < -1) extarray = extvalue; + else if (extvalue != extarray) + error->all(FLERR,"Fix ave/time cannot set output array intensive/extensive " + "from these inputs"); } } } @@ -434,32 +418,23 @@ FixAveTime::~FixAveTime() { // decrement lock counter in compute chunk/atom, it if still exists - if (any_variable_length && - (nrepeat > 1 || ave == RUNNING || ave == WINDOW)) { - for (int i = 0; i < nvalues; i++) - if (varlen[i]) { - int icompute = modify->find_compute(ids[i]); - if (icompute >= 0) { - if (ave == RUNNING || ave == WINDOW) - modify->compute[icompute]->unlock(this); - modify->compute[icompute]->lock_disable(); + if (any_variable_length && ((nrepeat > 1) || (ave == RUNNING) || (ave == WINDOW))) { + for (auto &val : values) { + if (val.varlen) { + auto icompute = modify->get_compute_by_id(val.id); + if (icompute) { + if ((ave == RUNNING) || (ave == WINDOW)) + icompute->unlock(this); + icompute->lock_disable(); } } + } } delete[] format_user; - - delete[] which; - delete[] argindex; - delete[] value2index; - delete[] offcol; - delete[] varlen; - for (int i = 0; i < nvalues; i++) delete[] ids[i]; - delete[] ids; - delete[] extlist; - if (fp && me == 0) { + if (fp && comm->me == 0) { if (yaml_flag) fputs("...\n", fp); fclose(fp); } @@ -485,24 +460,21 @@ int FixAveTime::setmask() void FixAveTime::init() { - // set current indices for all computes,fixes,variables + // update indices/pointers for all computes,fixes,variables - for (int i = 0; i < nvalues; i++) { - if (which[i] == ArgInfo::COMPUTE) { - int icompute = modify->find_compute(ids[i]); - if (icompute < 0) - error->all(FLERR,"Compute ID for fix ave/time does not exist"); - value2index[i] = icompute; - } else if (which[i] == ArgInfo::FIX) { - int ifix = modify->find_fix(ids[i]); - if (ifix < 0) - error->all(FLERR,"Fix ID for fix ave/time does not exist"); - value2index[i] = ifix; - } else if (which[i] == ArgInfo::VARIABLE) { - int ivariable = input->variable->find(ids[i]); - if (ivariable < 0) - error->all(FLERR,"Variable name for fix ave/time does not exist"); - value2index[i] = ivariable; + for (auto &val : values) { + if (val.which == ArgInfo::COMPUTE) { + val.val.c = modify->get_compute_by_id(val.id); + if (!val.val.c) + error->all(FLERR,"Compute ID {} for fix ave/time does not exist", val.id); + } else if (val.which == ArgInfo::FIX) { + val.val.f = modify->get_fix_by_id(val.id); + if (!val.val.f) + error->all(FLERR,"Fix ID {} for fix ave/time does not exist", val.id); + } else if (val.which == ArgInfo::VARIABLE) { + val.val.v = input->variable->find(val.id.c_str()); + if (val.val.v < 0) + error->all(FLERR,"Variable name {} for fix ave/time does not exist", val.id); } } @@ -542,9 +514,6 @@ void FixAveTime::end_of_step() void FixAveTime::invoke_scalar(bigint ntimestep) { - int i,m; - double scalar; - // zero if first sample within single Nfreq epoch // if any input is variable length, initialize current length // check for exceeding length is done below @@ -556,7 +525,7 @@ void FixAveTime::invoke_scalar(bigint ntimestep) modify->addstep_compute(ntimestep+nevery); modify->addstep_compute(ntimestep+nfreq); } - for (i = 0; i < nvalues; i++) vector[i] = 0.0; + for (int i = 0; i < nvalues; i++) vector[i] = 0.0; } // accumulate results of computes,fixes,variables to local copy @@ -564,56 +533,57 @@ void FixAveTime::invoke_scalar(bigint ntimestep) modify->clearstep_compute(); - for (i = 0; i < nvalues; i++) { - m = value2index[i]; + int i = 0; + double scalar = 0.0; + for (auto &val : values) { // invoke compute if not previously invoked // insure no out-of-range access to variable-length compute vector - if (which[i] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[m]; + if (val.which == ArgInfo::COMPUTE) { - if (argindex[i] == 0) { - if (!(compute->invoked_flag & Compute::INVOKED_SCALAR)) { - compute->compute_scalar(); - compute->invoked_flag |= Compute::INVOKED_SCALAR; + if (val.argindex == 0) { + if (!(val.val.c->invoked_flag & Compute::INVOKED_SCALAR)) { + val.val.c->compute_scalar(); + val.val.c->invoked_flag |= Compute::INVOKED_SCALAR; } - scalar = compute->scalar; + scalar = val.val.c->scalar; } else { - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; + if (!(val.val.c->invoked_flag & Compute::INVOKED_VECTOR)) { + val.val.c->compute_vector(); + val.val.c->invoked_flag |= Compute::INVOKED_VECTOR; } - if (varlen[i] && compute->size_vector < argindex[i]) scalar = 0.0; - else scalar = compute->vector[argindex[i]-1]; + if (val.varlen && (val.val.c->size_vector < val.argindex)) scalar = 0.0; + else scalar = val.val.c->vector[val.argindex-1]; } // access fix fields, guaranteed to be ready - } else if (which[i] == ArgInfo::FIX) { - if (argindex[i] == 0) - scalar = modify->fix[m]->compute_scalar(); + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) + scalar = val.val.f->compute_scalar(); else - scalar = modify->fix[m]->compute_vector(argindex[i]-1); + scalar = val.val.f->compute_vector(val.argindex-1); // evaluate equal-style or vector-style variable // insure no out-of-range access to vector-style variable - } else if (which[i] == ArgInfo::VARIABLE) { - if (argindex[i] == 0) - scalar = input->variable->compute_equal(m); + } else if (val.which == ArgInfo::VARIABLE) { + if (val.argindex == 0) + scalar = input->variable->compute_equal(val.val.v); else { double *varvec; - int nvec = input->variable->compute_vector(m,&varvec); - if (nvec < argindex[i]) scalar = 0.0; - else scalar = varvec[argindex[i]-1]; + int nvec = input->variable->compute_vector(val.val.v,&varvec); + if (nvec < val.argindex) scalar = 0.0; + else scalar = varvec[val.argindex-1]; } } // add value to vector or just set directly if offcol is set - if (offcol[i]) vector[i] = scalar; + if (val.offcol) vector[i] = scalar; else vector[i] += scalar; + ++i; } // done if irepeat < nrepeat @@ -634,7 +604,7 @@ void FixAveTime::invoke_scalar(bigint ntimestep) double repeat = nrepeat; for (i = 0; i < nvalues; i++) - if (offcol[i] == 0) vector[i] /= repeat; + if (values[i].offcol == 0) vector[i] /= repeat; // if ave = ONE, only single Nfreq timestep value is needed // if ave = RUNNING, combine with all previous Nfreq timestep values @@ -667,18 +637,18 @@ void FixAveTime::invoke_scalar(bigint ntimestep) // insure any columns with offcol set are effectively set to last value for (i = 0; i < nvalues; i++) - if (offcol[i]) vector_total[i] = norm*vector[i]; + if (values[i].offcol) vector_total[i] = norm*vector[i]; // output result to file - if (fp && me == 0) { + if (fp && comm->me == 0) { clearerr(fp); if (overwrite) platform::fseek(fp,filepos); if (yaml_flag) { if (!yaml_header || overwrite) { yaml_header = true; fputs("keywords: ['Step', ", fp); - for (const auto &k : keyword) fmt::print(fp, "'{}', ", k); + for (const auto &val : values) fmt::print(fp, "'{}', ", val.keyword); fputs("]\ndata:\n", fp); } fmt::print(fp, " - [{}, ", ntimestep); @@ -704,8 +674,6 @@ void FixAveTime::invoke_scalar(bigint ntimestep) void FixAveTime::invoke_vector(bigint ntimestep) { - int i,j,m; - // first sample within single Nfreq epoch // zero out arrays that accumulate over many samples, but not across epochs // invoke setup_chunks() to determine current nchunk @@ -735,22 +703,20 @@ void FixAveTime::invoke_vector(bigint ntimestep) } int lockforever_flag = 0; - for (i = 0; i < nvalues; i++) { - if (!varlen[i] || which[i] != ArgInfo::COMPUTE) continue; - if (nrepeat > 1 && ave == ONE) { - Compute *compute = modify->compute[value2index[i]]; - compute->lock(this,ntimestep,ntimestep+static_cast(nrepeat-1)*nevery); - } else if ((ave == RUNNING || ave == WINDOW) && !lockforever) { - Compute *compute = modify->compute[value2index[i]]; - compute->lock(this,update->ntimestep,-1); + for (auto &val : values) { + if (!val.varlen || (val.which != ArgInfo::COMPUTE)) continue; + if ((nrepeat > 1) && (ave == ONE)) { + val.val.c->lock(this,ntimestep,ntimestep+static_cast(nrepeat-1)*nevery); + } else if (((ave == RUNNING) || (ave == WINDOW)) && !lockforever) { + val.val.c->lock(this,update->ntimestep,-1); lockforever_flag = 1; } } if (lockforever_flag) lockforever = 1; } - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) array[i][j] = 0.0; + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) array[i][j] = 0.0; } // accumulate results of computes,fixes,variables to local copy @@ -758,69 +724,67 @@ void FixAveTime::invoke_vector(bigint ntimestep) modify->clearstep_compute(); - for (j = 0; j < nvalues; j++) { - m = value2index[j]; + int j = 0; + for (auto &val : values) { // invoke compute if not previously invoked - if (which[j] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[m]; - - if (argindex[j] == 0) { - if (!(compute->invoked_flag & Compute::INVOKED_VECTOR)) { - compute->compute_vector(); - compute->invoked_flag |= Compute::INVOKED_VECTOR; + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) { + if (!(val.val.c->invoked_flag & Compute::INVOKED_VECTOR)) { + val.val.c->compute_vector(); + val.val.c->invoked_flag |= Compute::INVOKED_VECTOR; } - double *cvector = compute->vector; - for (i = 0; i < nrows; i++) + double *cvector = val.val.c->vector; + for (int i = 0; i < nrows; i++) column[i] = cvector[i]; } else { - if (!(compute->invoked_flag & Compute::INVOKED_ARRAY)) { - compute->compute_array(); - compute->invoked_flag |= Compute::INVOKED_ARRAY; + if (!(val.val.c->invoked_flag & Compute::INVOKED_ARRAY)) { + val.val.c->compute_array(); + val.val.c->invoked_flag |= Compute::INVOKED_ARRAY; } - double **carray = compute->array; - int icol = argindex[j]-1; - for (i = 0; i < nrows; i++) + double **carray = val.val.c->array; + int icol = val.argindex-1; + for (int i = 0; i < nrows; i++) column[i] = carray[i][icol]; } // access fix fields, guaranteed to be ready - } else if (which[j] == ArgInfo::FIX) { - Fix *fix = modify->fix[m]; - if (argindex[j] == 0) - for (i = 0; i < nrows; i++) - column[i] = fix->compute_vector(i); + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) + for (int i = 0; i < nrows; i++) + column[i] = val.val.f->compute_vector(i); else { - int icol = argindex[j]-1; - for (i = 0; i < nrows; i++) - column[i] = fix->compute_array(i,icol); + int icol = val.argindex-1; + for (int i = 0; i < nrows; i++) + column[i] = val.val.f->compute_array(i,icol); } // evaluate vector-style variable // insure nvec = nrows, else error // could be different on this timestep than when column_length(1) set nrows - } else if (which[j] == ArgInfo::VARIABLE) { + } else if (val.which == ArgInfo::VARIABLE) { double *varvec; - int nvec = input->variable->compute_vector(m,&varvec); + int nvec = input->variable->compute_vector(val.val.v,&varvec); if (nvec != nrows) - error->all(FLERR,"Fix ave/time vector-style variable changed length"); - for (i = 0; i < nrows; i++) + error->all(FLERR,"Fix ave/time vector-style variable {} changed length", val.id); + for (int i = 0; i < nrows; i++) column[i] = varvec[i]; } // add columns of values to array or just set directly if offcol is set - if (offcol[j]) { - for (i = 0; i < nrows; i++) + if (val.offcol) { + for (int i = 0; i < nrows; i++) array[i][j] = column[i]; } else { - for (i = 0; i < nrows; i++) + for (int i = 0; i < nrows; i++) array[i][j] += column[i]; } + ++j; } // done if irepeat < nrepeat @@ -840,38 +804,37 @@ void FixAveTime::invoke_vector(bigint ntimestep) // unlock any variable length computes at end of Nfreq epoch // do not unlock if ave = RUNNING or WINDOW - if (any_variable_length && nrepeat > 1 && ave == ONE) { - for (i = 0; i < nvalues; i++) { - if (!varlen[i]) continue; - Compute *compute = modify->compute[value2index[i]]; - compute->unlock(this); + if (any_variable_length && (nrepeat > 1) && (ave == ONE)) { + for (auto &val : values) { + if (!val.varlen) continue; + if ((val.which == ArgInfo::COMPUTE) && val.val.c) val.val.c->unlock(this); } } // average the final result for the Nfreq timestep double repeat = nrepeat; - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) - if (offcol[j] == 0) array[i][j] /= repeat; + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) + if (values[j].offcol == 0) array[i][j] /= repeat; // if ave = ONE, only single Nfreq timestep value is needed // if ave = RUNNING, combine with all previous Nfreq timestep values // if ave = WINDOW, combine with nwindow most recent Nfreq timestep values if (ave == ONE) { - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) array_total[i][j] = array[i][j]; + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) array_total[i][j] = array[i][j]; norm = 1; } else if (ave == RUNNING) { - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) array_total[i][j] += array[i][j]; + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) array_total[i][j] += array[i][j]; norm++; } else if (ave == WINDOW) { - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) { + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) { array_total[i][j] += array[i][j]; if (window_limit) array_total[i][j] -= array_list[iwindow][i][j]; array_list[iwindow][i][j] = array[i][j]; @@ -888,32 +851,32 @@ void FixAveTime::invoke_vector(bigint ntimestep) // insure any columns with offcol set are effectively set to last value - for (i = 0; i < nrows; i++) - for (j = 0; j < nvalues; j++) - if (offcol[j]) array_total[i][j] = norm*array[i][j]; + for (int i = 0; i < nrows; i++) + for (int j = 0; j < nvalues; j++) + if (values[j].offcol) array_total[i][j] = norm*array[i][j]; // output result to file - if (fp && me == 0) { + if (fp && comm->me == 0) { if (overwrite) platform::fseek(fp,filepos); if (yaml_flag) { if (!yaml_header || overwrite) { yaml_header = true; fputs("keywords: [", fp); - for (const auto &k : keyword) fmt::print(fp, "'{}', ", k); + for (const auto &val : values) fmt::print(fp, "'{}', ", val.keyword); fputs("]\ndata:\n", fp); } fmt::print(fp, " {}:\n", ntimestep); - for (i = 0; i < nrows; i++) { + for (int i = 0; i < nrows; i++) { fputs(" - [", fp); - for (j = 0; j < nvalues; j++) fmt::print(fp,"{}, ",array_total[i][j]/norm); + for (int j = 0; j < nvalues; j++) fmt::print(fp,"{}, ",array_total[i][j]/norm); fputs("]\n", fp); } } else { fmt::print(fp,"{} {}\n",ntimestep,nrows); - for (i = 0; i < nrows; i++) { + for (int i = 0; i < nrows; i++) { fprintf(fp,"%d",i+1); - for (j = 0; j < nvalues; j++) fprintf(fp,format,array_total[i][j]/norm); + for (int j = 0; j < nvalues; j++) fprintf(fp,format,array_total[i][j]/norm); fprintf(fp,"\n"); } } @@ -938,18 +901,16 @@ int FixAveTime::column_length(int dynamic) if (!dynamic) { length = 0; - for (int i = 0; i < nvalues; i++) { - if (varlen[i]) continue; - if (which[i] == ArgInfo::COMPUTE) { - int icompute = modify->find_compute(ids[i]); - if (argindex[i] == 0) - lengthone = modify->compute[icompute]->size_vector; - else lengthone = modify->compute[icompute]->size_array_rows; - } else if (which[i] == ArgInfo::FIX) { - int ifix = modify->find_fix(ids[i]); - if (argindex[i] == 0) lengthone = modify->fix[ifix]->size_vector; - else lengthone = modify->fix[ifix]->size_array_rows; - } else if (which[i] == ArgInfo::VARIABLE) { + for (auto &val : values) { + if (val.varlen) continue; + if (val.which == ArgInfo::COMPUTE) { + if (val.argindex == 0) + lengthone = val.val.c->size_vector; + else lengthone = val.val.c->size_array_rows; + } else if (val.which == ArgInfo::FIX) { + if (val.argindex == 0) lengthone = val.val.f->size_vector; + else lengthone = val.val.f->size_array_rows; + } else if (val.which == ArgInfo::VARIABLE) { // variables are always varlen = 1, so dynamic } if (length == 0) length = lengthone; @@ -965,15 +926,13 @@ int FixAveTime::column_length(int dynamic) if (dynamic) { length = 0; - for (int i = 0; i < nvalues; i++) { - if (varlen[i] == 0) continue; - m = value2index[i]; - if (which[i] == ArgInfo::COMPUTE) { - Compute *compute = modify->compute[m]; - lengthone = compute->lock_length(); - } else if (which[i] == ArgInfo::VARIABLE) { + for (auto &val : values) { + if (val.varlen == 0) continue; + if (val.which == ArgInfo::COMPUTE) { + lengthone = val.val.c->lock_length(); + } else if (val.which == ArgInfo::VARIABLE) { double *varvec; - lengthone = input->variable->compute_vector(m,&varvec); + lengthone = input->variable->compute_vector(val.val.v,&varvec); } if (mode == SCALAR) continue; if (all_variable_length) { @@ -1036,7 +995,7 @@ int FixAveTime::modify_param(int narg, char **arg) int icol = -1; if (utils::is_integer(arg[1])) { icol = utils::inumeric(FLERR, arg[1], false, lmp); - if (icol < 0) icol = keyword.size() + icol + 1; + if (icol < 0) icol = values.size() + icol + 1; icol--; } else { try { @@ -1045,9 +1004,9 @@ int FixAveTime::modify_param(int narg, char **arg) icol = -1; } } - if ((icol < 0) || (icol >= (int) keyword.size())) + if ((icol < 0) || (icol >= (int) values.size())) error->all(FLERR, "Thermo_modify colname column {} invalid", arg[1]); - keyword[icol] = arg[2]; + values[icol].keyword = arg[2]; return 3; } return 0; @@ -1081,7 +1040,7 @@ void FixAveTime::options(int iarg, int narg, char **arg) if (strcmp(arg[iarg],"file") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix ave/time command"); yaml_flag = utils::strmatch(arg[iarg+1],"\\.[yY][aA]?[mM][lL]$"); - if (me == 0) { + if (comm->me == 0) { fp = fopen(arg[iarg+1],"w"); if (fp == nullptr) error->one(FLERR,"Cannot open fix ave/time file {}: {}", @@ -1140,7 +1099,7 @@ void FixAveTime::options(int iarg, int narg, char **arg) delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; - } else error->all(FLERR,"Illegal fix ave/time command"); + } else error->all(FLERR,"Unknown fix ave/time command option {}", arg[iarg]); } } diff --git a/src/fix_ave_time.h b/src/fix_ave_time.h index 55df82c1f7..9bc46a0b4f 100644 --- a/src/fix_ave_time.h +++ b/src/fix_ave_time.h @@ -40,12 +40,24 @@ class FixAveTime : public Fix { double compute_array(int, int) override; private: - int me, nvalues; - int nrepeat, nfreq, irepeat; + struct value_t { + int which; // type of data: COMPUTE, FIX, VARIABLE + int argindex; // 1-based index if data is vector, else 0 + int varlen; // 1 if value is from variable-length compute + int offcol; + std::string id; // compute/fix/variable ID + std::string keyword; // column keyword in output + union { + class Compute *c; + class Fix *f; + int v; + } val; + }; + std::vector values; + + int nvalues, nrepeat, nfreq, irepeat; bigint nvalid, nvalid_last; - int *which, *argindex, *value2index, *offcol; - int *varlen; // 1 if value is from variable-length compute - char **ids; + FILE *fp; int nrows; int any_variable_length; @@ -61,7 +73,6 @@ class FixAveTime : public Fix { bigint filepos; std::map key2col; - std::vector keyword; int norm, iwindow, window_limit; double *vector; @@ -79,8 +90,6 @@ class FixAveTime : public Fix { void allocate_arrays(); bigint nextvalid(); }; - } // namespace LAMMPS_NS - #endif #endif From c5c21bb36c552c9cb07fa5a0ee1a3cfc30d46769 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sun, 2 Oct 2022 15:28:10 -0500 Subject: [PATCH 285/364] Implemented, tested, and documented gather_atoms and variants; added RST docs for lammps_scatter_atoms and lammps_gather_atoms and variants (library.cpp); checked for missing atom map in lammps_gather_atoms_subset; fixed bug in keepstuff.f90; fixed docs for extract_variable --- doc/src/Fortran.rst | 90 ++++++- fortran/lammps.f90 | 237 +++++++++++++++++- src/library.cpp | 221 +++++++++++----- unittest/fortran/CMakeLists.txt | 4 + unittest/fortran/keepstuff.f90 | 14 +- .../fortran/test_fortran_extract_atom.f90 | 42 +--- .../fortran/test_fortran_extract_compute.f90 | 43 +--- .../fortran/test_fortran_gather_scatter.f90 | 143 +++++++++++ unittest/fortran/wrap_gather_scatter.cpp | 140 +++++++++++ 9 files changed, 796 insertions(+), 138 deletions(-) create mode 100644 unittest/fortran/test_fortran_gather_scatter.f90 create mode 100644 unittest/fortran/wrap_gather_scatter.cpp diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index c17c39db72..12056df995 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -1070,11 +1070,13 @@ Procedures Bound to the lammps Derived Type data (if absent, use "all") :r polymorphic: scalar of type ``REAL(c_double)`` (for *equal*-style variables and others that are *equal*-compatible), vector of type - ``REAL(c_double), DIMENSION(nlocal)`` for *atom*-style variables, or - ``CHARACTER(LEN=*)`` for *string*-style and compatible variables. Strings - whose length is too short to hold the result will be truncated. - Allocatable strings must be allocated before this function is called; - see note at :f:func:`extract_global` regarding allocatable strings. + ``REAL(c_double), DIMENSION(:), ALLOCATABLE`` for *atom*- or *vector*-style + variables, or ``CHARACTER(LEN=*)`` for *string*-style and compatible + variables. Strings whose length is too short to hold the result will be + truncated. Allocatable strings must be allocated before this function is + called; see note at :f:func:`extract_global` regarding allocatable strings. + Allocatable arrays (for *atom*- and *vector*-style data) will be + reallocated on assignment. .. note:: @@ -1086,6 +1088,84 @@ Procedures Bound to the lammps Derived Type -------- +.. f:function:: gather_atoms(name, count, data) + + This function calls :c:func:`lammps_gather_atoms` to gather the named + atom-based entity for all atoms on all processors and return it in the + vector *data*. The vector *data* will be ordered by atom + ID, which requires consecutive atom IDs (1 to *natoms*). + + .. versionadded:: TBD + + If you need a similar array but have non-consecutive atom IDs, see + :f:func:`gather_atoms_concat`; for a similar array but for a subset + of atoms, see :f:func:`gather_atoms_subset`. + + The *data* array will be ordered in groups of *count* values, sorted by atom + ID (e.g., if *name* is *x* and *count* = 3, then *data* = x[1][1], x[2][1], + x[3][1], x[1][2], x[2][2], x[3][2], x[1][3], :math:`\dots`); + *data* must be ``ALLOCATABLE`` and will be allocated to length + (*count* :math:`\times` *natoms*), as queried by + :f:func:`extract_setting`. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + + .. note:: + + If you want data from this function to be accessible as a two-dimensional + array, you can declare a rank-2 pointer and reassign it, like so: + + .. code-block:: Fortran + + USE, INTRINSIC :: ISO_C_BINDING + USE LIBLAMMPS + TYPE(lammps) :: lmp + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET :: xdata + REAL(c_double), DIMENSION(:,:), POINTER :: x + ! other code to set up, etc. + CALL lmp%gather_atoms('x',3,xdata) + x(1:3,1:size(xdata)/3) => xdata + + You can then access the *y*\ -component of atom 3 with ``x(2,3)``. + +-------- + +.. f:function:: gather_atoms_concat(name, count, data) + + This function calls :c:func:`lammps_gather_atoms_concat` to gather the named + atom-based entity for all atoms on all processors and return it in the + vector *data*. + + .. versionadded:: TBD + + The vector *data* will not be ordered by atom ID, and there is no + restriction on the IDs being consecutive. If you need the IDs, you can do + another :f:func:`gather_atoms_concat` with *name* set to ``id``. + + If you need a similar array but have consecutive atom IDs, see + :f:func:`gather_atoms`; for a similar array but for a subset of atoms, see + :f:func:`gather_atoms_subset`. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 0ec58c7914..ad90d45aa4 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -29,9 +29,9 @@ ! MODULE LIBLAMMPS - USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, c_associated, & - c_loc, c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, & - c_f_pointer + USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_ptr, c_null_ptr, C_ASSOCIATED, & + C_LOC, c_int, c_int64_t, c_char, c_null_char, c_double, c_size_t, & + C_F_POINTER IMPLICIT NONE PRIVATE @@ -103,6 +103,17 @@ MODULE LIBLAMMPS PROCEDURE :: extract_fix => lmp_extract_fix PROCEDURE :: extract_variable => lmp_extract_variable PROCEDURE :: set_variable => lmp_set_variable + PROCEDURE, PRIVATE :: lmp_gather_atoms_int, lmp_gather_atoms_double + GENERIC :: gather_atoms => lmp_gather_atoms_int, & + lmp_gather_atoms_double + PROCEDURE, PRIVATE :: lmp_gather_atoms_concat_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_concat_double + GENERIC :: gather_atoms_concat => lmp_gather_atoms_concat_int, & + lmp_gather_atoms_concat_double + PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_double + GENERIC :: gather_atoms_subset => lmp_gather_atoms_subset_int, & + lmp_gather_atoms_subset_double ! PROCEDURE :: version => lmp_version PROCEDURE,NOPASS :: get_os_info => lmp_get_os_info @@ -394,11 +405,28 @@ MODULE LIBLAMMPS INTEGER(c_int) :: lammps_set_variable END FUNCTION lammps_set_variable - !SUBROUTINE lammps_gather_atoms + SUBROUTINE lammps_gather_atoms(handle, name, type, count, data) BIND(C) + IMPORT :: c_int, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_gather_atoms - !SUBROUTINE lammps_gather_atoms_concat + SUBROUTINE lammps_gather_atoms_concat(handle, name, type, count, data) & + BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_gather_atoms_concat - !SUBROUTINE lammps_gather_atoms_subset + SUBROUTINE lammps_gather_atoms_subset(handle, name, type, count, ndata, & + ids, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, ids, data + INTEGER(c_int), VALUE :: type, count, ndata + END SUBROUTINE lammps_gather_atoms_subset !SUBROUTINE lammps_scatter_atoms @@ -1175,6 +1203,203 @@ CONTAINS END IF END SUBROUTINE lmp_set_variable + ! equivalent function to lammps_gather_atoms (for integers) + SUBROUTINE lmp_gather_atoms_int(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + REAL(C_double) :: dnatoms + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_int + + ! equivalent function to lammps_gather_atoms (for doubles) + SUBROUTINE lmp_gather_atoms_double(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + REAL(C_double) :: dnatoms + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_double + + ! equivalent function to lammps_gather_atoms_concat (for integers) + SUBROUTINE lmp_gather_atoms_concat_int(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + REAL(C_double) :: dnatoms + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_concat requires "count" to be 1 or 3 & + &[Fortran/gather_atoms_concat]') + END IF + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms_concat with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_concat_int + + ! equivalent function to lammps_gather_atoms_concat (for doubles) + SUBROUTINE lmp_gather_atoms_concat_double(self, name, count, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + TYPE(c_ptr) :: Cdata, Cname + INTEGER(c_int) :: natoms + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + REAL(C_double) :: dnatoms + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_concat requires "count" to be 1 or 3 & + &[Fortran/gather_atoms_concat]') + END IF + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function gather_atoms_concat with more than', & + HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(natoms*count)) + Cdata = C_LOC(data(1)) + CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_concat_double + + ! equivalent function to lammps_gather_atoms_subset (for integers) + SUBROUTINE lmp_gather_atoms_subset_int(self, name, count, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids + INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: ndata + TYPE(c_ptr) :: Cdata, Cname, Cids + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + ndata = SIZE(ids, KIND=c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(ndata*count)) + data = -1_c_int + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_gather_atoms_subset(self%handle, Cname, Ctype, count, & + ndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_subset_int + + ! equivalent function to lammps_gather_atoms_subset (for doubles) + SUBROUTINE lmp_gather_atoms_subset_double(self, name, count, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), INTENT(IN) :: count + INTEGER(c_int), DIMENSION(:), TARGET, INTENT(IN) :: ids + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data + INTEGER(c_int) :: ndata + TYPE(c_ptr) :: Cdata, Cname, Cids + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + CHARACTER(LEN=80) :: error_msg + + IF ( count /= 1 .AND. count /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& + & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + END IF + + ndata = SIZE(ids, KIND=c_int) + + Cname = f2c_string(name) + IF ( ALLOCATED(data) ) DEALLOCATE(data) + ALLOCATE(data(ndata*count)) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids(1)) + CALL lammps_gather_atoms_subset(self%handle, Cname, Ctype, count, & + ndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_gather_atoms_subset_double + ! equivalent function to lammps_version INTEGER FUNCTION lmp_version(self) CLASS(lammps), INTENT(IN) :: self diff --git a/src/library.cpp b/src/library.cpp index 1e0c438984..0851980207 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2222,21 +2222,38 @@ int lammps_set_variable(void *handle, char *name, char *str) // Library functions for scatter/gather operations of data // ---------------------------------------------------------------------- +/** Gather the named atom-based entity for all atoms across all processors, + * in order. + * +\verbatim embed:rst + +This subroutine gathers data for all atoms and stores them in a +one-dimensional array allocated by the user. The data will be ordered by +atom ID, which requires consecutive atom IDs (1 to *natoms*\ ). If you need +a similar array but have non-consecutive atom IDs, see +:cpp:func:`lammps_gather_atoms_concat`; for a similar array but for a subset +of atoms, see :cpp:func:`lammps_gather_atoms_subset`. + +The *data* array will be ordered in groups of *count* values, sorted by atom ID +(e.g., if *name* is *x* and *count* = 3, then *data* = x[0][0], x[0][1], +x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], :math:`\dots`); +*data* must be pre-allocated by the caller to length (*count* :math:`\times` +*natoms*), as queried by :cpp:func:`lammps_get_natoms`, +:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance + * \param name desired quantity (e.g., *x* or *charge*) + * \param type 0 for ``int`` values, 1 for ``double`` values + * \param count number of per-atom values (e.g., 1 for *type* or *charge*, + * 3 for *x* or *f*); use *count* = 3 with *image* if you want + * a single image flag unpacked into (*x*,*y*,*z*) components. + * \param data per-atom values packed in a 1-dimensional array of length + * *natoms* \* *count*. + * + */ /* ---------------------------------------------------------------------- - gather the named atom-based entity for all atoms - return it in user-allocated data - data will be ordered by atom ID - requirement for consecutive atom IDs (1 to N) - see gather_atoms_concat() to return data for all atoms, unordered - see gather_atoms_subset() to return data for only a subset of atoms - name = desired quantity (e.g., x or charge) - type = 0 for integer values, 1 for double values - count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) - use count = 3 with "image" if want single image flag unpacked into xyz - return atom-based values in 1d data, ordered by count, then by atom ID - (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...); - data must be pre-allocated by caller to correct length - correct length = count*Natoms, as queried by get_natoms() method: alloc and zero count*Natom length vector loop over Nlocal to fill vector with my values @@ -2357,23 +2374,43 @@ void lammps_gather_atoms(void *handle, char *name, int type, int count, void *da END_CAPTURE } +/** Gather the named atom-based entity for all atoms across all processors, + * unordered. + * +\verbatim embed:rst + +This subroutine gathers data for all atoms and stores them in a +one-dimensional array allocated by the user. The data will be a concatenation +of chunks from each processor's owned atoms, in whatever order the atoms are +in on each processor. This process has no requirement that the atom IDs be +consecutive. If you need the ID of each atom, you can do another +:cpp:func:`lammps_gather_atoms_concat` call with *name* set to ``id``. +If you have consecutive IDs and want the data to be in order, use +:cpp:func:`lammps_gather_atoms`; for a similar array but for a subset +of atoms, use :cpp:func:`lammps_gather_atoms_subset`. + +The *data* array will be in groups of *count* values, with *natoms* +groups total, but not in order by atom ID (e.g., if *name* is *x* and *count* +is 3, then *data* might be something like = x[10][0], x[10][1], x[10][2], +x[2][0], x[2][1], x[2][2], x[4][0], :math:`\dots`); *data* must be +pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as +queried by :cpp:func:`lammps_get_natoms`, +:cpp:func:`lammps_extract_global`, or :cpp:func:`lammps_extract_setting`. + +\endverbatim + * + * \param handle: pointer to a previously created LAMMPS instance + * \param name: desired quantity (e.g., *x* or *charge*\ ) + * \param type: 0 for ``int`` values, 1 for ``double`` values + * \param count: number of per-atom values (e.g., 1 for *type* or *charge*, + * 3 for *x* or *f*); use *count* = 3 with "image" if you want + * single image flags unpacked into (*x*,*y*,*z*) + * \param data: per-atom values packed in a 1-dimensional array of length + * *natoms* \* *count*. + * + */ + /* ---------------------------------------------------------------------- - gather the named atom-based entity for all atoms - return it in user-allocated data - data will be a concatenation of chunks of each proc's atoms, - in whatever order the atoms are on each proc - no requirement for consecutive atom IDs (1 to N) - can do a gather_atoms_concat for "id" if need to know atom IDs - see gather_atoms() to return data ordered by consecutive atom IDs - see gather_atoms_subset() to return data for only a subset of atoms - name = desired quantity (e.g., x or charge) - type = 0 for integer values, 1 for double values - count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) - use count = 3 with "image" if want single image flag unpacked into xyz - return atom-based values in 1d data, ordered by count, then by atom - (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) - data must be pre-allocated by caller to correct length - correct length = count*Natoms, as queried by get_natoms() method: Allgather Nlocal atoms from each proc into data ------------------------------------------------------------------------- */ @@ -2503,23 +2540,38 @@ void lammps_gather_atoms_concat(void *handle, char *name, int type, int count, v END_CAPTURE } +/** Gather the named atom-based entity for a subset of atoms. + * +\verbatim embed:rst + +This subroutine gathers data for the requested atom IDs and stores them in a +one-dimensional array allocated by the user. The data will be ordered by atom +ID, but there is no requirement that the IDs be consecutive. If you wish to +return a similar array for *all* the atoms, use :cpp:func:`lammps_gather_atoms` +or :cpp:func:`lammps_gather_atoms_concat`. + +The *data* array will be in groups of *count* values, sorted by atom ID +(e.g., if *name* is *x* and *count* = 3, then *data* might look like +x[100][0], x[100][1], x[100][2], x[101][0], x[101][1], x[101][2], x[102][0], +:math:`\dots`); *data* must be pre-allocated by the caller to length (*count* +:math:`\times` *ndata*). + +\endverbatim + * + * \param handle: pointer to a previously created LAMMPS instance + * \param name: desired quantity (e.g., *x* or *charge*) + * \param type: 0 for ``int`` values, 1 for ``double`` values + * \param count: number of per-atom values (e.g., 1 for *type* or *charge*, + * 3 for *x* or *f*); use *count* = 3 with "image" if you want + * single image flags unpacked into (*x*,*y*,*z*) + * \param ndata: number of atoms for which to return data (can be all of them) + * \param ids: list of *ndata* atom IDs for which to return data + * \param data: per-atom values packed in a 1-dimensional array of length + * *ndata* \* *count*. + * + */ + /* ---------------------------------------------------------------------- - gather the named atom-based entity for a subset of atoms - return it in user-allocated data - data will be ordered by requested atom IDs - no requirement for consecutive atom IDs (1 to N) - see gather_atoms() to return data for all atoms, ordered by consecutive IDs - see gather_atoms_concat() to return data for all atoms, unordered - name = desired quantity (e.g., x or charge) - type = 0 for integer values, 1 for double values - count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) - use count = 3 with "image" if want single image flag unpacked into xyz - ndata = # of atoms to return data for (could be all atoms) - ids = list of Ndata atom IDs to return data for - return atom-based values in 1d data, ordered by count, then by atom - (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) - data must be pre-allocated by caller to correct length - correct length = count*Ndata method: alloc and zero count*Ndata length vector loop over Ndata to fill vector with my values @@ -2540,12 +2592,13 @@ void lammps_gather_atoms_subset(void *handle, char *name, int type, int count, int i,j,m,offset; tagint id; - // error if tags are not defined + // error if tags are not defined or no atom map // NOTE: test that name = image or ids is not a 64-bit int in code? int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; + if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; if (flag) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"Library error in lammps_gather_atoms_subset"); @@ -2649,18 +2702,35 @@ void lammps_gather_atoms_subset(void *handle, char *name, int type, int count, END_CAPTURE } +/** Scatter the named atom-based entities in *data* to all processors. + * +\verbatim embed:rst + +This subroutine takes data stored in a one-dimensional array supplied by the +user and scatters them to all atoms on all processors. The data must be +ordered by atom ID, with the requirement that the IDs be consecutive. +Use :cpp:func:`lammps_scatter_atoms_subset` to scatter data for some (or all) +atoms, unordered. + +The *data* array needs to be ordered in groups of *count* values, sorted by +atom ID (e.g., if *name* is *x* and *count* = 3, then +*data* = x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], +:math:`\dots`); *data* must be of length (*count* :math:`\times` *natoms*). + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance + * \param name desired quantity (e.g., *x* or *charge*) + * \param type 0 for ``int`` values, 1 for ``double`` values + * \param count number of per-atom values (e.g., 1 for *type* or *charge*, + * 3 for *x* or *f*); use *count* = 3 with *image* if you have + * a single image flag packed into (*x*,*y*,*z*) components. + * \param data per-atom values packed in a 1-dimensional array of length + * *natoms* \* *count*. + * + */ + /* ---------------------------------------------------------------------- - scatter the named atom-based entity in data to all atoms - data is ordered by atom ID - requirement for consecutive atom IDs (1 to N) - see scatter_atoms_subset() to scatter data for some (or all) atoms, unordered - name = desired quantity (e.g., x or charge) - type = 0 for integer values, 1 for double values - count = # of per-atom values (e.g., 1 for type or charge, 3 for x or f) - use count = 3 with "image" for xyz to be packed into single image flag - data = atom-based values in 1d data, ordered by count, then by atom ID - (e.g., x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],x[2][0],...) - data must be correct length = count*Natoms, as queried by get_natoms() method: loop over Natoms, if I own atom ID, set its values from data ------------------------------------------------------------------------- */ @@ -2765,6 +2835,38 @@ void lammps_scatter_atoms(void *handle, char *name, int type, int count, void *d END_CAPTURE } +/** Scatter the named atom-based entities in *data* from a subset of atoms + * to all processors. + * +\verbatim embed:rst + +This subroutine takes data stored in a one-dimensional array supplied by the +user and scatters them to a subset of atoms on all processors. The array +*data* contains data associated with atom IDs, but there is no requirement that +the IDs be consecutive, as they are provided in a separate array. +Use :cpp:func:`lammps_scatter_atoms` to scatter data for all atoms, in order. + +The *data* array needs to be organized in groups of *count* values, with the +groups in the same order as the array *ids*. For example, if you want *data* +to be the array {x[1][0], x[1][1], x[1][2], x[100][0], x[100][1], x[100][2], +x[57][0], x[57][1], x[57][2]}, then *count* = 3, *ndata* = 3, and *ids* would +be {1, 100, 57}. + +\endverbatim + * + * \param handle: pointer to a previously created LAMMPS instance + * \param name: desired quantity (e.g., *x* or *charge*) + * \param type: 0 for ``int`` values, 1 for ``double`` values + * \param count: number of per-atom values (e.g., 1 for *type* or *charge*, + * 3 for *x* or *f*); use *count* = 3 with "image" if you have + * all the image flags packed into (*xyz*) + * \param ndata: number of atoms listed in *ids* and *data* arrays + * \param ids: list of *ndata* atom IDs to scatter data to + * \param data per-atom values packed in a 1-dimensional array of length + * *ndata* \* *count*. + * + */ + /* ---------------------------------------------------------------------- scatter the named atom-based entity in data to a subset of atoms data is ordered by provided atom IDs @@ -3528,11 +3630,12 @@ void lammps_gather_subset(void *handle, char *name, int i,j,m,offset,ltype; tagint id; - // error if tags are not defined or not consecutive + // error if tags are not defined or no atom map int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; + if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; if (flag) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"Library error in lammps_gather_subset"); diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index 0c813573f5..d3c18c9941 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -74,6 +74,10 @@ if(CMAKE_Fortran_COMPILER) target_link_libraries(test_fortran_extract_variable PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) add_test(NAME FortranExtractVariable COMMAND test_fortran_extract_variable) + add_executable(test_fortran_gather_scatter wrap_gather_scatter.cpp test_fortran_gather_scatter.f90) + target_link_libraries(test_fortran_gather_scatter PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + add_test(NAME FortranGatherScatter COMMAND test_fortran_gather_scatter) + else() message(STATUS "Skipping Tests for the LAMMPS Fortran Module: no Fortran compiler") endif() diff --git a/unittest/fortran/keepstuff.f90 b/unittest/fortran/keepstuff.f90 index e0e0725c69..6838d78955 100644 --- a/unittest/fortran/keepstuff.f90 +++ b/unittest/fortran/keepstuff.f90 @@ -3,24 +3,26 @@ MODULE keepstuff IMPLICIT NONE TYPE(LAMMPS) :: lmp INTEGER :: mycomm - CHARACTER(len=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & + CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & + [ CHARACTER(LEN=40) :: & 'region box block 0 $x 0 2 0 2', & 'create_box 1 box', & 'create_atoms 1 single 1.0 1.0 ${zpos}' ] CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: big_input = & - [ CHARACTER(len=40) :: & + [ CHARACTER(LEN=40) :: & 'region box block 0 $x 0 3 0 4', & 'create_box 1 box', & 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(len=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & + CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & + [ CHARACTER(LEN=40) :: & 'create_atoms 1 single &', & ' 0.2 0.1 0.1' ] + CHARACTER(LEN=40), DIMENSION(1), PARAMETER :: more_input = & + [ CHARACTER(LEN=40) :: 'create_atoms 1 single 0.5 0.5 0.5' ] CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & [ CHARACTER(LEN=40) :: & 'pair_style lj/cut 2.5', & 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 1.0' ] + 'mass 1 2.0' ] END MODULE keepstuff diff --git a/unittest/fortran/test_fortran_extract_atom.f90 b/unittest/fortran/test_fortran_extract_atom.f90 index 5f899f80e0..eb55754561 100644 --- a/unittest/fortran/test_fortran_extract_atom.f90 +++ b/unittest/fortran/test_fortran_extract_atom.f90 @@ -1,26 +1,7 @@ -MODULE keepatom - USE liblammps - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(2), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 2.0' ] -END MODULE keepatom - FUNCTION f_lammps_with_args() BIND(C, name="f_lammps_with_args") USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepatom, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & @@ -34,7 +15,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepatom, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -43,19 +24,18 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_atom () BIND(C) USE LIBLAMMPS - USE keepatom, ONLY : lmp, demo_input, cont_input, pair_input + USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) CALL lmp%commands_list(pair_input) -! CALL lmp%command('run 0') END SUBROUTINE f_lammps_setup_extract_atom FUNCTION f_lammps_extract_atom_mass () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(C_double) :: f_lammps_extract_atom_mass REAL(C_double), DIMENSION(:), POINTER :: mass => NULL() @@ -67,7 +47,7 @@ END FUNCTION f_lammps_extract_atom_mass FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_tag_int @@ -80,7 +60,7 @@ END FUNCTION f_lammps_extract_atom_tag_int FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int64_t), INTENT(IN), VALUE :: i INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 @@ -93,7 +73,7 @@ END FUNCTION f_lammps_extract_atom_tag_int64 FUNCTION f_lammps_extract_atom_type(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_type @@ -106,7 +86,7 @@ END FUNCTION f_lammps_extract_atom_type FUNCTION f_lammps_extract_atom_mask(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i INTEGER(C_int) :: f_lammps_extract_atom_mask @@ -119,7 +99,7 @@ END FUNCTION f_lammps_extract_atom_mask SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double), DIMENSION(3) :: x @@ -132,7 +112,7 @@ END SUBROUTINE f_lammps_extract_atom_x SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepatom, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double), DIMENSION(3) :: v diff --git a/unittest/fortran/test_fortran_extract_compute.f90 b/unittest/fortran/test_fortran_extract_compute.f90 index 64b5068171..8f5bbdfd51 100644 --- a/unittest/fortran/test_fortran_extract_compute.f90 +++ b/unittest/fortran/test_fortran_extract_compute.f90 @@ -1,27 +1,7 @@ -MODULE keepcompute - USE liblammps - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(len=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & - [ CHARACTER(len=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1', & - 'create_atoms 1 single 0.5 0.5 0.5' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 2.0' ] -END MODULE keepcompute - FUNCTION f_lammps_with_args() BIND(C) USE ISO_C_BINDING, ONLY: c_ptr USE liblammps - USE keepcompute, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(c_ptr) :: f_lammps_with_args CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & @@ -35,7 +15,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepcompute, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -44,11 +24,12 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_compute () BIND(C) USE LIBLAMMPS - USE keepcompute, ONLY : lmp, demo_input, cont_input, pair_input + USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input IMPLICIT NONE - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(more_input) CALL lmp%commands_list(pair_input) CALL lmp%command("compute peratompe all pe/atom") ! per-atom vector call lmp%command("compute stress all stress/atom thermo_temp") ! per-atom array @@ -64,7 +45,7 @@ END SUBROUTINE f_lammps_setup_extract_compute FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double) :: f_lammps_extract_compute_peratom_vector @@ -77,7 +58,7 @@ END FUNCTION f_lammps_extract_compute_peratom_vector FUNCTION f_lammps_extract_compute_peratom_array (i,j) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i, j REAL(C_double) :: f_lammps_extract_compute_peratom_array @@ -90,7 +71,7 @@ END FUNCTION f_lammps_extract_compute_peratom_array FUNCTION f_lammps_extract_compute_global_scalar () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(C_double) :: f_lammps_extract_compute_global_scalar REAL(C_double), POINTER :: scalar @@ -102,7 +83,7 @@ END FUNCTION f_lammps_extract_compute_global_scalar FUNCTION f_lammps_extract_compute_global_vector (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(C_double) :: f_lammps_extract_compute_global_vector @@ -115,7 +96,7 @@ END FUNCTION f_lammps_extract_compute_global_vector FUNCTION f_lammps_extract_compute_global_array (i,j) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i, j REAL(C_double) :: f_lammps_extract_compute_global_array @@ -128,7 +109,7 @@ END FUNCTION f_lammps_extract_compute_global_array FUNCTION f_lammps_extract_compute_local_vector (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(C_double) :: f_lammps_extract_compute_local_vector @@ -141,7 +122,7 @@ END FUNCTION f_lammps_extract_compute_local_vector FUNCTION f_lammps_extract_compute_local_array (i, j) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepcompute, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i, j REAL(C_double) :: f_lammps_extract_compute_local_array diff --git a/unittest/fortran/test_fortran_gather_scatter.f90 b/unittest/fortran/test_fortran_gather_scatter.f90 new file mode 100644 index 0000000000..86870721ba --- /dev/null +++ b/unittest/fortran/test_fortran_gather_scatter.f90 @@ -0,0 +1,143 @@ +FUNCTION f_lammps_with_args() BIND(C) + USE ISO_C_BINDING, ONLY: c_ptr + USE LIBLAMMPS + USE keepstuff, ONLY: lmp + IMPLICIT NONE + TYPE(c_ptr) :: f_lammps_with_args + CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & + [ CHARACTER(len=12) :: 'liblammps', '-log', 'none', & + '-echo','screen','-nocite','-var','zpos','1.5','-var','x','2'] + + lmp = lammps(args) + f_lammps_with_args = lmp%handle +END FUNCTION f_lammps_with_args + +SUBROUTINE f_lammps_close() BIND(C) + USE ISO_C_BINDING, ONLY: c_null_ptr + USE liblammps + USE keepstuff, ONLY: lmp + IMPLICIT NONE + + CALL lmp%close() + lmp%handle = c_null_ptr +END SUBROUTINE f_lammps_close + +SUBROUTINE f_lammps_setup_gather_scatter () BIND(C) + USE LIBLAMMPS + USE keepstuff, ONLY : lmp, big_input, cont_input, more_input + IMPLICIT NONE + + CALL lmp%command('atom_modify map array') + CALL lmp%commands_list(big_input) + CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(more_input) +END SUBROUTINE f_lammps_setup_gather_scatter + +FUNCTION f_lammps_gather_mask (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_gather_mask + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask + + CALL lmp%gather_atoms('mask', 1_c_int, mask) + f_lammps_gather_mask = mask(i) +END FUNCTION f_lammps_gather_mask + +FUNCTION f_lammps_gather_position (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_gather_position + REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions + + CALL lmp%gather_atoms('x', 3_c_int, positions) + f_lammps_gather_position = positions(i) +END FUNCTION f_lammps_gather_position + +FUNCTION f_lammps_gather_concat_mask (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_gather_concat_mask + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask, tag + INTEGER :: j + + CALL lmp%gather_atoms_concat('mask', 1_c_int, mask) + CALL lmp%gather_atoms_concat('id', 1_c_int, tag) + DO j = 1, SIZE(tag) + IF ( tag(j) == i ) THEN + f_lammps_gather_concat_mask = mask(j) + RETURN + END IF + END DO + f_lammps_gather_concat_mask = -1 +END FUNCTION f_lammps_gather_concat_mask + +FUNCTION f_lammps_gather_concat_position (xyz, id) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: id, xyz + REAL(c_double) :: f_lammps_gather_concat_position + REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: tag + INTEGER :: j + + CALL lmp%gather_atoms_concat('x', 3_c_int, positions) + CALL lmp%gather_atoms_concat('id', 1_c_int, tag) + DO j = 1, SIZE(tag) + IF ( tag(j) == id ) THEN + f_lammps_gather_concat_position = positions((j-1)*3 + xyz) + END IF + END DO +END FUNCTION f_lammps_gather_concat_position + +FUNCTION f_lammps_gather_subset_mask (i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_gather_subset_mask + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask + INTEGER :: j + INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2] + + CALL lmp%gather_atoms_subset('mask', 1_c_int, tag, mask) + DO j = 1, SIZE(tag) + IF ( tag(j) == i ) THEN + f_lammps_gather_subset_mask = mask(j) + RETURN + END IF + END DO + f_lammps_gather_subset_mask = -1 +END FUNCTION f_lammps_gather_subset_mask + +FUNCTION f_lammps_gather_subset_position (xyz,id) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), INTENT(IN), VALUE :: id, xyz + REAL(c_double) :: f_lammps_gather_subset_position + REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions + INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2] + INTEGER :: j + + CALL lmp%gather_atoms_subset('x', 3_c_int, tag, positions) + DO j = 1, SIZE(tag) + IF ( tag(j) == id ) THEN + f_lammps_gather_subset_position = positions((j-1)*3 + xyz) + RETURN + END IF + END DO + f_lammps_gather_subset_position = -1.0D0 +END FUNCTION f_lammps_gather_subset_position diff --git a/unittest/fortran/wrap_gather_scatter.cpp b/unittest/fortran/wrap_gather_scatter.cpp new file mode 100644 index 0000000000..4fd733a167 --- /dev/null +++ b/unittest/fortran/wrap_gather_scatter.cpp @@ -0,0 +1,140 @@ +// unit tests for gathering and scattering data from a LAMMPS instance through +// the Fortran wrapper + +#include "lammps.h" +#include "library.h" +#include +#include +#include +#include + +#include "gtest/gtest.h" + +// prototypes for Fortran reverse wrapper functions +extern "C" { +void *f_lammps_with_args(); +void f_lammps_close(); +void f_lammps_setup_gather_scatter(); +int f_lammps_gather_mask(int); +double f_lammps_gather_position(int); +int f_lammps_gather_concat_mask(int); +double f_lammps_gather_concat_position(int,int); +int f_lammps_gather_subset_mask(int); +double f_lammps_gather_subset_position(int,int); +} + +class LAMMPS_gather_scatter : public ::testing::Test { +protected: + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_gather_scatter() = default; + ~LAMMPS_gather_scatter() override = default; + + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } +}; + +TEST_F(LAMMPS_gather_scatter, gather_masks) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_mask(1), 1); + EXPECT_EQ(f_lammps_gather_mask(2), 1); + EXPECT_EQ(f_lammps_gather_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_mask(1), 3); + EXPECT_EQ(f_lammps_gather_mask(2), 5); + EXPECT_EQ(f_lammps_gather_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_mask(1), 7); + EXPECT_EQ(f_lammps_gather_mask(2), 5); + EXPECT_EQ(f_lammps_gather_mask(3), 9); +}; + +TEST_F(LAMMPS_gather_scatter, gather_positions) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_position(1), 1.0); + EXPECT_EQ(f_lammps_gather_position(2), 1.0); + EXPECT_EQ(f_lammps_gather_position(3), 1.5); + EXPECT_EQ(f_lammps_gather_position(4), 0.2); + EXPECT_EQ(f_lammps_gather_position(5), 0.1); + EXPECT_EQ(f_lammps_gather_position(6), 0.1); + EXPECT_EQ(f_lammps_gather_position(7), 0.5); + EXPECT_EQ(f_lammps_gather_position(8), 0.5); + EXPECT_EQ(f_lammps_gather_position(9), 0.5); +}; + +TEST_F(LAMMPS_gather_scatter, gather_masks_concat) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_concat_mask(1), 1); + EXPECT_EQ(f_lammps_gather_concat_mask(2), 1); + EXPECT_EQ(f_lammps_gather_concat_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_concat_mask(1), 3); + EXPECT_EQ(f_lammps_gather_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_concat_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_concat_mask(1), 7); + EXPECT_EQ(f_lammps_gather_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_concat_mask(3), 9); +}; + +TEST_F(LAMMPS_gather_scatter, gather_positions_concat) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_concat_position(1,1), 1.0); + EXPECT_EQ(f_lammps_gather_concat_position(2,1), 1.0); + EXPECT_EQ(f_lammps_gather_concat_position(3,1), 1.5); + EXPECT_EQ(f_lammps_gather_concat_position(1,2), 0.2); + EXPECT_EQ(f_lammps_gather_concat_position(2,2), 0.1); + EXPECT_EQ(f_lammps_gather_concat_position(3,2), 0.1); + EXPECT_EQ(f_lammps_gather_concat_position(1,3), 0.5); + EXPECT_EQ(f_lammps_gather_concat_position(2,3), 0.5); + EXPECT_EQ(f_lammps_gather_concat_position(3,3), 0.5); +}; + +TEST_F(LAMMPS_gather_scatter, gather_masks_subset) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_subset_mask(2), 1); + EXPECT_EQ(f_lammps_gather_subset_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_subset_mask(2), 5); + EXPECT_EQ(f_lammps_gather_subset_mask(3), 9); + lammps_command(lmp, "group other id 3"); + EXPECT_EQ(f_lammps_gather_subset_mask(2), 5); + EXPECT_EQ(f_lammps_gather_subset_mask(3), 13); +}; + +TEST_F(LAMMPS_gather_scatter, gather_positions_subset) +{ + f_lammps_setup_gather_scatter(); +// EXPECT_EQ(f_lammps_gather_subset_position(1,1), 1.0); +// EXPECT_EQ(f_lammps_gather_subset_position(2,1), 1.0); +// EXPECT_EQ(f_lammps_gather_subset_position(3,1), 1.5); + EXPECT_EQ(f_lammps_gather_subset_position(1,2), 0.2); + EXPECT_EQ(f_lammps_gather_subset_position(2,2), 0.1); + EXPECT_EQ(f_lammps_gather_subset_position(3,2), 0.1); + EXPECT_EQ(f_lammps_gather_subset_position(1,3), 0.5); + EXPECT_EQ(f_lammps_gather_subset_position(2,3), 0.5); + EXPECT_EQ(f_lammps_gather_subset_position(3,3), 0.5); +}; From db9b59c269983581f8983e7cc602b887657654c7 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sun, 2 Oct 2022 20:32:42 -0500 Subject: [PATCH 286/364] Implemented scatter_atoms and scatter_atoms_subset + unit tests + documentation + typos/edits --- doc/src/Fortran.rst | 141 ++++++++-- fortran/README | 8 +- fortran/lammps.f90 | 161 ++++++++++- src/library.cpp | 16 +- .../fortran/test_fortran_gather_scatter.f90 | 113 ++++++-- unittest/fortran/wrap_gather_scatter.cpp | 251 +++++++++++------- 6 files changed, 520 insertions(+), 170 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index 12056df995..a62378819f 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -1,14 +1,14 @@ The ``LIBLAMMPS`` Fortran Module ******************************** -The ``LIBLAMMPS`` module provides an interface to call LAMMPS from a -Fortran code. It is based on the LAMMPS C-library interface and -requires a Fortran 2003 compatible compiler to be compiled. It is +The ``LIBLAMMPS`` module provides an interface to call LAMMPS from Fortran. +It is based on the LAMMPS C library interface and +requires a Fortran 2003-compatible compiler to be compiled. It is designed to be self-contained and not require any support functions -written in C, C++, or Fortran. +written in C, C++, or Fortran other than those in the C library interface. While C libraries have a defined binary interface (ABI) and can thus be -used from multiple compiler versions from different vendors for as long +used from multiple compiler versions from different vendors as long as they are compatible with the hosting operating system, the same is not true for Fortran programs. Thus, the LAMMPS Fortran module needs to be compiled alongside the code using it from the source code in @@ -49,7 +49,7 @@ folder of the LAMMPS distribution. .. note:: A contributed (and more complete!) Fortran interface that more - closely resembles the C-library interface is available in the + closely resembles the C library interface is available in the ``examples/COUPLE/fortran2`` folder. Please see the ``README`` file in that folder for more information about it and how to contact its author and maintainer. @@ -62,8 +62,8 @@ Creating or deleting a LAMMPS object With the Fortran interface, the creation of a :cpp:class:`LAMMPS ` instance is included in the constructor for creating the :f:func:`lammps` derived type. To import the definition of -that type and its type-bound procedures, you need to add a ``USE -LIBLAMMPS`` statement. Internally, it will call either +that type and its type-bound procedures, you need to add a ``USE LIBLAMMPS`` +statement. Internally, it will call either :cpp:func:`lammps_open_fortran` or :cpp:func:`lammps_open_no_mpi` from the C library API to create the class instance. All arguments are optional and :cpp:func:`lammps_mpi_init` will be called automatically @@ -178,11 +178,13 @@ Accessing system properties The C library interface allows the :doc:`extraction of different kinds of information ` about the active simulation -instance and also---in some cases---to apply modifications to it. In -some cases, the C library interface makes pointers to internal data -structures accessible; when accessing them through the library interfaces, -special care is needed to avoid data corruption and crashes. Please see -the documentation of the individual type-bound procedures for details. +instance and also---in some cases---to apply modifications to it, and the +Fortran interface provides access to the same data using Fortran-style, +C-interoperable data types. In some cases, the Fortran library interface makes +pointers to internal LAMMPS data structures accessible; when accessing them +through the library interfaces, special care is needed to avoid data corruption +and crashes. Please see the documentation of the individual type-bound +procedures for details. Below is an example demonstrating some of the possible uses. @@ -258,6 +260,11 @@ of the contents of the ``LIBLAMMPS`` Fortran interface to LAMMPS. :f function extract_compute: :f:func:`extract_compute` :f function extract_fix: :f:func:`extract_fix` :f function extract_variable: :f:func:`extract_variable` + :f subroutine gather_atoms: :f:func:`gather_atoms` + :f subroutine gather_atoms_concat: :f:func:`gather_atoms_concat` + :f subroutine gather_atoms_subset: :f:func:`gather_atoms_subset` + :f subroutine scatter_atoms: :f:func:`scatter_atoms` + :f subroutine scatter_atoms_subset: :f:func:`scatter_atoms_subset` :f function version: :f:func:`version` :f subroutine flush_buffers: :f:func:`flush_buffers` :f function is_running: :f:func:`is_running` @@ -1041,9 +1048,8 @@ Procedures Bound to the lammps Derived Type This function returns the values of the variables, not pointers to them. Vectors pointing to *atom*-style variables should be of type - ``REAL(c_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and either have - the ``ALLOCATABLE`` attribute or be long enough to contain the data without - reallocation. + ``REAL(c_double)``, be of rank 1 (i.e., ``DIMENSION(:)``), and have the + ``ALLOCATABLE`` attribute. .. note:: @@ -1088,7 +1094,7 @@ Procedures Bound to the lammps Derived Type -------- -.. f:function:: gather_atoms(name, count, data) +.. f:subroutine:: gather_atoms(name, count, data) This function calls :c:func:`lammps_gather_atoms` to gather the named atom-based entity for all atoms on all processors and return it in the @@ -1135,10 +1141,11 @@ Procedures Bound to the lammps Derived Type x(1:3,1:size(xdata)/3) => xdata You can then access the *y*\ -component of atom 3 with ``x(2,3)``. + See the note about array index order at :f:func:`extract_atom`. -------- -.. f:function:: gather_atoms_concat(name, count, data) +.. f:subroutine:: gather_atoms_concat(name, count, data) This function calls :c:func:`lammps_gather_atoms_concat` to gather the named atom-based entity for all atoms on all processors and return it in the @@ -1166,6 +1173,100 @@ Procedures Bound to the lammps Derived Type -------- +.. f:subroutine:: gather_atoms_subset(name, count, ids, data) + + This function calls :c:func:`lammps_gather_atoms_subset` to gather the named + atom-based entity for the atoms in the array *ids* from all processors and + return it in the vector *data*. + + .. versionadded: TBD + + This subroutine gathers data for the requested atom IDs and stores them in a + one-dimensional array allocated by the user. The data will be ordered by + atom ID, but there is no requirement that the IDs be consecutive. If you + wish to return a similar array for *all* the atoms, use + :f:func:`gather_atoms` or :f:func:`gather_atoms_concat`. + + The *data* array will be in groups of *count* values, sorted by atom ID + in the same order as the array *ids* (e.g., if *name* is *x*, *count* = 3, + and *ids* is [100, 57, 210], then *data* might look like + [x(1,100), x(2,100), x(3,100), x(1,57), x(2,57), x(3,57), x(1,210), + :math:`\dots`]; *ids* must be provided by the user, and *data* must be + of rank 1 (i.e., ``DIMENSION(:)``) and have the ``ALLOCATABLE`` attribute. + + :p character(len=\*) name: desired quantity (e.g., *x* or *mask*) + :p integer(c_int) count: number of per-atom values you expect per atom + (e.g., 1 for *type*, *mask*, or *charge*; 3 for *x*, *v*, or *f*). Use + *count* = 3 with *image* if you want a single image flag unpacked into + *x*/*y*/*z* components. + :p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms + to be gathered + :p real(c_double) data [dimension(:),allocatable]: array into which to store + the data. Array *must* have the ``ALLOCATABLE`` attribute and be of rank 1 + (i.e., ``DIMENSION(:)``). If this array is already allocated, it will be + reallocated to fit the length of the incoming data. + +-------- + +.. f:subroutine:: scatter_atoms(name, data) + + This function calls :c:func:`lammps_scatter_atoms` to scatter the named + atom-based entities in *data* to all processors. + + .. versionadded:: TBD + + This subroutine takes data stored in a one-dimensional array supplied by the + user and scatters them to all atoms on all processors. The data must be + ordered by atom ID, with the requirement that the IDs be consecutive. + Use :f:func:`scatter_atoms_subset` to scatter data for some (or all) + atoms, in any order. + + The *data* array needs to be ordered in groups of *count* values, sorted by + atom ID (e.g., if *name* is *x* and *count* = 3, then + *data* = [x(1,1) x(2,1) x(3,1) x(1,2) x(2,2) x(3,2) x(1,3) :math:`\dots`]; + *data* must be of length (*count* :math:`\times` *natoms*). + + :p character(len=\*) name: quantity to be scattered (e.g., *x* or *charge*) + :p polymorphic data [dimension(:)]: per-atom values packed in a one-dimensional array + containing the data to be scattered. This array must have length *natoms* + (e.g., for *type* or *charge*) or length *natoms*\ :math:`\times 3` + (e.g., for *x* or *f*). The array *data* must be rank 1 (i.e., + ``DIMENSION(:)``) and be of type ``INTEGER(c_int)`` (e.g., for *mask* or + *type*) or of type ``REAL(c_double)`` (e.g., for *x* or *charge* or *f*). + +-------- + +.. f:subroutine:: scatter_atoms_subset(name, ids, data) + + This function calls :c:func:`lammps_scatter_atoms_subset` to scatter the + named atom-based entities in *data* to all processors. + + .. versionadded:: TBD + + This subroutine takes data stored in a one-dimensional array supplied by the + user and scatters them to a subset of atoms on all processors. The array + *data* contains data associated with atom IDs, but there is no requirement + that the IDs be consecutive, as they are provided in a separate array, + *ids*. Use :f:func:`scatter_atoms` to scatter data for all atoms, in order. + + The *data* array needs to be organized in groups of 1 or 3 values, + depending on which quantity is being scattered, with the groups in the same + order as the array *ids*. For example, if you want *data* to be the array + [x(1,1) x(2,1) x(3,1) x(1,100) x(2,100) x(3,100) x(1,57) x(2,57) x(3,57)], + then *ids* would be [1 100 57] and *name* would be *x*. + + :p character(len=\*) name: quantity to be scattered (e.g., *x* or *charge*) + :p integer(c_int) ids [dimension(:)]: atom IDs corresponding to the atoms + being scattered + :p polymorphic data [dimension(:)]: per-atom values packed into a + one-dimensional array containing the data to be scattered. This array must + have either the same length as *ids* (for *mask*, *type*, etc.) or three + times its length (for *x*, *f*, etc.); the array must be rank 1 + and be of type ``INTEGER(c_int)`` (e.g., for *mask* or *type*) or of type + ``REAL(c_double)`` (e.g., *charge*, *x*, or *f*). + +-------- + .. f:function:: version() This method returns the numeric LAMMPS version like @@ -1183,8 +1284,8 @@ Procedures Bound to the lammps Derived Type .. versionadded:: TBD A suitable buffer has to be provided. The assembled text will be truncated - to not overflow this buffer. The string is typically a few hundred bytes - long. + so as not to overflow this buffer. The string is typically a few hundred + bytes long. -------- diff --git a/fortran/README b/fortran/README index 57d163e197..6a19cd7dc2 100644 --- a/fortran/README +++ b/fortran/README @@ -1,9 +1,9 @@ -This directory contains Fortran code which interface LAMMPS as a library -and allows the LAMMPS library interface to be invoked from Fortran codes. -It requires a Fortran compiler that supports the Fortran 2003 standard. +This directory contains Fortran code that acts as an interface to LAMMPS as a +library and allows the LAMMPS library interface to be invoked from Fortran +code. It requires a Fortran compiler that supports the Fortran 2003 standard. This interface is based on and supersedes the previous Fortran interfaces -in the examples/COUPLE/fortran* folders, but is fully supported by the +in the examples/COUPLE/fortran* folders, but it is fully supported by the LAMMPS developers and included in the documentation and unit testing. Details on this Fortran interface and how to build programs using it diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index ad90d45aa4..8fad0d43e5 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -114,7 +114,14 @@ MODULE LIBLAMMPS PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_double GENERIC :: gather_atoms_subset => lmp_gather_atoms_subset_int, & lmp_gather_atoms_subset_double + PROCEDURE, PRIVATE :: lmp_scatter_atoms_int, lmp_scatter_atoms_double + GENERIC :: scatter_atoms => lmp_scatter_atoms_int, & + lmp_scatter_atoms_double ! + PROCEDURE, PRIVATE :: lmp_scatter_atoms_subset_int + PROCEDURE, PRIVATE :: lmp_scatter_atoms_subset_double + GENERIC :: scatter_atoms_subset => lmp_scatter_atoms_subset_int, & + lmp_scatter_atoms_subset_double PROCEDURE :: version => lmp_version PROCEDURE,NOPASS :: get_os_info => lmp_get_os_info PROCEDURE,NOPASS :: config_has_mpi_support => lmp_config_has_mpi_support @@ -428,9 +435,20 @@ MODULE LIBLAMMPS INTEGER(c_int), VALUE :: type, count, ndata END SUBROUTINE lammps_gather_atoms_subset - !SUBROUTINE lammps_scatter_atoms + SUBROUTINE lammps_scatter_atoms(handle, name, type, count, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, data + INTEGER(c_int), VALUE :: type, count + END SUBROUTINE lammps_scatter_atoms - !SUBROUTINE lammps_scatter_atoms_subset + SUBROUTINE lammps_scatter_atoms_subset(handle, name, type, count, & + ndata, ids, data) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, name, ids, data + INTEGER(c_int), VALUE :: count, ndata, type + END SUBROUTINE lammps_scatter_atoms_subset !SUBROUTINE lammps_gather_bonds @@ -1212,8 +1230,8 @@ CONTAINS TYPE(c_ptr) :: Cdata, Cname INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 0_c_int - REAL(C_double) :: dnatoms - CHARACTER(LEN=80) :: error_msg + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& @@ -1247,7 +1265,7 @@ CONTAINS INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 1_c_int REAL(C_double) :: dnatoms - CHARACTER(LEN=80) :: error_msg + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& @@ -1281,7 +1299,7 @@ CONTAINS INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 0_c_int REAL(C_double) :: dnatoms - CHARACTER(LEN=80) :: error_msg + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & @@ -1316,7 +1334,7 @@ CONTAINS INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 1_c_int REAL(C_double) :: dnatoms - CHARACTER(LEN=80) :: error_msg + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & @@ -1351,11 +1369,12 @@ CONTAINS INTEGER(c_int) :: ndata TYPE(c_ptr) :: Cdata, Cname, Cids INTEGER(c_int), PARAMETER :: Ctype = 0_c_int - CHARACTER(LEN=80) :: error_msg + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN - CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& - & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_subset requires "count" to be 1 or 3 & + &[Fortran/gather_atoms]') END IF ndata = SIZE(ids, KIND=c_int) @@ -1381,11 +1400,12 @@ CONTAINS INTEGER(c_int) :: ndata TYPE(c_ptr) :: Cdata, Cname, Cids INTEGER(c_int), PARAMETER :: Ctype = 1_c_int - CHARACTER(LEN=80) :: error_msg + CHARACTER(LEN=100) :: error_msg IF ( count /= 1 .AND. count /= 3 ) THEN - CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& - & requires "count" to be 1 or 3 [Fortran/gather_atoms]') + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'gather_atoms_subset requires "count" to be 1 or 3 & + &[Fortran/gather_atoms]') END IF ndata = SIZE(ids, KIND=c_int) @@ -1400,6 +1420,121 @@ CONTAINS CALL lammps_free(Cname) END SUBROUTINE lmp_gather_atoms_subset_double + ! equivalent function to lammps_scatter_atoms (for integers) + SUBROUTINE lmp_scatter_atoms_int(self, name, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: data + INTEGER(c_int) :: natoms, Ccount + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + TYPE(c_ptr) :: Cname, Cdata + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function scatter_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Ccount = SIZE(data) / natoms + + IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'lammps_scatter_atoms requires either 1 or 3 data per atom') + END IF + CALL lammps_scatter_atoms(self%handle, Cname, Ctype, Ccount, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_int + + ! equivalent function to lammps_scatter_atoms (for doubles) + SUBROUTINE lmp_scatter_atoms_double(self, name, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + REAL(c_double), DIMENSION(:), TARGET :: data + INTEGER(c_int) :: natoms, Ccount + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + TYPE(c_ptr) :: Cname, Cdata + REAL(c_double) :: dnatoms + CHARACTER(LEN=100) :: error_msg + + dnatoms = lmp_get_natoms(self) + IF ( dnatoms > HUGE(1_c_int) ) THEN + WRITE(error_msg,'(A,1X,I0,1X,A)') & + 'Cannot use library function scatter_atoms with more than', & + HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, error_msg) + END IF + natoms = NINT(dnatoms, c_int) + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Ccount = SIZE(data) / natoms + + IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms requires either 1 or 3 data per atom & + &[Fortran/scatter_atoms]') + END IF + CALL lammps_scatter_atoms(self%handle, Cname, Ctype, Ccount, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_double + + SUBROUTINE lmp_scatter_atoms_subset_int(self, name, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: ids + INTEGER(c_int), DIMENSION(:), TARGET :: data + INTEGER(c_int), PARAMETER :: Ctype = 0_c_int + INTEGER(c_int) :: Cndata, Ccount + TYPE(c_ptr) :: Cdata, Cname, Cids + CHARACTER(LEN=100) :: error_msg + + Cndata = SIZE(ids, KIND=c_int) + Ccount = SIZE(data, KIND=c_int) / Cndata + IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms_subset requires either 1 or 3 data per atom') + END IF + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids) + CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & + Cndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_subset_int + + SUBROUTINE lmp_scatter_atoms_subset_double(self, name, ids, data) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: name + INTEGER(c_int), DIMENSION(:), TARGET :: ids + REAL(c_double), DIMENSION(:), TARGET :: data + INTEGER(c_int), PARAMETER :: Ctype = 1_c_int + INTEGER(c_int) :: Cndata, Ccount + TYPE(c_ptr) :: Cdata, Cname, Cids + CHARACTER(LEN=100) :: error_msg + + Cndata = SIZE(ids, KIND=c_int) + Ccount = SIZE(data, KIND=c_int) / Cndata + IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & + 'scatter_atoms_subset requires either 1 or 3 data per atom') + END IF + + Cname = f2c_string(name) + Cdata = C_LOC(data(1)) + Cids = C_LOC(ids) + CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & + Cndata, Cids, Cdata) + CALL lammps_free(Cname) + END SUBROUTINE lmp_scatter_atoms_subset_double + ! equivalent function to lammps_version INTEGER FUNCTION lmp_version(self) CLASS(lammps), INTENT(IN) :: self diff --git a/src/library.cpp b/src/library.cpp index 0851980207..fe16d1e518 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2551,10 +2551,12 @@ return a similar array for *all* the atoms, use :cpp:func:`lammps_gather_atoms` or :cpp:func:`lammps_gather_atoms_concat`. The *data* array will be in groups of *count* values, sorted by atom ID -(e.g., if *name* is *x* and *count* = 3, then *data* might look like -x[100][0], x[100][1], x[100][2], x[101][0], x[101][1], x[101][2], x[102][0], -:math:`\dots`); *data* must be pre-allocated by the caller to length (*count* -:math:`\times` *ndata*). +in the same order as the array *ids* (e.g., if *name* is *x*, *count* = 3, and +*ids* is {100, 57, 210}, then *data* might look like {x[100][0], x[100][1], +x[100][2], x[57][0], x[57][1], x[57][2], x[210][0], :math:`\dots`); +*ids* must be provided by the user with length *ndata*, and +*data* must be pre-allocated by the caller to length +(*count* :math:`\times` *ndata*). \endverbatim * @@ -2601,7 +2603,7 @@ void lammps_gather_atoms_subset(void *handle, char *name, int type, int count, if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; if (flag) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Library error in lammps_gather_atoms_subset"); + lmp->error->warning(FLERR,"Library error in lammps_gather_atoms_subset: atoms must have mappable ids"); return; } @@ -2757,7 +2759,7 @@ void lammps_scatter_atoms(void *handle, char *name, int type, int count, void *d if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; if (flag) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Library error in lammps_scatter_atoms"); + lmp->error->warning(FLERR,"Library error in lammps_scatter_atoms: ids must exist, be consecutive, and be mapped"); return; } @@ -2908,7 +2910,7 @@ void lammps_scatter_atoms_subset(void *handle, char *name, int type, int count, if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; if (flag) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Library error in lammps_scatter_atoms_subset"); + lmp->error->warning(FLERR,"Library error in lammps_scatter_atoms_subset: atoms must have mapped ids"); return; } diff --git a/unittest/fortran/test_fortran_gather_scatter.f90 b/unittest/fortran/test_fortran_gather_scatter.f90 index 86870721ba..dd9182afaa 100644 --- a/unittest/fortran/test_fortran_gather_scatter.f90 +++ b/unittest/fortran/test_fortran_gather_scatter.f90 @@ -33,39 +33,39 @@ SUBROUTINE f_lammps_setup_gather_scatter () BIND(C) CALL lmp%commands_list(more_input) END SUBROUTINE f_lammps_setup_gather_scatter -FUNCTION f_lammps_gather_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_mask (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - INTEGER(c_int) :: f_lammps_gather_mask + INTEGER(c_int) :: f_lammps_gather_atoms_mask INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask CALL lmp%gather_atoms('mask', 1_c_int, mask) - f_lammps_gather_mask = mask(i) -END FUNCTION f_lammps_gather_mask + f_lammps_gather_atoms_mask = mask(i) +END FUNCTION f_lammps_gather_atoms_mask -FUNCTION f_lammps_gather_position (i) BIND(C) +FUNCTION f_lammps_gather_atoms_position (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - REAL(c_double) :: f_lammps_gather_position + REAL(c_double) :: f_lammps_gather_atoms_position REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions CALL lmp%gather_atoms('x', 3_c_int, positions) - f_lammps_gather_position = positions(i) -END FUNCTION f_lammps_gather_position + f_lammps_gather_atoms_position = positions(i) +END FUNCTION f_lammps_gather_atoms_position -FUNCTION f_lammps_gather_concat_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_concat_mask (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - INTEGER(c_int) :: f_lammps_gather_concat_mask + INTEGER(c_int) :: f_lammps_gather_atoms_concat_mask INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask, tag INTEGER :: j @@ -73,20 +73,20 @@ FUNCTION f_lammps_gather_concat_mask (i) BIND(C) CALL lmp%gather_atoms_concat('id', 1_c_int, tag) DO j = 1, SIZE(tag) IF ( tag(j) == i ) THEN - f_lammps_gather_concat_mask = mask(j) + f_lammps_gather_atoms_concat_mask = mask(j) RETURN END IF END DO - f_lammps_gather_concat_mask = -1 -END FUNCTION f_lammps_gather_concat_mask + f_lammps_gather_atoms_concat_mask = -1 +END FUNCTION f_lammps_gather_atoms_concat_mask -FUNCTION f_lammps_gather_concat_position (xyz, id) BIND(C) +FUNCTION f_lammps_gather_atoms_concat_position (xyz, id) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: id, xyz - REAL(c_double) :: f_lammps_gather_concat_position + REAL(c_double) :: f_lammps_gather_atoms_concat_position REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: tag INTEGER :: j @@ -95,18 +95,18 @@ FUNCTION f_lammps_gather_concat_position (xyz, id) BIND(C) CALL lmp%gather_atoms_concat('id', 1_c_int, tag) DO j = 1, SIZE(tag) IF ( tag(j) == id ) THEN - f_lammps_gather_concat_position = positions((j-1)*3 + xyz) + f_lammps_gather_atoms_concat_position = positions((j-1)*3 + xyz) END IF END DO -END FUNCTION f_lammps_gather_concat_position +END FUNCTION f_lammps_gather_atoms_concat_position -FUNCTION f_lammps_gather_subset_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_subset_mask (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - INTEGER(c_int) :: f_lammps_gather_subset_mask + INTEGER(c_int) :: f_lammps_gather_atoms_subset_mask INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: mask INTEGER :: j INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2] @@ -114,20 +114,20 @@ FUNCTION f_lammps_gather_subset_mask (i) BIND(C) CALL lmp%gather_atoms_subset('mask', 1_c_int, tag, mask) DO j = 1, SIZE(tag) IF ( tag(j) == i ) THEN - f_lammps_gather_subset_mask = mask(j) + f_lammps_gather_atoms_subset_mask = mask(j) RETURN END IF END DO - f_lammps_gather_subset_mask = -1 -END FUNCTION f_lammps_gather_subset_mask + f_lammps_gather_atoms_subset_mask = -1 +END FUNCTION f_lammps_gather_atoms_subset_mask -FUNCTION f_lammps_gather_subset_position (xyz,id) BIND(C) +FUNCTION f_lammps_gather_atoms_subset_position (xyz,id) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: id, xyz - REAL(c_double) :: f_lammps_gather_subset_position + REAL(c_double) :: f_lammps_gather_atoms_subset_position REAL(c_double), DIMENSION(:), ALLOCATABLE :: positions INTEGER(c_int), DIMENSION(*), PARAMETER :: tag = [3,2] INTEGER :: j @@ -135,9 +135,68 @@ FUNCTION f_lammps_gather_subset_position (xyz,id) BIND(C) CALL lmp%gather_atoms_subset('x', 3_c_int, tag, positions) DO j = 1, SIZE(tag) IF ( tag(j) == id ) THEN - f_lammps_gather_subset_position = positions((j-1)*3 + xyz) + f_lammps_gather_atoms_subset_position = positions((j-1)*3 + xyz) RETURN END IF END DO - f_lammps_gather_subset_position = -1.0D0 -END FUNCTION f_lammps_gather_subset_position + f_lammps_gather_atoms_subset_position = -1.0D0 +END FUNCTION f_lammps_gather_atoms_subset_position + +SUBROUTINE f_lammps_scatter_atoms_masks() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: masks + INTEGER(c_int) :: swap + + CALL lmp%gather_atoms('mask', 1_c_int, masks) + + ! swap masks of atoms 1 and 3 + swap=masks(1) + masks(1) = masks(3) + masks(3) = swap + + CALL lmp%scatter_atoms('mask', masks) ! push the swap back to LAMMPS +END SUBROUTINE f_lammps_scatter_atoms_masks + +SUBROUTINE f_lammps_scatter_atoms_positions() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: tags + REAL(c_double), DIMENSION(:), ALLOCATABLE, TARGET :: xvec + REAL(c_double), DIMENSION(:,:), POINTER :: x + REAL(c_double) :: swap(3) + + CALL lmp%gather_atoms('id',1_c_int,tags) + CALL lmp%gather_atoms('x',3_c_int,xvec) + x(1:3,1:SIZE(xvec)/3) => xvec + + ! swap positions of atoms 1 and 3 + swap=x(:,1) + x(:,1) = x(:,3) + x(:,3) = swap + + CALL lmp%scatter_atoms('x', xvec) ! push the swap back to LAMMPS +END SUBROUTINE f_lammps_scatter_atoms_positions + +SUBROUTINE f_lammps_scatter_atoms_subset_mask() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double + USE LIBLAMMPS + USE keepstuff, ONLY : lmp + IMPLICIT NONE + INTEGER(c_int), DIMENSION(:), ALLOCATABLE :: all_masks + INTEGER(c_int), DIMENSION(*), PARAMETER :: tags = [3,1] + INTEGER(c_int), DIMENSION(2) :: masks + INTEGER(c_int) :: swap + + CALL lmp%gather_atoms('mask', 1_c_int, all_masks) + + ! swap masks of atoms 1 and 3 in the new array (because 'tags' is reversed) + masks(1) = all_masks(1) + masks(2) = all_masks(3) + + CALL lmp%scatter_atoms_subset('mask', tags, masks) ! push the swap to LAMMPS +END SUBROUTINE f_lammps_scatter_atoms_subset_mask diff --git a/unittest/fortran/wrap_gather_scatter.cpp b/unittest/fortran/wrap_gather_scatter.cpp index 4fd733a167..96397b7681 100644 --- a/unittest/fortran/wrap_gather_scatter.cpp +++ b/unittest/fortran/wrap_gather_scatter.cpp @@ -15,126 +15,179 @@ extern "C" { void *f_lammps_with_args(); void f_lammps_close(); void f_lammps_setup_gather_scatter(); -int f_lammps_gather_mask(int); -double f_lammps_gather_position(int); -int f_lammps_gather_concat_mask(int); -double f_lammps_gather_concat_position(int,int); -int f_lammps_gather_subset_mask(int); -double f_lammps_gather_subset_position(int,int); +int f_lammps_gather_atoms_mask(int); +double f_lammps_gather_atoms_position(int); +int f_lammps_gather_atoms_concat_mask(int); +double f_lammps_gather_atoms_concat_position(int,int); +int f_lammps_gather_atoms_subset_mask(int); +double f_lammps_gather_atoms_subset_position(int,int); +void f_lammps_scatter_atoms_masks(); +void f_lammps_scatter_atoms_positions(); } class LAMMPS_gather_scatter : public ::testing::Test { protected: - LAMMPS_NS::LAMMPS *lmp; - LAMMPS_gather_scatter() = default; - ~LAMMPS_gather_scatter() override = default; + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_gather_scatter() = default; + ~LAMMPS_gather_scatter() override = default; - void SetUp() override - { - ::testing::internal::CaptureStdout(); - lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); - std::string output = ::testing::internal::GetCapturedStdout(); - EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); - } - void TearDown() override - { - ::testing::internal::CaptureStdout(); - f_lammps_close(); - std::string output = ::testing::internal::GetCapturedStdout(); - EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); - lmp = nullptr; - } + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } }; -TEST_F(LAMMPS_gather_scatter, gather_masks) +TEST_F(LAMMPS_gather_scatter, gather_atoms_masks) { - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_mask(1), 1); - EXPECT_EQ(f_lammps_gather_mask(2), 1); - EXPECT_EQ(f_lammps_gather_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_mask(1), 3); - EXPECT_EQ(f_lammps_gather_mask(2), 5); - EXPECT_EQ(f_lammps_gather_mask(3), 9); - lammps_command(lmp, "group other id 1"); - EXPECT_EQ(f_lammps_gather_mask(1), 7); - EXPECT_EQ(f_lammps_gather_mask(2), 5); - EXPECT_EQ(f_lammps_gather_mask(3), 9); + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 7); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); }; -TEST_F(LAMMPS_gather_scatter, gather_positions) +TEST_F(LAMMPS_gather_scatter, gather_atoms_positions) { - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_position(1), 1.0); - EXPECT_EQ(f_lammps_gather_position(2), 1.0); - EXPECT_EQ(f_lammps_gather_position(3), 1.5); - EXPECT_EQ(f_lammps_gather_position(4), 0.2); - EXPECT_EQ(f_lammps_gather_position(5), 0.1); - EXPECT_EQ(f_lammps_gather_position(6), 0.1); - EXPECT_EQ(f_lammps_gather_position(7), 0.5); - EXPECT_EQ(f_lammps_gather_position(8), 0.5); - EXPECT_EQ(f_lammps_gather_position(9), 0.5); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(2), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(3), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(4), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(5), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(6), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(7), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(8), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(9), 0.5); }; -TEST_F(LAMMPS_gather_scatter, gather_masks_concat) +TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_masks) { - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_concat_mask(1), 1); - EXPECT_EQ(f_lammps_gather_concat_mask(2), 1); - EXPECT_EQ(f_lammps_gather_concat_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_concat_mask(1), 3); - EXPECT_EQ(f_lammps_gather_concat_mask(2), 5); - EXPECT_EQ(f_lammps_gather_concat_mask(3), 9); - lammps_command(lmp, "group other id 1"); - EXPECT_EQ(f_lammps_gather_concat_mask(1), 7); - EXPECT_EQ(f_lammps_gather_concat_mask(2), 5); - EXPECT_EQ(f_lammps_gather_concat_mask(3), 9); + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 1); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 7); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); }; -TEST_F(LAMMPS_gather_scatter, gather_positions_concat) +TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_positions) { - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_concat_position(1,1), 1.0); - EXPECT_EQ(f_lammps_gather_concat_position(2,1), 1.0); - EXPECT_EQ(f_lammps_gather_concat_position(3,1), 1.5); - EXPECT_EQ(f_lammps_gather_concat_position(1,2), 0.2); - EXPECT_EQ(f_lammps_gather_concat_position(2,2), 0.1); - EXPECT_EQ(f_lammps_gather_concat_position(3,2), 0.1); - EXPECT_EQ(f_lammps_gather_concat_position(1,3), 0.5); - EXPECT_EQ(f_lammps_gather_concat_position(2,3), 0.5); - EXPECT_EQ(f_lammps_gather_concat_position(3,3), 0.5); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 0.5); }; -TEST_F(LAMMPS_gather_scatter, gather_masks_subset) +TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_masks) { - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_subset_mask(2), 1); - EXPECT_EQ(f_lammps_gather_subset_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_subset_mask(2), 5); - EXPECT_EQ(f_lammps_gather_subset_mask(3), 9); - lammps_command(lmp, "group other id 3"); - EXPECT_EQ(f_lammps_gather_subset_mask(2), 5); - EXPECT_EQ(f_lammps_gather_subset_mask(3), 13); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 9); + lammps_command(lmp, "group other id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 13); }; -TEST_F(LAMMPS_gather_scatter, gather_positions_subset) +TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_positions) { - f_lammps_setup_gather_scatter(); -// EXPECT_EQ(f_lammps_gather_subset_position(1,1), 1.0); -// EXPECT_EQ(f_lammps_gather_subset_position(2,1), 1.0); -// EXPECT_EQ(f_lammps_gather_subset_position(3,1), 1.5); - EXPECT_EQ(f_lammps_gather_subset_position(1,2), 0.2); - EXPECT_EQ(f_lammps_gather_subset_position(2,2), 0.1); - EXPECT_EQ(f_lammps_gather_subset_position(3,2), 0.1); - EXPECT_EQ(f_lammps_gather_subset_position(1,3), 0.5); - EXPECT_EQ(f_lammps_gather_subset_position(2,3), 0.5); - EXPECT_EQ(f_lammps_gather_subset_position(3,3), 0.5); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1,2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3,3), 0.5); +}; + +TEST_F(LAMMPS_gather_scatter, scatter_atoms_masks) +{ + f_lammps_setup_gather_scatter(); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 3); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 9); + f_lammps_scatter_atoms_masks(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 9); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 3); +}; + +TEST_F(LAMMPS_gather_scatter, scatter_atoms_positions) +{ + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 0.5); + f_lammps_scatter_atoms_positions(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 0.5); +}; + +TEST_F(LAMMPS_gather_scatter, scatter_atoms_subset_mask) +{ + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); + f_lammps_scatter_atoms_masks(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 9); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 3); }; From dc5324c1db0572ee38376f613d6383a34679b8a4 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Sun, 2 Oct 2022 21:26:42 -0500 Subject: [PATCH 287/364] Updated unit tests to use keepstuff; whitespace fixes --- doc/src/Fortran.rst | 2 +- src/library.cpp | 4 +- unittest/fortran/test_fortran_extract_fix.f90 | 39 +++------- .../fortran/test_fortran_extract_variable.f90 | 78 +++++++++---------- 4 files changed, 49 insertions(+), 74 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index a62378819f..e7b44c4686 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -1108,7 +1108,7 @@ Procedures Bound to the lammps Derived Type of atoms, see :f:func:`gather_atoms_subset`. The *data* array will be ordered in groups of *count* values, sorted by atom - ID (e.g., if *name* is *x* and *count* = 3, then *data* = x[1][1], x[2][1], + ID (e.g., if *name* is *x* and *count* = 3, then *data* = x[1][1], x[2][1], x[3][1], x[1][2], x[2][2], x[3][2], x[1][3], :math:`\dots`); *data* must be ``ALLOCATABLE`` and will be allocated to length (*count* :math:`\times` *natoms*), as queried by diff --git a/src/library.cpp b/src/library.cpp index fe16d1e518..bfa0fc803a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2235,7 +2235,7 @@ a similar array but have non-consecutive atom IDs, see of atoms, see :cpp:func:`lammps_gather_atoms_subset`. The *data* array will be ordered in groups of *count* values, sorted by atom ID -(e.g., if *name* is *x* and *count* = 3, then *data* = x[0][0], x[0][1], +(e.g., if *name* is *x* and *count* = 3, then *data* = x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], :math:`\dots`); *data* must be pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as queried by :cpp:func:`lammps_get_natoms`, @@ -2383,7 +2383,7 @@ This subroutine gathers data for all atoms and stores them in a one-dimensional array allocated by the user. The data will be a concatenation of chunks from each processor's owned atoms, in whatever order the atoms are in on each processor. This process has no requirement that the atom IDs be -consecutive. If you need the ID of each atom, you can do another +consecutive. If you need the ID of each atom, you can do another :cpp:func:`lammps_gather_atoms_concat` call with *name* set to ``id``. If you have consecutive IDs and want the data to be in order, use :cpp:func:`lammps_gather_atoms`; for a similar array but for a subset diff --git a/unittest/fortran/test_fortran_extract_fix.f90 b/unittest/fortran/test_fortran_extract_fix.f90 index 85b4cb5f4f..7d5e18016b 100644 --- a/unittest/fortran/test_fortran_extract_fix.f90 +++ b/unittest/fortran/test_fortran_extract_fix.f90 @@ -1,27 +1,7 @@ -MODULE keepfix - USE liblammps - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(LEN=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & - [ CHARACTER(LEN=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1', & - 'create_atoms 1 single 0.5 0.5 0.5' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 2.0' ] -END MODULE keepfix - FUNCTION f_lammps_with_args() BIND(C) USE ISO_C_BINDING, ONLY: C_ptr USE liblammps - USE keepfix, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE TYPE(C_ptr) :: f_lammps_with_args CHARACTER(len=12), DIMENSION(12), PARAMETER :: args = & @@ -35,7 +15,7 @@ END FUNCTION f_lammps_with_args SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepfix, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -44,11 +24,12 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_fix () BIND(C) USE LIBLAMMPS - USE keepfix, ONLY : lmp, demo_input, cont_input, pair_input + USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input, more_input IMPLICIT NONE - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(more_input) CALL lmp%commands_list(pair_input) CALL lmp%command("fix state all store/state 0 z") ! per-atom vector CALL lmp%command("fix move all move linear 0 0 0") ! for per-atom array @@ -62,7 +43,7 @@ END SUBROUTINE f_lammps_setup_extract_fix FUNCTION f_lammps_extract_fix_global_scalar () BIND(C) RESULT(scalar) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE LIBLAMMPS - USE keepfix, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(C_double) :: scalar @@ -72,7 +53,7 @@ END FUNCTION f_lammps_extract_fix_global_scalar FUNCTION f_lammps_extract_fix_global_vector (i) BIND(C) RESULT(element) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepfix, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double) :: element @@ -83,7 +64,7 @@ END FUNCTION f_lammps_extract_fix_global_vector FUNCTION f_lammps_extract_fix_global_array (i,j) BIND(C) RESULT(element) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepfix, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i, j REAL(C_double) :: element @@ -94,7 +75,7 @@ END FUNCTION f_lammps_extract_fix_global_array FUNCTION f_lammps_extract_fix_peratom_vector (i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepfix, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i REAL(C_double) :: f_lammps_extract_fix_peratom_vector @@ -107,7 +88,7 @@ END FUNCTION f_lammps_extract_fix_peratom_vector FUNCTION f_lammps_extract_fix_peratom_array (i,j) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepfix, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(C_int), INTENT(IN), VALUE :: i, j REAL(C_double) :: f_lammps_extract_fix_peratom_array diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index 267b5e1139..0b16e61894 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -1,26 +1,11 @@ MODULE keepvar USE liblammps IMPLICIT NONE - TYPE(LAMMPS) :: lmp - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: demo_input = & - [ CHARACTER(LEN=40) :: & - 'region box block 0 $x 0 3 0 4', & - 'create_box 1 box', & - 'create_atoms 1 single 1.0 1.0 ${zpos}' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: cont_input = & - [ CHARACTER(LEN=40) :: & - 'create_atoms 1 single &', & - ' 0.2 0.1 0.1', & - 'create_atoms 1 single 0.5 0.5 0.5' ] - CHARACTER(LEN=40), DIMENSION(3), PARAMETER :: pair_input = & - [ CHARACTER(LEN=40) :: & - 'pair_style lj/cut 2.5', & - 'pair_coeff 1 1 1.0 1.0', & - 'mass 1 2.0' ] CONTAINS FUNCTION absolute_path(filename) + USE keepstuff, ONLY : lmp CHARACTER(LEN=:), ALLOCATABLE :: absolute_path CHARACTER(LEN=*), INTENT(IN) :: filename CHARACTER(LEN=256) :: test_input_directory @@ -60,7 +45,7 @@ END MODULE keepvar FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) USE ISO_C_BINDING, ONLY: c_ptr, c_char, c_int, c_size_t, C_F_POINTER USE liblammps - USE keepvar, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: argc TYPE(c_ptr), VALUE :: argv @@ -97,7 +82,7 @@ END FUNCTION f_lammps_with_C_args SUBROUTINE f_lammps_close() BIND(C) USE ISO_C_BINDING, ONLY: c_null_ptr USE liblammps - USE keepvar, ONLY: lmp + USE keepstuff, ONLY: lmp IMPLICIT NONE CALL lmp%close() @@ -106,7 +91,8 @@ END SUBROUTINE f_lammps_close SUBROUTINE f_lammps_setup_extract_variable () BIND(C) USE LIBLAMMPS - USE keepvar, ONLY : lmp, demo_input, cont_input, pair_input, absolute_path + USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input + USE keepvar, ONLY : absolute_path IMPLICIT NONE ! Had to do this one as one string because lammps_commands_list and @@ -118,8 +104,9 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) // NEW_LINE(' ') // '"""' CALL lmp%command('atom_modify map array') - CALL lmp%commands_list(demo_input) + CALL lmp%commands_list(big_input) CALL lmp%commands_list(cont_input) + CALL lmp%commands_list(more_input) CALL lmp%commands_list(pair_input) CALL lmp%command('variable idx index "hello" "goodbye"') CALL lmp%command('variable lp loop 10') @@ -153,7 +140,7 @@ END SUBROUTINE f_lammps_setup_extract_variable FUNCTION f_lammps_extract_variable_index_1 () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_index_1 CHARACTER(LEN=80) :: str @@ -169,7 +156,7 @@ END FUNCTION f_lammps_extract_variable_index_1 FUNCTION f_lammps_extract_variable_index_2 () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_index_2 CHARACTER(LEN=80) :: str @@ -185,7 +172,7 @@ END FUNCTION f_lammps_extract_variable_index_2 FUNCTION f_lammps_extract_variable_loop () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_loop CHARACTER(LEN=80) :: loop @@ -197,7 +184,8 @@ END FUNCTION f_lammps_extract_variable_loop FUNCTION f_lammps_extract_variable_loop_pad () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_loop_pad CHARACTER(LEN=20) :: loop @@ -209,8 +197,8 @@ END FUNCTION f_lammps_extract_variable_loop_pad FUNCTION f_lammps_extract_variable_world () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string - + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_world CHARACTER(LEN=20) :: world @@ -222,8 +210,8 @@ END FUNCTION f_lammps_extract_variable_world FUNCTION f_lammps_extract_variable_universe () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string - + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_universe CHARACTER(LEN=20) :: universe @@ -235,7 +223,7 @@ END FUNCTION f_lammps_extract_variable_universe FUNCTION f_lammps_extract_variable_uloop () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_uloop CHARACTER(LEN=80) :: uloop @@ -247,7 +235,8 @@ END FUNCTION f_lammps_extract_variable_uloop FUNCTION f_lammps_extract_variable_string () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_string CHARACTER(LEN=40) :: string @@ -259,7 +248,8 @@ END FUNCTION f_lammps_extract_variable_string FUNCTION f_lammps_extract_variable_format () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_format CHARACTER(LEN=20) :: form @@ -271,7 +261,8 @@ END FUNCTION f_lammps_extract_variable_format FUNCTION f_lammps_extract_variable_format_pad () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_format_pad CHARACTER(LEN=20) :: form @@ -283,7 +274,8 @@ END FUNCTION f_lammps_extract_variable_format_pad FUNCTION f_lammps_extract_variable_getenv () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_getenv CHARACTER(LEN=40) :: string @@ -295,7 +287,8 @@ END FUNCTION f_lammps_extract_variable_getenv FUNCTION f_lammps_extract_variable_file () BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_file CHARACTER(LEN=40) :: string @@ -307,7 +300,7 @@ END FUNCTION f_lammps_extract_variable_file FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(c_double) :: f_lammps_extract_variable_atomfile @@ -320,7 +313,7 @@ END FUNCTION f_lammps_extract_variable_atomfile FUNCTION f_lammps_extract_variable_python(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(c_double) :: f_lammps_extract_variable_python @@ -331,7 +324,7 @@ END FUNCTION f_lammps_extract_variable_python FUNCTION f_lammps_extract_variable_timer() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(c_double) :: f_lammps_extract_variable_timer @@ -341,7 +334,7 @@ END FUNCTION f_lammps_extract_variable_timer FUNCTION f_lammps_extract_variable_internal() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(c_double) :: f_lammps_extract_variable_internal @@ -351,7 +344,7 @@ END FUNCTION f_lammps_extract_variable_internal FUNCTION f_lammps_extract_variable_equal() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE REAL(c_double) :: f_lammps_extract_variable_equal @@ -361,7 +354,7 @@ END FUNCTION f_lammps_extract_variable_equal FUNCTION f_lammps_extract_variable_atom(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(c_double) :: f_lammps_extract_variable_atom @@ -374,7 +367,7 @@ END FUNCTION f_lammps_extract_variable_atom FUNCTION f_lammps_extract_variable_vector(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp + USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i REAL(c_double) :: f_lammps_extract_variable_vector @@ -387,7 +380,8 @@ END FUNCTION f_lammps_extract_variable_vector SUBROUTINE f_lammps_set_variable_string() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int USE LIBLAMMPS - USE keepvar, ONLY : lmp, f2c_string + USE keepstuff, ONLY : lmp + USE keepvar, ONLY : f2c_string IMPLICIT NONE CHARACTER(LEN=40) :: string From f474b67c7c5a94b66cb49086e56b5889842a474e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 09:22:02 -0400 Subject: [PATCH 288/364] update swig interface file for recent changes to the library interface --- tools/swig/lammps.i | 183 ++++++++++++++++++++++++++++++++------------ 1 file changed, 135 insertions(+), 48 deletions(-) diff --git a/tools/swig/lammps.i b/tools/swig/lammps.i index fb4322af34..3c5f43ac2d 100644 --- a/tools/swig/lammps.i +++ b/tools/swig/lammps.i @@ -22,37 +22,69 @@ %{ +/** Data type constants for extracting data from atoms, computes and fixes + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + enum _LMP_DATATYPE_CONST { - LAMMPS_INT = 0, /*!< 32-bit integer (array) */ - LAMMPS_INT_2D = 1, /*!< two-dimensional 32-bit integer array */ - LAMMPS_DOUBLE = 2, /*!< 64-bit double (array) */ - LAMMPS_DOUBLE_2D = 3, /*!< two-dimensional 64-bit double array */ - LAMMPS_INT64 = 4, /*!< 64-bit integer (array) */ - LAMMPS_INT64_2D = 5, /*!< two-dimensional 64-bit integer array */ - LAMMPS_STRING = 6 /*!< C-String */ + LAMMPS_INT = 0, /*!< 32-bit integer (array) */ + LAMMPS_INT_2D = 1, /*!< two-dimensional 32-bit integer array */ + LAMMPS_DOUBLE = 2, /*!< 64-bit double (array) */ + LAMMPS_DOUBLE_2D = 3, /*!< two-dimensional 64-bit double array */ + LAMMPS_INT64 = 4, /*!< 64-bit integer (array) */ + LAMMPS_INT64_2D = 5, /*!< two-dimensional 64-bit integer array */ + LAMMPS_STRING = 6 /*!< C-String */ }; /** Style constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ enum _LMP_STYLE_CONST { - LMP_STYLE_GLOBAL=0, /*!< return global data */ - LMP_STYLE_ATOM =1, /*!< return per-atom data */ - LMP_STYLE_LOCAL =2 /*!< return local data */ + LMP_STYLE_GLOBAL = 0, /*!< return global data */ + LMP_STYLE_ATOM = 1, /*!< return per-atom data */ + LMP_STYLE_LOCAL = 2 /*!< return local data */ }; /** Type and size constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ enum _LMP_TYPE_CONST { - LMP_TYPE_SCALAR=0, /*!< return scalar */ - LMP_TYPE_VECTOR=1, /*!< return vector */ - LMP_TYPE_ARRAY =2, /*!< return array */ - LMP_SIZE_VECTOR=3, /*!< return length of vector */ - LMP_SIZE_ROWS =4, /*!< return number of rows */ - LMP_SIZE_COLS =5 /*!< return number of columns */ + LMP_TYPE_SCALAR = 0, /*!< return scalar */ + LMP_TYPE_VECTOR = 1, /*!< return vector */ + LMP_TYPE_ARRAY = 2, /*!< return array */ + LMP_SIZE_VECTOR = 3, /*!< return length of vector */ + LMP_SIZE_ROWS = 4, /*!< return number of rows */ + LMP_SIZE_COLS = 5 /*!< return number of columns */ +}; + +/** Error codes to select the suitable function in the Error class + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + +enum _LMP_ERROR_CONST { + LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ + LMP_ERROR_ONE = 1, /*!< called from one MPI rank */ + LMP_ERROR_ALL = 2, /*!< called from all MPI ranks */ + LMP_ERROR_WORLD = 4, /*!< error on Comm::world */ + LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ +}; + +/** Variable style constants for extracting data from variables. + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + +enum _LMP_VAR_CONST { + LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ + LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ + LMP_VAR_VECTOR = 2, /*!< compatible with vector-style variables */ + LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ }; /* @@ -65,10 +97,13 @@ extern void lammps_mpi_init(); extern void lammps_mpi_finalize(); extern void lammps_kokkos_finalize(); extern void lammps_python_finalize(); +extern void lammps_error(void *handle, int error_type, const char *error_text); + extern void lammps_file(void *handle, const char *file); extern char *lammps_command(void *handle, const char *cmd); extern void lammps_commands_list(void *handle, int ncmd, const char **cmds); extern void lammps_commands_string(void *handle, const char *str); + extern double lammps_get_natoms(void *handle); extern double lammps_get_thermo(void *handle, const char *keyword); extern void lammps_extract_box(void *handle, double *boxlo, double *boxhi, @@ -81,12 +116,16 @@ extern int lammps_get_mpi_comm(void *handle); extern int lammps_extract_setting(void *handle, const char *keyword); extern int lammps_extract_global_datatype(void *handle, const char *name); extern void *lammps_extract_global(void *handle, const char *name); + extern int lammps_extract_atom_datatype(void *handle, const char *name); extern void *lammps_extract_atom(void *handle, const char *name); + extern void *lammps_extract_compute(void *handle, char *id, int, int); extern void *lammps_extract_fix(void *handle, char *, int, int, int, int); extern void *lammps_extract_variable(void *handle, char *, char *); +extern int lammps_extract_variable_datatype(void *handle, const char *name); extern int lammps_set_variable(void *, char *, char *); + extern void lammps_gather_atoms(void *, char *, int, int, void *); extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); @@ -107,6 +146,7 @@ extern int lammps_find_fix_neighlist(void*, char *, int); extern int lammps_find_compute_neighlist(void*, char *, int); extern int lammps_neighlist_num_elements(void*, int); extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); + extern int lammps_version(void *handle); extern void lammps_get_os_info(char *buffer, int buf_size); extern int lammps_config_has_mpi_support(); @@ -151,46 +191,79 @@ extern void lammps_fix_external_set_virial_global(void *handle, const char *id extern void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); extern void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val); +extern void lammps_flush_buffers(void *ptr); extern void lammps_free(void *ptr); extern int lammps_is_running(void *handle); extern void lammps_force_timeout(void *handle); extern int lammps_has_error(void *handle); extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +extern int lammps_python_api_version(); -extern void lammps_flush_buffers(void *ptr); %} +/** Data type constants for extracting data from atoms, computes and fixes + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + enum _LMP_DATATYPE_CONST { - LAMMPS_INT = 0, /*!< 32-bit integer (array) */ - LAMMPS_INT_2D = 1, /*!< two-dimensional 32-bit integer array */ - LAMMPS_DOUBLE = 2, /*!< 64-bit double (array) */ - LAMMPS_DOUBLE_2D = 3, /*!< two-dimensional 64-bit double array */ - LAMMPS_INT64 = 4, /*!< 64-bit integer (array) */ - LAMMPS_INT64_2D = 5, /*!< two-dimensional 64-bit integer array */ - LAMMPS_STRING = 6 /*!< C-String */ + LAMMPS_INT = 0, /*!< 32-bit integer (array) */ + LAMMPS_INT_2D = 1, /*!< two-dimensional 32-bit integer array */ + LAMMPS_DOUBLE = 2, /*!< 64-bit double (array) */ + LAMMPS_DOUBLE_2D = 3, /*!< two-dimensional 64-bit double array */ + LAMMPS_INT64 = 4, /*!< 64-bit integer (array) */ + LAMMPS_INT64_2D = 5, /*!< two-dimensional 64-bit integer array */ + LAMMPS_STRING = 6 /*!< C-String */ }; /** Style constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ enum _LMP_STYLE_CONST { - LMP_STYLE_GLOBAL=0, /*!< return global data */ - LMP_STYLE_ATOM =1, /*!< return per-atom data */ - LMP_STYLE_LOCAL =2 /*!< return local data */ + LMP_STYLE_GLOBAL = 0, /*!< return global data */ + LMP_STYLE_ATOM = 1, /*!< return per-atom data */ + LMP_STYLE_LOCAL = 2 /*!< return local data */ }; /** Type and size constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py */ + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ enum _LMP_TYPE_CONST { - LMP_TYPE_SCALAR=0, /*!< return scalar */ - LMP_TYPE_VECTOR=1, /*!< return vector */ - LMP_TYPE_ARRAY =2, /*!< return array */ - LMP_SIZE_VECTOR=3, /*!< return length of vector */ - LMP_SIZE_ROWS =4, /*!< return number of rows */ - LMP_SIZE_COLS =5 /*!< return number of columns */ + LMP_TYPE_SCALAR = 0, /*!< return scalar */ + LMP_TYPE_VECTOR = 1, /*!< return vector */ + LMP_TYPE_ARRAY = 2, /*!< return array */ + LMP_SIZE_VECTOR = 3, /*!< return length of vector */ + LMP_SIZE_ROWS = 4, /*!< return number of rows */ + LMP_SIZE_COLS = 5 /*!< return number of columns */ +}; + +/** Error codes to select the suitable function in the Error class + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + +enum _LMP_ERROR_CONST { + LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ + LMP_ERROR_ONE = 1, /*!< called from one MPI rank */ + LMP_ERROR_ALL = 2, /*!< called from all MPI ranks */ + LMP_ERROR_WORLD = 4, /*!< error on Comm::world */ + LMP_ERROR_UNIVERSE = 8 /*!< error on Comm::universe */ +}; + +/** Variable style constants for extracting data from variables. + * + * Must be kept in sync with the equivalent constants in src/library.h, + * python/lammps/constants.py, and fortran/lammps.f90 */ + +enum _LMP_VAR_CONST { + LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ + LMP_VAR_ATOM = 1, /*!< compatible with atom-style variables */ + LMP_VAR_VECTOR = 2, /*!< compatible with vector-style variables */ + LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ }; /* @@ -203,10 +276,13 @@ extern void lammps_mpi_init(); extern void lammps_mpi_finalize(); extern void lammps_kokkos_finalize(); extern void lammps_python_finalize(); +extern void lammps_error(void *handle, int error_type, const char *error_text); + extern void lammps_file(void *handle, const char *file); extern char *lammps_command(void *handle, const char *cmd); extern void lammps_commands_list(void *handle, int ncmd, const char **cmds); extern void lammps_commands_string(void *handle, const char *str); + extern double lammps_get_natoms(void *handle); extern double lammps_get_thermo(void *handle, const char *keyword); extern void lammps_extract_box(void *handle, double *boxlo, double *boxhi, @@ -219,12 +295,16 @@ extern int lammps_get_mpi_comm(void *handle); extern int lammps_extract_setting(void *handle, const char *keyword); extern int lammps_extract_global_datatype(void *handle, const char *name); extern void *lammps_extract_global(void *handle, const char *name); + extern int lammps_extract_atom_datatype(void *handle, const char *name); extern void *lammps_extract_atom(void *handle, const char *name); + extern void *lammps_extract_compute(void *handle, char *id, int, int); extern void *lammps_extract_fix(void *handle, char *, int, int, int, int); extern void *lammps_extract_variable(void *handle, char *, char *); +extern int lammps_extract_variable_datatype(void *handle, const char *name); extern int lammps_set_variable(void *, char *, char *); + extern void lammps_gather_atoms(void *, char *, int, int, void *); extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); @@ -245,6 +325,7 @@ extern int lammps_find_fix_neighlist(void*, char *, int); extern int lammps_find_compute_neighlist(void*, char *, int); extern int lammps_neighlist_num_elements(void*, int); extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); + extern int lammps_version(void *handle); extern void lammps_get_os_info(char *buffer, int buf_size); extern int lammps_config_has_mpi_support(); @@ -268,14 +349,20 @@ extern int lammps_id_name(void *, const char *, int, char *buffer, int buf_si extern int lammps_plugin_count(); extern int lammps_plugin_name(int, char *, char *, int); /* -extern int lammps_encode_image_flags(int ix, int iy, int iz); -extern void lammps_decode_image_flags(int image, int *flags); -extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); -extern void lammps_decode_image_flags(int64_t image, int *flags); -typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); -extern void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr); -extern void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng); -extern void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); + * Have not found a good way to map these functions in a general way. + * So some individual customization for the specific use case and compilation is needed. + * + extern int lammps_encode_image_flags(int ix, int iy, int iz); + extern void lammps_decode_image_flags(int image, int *flags); + extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); + extern void lammps_decode_image_flags(int64_t image, int *flags); + + * Supporting the fix external callback mechanism will require extra code specific to the application. + typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); + extern void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr); + * these two functions can only be used from the callback, so we don't support them either + extern void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng); + extern void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); */ extern double **lammps_fix_external_get_force(void *handle, const char *id); extern void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng); @@ -283,12 +370,12 @@ extern void lammps_fix_external_set_virial_global(void *handle, const char *id extern void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); extern void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val); +extern void lammps_flush_buffers(void *ptr); extern void lammps_free(void *ptr); extern int lammps_is_running(void *handle); extern void lammps_force_timeout(void *handle); extern int lammps_has_error(void *handle); extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +extern int lammps_python_api_version(); -extern void lammps_flush_buffers(void *ptr); - -/* last revised on 4 February 2022 */ +/* last revised on 3 October 2022 */ From ea512ce2bbaaed4f9d68fc28aa836af34dee2e40 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 09:22:28 -0400 Subject: [PATCH 289/364] update comments about which files to keep synchronized for consistency --- python/lammps/constants.py | 3 ++- src/library.h | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/python/lammps/constants.py b/python/lammps/constants.py index a76be819fe..6fe7750326 100644 --- a/python/lammps/constants.py +++ b/python/lammps/constants.py @@ -22,7 +22,8 @@ LAMMPS_INT64 = 4 LAMMPS_INT64_2D = 5 LAMMPS_STRING = 6 -# these must be kept in sync with the enums in library.h +# these must be kept in sync with the enums in src/library.h, tools/swig/lammps.i +# and the constants in fortran/lammps.f90 LMP_STYLE_GLOBAL = 0 LMP_STYLE_ATOM = 1 LMP_STYLE_LOCAL = 2 diff --git a/src/library.h b/src/library.h index 9adb274518..814c24210d 100644 --- a/src/library.h +++ b/src/library.h @@ -40,8 +40,8 @@ /** Data type constants for extracting data from atoms, computes and fixes * - * Must be kept in sync with the equivalent constants in lammps/constants.py - * and fortran/lammps.f90 */ + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ enum _LMP_DATATYPE_CONST { LAMMPS_INT = 0, /*!< 32-bit integer (array) */ @@ -55,8 +55,8 @@ enum _LMP_DATATYPE_CONST { /** Style constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py - * and fortran/lammps.f90 */ + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ enum _LMP_STYLE_CONST { LMP_STYLE_GLOBAL = 0, /*!< return global data */ @@ -66,8 +66,8 @@ enum _LMP_STYLE_CONST { /** Type and size constants for extracting data from computes and fixes. * - * Must be kept in sync with the equivalent constants in lammps/constants.py - * and fortran/lammps.f90 */ + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ enum _LMP_TYPE_CONST { LMP_TYPE_SCALAR = 0, /*!< return scalar */ @@ -80,8 +80,8 @@ enum _LMP_TYPE_CONST { /** Error codes to select the suitable function in the Error class * - * Must be kept in sync with the equivalent constants in lammps/constants.py - * and fortran/lammps.f90 */ + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ enum _LMP_ERROR_CONST { LMP_ERROR_WARNING = 0, /*!< call Error::warning() */ @@ -93,8 +93,8 @@ enum _LMP_ERROR_CONST { /** Variable style constants for extracting data from variables. * - * Must be kept in sync with the equivalent constants in lammps/constants.py - * and fortran/lammps.f90 */ + * Must be kept in sync with the equivalent constants in python/lammps/constants.py, + * fortran/lammps.f90, and tools/swig/lammps.i */ enum _LMP_VAR_CONST { LMP_VAR_EQUAL = 0, /*!< compatible with equal-style variables */ From 658df50e97ac4bc6e65b228d32942375402e15b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 09:37:05 -0400 Subject: [PATCH 290/364] make getenv style variable test fully portable --- unittest/fortran/test_fortran_extract_variable.f90 | 3 +-- unittest/fortran/wrap_extract_variable.cpp | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index 0b16e61894..da7b2d5835 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -118,8 +118,7 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) CALL lmp%command('variable ex equal exp(v_lp)') CALL lmp%command('variable fmt format ex %.6G') CALL lmp%command('variable fmt_pad format ex %08.6g') - ! USERNAME should exist on all platforms (incl. Windows) - CALL lmp%command('variable username getenv USERNAME') + CALL lmp%command('variable username getenv FORTRAN_USER') CALL lmp%command('variable greeting file ' // absolute_path('greetings.txt')) CALL lmp%command('variable atfile atomfile ' & // absolute_path('atomdata.txt')) diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index ba439fbda4..47ca0c205d 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -3,6 +3,8 @@ #include "lammps.h" #include "library.h" +#include "platform.h" + #include #include #include @@ -175,8 +177,9 @@ TEST_F(LAMMPS_extract_variable, format_pad) TEST_F(LAMMPS_extract_variable, getenv) { + LAMMPS_NS::platform::putenv("FORTRAN_USER=myuser"); f_lammps_setup_extract_variable(); - char *env = std::getenv("USERNAME"); + char *env = std::getenv("FORTRAN_USER"); char *fenv = f_lammps_extract_variable_getenv(); EXPECT_STREQ(fenv, env); std::free(fenv); From 6a2023e7df80da3624bec2c835f4a184ca08ca25 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 09:55:20 -0400 Subject: [PATCH 291/364] spelling --- doc/src/Build_manual.rst | 2 +- doc/utils/sphinx-config/false_positives.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index a920688923..c71c536e10 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -216,7 +216,7 @@ be multiple tests run automatically: - A test that only standard, printable ASCII text characters are used. This runs the command ``env LC_ALL=C grep -n '[^ -~]' src/*.rst`` and thus prints all offending lines with filename and line number - prepended to the screen. Special characters like greek letters + prepended to the screen. Special characters like Greek letters (:math:`\alpha~~\sigma~~\epsilon`), super- or subscripts (:math:`x^2~~\mathrm{U}_{LJ}`), mathematical expressions (:math:`\frac{1}{2}\mathrm{N}~~x\to\infty`), or the Angstrom symbol diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 9708c02403..85df97b332 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1489,6 +1489,7 @@ interfacial interial interlayer intermolecular +interoperable Interparticle interstitials intertube @@ -3622,6 +3623,7 @@ Universite unix unmaintained unoptimized +unordered unpadded unphysical unphysically From 94ff9cea4cfb75ad3d1e2f8435670f58c3fa842f Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 3 Oct 2022 19:43:37 +0200 Subject: [PATCH 292/364] Revert "update documentation: explain fix_modify pair every N" This reverts commit 2f231bcd50dd958a12aac2661ea18df340756ce5. --- doc/src/fix_modify.rst | 4 +--- doc/src/fix_pair.rst | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/doc/src/fix_modify.rst b/doc/src/fix_modify.rst index 33b11a9764..e0cf3a34c7 100644 --- a/doc/src/fix_modify.rst +++ b/doc/src/fix_modify.rst @@ -12,7 +12,7 @@ Syntax * fix-ID = ID of the fix to modify * one or more keyword/value pairs may be appended -* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* or *every* +* keyword = *bodyforces* or *colname* or *dynamic/dof* or *energy* or *press* or *respa* or *temp* or *virial* .. parsed-literal:: @@ -29,7 +29,6 @@ Syntax *respa* value = *1* to *max respa level* or *0* (for outermost level) *temp* value = compute ID that calculates a temperature *virial* value = *yes* or *no* - *every* arg = N Examples """""""" @@ -40,7 +39,6 @@ Examples fix_modify 1 energy yes fix_modify tether respa 2 fix_modify ave colname c_thermo_press Pressure colname 1 Temperature - fix_modify pair every 10 Description """"""""""" diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index 374ac121f0..abb44718cd 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -86,9 +86,8 @@ Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" No information about this fix is written to :doc:`binary restart files -`. -The timesteps on which fix pair will extract per-atom quantities from a pair -style can be modified by *every* option of :doc:`fix_modify `. +`. None of the :doc:`fix_modify ` options are +relevant to this fix. As explained above, this fix produces a per-atom vector or array which can be accessed by various :doc:`output commands `. If @@ -104,7 +103,6 @@ Related commands """""""""""""""" :doc:`compute pair ` -:doc:`fix_modify ` Default """"""" From ccdcae0a99217110bebf8a2922319ab37a52834d Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 3 Oct 2022 19:47:02 +0200 Subject: [PATCH 293/364] fix_pair.h/cpp: remove modify_param(int, char **) --- src/fix_pair.cpp | 16 ---------------- src/fix_pair.h | 2 -- 2 files changed, 18 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index d33324805d..b71e65b4b7 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -356,19 +356,3 @@ double FixPair::memory_usage() else bytes += (double)atom->nmax*ncols * sizeof(double); return bytes; } - -int FixPair::modify_param(int narg, char **arg) { - int processed_args=0; - int iarg = 0; - while (iarg < narg) { - if (strcmp(arg[iarg], "every") == 0) { - nevery = utils::inumeric(FLERR, arg[iarg+1], false, lmp); - if (nevery < 1) error->all(FLERR, "Illegal fix_modify pair every value: {}", nevery); - iarg += 2; - processed_args+=2; - } else - iarg +=1; - } - - return processed_args; // how many arguments were processed -} diff --git a/src/fix_pair.h b/src/fix_pair.h index 56d092c71d..c3d8454185 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -45,8 +45,6 @@ class FixPair : public Fix { double memory_usage() override; - int modify_param(int, char **) override; - private: int nevery,nfield,ncols; bigint lasttime; From ba27ecf6102b17d1f92037e488effbcad279cd77 Mon Sep 17 00:00:00 2001 From: rohskopf Date: Mon, 3 Oct 2022 11:53:41 -0600 Subject: [PATCH 294/364] Add optional full flag to pair_zero --- src/pair_zero.cpp | 30 ++++++++++++++++++++++++++++-- src/pair_zero.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/pair_zero.cpp b/src/pair_zero.cpp index 83505edd35..e253cd2aa5 100644 --- a/src/pair_zero.cpp +++ b/src/pair_zero.cpp @@ -21,6 +21,8 @@ #include "comm.h" #include "error.h" #include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" #include @@ -34,6 +36,7 @@ PairZero::PairZero(LAMMPS *lmp) : Pair(lmp) writedata = 1; single_enable = 1; respa_enable = 1; + fullneighflag = 0; } /* ---------------------------------------------------------------------- */ @@ -85,12 +88,23 @@ void PairZero::allocate() void PairZero::settings(int narg, char **arg) { - if ((narg != 1) && (narg != 2)) error->all(FLERR, "Illegal pair_style command"); + if ((narg != 1) && (narg != 2) && (narg != 3)) error->all(FLERR, "Illegal pair_style command"); cut_global = utils::numeric(FLERR, arg[0], false, lmp); - if (narg == 2) { + + if (narg == 2){ if (strcmp("nocoeff", arg[1]) == 0) coeffflag = 0; + else if(strcmp("full", arg[1]) == 0) + fullneighflag = 1; + else + error->all(FLERR, "Illegal pair_style command"); + } + else if (narg == 3) { + if (strcmp("nocoeff", arg[1]) == 0 || strcmp("nocoeff", arg[2]) == 0) + coeffflag = 0; + else if(strcmp("full", arg[1]) == 0 || strcmp("full", arg[2]) == 0) + fullneighflag = 1; else error->all(FLERR, "Illegal pair_style command"); } @@ -134,6 +148,18 @@ void PairZero::coeff(int narg, char **arg) if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairZero::init_style() +{ + if (fullneighflag == 0) + neighbor->add_request(this, NeighConst::REQ_DEFAULT); + else + neighbor->add_request(this, NeighConst::REQ_FULL); +} + /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ diff --git a/src/pair_zero.h b/src/pair_zero.h index 03b6d096a1..10102f1cad 100644 --- a/src/pair_zero.h +++ b/src/pair_zero.h @@ -42,6 +42,7 @@ class PairZero : public Pair { void compute_outer(int, int) override; void settings(int, char **) override; void coeff(int, char **) override; + void init_style() override; double init_one(int, int) override; void write_restart(FILE *) override; void read_restart(FILE *) override; @@ -55,6 +56,7 @@ class PairZero : public Pair { double cut_global; double **cut; int coeffflag; + int fullneighflag; // 0 for half list, 1 for full list virtual void allocate(); }; From c82fdd4898719dadca4ffc72746e1a5acaeefa3b Mon Sep 17 00:00:00 2001 From: rohskopf Date: Mon, 3 Oct 2022 11:57:47 -0600 Subject: [PATCH 295/364] Add docs --- doc/src/pair_zero.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/src/pair_zero.rst b/doc/src/pair_zero.rst index 062b5204f8..0e6bac643a 100644 --- a/doc/src/pair_zero.rst +++ b/doc/src/pair_zero.rst @@ -8,11 +8,12 @@ Syntax .. code-block:: LAMMPS - pair_style zero cutoff [nocoeff] + pair_style zero cutoff [nocoeff] [full] * zero = style name of this pair style * cutoff = global cutoff (distance units) * nocoeff = ignore all pair_coeff parameters (optional) +* full = build full neighbor list (optional) Examples """""""" @@ -45,6 +46,9 @@ section for any pair style. Similarly, any pair_coeff commands will only be checked for the atom type numbers and the rest ignored. In this case, only the global cutoff will be used. +The optional *full* flag builds a full neighbor list instead of the default +half neighbor list. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the From 981f75d92fa685b25d5f2828dc3c3635910fa8c8 Mon Sep 17 00:00:00 2001 From: rohskopf Date: Mon, 3 Oct 2022 12:40:05 -0600 Subject: [PATCH 296/364] Example in docs --- doc/src/Python_neighbor.rst | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/doc/src/Python_neighbor.rst b/doc/src/Python_neighbor.rst index 00c4cc8996..8201955b6c 100644 --- a/doc/src/Python_neighbor.rst +++ b/doc/src/Python_neighbor.rst @@ -38,6 +38,40 @@ using the NumPy access method. for n in np.nditer(nlist): print(" atom {} with ID {}".format(n,tags[n])) +Another example for extracting a full neighbor list without evaluating a +potential is shown below. + +.. code-block:: python + + from lammps import lammps + import numpy as np + + lmp = lammps() + lmp.commands_string(""" + newton off + region box block -2 2 -2 2 -2 2 + lattice fcc 1.0 + create_box 1 box + create_atoms 1 box + mass 1 1.0 + pair_style zero 1.0 full + pair_coeff * * + run 0 post no""") + + # look up the neighbor list + nlidx = lmp.find_pair_neighlist('zero') + nl = lmp.numpy.get_neighlist(nlidx) + tags = lmp.extract_atom('id') + print("full neighbor list with {} entries".format(nl.size)) + # print neighbor list contents + for i in range(0,nl.size): + idx, nlist = nl.get(i) + print("\natom {} with ID {} has {} neighbors:".format(idx,tags[idx],nlist.size)) + if nlist.size > 0: + for n in np.nditer(nlist): + pass + print(" atom {} with ID {}".format(n,tags[n])) + **Methods:** * :py:meth:`lammps.get_neighlist() `: Get neighbor list for given index From 82bf23401f4747338eacc3d5c2d94ece012d8ab3 Mon Sep 17 00:00:00 2001 From: rohskopf Date: Mon, 3 Oct 2022 12:45:18 -0600 Subject: [PATCH 297/364] Fix whitespace --- doc/src/Python_neighbor.rst | 2 +- src/pair_zero.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Python_neighbor.rst b/doc/src/Python_neighbor.rst index 8201955b6c..755b83da81 100644 --- a/doc/src/Python_neighbor.rst +++ b/doc/src/Python_neighbor.rst @@ -38,7 +38,7 @@ using the NumPy access method. for n in np.nditer(nlist): print(" atom {} with ID {}".format(n,tags[n])) -Another example for extracting a full neighbor list without evaluating a +Another example for extracting a full neighbor list without evaluating a potential is shown below. .. code-block:: python diff --git a/src/pair_zero.cpp b/src/pair_zero.cpp index e253cd2aa5..e4d98ad66e 100644 --- a/src/pair_zero.cpp +++ b/src/pair_zero.cpp @@ -91,7 +91,7 @@ void PairZero::settings(int narg, char **arg) if ((narg != 1) && (narg != 2) && (narg != 3)) error->all(FLERR, "Illegal pair_style command"); cut_global = utils::numeric(FLERR, arg[0], false, lmp); - + if (narg == 2){ if (strcmp("nocoeff", arg[1]) == 0) coeffflag = 0; From 21aded5e4ee6139e9ddefecf8f729f210251cc5b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 15:14:54 -0400 Subject: [PATCH 298/364] silence compiler warning --- src/fix_ave_time.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_ave_time.cpp b/src/fix_ave_time.cpp index 3eeed90e2f..bd8ed1468d 100644 --- a/src/fix_ave_time.cpp +++ b/src/fix_ave_time.cpp @@ -895,7 +895,7 @@ void FixAveTime::invoke_vector(bigint ntimestep) int FixAveTime::column_length(int dynamic) { - int m,length,lengthone; + int length,lengthone; // determine nrows for static values From 840e3398b8b99aadb5cbe104c1c7a6ce2b323956 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 15:36:19 -0400 Subject: [PATCH 299/364] silence warning with CMake 3.24 and later --- cmake/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 28c3d6c027..8267a9bf91 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -12,6 +12,11 @@ endif() if(POLICY CMP0109) cmake_policy(SET CMP0109 OLD) endif() +# set policy to silence warnings about timestamps of downloaded files. review occasionally if it may be set to NEW +if(POLICY CMP0135) + cmake_policy(SET CMP0135 OLD) +endif() + ######################################## project(lammps CXX) From 2d3e4fdd9a601868cb4e77db4073ac374b9392b1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 15:24:05 -0400 Subject: [PATCH 300/364] make MDI package cmake config compatible with multi-config builders --- cmake/Modules/Packages/MDI.cmake | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index edae4ffcbd..82b036a583 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -70,23 +70,22 @@ if(DOWNLOAD_MDI) -Dplugins=ON -Dpython_plugins=${MDI_USE_PYTHON_PLUGINS} UPDATE_COMMAND "" - INSTALL_COMMAND "" - BUILD_BYPRODUCTS "/MDI_Library/libmdi.a" + BUILD_BYPRODUCTS "/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" ) # where is the compiled library? - ExternalProject_get_property(mdi_build BINARY_DIR) - set(MDI_BINARY_DIR "${BINARY_DIR}/MDI_Library") + ExternalProject_get_property(mdi_build INSTALL_DIR) # workaround for older CMake versions - file(MAKE_DIRECTORY ${MDI_BINARY_DIR}) + file(MAKE_DIRECTORY ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/mdi) + file(MAKE_DIRECTORY ${INSTALL_DIR}/include/mdi) # create imported target for the MDI library add_library(LAMMPS::MDI UNKNOWN IMPORTED) add_dependencies(LAMMPS::MDI mdi_build) set_target_properties(LAMMPS::MDI PROPERTIES - IMPORTED_LOCATION "${MDI_BINARY_DIR}/libmdi.a" - INTERFACE_INCLUDE_DIRECTORIES ${MDI_BINARY_DIR} - ) + IMPORTED_LOCATION "${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include/mdi + ) set(MDI_DEP_LIBS "") # if compiling with python plugins we need From aff58465f208baa7f85291d2ac83b897608259ef Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 3 Oct 2022 15:15:15 -0500 Subject: [PATCH 301/364] Reimplemented absolute_path using platform::path_join for portability --- .../fortran/test_fortran_extract_variable.f90 | 39 ++++++++++++++++++- unittest/fortran/wrap_extract_variable.cpp | 13 +++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index da7b2d5835..af6ed0c019 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -1,17 +1,54 @@ MODULE keepvar + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_size_t, c_char USE liblammps IMPLICIT NONE + INTERFACE + FUNCTION c_path_join(a, b) BIND(C) + IMPORT :: c_ptr + TYPE(c_ptr), VALUE :: a, b + TYPE(c_ptr) :: c_path_join + END FUNCTION c_path_join + + FUNCTION c_strlen(str) BIND(C,name='strlen') + IMPORT :: c_ptr, c_size_t + IMPLICIT NONE + TYPE(c_ptr), INTENT(IN), VALUE :: str + INTEGER(c_size_t) :: c_strlen + END FUNCTION c_strlen + + SUBROUTINE c_free(ptr) BIND(C,name='free') + IMPORT :: c_ptr + TYPE(c_ptr), VALUE :: ptr + END SUBROUTINE c_free + END INTERFACE + CONTAINS FUNCTION absolute_path(filename) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_size_t, c_char, C_F_POINTER USE keepstuff, ONLY : lmp CHARACTER(LEN=:), ALLOCATABLE :: absolute_path CHARACTER(LEN=*), INTENT(IN) :: filename CHARACTER(LEN=256) :: test_input_directory + TYPE(c_ptr) :: c_test_input_directory, c_absolute_path, c_filename + CHARACTER(LEN=1,KIND=c_char), DIMENSION(:), POINTER :: F_absolute_path + INTEGER :: i + INTEGER(c_size_t) :: length test_input_directory = lmp%extract_variable('input_dir') - absolute_path = TRIM(test_input_directory) // '/' // TRIM(filename) + c_test_input_directory = f2c_string(test_input_directory) + c_filename = f2c_string(filename) + c_absolute_path = c_path_join(c_test_input_directory, c_filename) + length = c_strlen(c_absolute_path) + CALL C_F_POINTER(c_absolute_path, F_absolute_path, [length]) + ALLOCATE( CHARACTER(LEN=length) :: absolute_path ) + DO i = 1, length + absolute_path(i:i) = F_absolute_path(i) + END DO + CALL c_free(c_filename) + CALL c_free(c_test_input_directory) + CALL c_free(c_absolute_path) END FUNCTION absolute_path FUNCTION f2c_string(f_string) RESULT(ptr) diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index 47ca0c205d..095b0b3be7 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -45,6 +45,19 @@ double f_lammps_extract_variable_equal(); double f_lammps_extract_variable_atom(int); double f_lammps_extract_variable_vector(int); void f_lammps_set_variable_string(); +char* c_path_join(const char*, const char*); +} + +char* c_path_join(const char* a, const char* b) +{ + std::string A = a; + std::string B = b; + std::string C = LAMMPS_NS::platform::path_join(A, B); + size_t length = C.length() + 1; + char *retval = (char*) malloc(length*sizeof(char)); + C.copy(retval, length); + retval[length-1] = '\0'; + return retval; } class LAMMPS_extract_variable : public ::testing::Test { From bb6a1180067e6de2639120ff5742ff9dfb492f96 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 16:31:23 -0400 Subject: [PATCH 302/364] refactor for simpler flow of control. apply clang-format. --- src/pair_zero.cpp | 33 ++++++++++++++++----------------- src/pair_zero.h | 4 +--- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/pair_zero.cpp b/src/pair_zero.cpp index e4d98ad66e..b554f78b7f 100644 --- a/src/pair_zero.cpp +++ b/src/pair_zero.cpp @@ -88,25 +88,24 @@ void PairZero::allocate() void PairZero::settings(int narg, char **arg) { - if ((narg != 1) && (narg != 2) && (narg != 3)) error->all(FLERR, "Illegal pair_style command"); + if (narg < 1) utils::missing_cmd_args(FLERR, "pair_style zero", error); cut_global = utils::numeric(FLERR, arg[0], false, lmp); - if (narg == 2){ - if (strcmp("nocoeff", arg[1]) == 0) + // reset to defaults + coeffflag = 1; + fullneighflag = 0; + + int iarg = 1; + while (iarg < narg) { + if (strcmp("nocoeff", arg[iarg]) == 0) { coeffflag = 0; - else if(strcmp("full", arg[1]) == 0) + ++iarg; + } else if (strcmp("full", arg[iarg]) == 0) { fullneighflag = 1; - else - error->all(FLERR, "Illegal pair_style command"); - } - else if (narg == 3) { - if (strcmp("nocoeff", arg[1]) == 0 || strcmp("nocoeff", arg[2]) == 0) - coeffflag = 0; - else if(strcmp("full", arg[1]) == 0 || strcmp("full", arg[2]) == 0) - fullneighflag = 1; - else - error->all(FLERR, "Illegal pair_style command"); + ++iarg; + } else + error->all(FLERR, "Unknown pair style zero option {}", arg[iarg]); } // reset cutoffs that have been explicitly set @@ -154,10 +153,10 @@ void PairZero::coeff(int narg, char **arg) void PairZero::init_style() { - if (fullneighflag == 0) - neighbor->add_request(this, NeighConst::REQ_DEFAULT); - else + if (fullneighflag) neighbor->add_request(this, NeighConst::REQ_FULL); + else + neighbor->add_request(this, NeighConst::REQ_DEFAULT); } /* ---------------------------------------------------------------------- diff --git a/src/pair_zero.h b/src/pair_zero.h index 10102f1cad..06d7b2ab72 100644 --- a/src/pair_zero.h +++ b/src/pair_zero.h @@ -56,12 +56,10 @@ class PairZero : public Pair { double cut_global; double **cut; int coeffflag; - int fullneighflag; // 0 for half list, 1 for full list + int fullneighflag; // 0 for half list, 1 for full list virtual void allocate(); }; - } // namespace LAMMPS_NS - #endif #endif From 02158516f21b31fe0321d6a71b3d8a542cfdd4cb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 17:58:14 -0400 Subject: [PATCH 303/364] use large string buffers to avoid truncation --- unittest/fortran/test_fortran_extract_variable.f90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index af6ed0c019..1e05dd5a27 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -87,7 +87,7 @@ FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) INTEGER(c_int), INTENT(IN), VALUE :: argc TYPE(c_ptr), VALUE :: argv TYPE(c_ptr), DIMENSION(:), POINTER :: Fargv - INTEGER, PARAMETER :: ARG_LENGTH = 80 + INTEGER, PARAMETER :: ARG_LENGTH = 256 TYPE(c_ptr) :: f_lammps_with_C_args CHARACTER(LEN=ARG_LENGTH), DIMENSION(argc) :: args CHARACTER(LEN=1,KIND=c_char), DIMENSION(:), POINTER :: Cstr @@ -179,7 +179,7 @@ FUNCTION f_lammps_extract_variable_index_1 () BIND(C) USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_index_1 - CHARACTER(LEN=80) :: str + CHARACTER(LEN=256) :: str str = lmp%extract_variable("idx") IF ( trim(str) == 'hello' ) THEN @@ -195,7 +195,7 @@ FUNCTION f_lammps_extract_variable_index_2 () BIND(C) USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_index_2 - CHARACTER(LEN=80) :: str + CHARACTER(LEN=256) :: str str = lmp%extract_variable("idx") IF ( trim(str) == 'goodbye' ) THEN @@ -211,7 +211,7 @@ FUNCTION f_lammps_extract_variable_loop () BIND(C) USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_loop - CHARACTER(LEN=80) :: loop + CHARACTER(LEN=256) :: loop loop = lmp%extract_variable('lp') READ(loop,*) f_lammps_extract_variable_loop @@ -262,7 +262,7 @@ FUNCTION f_lammps_extract_variable_uloop () BIND(C) USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int) :: f_lammps_extract_variable_uloop - CHARACTER(LEN=80) :: uloop + CHARACTER(LEN=256) :: uloop uloop = lmp%extract_variable('ulp') READ(uloop,*) f_lammps_extract_variable_uloop @@ -275,7 +275,7 @@ FUNCTION f_lammps_extract_variable_string () BIND(C) USE keepvar, ONLY : f2c_string IMPLICIT NONE TYPE(c_ptr) :: f_lammps_extract_variable_string - CHARACTER(LEN=40) :: string + CHARACTER(LEN=256) :: string string = lmp%extract_variable('str') f_lammps_extract_variable_string = f2c_string(string) From ef3b01f3402cb92ec20902c7c469fdbde2e8b2e9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 18:14:08 -0400 Subject: [PATCH 304/364] add neighbor list access tests. now we can always test for a full list. --- unittest/python/python-commands.py | 69 ++++++++++++++++++++++++++++++ unittest/python/python-numpy.py | 68 +++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/unittest/python/python-commands.py b/unittest/python/python-commands.py index cd77fa21a1..13be27f067 100644 --- a/unittest/python/python-commands.py +++ b/unittest/python/python-commands.py @@ -209,6 +209,75 @@ create_atoms 1 single & self.assertEqual(idx,i) self.assertEqual(num,nlocal-1) + def testNeighborListZeroHalf(self): + self.lmp.commands_string(""" + boundary f f f + units real + region box block -5 5 -5 5 -5 5 + create_box 1 box + mass 1 1.0 + pair_style zero 4.0 + pair_coeff 1 1 + """) + x = [ 0.0, 0.0, 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, + 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.1, + 0.0, 0.0, 1.0 ] + tags = [1, 2, 3, 4, 5, 6, 7] + types = [1, 1, 1, 1, 1, 1, 1] + + self.assertEqual(self.lmp.create_atoms(7, id=tags, type=types, x=x), 7) + nlocal = self.lmp.extract_global("nlocal") + self.assertEqual(nlocal, 7) + + self.lmp.command("run 0 post no") + + self.assertEqual(self.lmp.find_pair_neighlist("zero"),0) + nlist = self.lmp.get_neighlist(0) + self.assertEqual(nlist.size, 7) + for i in range(0,nlist.size): + idx, num, neighs = nlist.get(i) + self.assertEqual(idx,i) + self.assertEqual(num,nlocal-1-i) + + # look up neighbor list by atom index + num, neighs = nlist.find(2) + self.assertEqual(num,4) + self.assertIsNotNone(neighs,None) + # this one will fail + num, neighs = nlist.find(10) + self.assertEqual(num,-1) + self.assertIsNone(neighs,None) + + def testNeighborListZeroFull(self): + self.lmp.commands_string(""" + boundary f f f + units metal + region box block -5 5 -5 5 -5 5 + create_box 1 box + mass 1 1.0 + pair_style zero 4.0 full + pair_coeff * * + """) + x = [ 0.0, 0.0, 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, + 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.1, + 0.0, 0.0, 1.0 ] + tags = [1, 2, 3, 4, 5, 6, 7] + types = [1, 1, 1, 1, 1, 1, 1] + + self.assertEqual(self.lmp.create_atoms(7, id=tags, type=types, x=x), 7) + nlocal = self.lmp.extract_global("nlocal") + self.assertEqual(nlocal, 7) + + self.lmp.command("run 0 post no") + + self.assertEqual(self.lmp.find_pair_neighlist("zero"),0) + nlist = self.lmp.get_neighlist(0) + self.assertEqual(nlist.size, 7) + for i in range(0,nlist.size): + idx, num, neighs = nlist.get(i) + self.assertEqual(idx,i) + self.assertEqual(num,nlocal-1) + @unittest.skipIf(not has_manybody,"Hybrid neighbor list test for manybody potential") def testNeighborListHybrid(self): self.lmp.commands_string(""" diff --git a/unittest/python/python-numpy.py b/unittest/python/python-numpy.py index 7cbae8e48d..3306aba1cd 100644 --- a/unittest/python/python-numpy.py +++ b/unittest/python/python-numpy.py @@ -412,6 +412,74 @@ class PythonNumpy(unittest.TestCase): idx, neighs = nlist.get(i) self.assertEqual(neighs.size,nlocal-1-i) + def testNeighborListZeroHalf(self): + self.lmp.commands_string(""" + boundary f f f + units real + region box block -5 5 -5 5 -5 5 + create_box 1 box + mass 1 1.0 + pair_style zero 4.0 + pair_coeff 1 1 + """) + x = [ 0.0, 0.0, 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, + 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.1, + 0.0, 0.0, 1.0 ] + tags = [1, 2, 3, 4, 5, 6, 7] + types = [1, 1, 1, 1, 1, 1, 1] + + self.assertEqual(self.lmp.create_atoms(7, id=tags, type=types, x=x), 7) + nlocal = self.lmp.extract_global("nlocal") + self.assertEqual(nlocal, 7) + + self.lmp.command("run 0 post no") + + self.assertEqual(self.lmp.find_pair_neighlist("zero"),0) + nlist = self.lmp.numpy.get_neighlist(0) + self.assertEqual(nlist.size, 7) + for i in range(0,nlist.size): + idx, neighs = nlist.get(i) + self.assertEqual(idx,i) + self.assertEqual(neighs.size,nlocal-1-i) + + # look up neighbor list by atom index + neighs = nlist.find(2) + self.assertEqual(neighs.size,4) + self.assertIsNotNone(neighs,None) + # this one will fail + neighs = nlist.find(10) + self.assertIsNone(neighs,None) + + def testNeighborListZeroFull(self): + self.lmp.commands_string(""" + boundary f f f + units metal + region box block -5 5 -5 5 -5 5 + create_box 1 box + mass 1 1.0 + pair_style zero 4.0 full + pair_coeff * * + """) + x = [ 0.0, 0.0, 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, + 0.0, -1.1, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.1, + 0.0, 0.0, 1.0 ] + tags = [1, 2, 3, 4, 5, 6, 7] + types = [1, 1, 1, 1, 1, 1, 1] + + self.assertEqual(self.lmp.create_atoms(7, id=tags, type=types, x=x), 7) + nlocal = self.lmp.extract_global("nlocal") + self.assertEqual(nlocal, 7) + + self.lmp.command("run 0 post no") + + self.assertEqual(self.lmp.find_pair_neighlist("zero"),0) + nlist = self.lmp.numpy.get_neighlist(0) + self.assertEqual(nlist.size, 7) + for i in range(0,nlist.size): + idx, neighs = nlist.get(i) + self.assertEqual(idx,i) + self.assertEqual(neighs.size,nlocal-1) + def testNeighborListCompute(self): self.lmp.commands_string(""" boundary f f f From a9ba96252a10197e56842afcefb8832f791f6340 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 3 Oct 2022 17:44:09 -0500 Subject: [PATCH 305/364] Added warning message if we ever assign to a too-short string; fixed array-reference typo that -f2003 helped catch --- fortran/lammps.f90 | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 8fad0d43e5..2e552f22f0 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -103,7 +103,8 @@ MODULE LIBLAMMPS PROCEDURE :: extract_fix => lmp_extract_fix PROCEDURE :: extract_variable => lmp_extract_variable PROCEDURE :: set_variable => lmp_set_variable - PROCEDURE, PRIVATE :: lmp_gather_atoms_int, lmp_gather_atoms_double + PROCEDURE, PRIVATE :: lmp_gather_atoms_int + PROCEDURE, PRIVATE :: lmp_gather_atoms_double GENERIC :: gather_atoms => lmp_gather_atoms_int, & lmp_gather_atoms_double PROCEDURE, PRIVATE :: lmp_gather_atoms_concat_int @@ -114,7 +115,8 @@ MODULE LIBLAMMPS PROCEDURE, PRIVATE :: lmp_gather_atoms_subset_double GENERIC :: gather_atoms_subset => lmp_gather_atoms_subset_int, & lmp_gather_atoms_subset_double - PROCEDURE, PRIVATE :: lmp_scatter_atoms_int, lmp_scatter_atoms_double + PROCEDURE, PRIVATE :: lmp_scatter_atoms_int + PROCEDURE, PRIVATE :: lmp_scatter_atoms_double GENERIC :: scatter_atoms => lmp_scatter_atoms_int, & lmp_scatter_atoms_double ! @@ -1504,7 +1506,7 @@ CONTAINS Cname = f2c_string(name) Cdata = C_LOC(data(1)) - Cids = C_LOC(ids) + Cids = C_LOC(ids(1)) CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & Cndata, Cids, Cdata) CALL lammps_free(Cname) @@ -1529,7 +1531,7 @@ CONTAINS Cname = f2c_string(name) Cdata = C_LOC(data(1)) - Cids = C_LOC(ids) + Cids = C_LOC(ids(1)) CALL lammps_scatter_atoms_subset(self%handle, Cname, Ctype, Ccount, & Cndata, Cids, Cdata) CALL lammps_free(Cname) @@ -1808,6 +1810,10 @@ CONTAINS IF ( rhs%datatype == DATA_STRING ) THEN lhs = rhs%str + IF ( LEN_TRIM(rhs%str) > LEN(lhs) ) THEN + CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & + 'String provided by user required truncation [Fortran API]') + END IF ELSE CALL assignment_error(rhs, 'string') END IF @@ -1882,6 +1888,10 @@ CONTAINS IF ( rhs%datatype == DATA_STRING ) THEN lhs = rhs%str + IF ( LEN_TRIM(rhs%str) > LEN(lhs) ) THEN + CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & + 'String provided by user required truncation [Fortran API]') + END IF ELSE CALL assignment_error(rhs, 'string') END IF From fcf415d0b1b8b6188f876dba3cc6856b55dd2039 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Mon, 3 Oct 2022 18:01:33 -0500 Subject: [PATCH 306/364] Skipped scatter/gather tests when sizeof(tagint) is 8 --- unittest/fortran/wrap_gather_scatter.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/unittest/fortran/wrap_gather_scatter.cpp b/unittest/fortran/wrap_gather_scatter.cpp index 96397b7681..efb33467d9 100644 --- a/unittest/fortran/wrap_gather_scatter.cpp +++ b/unittest/fortran/wrap_gather_scatter.cpp @@ -50,6 +50,7 @@ protected: TEST_F(LAMMPS_gather_scatter, gather_atoms_masks) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); EXPECT_EQ(f_lammps_gather_atoms_mask(2), 1); @@ -68,6 +69,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_masks) TEST_F(LAMMPS_gather_scatter, gather_atoms_positions) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(1), 1.0); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(2), 1.0); @@ -82,6 +84,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_positions) TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_masks) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 1); EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 1); @@ -100,6 +103,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_masks) TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_positions) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); @@ -114,6 +118,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_positions) TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_masks) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 1); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 1); @@ -129,6 +134,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_masks) TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_positions) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1,2), 0.2); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2,2), 0.1); @@ -140,6 +146,7 @@ TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_positions) TEST_F(LAMMPS_gather_scatter, scatter_atoms_masks) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); lammps_command(lmp, "group special id 1"); lammps_command(lmp, "group other id 2"); @@ -155,6 +162,7 @@ TEST_F(LAMMPS_gather_scatter, scatter_atoms_masks) TEST_F(LAMMPS_gather_scatter, scatter_atoms_positions) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); @@ -179,6 +187,7 @@ TEST_F(LAMMPS_gather_scatter, scatter_atoms_positions) TEST_F(LAMMPS_gather_scatter, scatter_atoms_subset_mask) { + if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); f_lammps_setup_gather_scatter(); EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); From ed8e317ef62646c01c0e4b90253f8f85810f9005 Mon Sep 17 00:00:00 2001 From: Terry Suun Date: Tue, 4 Oct 2022 10:40:32 +0800 Subject: [PATCH 307/364] Added quartic function for explicit pair interaction in pair_style list. --- doc/src/pair_list.rst | 16 ++++++++++++++++ src/MISC/pair_list.cpp | 42 +++++++++++++++++++++++++++++++++++------- src/MISC/pair_list.h | 5 +++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index 321bf61be9..322da79369 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -69,6 +69,7 @@ Here is an example file: 15 259 lj126 1.0 1.0 50.0 15 603 morse 10.0 1.2 2.0 10.0 # and another comment 18 470 harmonic 50.0 1.2 5.0 + 19 332 quartic 5.0 -1.2 1.2 5.0 The style *lj126* computes pairwise interactions with the formula @@ -106,6 +107,21 @@ and the coefficients: Note that the usual 1/2 factor is included in :math:`K`. +The style *quartic* computes pairwise interactions with the formula + +.. math:: + + E = K (r - r_c)^2 (r - r_c -b_1) (r - r_c - b_2) \qquad r < r_c + +and the coefficients: + +* :math:`K` (energy units) +* :math:`b_1` (distance units) +* :math:`b_2` (distance units) +* :math:`r_c` (distance units) + +Note that the cutoff :math:`r_c` should always be specified to ensure zero energy and smooth force at cutoff. + ---------- Mixing, shift, table, tail correction, restart, rRESPA info diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index f6ac2e3190..1eff74564d 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -32,13 +32,14 @@ using namespace LAMMPS_NS; -enum { NONE = 0, HARM, MORSE, LJ126 }; +enum { NONE = 0, HARM, MORSE, LJ126, QUARTIC }; static std::map stylename = { { "none", NONE }, { "harmonic", HARM }, { "morse", MORSE }, - { "lj126", LJ126 } + { "lj126", LJ126 }, + { "quartic", QUARTIC } }; // fast power function for integer exponent > 0 @@ -157,8 +158,21 @@ void PairList::compute(int eflag, int vflag) if (eflag_either) epair = 4.0*par.param.lj126.epsilon*r6inv * (sig6*sig6*r6inv - sig6) - par.offset; + + } else if (par.style == QUARTIC) { + + const double r = sqrt(rsq); + double dr = r - sqrt(par.cutsq); + double ra = dr - par.param.quartic.b1; + double rb = dr - par.param.quartic.b2; + double r2 = dr * dr; + fpair = -par.param.quartic.k / r * (r2 * (ra + rb) + 2.0 * dr * ra * rb); + + if (eflag_either) + epair = par.param.quartic.k * r2 * ra * rb; } + if (newton_pair || i < nlocal) { f[i].x += dx*fpair; f[i].y += dy*fpair; @@ -221,10 +235,10 @@ void PairList::settings(int narg, char **arg) // read and parse potential file only on MPI rank 0. if (comm->me == 0) { - int nharm, nmorse, nlj126, nskipped; + int nharm, nmorse, nlj126, nquartic, nskipped; FILE *fp = utils::open_potential(arg[0],lmp,nullptr); TextFileReader reader(fp,"pair list coeffs"); - npairs = nharm = nmorse = nlj126 = nskipped = 0; + npairs = nharm = nmorse = nlj126 = nquartic = nskipped = 0; try { char *line; @@ -258,6 +272,14 @@ void PairList::settings(int narg, char **arg) ++nlj126; break; + case QUARTIC: + oneparam.param.quartic.k = values.next_double(); + oneparam.param.quartic.b1 = values.next_double(); + oneparam.param.quartic.b2 = values.next_double(); + oneparam.param.quartic.rc = values.next_double(); + ++nquartic; + break; + case NONE: // fallthrough error->warning(FLERR,"Skipping unrecognized pair list potential entry: {}", utils::trim(line)); @@ -265,7 +287,7 @@ void PairList::settings(int narg, char **arg) break; } if (values.has_next()) - oneparam.cutsq = values.next_double(); + oneparam.cutsq = mypow(values.next_double(), 2); else oneparam.cutsq = cut_global*cut_global; @@ -274,8 +296,8 @@ void PairList::settings(int narg, char **arg) } catch (std::exception &e) { error->one(FLERR,"Error reading pair list coeffs file: {}", e.what()); } - utils::logmesg(lmp, "Read {} ({}/{}/{}) interacting pair lines from {}. " - "{} skipped entries.\n", npairs, nharm, nmorse, nlj126, arg[0], nskipped); + utils::logmesg(lmp, "Read {} ({}/{}/{}/{}) interacting pair lines from {}. " + "{} skipped entries.\n", npairs, nharm, nmorse, nlj126, nquartic, arg[0], nskipped); memory->create(params,npairs,"pair_list:params"); memcpy(params, myparams.data(),npairs*sizeof(list_param)); @@ -339,6 +361,12 @@ void PairList::init_style() const double r6inv = par.cutsq*par.cutsq*par.cutsq; const double sig6 = mypow(par.param.lj126.sigma,6); par.offset = 4.0*par.param.lj126.epsilon*r6inv * (sig6*sig6*r6inv - sig6); + + } else if (par.style == QUARTIC) { + // the offset is always 0 at rc + par.offset = 0.0; + // correct cutsq + par.cutsq = mypow(par.param.quartic.rc, 2); } } } diff --git a/src/MISC/pair_list.h b/src/MISC/pair_list.h index 2828a08547..2d00788811 100644 --- a/src/MISC/pair_list.h +++ b/src/MISC/pair_list.h @@ -49,11 +49,16 @@ class PairList : public Pair { struct lj126_p { double epsilon, sigma; }; + struct quartic_p { + double k, b1, b2, rc; + }; + union param_u { harm_p harm; morse_p morse; lj126_p lj126; + quartic_p quartic; }; struct list_param { From af3d618f474349d68920c5f20daf1621bd604bda Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 23:18:44 -0400 Subject: [PATCH 308/364] complete implementation of looking up last error message and include test --- fortran/lammps.f90 | 29 ++++++++++-------- unittest/fortran/CMakeLists.txt | 2 +- unittest/fortran/test_fortran_properties.f90 | 23 +++++++++++++++ unittest/fortran/wrap_properties.cpp | 31 +++++++++++++++++--- 4 files changed, 67 insertions(+), 18 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 2e552f22f0..2a4a16bdd0 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -1552,7 +1552,7 @@ CONTAINS TYPE(c_ptr) :: ptr INTEGER :: i - buffer = '' + buffer = ' ' ptr = C_LOC(Cbuffer(1)) buf_size = LEN(buffer) CALL lammps_get_os_info(ptr, buf_size) @@ -1699,25 +1699,28 @@ CONTAINS CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(OUT) :: buffer INTEGER, INTENT(OUT), OPTIONAL :: status - INTEGER(c_int) :: length, Cstatus, i + INTEGER(c_int) :: buflen, Cstatus, i + INTEGER(c_size_t) :: length TYPE(c_ptr) :: Cptr - CHARACTER(KIND=c_char, LEN=1), DIMENSION(:), POINTER :: Cbuffer + CHARACTER(LEN=1, KIND=c_char), POINTER :: c_string(:) - buffer = '' + buffer = ' ' IF ( lmp_has_error(self) ) THEN - length = LEN(buffer) - Cptr = f2c_string(buffer) - Cstatus = lammps_get_last_error_message(self%handle, Cptr, length) - length = MIN(LEN(buffer, c_size_t), c_strlen(Cptr)) - CALL C_F_POINTER(Cptr, Cbuffer, [length]) - FORALL ( i=1:length ) - buffer(i:i) = Cbuffer(i) - END FORALL + buflen = LEN(buffer) + length = buflen + Cptr = lammps_malloc(length) + Cstatus = lammps_get_last_error_message(self%handle, Cptr, buflen) + CALL C_F_POINTER(Cptr, c_string, [1]) + DO i=1, length + buffer(i:i) = c_string(i) + IF (c_string(i) == c_null_char) EXIT + END DO IF ( PRESENT(status) ) THEN status = Cstatus END IF + CALL lammps_free(Cptr) ELSE - buffer = '' + buffer = ' ' IF ( PRESENT(status) ) THEN status = 0 END IF diff --git a/unittest/fortran/CMakeLists.txt b/unittest/fortran/CMakeLists.txt index d3c18c9941..70ab462053 100644 --- a/unittest/fortran/CMakeLists.txt +++ b/unittest/fortran/CMakeLists.txt @@ -50,7 +50,7 @@ if(CMAKE_Fortran_COMPILER) add_test(NAME FortranBox COMMAND test_fortran_box) add_executable(test_fortran_properties wrap_properties.cpp test_fortran_properties.f90 test_fortran_commands.f90) - target_link_libraries(test_fortran_properties PRIVATE flammps lammps MPI::MPI_Fortran GTest::GTestMain) + target_link_libraries(test_fortran_properties PRIVATE flammps lammps MPI::MPI_Fortran GTest::GMockMain) add_test(NAME FortranProperties COMMAND test_fortran_properties) add_executable(test_fortran_extract_global wrap_extract_global.cpp test_fortran_extract_global.f90) diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index 153cab8c77..e8ea330bd6 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -64,3 +64,26 @@ FUNCTION f_lammps_has_error () BIND(C) f_lammps_has_error = 0_C_int END IF END FUNCTION f_lammps_has_error + +FUNCTION f_lammps_get_last_error_message(errmesg, errlen) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char, C_ptr, C_F_POINTER + USE keepstuff, ONLY : lmp + USE LIBLAMMPS + IMPLICIT NONE + INTEGER(C_int) :: f_lammps_get_last_error_message + CHARACTER(KIND=c_char), DIMENSION(*) :: errmesg + INTEGER(C_int), VALUE, INTENT(IN) :: errlen + CHARACTER(LEN=:), ALLOCATABLE :: buffer + INTEGER :: status, i + + ! copy error message to buffer + ALLOCATE(CHARACTER(errlen) :: buffer) + CALL lmp%get_last_error_message(buffer, status) + f_lammps_get_last_error_message = status + ! and copy to C style string + DO i=1, errlen + errmesg(i) = buffer(i:i) + IF (buffer(i:i) == ACHAR(0)) EXIT + END DO + DEALLOCATE(buffer) +END FUNCTION f_lammps_get_last_error_message diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index d53aabb8fa..21c953a514 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -2,9 +2,10 @@ #include "lammps.h" #include "library.h" -#include + #include +#include "gmock/gmock.h" #include "gtest/gtest.h" // prototypes for fortran reverse wrapper functions @@ -16,8 +17,13 @@ void f_lammps_memory_usage(double*); int f_lammps_get_mpi_comm(); int f_lammps_extract_setting(const char*); int f_lammps_has_error(); +int f_lammps_get_last_error_message(char *, int); } +namespace LAMMPS_NS { + +using ::testing::ContainsRegex; + class LAMMPS_properties : public ::testing::Test { protected: LAMMPS_NS::LAMMPS *lmp; @@ -105,11 +111,28 @@ TEST_F(LAMMPS_properties, extract_setting) EXPECT_EQ(f_lammps_extract_setting("mu_flag"), 0); EXPECT_EQ(f_lammps_extract_setting("rmass_flag"), 0); EXPECT_EQ(f_lammps_extract_setting("UNKNOWN"), -1); - }; TEST_F(LAMMPS_properties, has_error) { - EXPECT_EQ(f_lammps_has_error(), lammps_has_error(lmp)); - // TODO: How to test the error message itself? + // need errors to throw exceptions to be able to intercept them. + if (!lammps_config_has_exceptions()) GTEST_SKIP(); + + EXPECT_EQ(f_lammps_has_error(), lammps_has_error(lmp)); + EXPECT_EQ(f_lammps_has_error(), 0); + + // trigger an error, but hide output + ::testing::internal::CaptureStdout(); + lammps_command(lmp, "this_is_not_a_known_command"); + ::testing::internal::GetCapturedStdout(); + + EXPECT_EQ(f_lammps_has_error(), lammps_has_error(lmp)); + EXPECT_EQ(f_lammps_has_error(), 1); + + // retrieve error message + char errmsg[1024]; + int err = f_lammps_get_last_error_message(errmsg, 1023); + EXPECT_EQ(err, 1); + EXPECT_THAT(errmsg, ContainsRegex(".*ERRORx: Unknown command: this_is_not_a_known_command.*")); }; +} // namespace LAMMPS_NS From 337443528180e452211f942feb6b050025a23f02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 23:19:05 -0400 Subject: [PATCH 309/364] add note that integer sizes can be queried without a LAMMPS handle --- src/library.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/library.cpp b/src/library.cpp index bfa0fc803a..a2a632c244 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -949,7 +949,8 @@ int lammps_get_mpi_comm(void *handle) This function will retrieve or compute global properties. In contrast to :cpp:func:`lammps_get_thermo` this function returns an ``int``. The following tables list the currently supported keyword. If a keyword is -not recognized, the function returns -1. +not recognized, the function returns -1. The integer sizes functions may +be called without a valid LAMMPS object handle (it is ignored). * :ref:`Integer sizes ` * :ref:`System status ` From 647c5e3572fdc951f1b5f34f248360523cda9771 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 23:19:59 -0400 Subject: [PATCH 310/364] apply clang-format --- unittest/fortran/wrap_box.cpp | 6 +- unittest/fortran/wrap_extract_atom.cpp | 100 +++---- unittest/fortran/wrap_extract_compute.cpp | 202 +++++++------- unittest/fortran/wrap_extract_fix.cpp | 86 +++--- unittest/fortran/wrap_extract_global.cpp | 124 ++++----- unittest/fortran/wrap_extract_variable.cpp | 305 +++++++++++---------- unittest/fortran/wrap_gather_scatter.cpp | 278 +++++++++---------- unittest/fortran/wrap_properties.cpp | 30 +- 8 files changed, 563 insertions(+), 568 deletions(-) diff --git a/unittest/fortran/wrap_box.cpp b/unittest/fortran/wrap_box.cpp index 8678816658..5eb9a6b18d 100644 --- a/unittest/fortran/wrap_box.cpp +++ b/unittest/fortran/wrap_box.cpp @@ -55,10 +55,10 @@ TEST_F(LAMMPS_commands, get_thermo) EXPECT_DOUBLE_EQ(f_lammps_extract_box_zhi(), 2.0); f_lammps_delete_everything(); f_lammps_reset_box_2x(); - EXPECT_DOUBLE_EQ(f_lammps_extract_box_xlo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_xlo(), -1.0); EXPECT_DOUBLE_EQ(f_lammps_extract_box_xhi(), 3.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_box_ylo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_ylo(), -1.0); EXPECT_DOUBLE_EQ(f_lammps_extract_box_yhi(), 3.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_box_zlo(),-1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_box_zlo(), -1.0); EXPECT_DOUBLE_EQ(f_lammps_extract_box_zhi(), 3.0); }; diff --git a/unittest/fortran/wrap_extract_atom.cpp b/unittest/fortran/wrap_extract_atom.cpp index 17116b11b9..2552d6a10f 100644 --- a/unittest/fortran/wrap_extract_atom.cpp +++ b/unittest/fortran/wrap_extract_atom.cpp @@ -3,10 +3,10 @@ #include "lammps.h" #include "library.h" +#include +#include #include #include -#include -#include #include "gtest/gtest.h" @@ -20,8 +20,8 @@ int f_lammps_extract_atom_tag_int(int); int64_t f_lammps_extract_atom_tag_int64(int64_t); int f_lammps_extract_atom_type(int); int f_lammps_extract_atom_mask(int); -void f_lammps_extract_atom_x(int,double*); -void f_lammps_extract_atom_v(int,double*); +void f_lammps_extract_atom_x(int, double *); +void f_lammps_extract_atom_v(int, double *); } class LAMMPS_extract_atom : public ::testing::Test { @@ -49,72 +49,72 @@ protected: TEST_F(LAMMPS_extract_atom, mass) { - f_lammps_setup_extract_atom(); - EXPECT_DOUBLE_EQ(f_lammps_extract_atom_mass(), 2.0); + f_lammps_setup_extract_atom(); + EXPECT_DOUBLE_EQ(f_lammps_extract_atom_mass(), 2.0); }; TEST_F(LAMMPS_extract_atom, tag) { - f_lammps_setup_extract_atom(); -#ifdef LAMMPS_BIGBIG - EXPECT_EQ(f_lammps_extract_atom_tag_int64(1l), 1l); - EXPECT_EQ(f_lammps_extract_atom_tag_int64(2l), 2l); + f_lammps_setup_extract_atom(); +#if defined(LAMMPS_BIGBIG) + EXPECT_EQ(f_lammps_extract_atom_tag_int64(1l), 1l); + EXPECT_EQ(f_lammps_extract_atom_tag_int64(2l), 2l); #else - EXPECT_EQ(f_lammps_extract_atom_tag_int(1), 1); - EXPECT_EQ(f_lammps_extract_atom_tag_int(2), 2); + EXPECT_EQ(f_lammps_extract_atom_tag_int(1), 1); + EXPECT_EQ(f_lammps_extract_atom_tag_int(2), 2); #endif }; TEST_F(LAMMPS_extract_atom, type) { - f_lammps_setup_extract_atom(); - EXPECT_EQ(f_lammps_extract_atom_type(1), 1); - EXPECT_EQ(f_lammps_extract_atom_type(2), 1); + f_lammps_setup_extract_atom(); + EXPECT_EQ(f_lammps_extract_atom_type(1), 1); + EXPECT_EQ(f_lammps_extract_atom_type(2), 1); }; TEST_F(LAMMPS_extract_atom, mask) { - f_lammps_setup_extract_atom(); - EXPECT_EQ(f_lammps_extract_atom_mask(1), 1); - EXPECT_EQ(f_lammps_extract_atom_mask(2), 1); - lammps_command(lmp, "group 1 id 1"); - lammps_command(lmp, "group 2 id 2"); - EXPECT_EQ(f_lammps_extract_atom_mask(1), 3); - EXPECT_EQ(f_lammps_extract_atom_mask(2), 5); + f_lammps_setup_extract_atom(); + EXPECT_EQ(f_lammps_extract_atom_mask(1), 1); + EXPECT_EQ(f_lammps_extract_atom_mask(2), 1); + lammps_command(lmp, "group 1 id 1"); + lammps_command(lmp, "group 2 id 2"); + EXPECT_EQ(f_lammps_extract_atom_mask(1), 3); + EXPECT_EQ(f_lammps_extract_atom_mask(2), 5); }; TEST_F(LAMMPS_extract_atom, x) { - f_lammps_setup_extract_atom(); - double x1[3]; - double x2[3]; - f_lammps_extract_atom_x(1, x1); - EXPECT_DOUBLE_EQ(x1[0], 1.0); - EXPECT_DOUBLE_EQ(x1[1], 1.0); - EXPECT_DOUBLE_EQ(x1[2], 1.5); - f_lammps_extract_atom_x(2, x2); - EXPECT_DOUBLE_EQ(x2[0], 0.2); - EXPECT_DOUBLE_EQ(x2[1], 0.1); - EXPECT_DOUBLE_EQ(x2[2], 0.1); + f_lammps_setup_extract_atom(); + double x1[3]; + double x2[3]; + f_lammps_extract_atom_x(1, x1); + EXPECT_DOUBLE_EQ(x1[0], 1.0); + EXPECT_DOUBLE_EQ(x1[1], 1.0); + EXPECT_DOUBLE_EQ(x1[2], 1.5); + f_lammps_extract_atom_x(2, x2); + EXPECT_DOUBLE_EQ(x2[0], 0.2); + EXPECT_DOUBLE_EQ(x2[1], 0.1); + EXPECT_DOUBLE_EQ(x2[2], 0.1); } TEST_F(LAMMPS_extract_atom, v) { - f_lammps_setup_extract_atom(); - double v1[3]; - double v2[3]; - f_lammps_extract_atom_v(1, v1); - EXPECT_DOUBLE_EQ(v1[0], 0.0); - EXPECT_DOUBLE_EQ(v1[1], 0.0); - EXPECT_DOUBLE_EQ(v1[2], 0.0); - f_lammps_extract_atom_v(2, v2); - EXPECT_DOUBLE_EQ(v2[0], 0.0); - EXPECT_DOUBLE_EQ(v2[1], 0.0); - EXPECT_DOUBLE_EQ(v2[2], 0.0); - lammps_command(lmp, "group one id 1"); - lammps_command(lmp, "velocity one set 1 2 3"); - f_lammps_extract_atom_v(1, v1); - EXPECT_DOUBLE_EQ(v1[0], 1.0); - EXPECT_DOUBLE_EQ(v1[1], 2.0); - EXPECT_DOUBLE_EQ(v1[2], 3.0); + f_lammps_setup_extract_atom(); + double v1[3]; + double v2[3]; + f_lammps_extract_atom_v(1, v1); + EXPECT_DOUBLE_EQ(v1[0], 0.0); + EXPECT_DOUBLE_EQ(v1[1], 0.0); + EXPECT_DOUBLE_EQ(v1[2], 0.0); + f_lammps_extract_atom_v(2, v2); + EXPECT_DOUBLE_EQ(v2[0], 0.0); + EXPECT_DOUBLE_EQ(v2[1], 0.0); + EXPECT_DOUBLE_EQ(v2[2], 0.0); + lammps_command(lmp, "group one id 1"); + lammps_command(lmp, "velocity one set 1 2 3"); + f_lammps_extract_atom_v(1, v1); + EXPECT_DOUBLE_EQ(v1[0], 1.0); + EXPECT_DOUBLE_EQ(v1[1], 2.0); + EXPECT_DOUBLE_EQ(v1[2], 3.0); } diff --git a/unittest/fortran/wrap_extract_compute.cpp b/unittest/fortran/wrap_extract_compute.cpp index 2325b1540f..5d6e8b1978 100644 --- a/unittest/fortran/wrap_extract_compute.cpp +++ b/unittest/fortran/wrap_extract_compute.cpp @@ -3,10 +3,10 @@ #include "lammps.h" #include "library.h" +#include +#include #include #include -#include -#include #include "gtest/gtest.h" @@ -16,12 +16,12 @@ void *f_lammps_with_args(); void f_lammps_close(); void f_lammps_setup_extract_compute(); double f_lammps_extract_compute_peratom_vector(int); -double f_lammps_extract_compute_peratom_array(int,int); +double f_lammps_extract_compute_peratom_array(int, int); double f_lammps_extract_compute_global_scalar(); double f_lammps_extract_compute_global_vector(int); -double f_lammps_extract_compute_global_array(int,int); +double f_lammps_extract_compute_global_array(int, int); double f_lammps_extract_compute_local_vector(int); -double f_lammps_extract_compute_local_array(int,int); +double f_lammps_extract_compute_local_array(int, int); } class LAMMPS_extract_compute : public ::testing::Test { @@ -49,126 +49,120 @@ protected: TEST_F(LAMMPS_extract_compute, peratom_vector) { - f_lammps_setup_extract_compute(); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(1), -0.599703102447981); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(2), 391.817623795857); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(3), 391.430665759871); - + f_lammps_setup_extract_compute(); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(1), -0.599703102447981); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(2), 391.817623795857); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_vector(3), 391.430665759871); }; TEST_F(LAMMPS_extract_compute, peratom_array) { - f_lammps_setup_extract_compute(); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,1), 0.8837067009319107); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,1), 0.3588584939803668); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,1), 1.2799807127711049); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,1), 0.20477632346642258); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,1), 0.400429511840588); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,1), 0.673995757699694); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1,2), -1070.0291234709418); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2,2), -1903.651817128683); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3,2), -1903.5121520875714); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4,2), -1427.867483013); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5,2), -1427.8560790941347); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6,2), -1903.5971655908565); + f_lammps_setup_extract_compute(); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1, 1), 0.8837067009319107); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2, 1), 0.3588584939803668); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3, 1), 1.2799807127711049); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4, 1), 0.20477632346642258); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5, 1), 0.400429511840588); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6, 1), 0.673995757699694); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(1, 2), -1070.0291234709418); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(2, 2), -1903.651817128683); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(3, 2), -1903.5121520875714); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(4, 2), -1427.867483013); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(5, 2), -1427.8560790941347); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_peratom_array(6, 2), -1903.5971655908565); }; TEST_F(LAMMPS_extract_compute, global_scalar) { - f_lammps_setup_extract_compute(); - double *scalar; - scalar = (double*) lammps_extract_compute(lmp, "totalpe", LMP_STYLE_GLOBAL, - LMP_TYPE_SCALAR); - //EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), 782.64858645328); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), *scalar); + f_lammps_setup_extract_compute(); + double *scalar; + scalar = (double *)lammps_extract_compute(lmp, "totalpe", LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR); + // EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), 782.64858645328); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_scalar(), *scalar); }; TEST_F(LAMMPS_extract_compute, global_vector) { - f_lammps_setup_extract_compute(); - double *vector; - vector = (double*) lammps_extract_compute(lmp, "COM", LMP_STYLE_GLOBAL, - LMP_TYPE_VECTOR); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(1), vector[0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(2), vector[1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(3), vector[2]); + f_lammps_setup_extract_compute(); + double *vector; + vector = (double *)lammps_extract_compute(lmp, "COM", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(1), vector[0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(2), vector[1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_vector(3), vector[2]); }; TEST_F(LAMMPS_extract_compute, global_array) { - f_lammps_setup_extract_compute(); - double **array; - array = (double**) lammps_extract_compute(lmp, "RDF", LMP_STYLE_GLOBAL, - LMP_TYPE_ARRAY); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,1), array[0][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,1), array[0][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,2), array[1][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2,2), array[1][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,3), array[2][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1,4), array[3][0]); + f_lammps_setup_extract_compute(); + double **array; + array = (double **)lammps_extract_compute(lmp, "RDF", LMP_STYLE_GLOBAL, LMP_TYPE_ARRAY); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1, 1), array[0][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2, 1), array[0][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1, 2), array[1][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(2, 2), array[1][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1, 3), array[2][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_global_array(1, 4), array[3][0]); }; TEST_F(LAMMPS_extract_compute, local_vector) { - f_lammps_setup_extract_compute(); - double *vector; - vector = (double*) lammps_extract_compute(lmp, "pairdist", LMP_STYLE_LOCAL, - LMP_TYPE_VECTOR); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(1), vector[0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(2), vector[1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(3), vector[2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(4), vector[3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(5), vector[4]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(6), vector[5]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(7), vector[6]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(8), vector[7]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(9), vector[8]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(10), vector[9]); + f_lammps_setup_extract_compute(); + double *vector; + vector = (double *)lammps_extract_compute(lmp, "pairdist", LMP_STYLE_LOCAL, LMP_TYPE_VECTOR); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(1), vector[0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(2), vector[1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(3), vector[2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(4), vector[3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(5), vector[4]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(6), vector[5]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(7), vector[6]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(8), vector[7]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(9), vector[8]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_vector(10), vector[9]); }; TEST_F(LAMMPS_extract_compute, local_array) { - f_lammps_setup_extract_compute(); - double **array; - array = (double**) lammps_extract_compute(lmp, "pairlocal", LMP_STYLE_LOCAL, - LMP_TYPE_ARRAY); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,1), array[0][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,1), array[0][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,1), array[0][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,1), array[0][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,2), array[1][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,2), array[1][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,2), array[1][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,2), array[1][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,3), array[2][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,3), array[2][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,3), array[2][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,3), array[2][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,4), array[3][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,4), array[3][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,4), array[3][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,4), array[3][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,5), array[4][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,5), array[4][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,5), array[4][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,5), array[4][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,6), array[5][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,6), array[5][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,6), array[5][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,6), array[5][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,7), array[6][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,7), array[6][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,7), array[6][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,7), array[6][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,8), array[7][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,8), array[7][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,8), array[7][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,8), array[7][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,9), array[8][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,9), array[8][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,9), array[8][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,9), array[8][3]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1,10), array[9][0]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2,10), array[9][1]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3,10), array[9][2]); - EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4,10), array[9][3]); + f_lammps_setup_extract_compute(); + double **array; + array = (double **)lammps_extract_compute(lmp, "pairlocal", LMP_STYLE_LOCAL, LMP_TYPE_ARRAY); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 1), array[0][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 1), array[0][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 1), array[0][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 1), array[0][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 2), array[1][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 2), array[1][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 2), array[1][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 2), array[1][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 3), array[2][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 3), array[2][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 3), array[2][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 3), array[2][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 4), array[3][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 4), array[3][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 4), array[3][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 4), array[3][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 5), array[4][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 5), array[4][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 5), array[4][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 5), array[4][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 6), array[5][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 6), array[5][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 6), array[5][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 6), array[5][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 7), array[6][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 7), array[6][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 7), array[6][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 7), array[6][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 8), array[7][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 8), array[7][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 8), array[7][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 8), array[7][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 9), array[8][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 9), array[8][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 9), array[8][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 9), array[8][3]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(1, 10), array[9][0]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(2, 10), array[9][1]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(3, 10), array[9][2]); + EXPECT_DOUBLE_EQ(f_lammps_extract_compute_local_array(4, 10), array[9][3]); }; diff --git a/unittest/fortran/wrap_extract_fix.cpp b/unittest/fortran/wrap_extract_fix.cpp index d8f19c8b95..bbb535c1e7 100644 --- a/unittest/fortran/wrap_extract_fix.cpp +++ b/unittest/fortran/wrap_extract_fix.cpp @@ -4,10 +4,10 @@ #include "lammps.h" #include "library.h" +#include +#include #include #include -#include -#include #include "gtest/gtest.h" @@ -18,11 +18,11 @@ void f_lammps_close(); void f_lammps_setup_extract_fix(); double f_lammps_extract_fix_global_scalar(); double f_lammps_extract_fix_global_vector(int); -double f_lammps_extract_fix_global_array(int,int); +double f_lammps_extract_fix_global_array(int, int); double f_lammps_extract_fix_peratom_vector(int); -double f_lammps_extract_fix_peratom_array(int,int); +double f_lammps_extract_fix_peratom_array(int, int); double f_lammps_extract_fix_local_vector(int); -double f_lammps_extract_fix_local_array(int,int); +double f_lammps_extract_fix_local_array(int, int); } class LAMMPS_extract_fix : public ::testing::Test { @@ -50,58 +50,58 @@ protected: TEST_F(LAMMPS_extract_fix, global_scalar) { - f_lammps_setup_extract_fix(); - double *scalar = (double*) lammps_extract_fix(lmp, "recenter", - LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR, -1, -1); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_scalar(), *scalar); - lammps_free(scalar); + f_lammps_setup_extract_fix(); + double *scalar = + (double *)lammps_extract_fix(lmp, "recenter", LMP_STYLE_GLOBAL, LMP_TYPE_SCALAR, -1, -1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_scalar(), *scalar); + lammps_free(scalar); }; TEST_F(LAMMPS_extract_fix, global_vector) { - f_lammps_setup_extract_fix(); - double *x = (double*) lammps_extract_fix(lmp, "recenter", - LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 0, -1); - double *y = (double*) lammps_extract_fix(lmp, "recenter", - LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 1, -1); - double *z = (double*) lammps_extract_fix(lmp, "recenter", - LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 2, -1); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(1), *x); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(2), *y); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(3), *z); - lammps_free(x); - lammps_free(y); - lammps_free(z); + f_lammps_setup_extract_fix(); + double *x = + (double *)lammps_extract_fix(lmp, "recenter", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 0, -1); + double *y = + (double *)lammps_extract_fix(lmp, "recenter", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 1, -1); + double *z = + (double *)lammps_extract_fix(lmp, "recenter", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 2, -1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(1), *x); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(2), *y); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_vector(3), *z); + lammps_free(x); + lammps_free(y); + lammps_free(z); }; TEST_F(LAMMPS_extract_fix, global_array) { - f_lammps_setup_extract_fix(); - double natoms = lammps_get_natoms(lmp); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1,1), natoms); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1,2), natoms); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2,1), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2,2), 1.0); + f_lammps_setup_extract_fix(); + double natoms = lammps_get_natoms(lmp); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1, 1), natoms); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(1, 2), natoms); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2, 1), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_global_array(2, 2), 1.0); }; TEST_F(LAMMPS_extract_fix, peratom_vector) { - f_lammps_setup_extract_fix(); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(1), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(3), 0.5); + f_lammps_setup_extract_fix(); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_vector(3), 0.5); }; TEST_F(LAMMPS_extract_fix, peratom_array) { - f_lammps_setup_extract_fix(); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,1), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,2), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3,3), 0.5); + f_lammps_setup_extract_fix(); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3, 1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1, 2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(1, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(2, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_fix_peratom_array(3, 3), 0.5); }; diff --git a/unittest/fortran/wrap_extract_global.cpp b/unittest/fortran/wrap_extract_global.cpp index adf3986073..bf442279a1 100644 --- a/unittest/fortran/wrap_extract_global.cpp +++ b/unittest/fortran/wrap_extract_global.cpp @@ -3,10 +3,10 @@ #include "lammps.h" #include "library.h" +#include +#include #include #include -#include -#include #include "gtest/gtest.h" @@ -78,100 +78,100 @@ protected: TEST_F(LAMMPS_extract_global, units) { - f_lammps_setup_extract_global(); - EXPECT_EQ(f_lammps_extract_global_units(), 1); + f_lammps_setup_extract_global(); + EXPECT_EQ(f_lammps_extract_global_units(), 1); }; TEST_F(LAMMPS_extract_global, ntimestep) { - f_lammps_setup_extract_global(); + f_lammps_setup_extract_global(); #ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_ntimestep(), 0); + EXPECT_EQ(f_lammps_extract_global_ntimestep(), 0); #else - EXPECT_EQ(f_lammps_extract_global_ntimestep_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_ntimestep_big(), 0l); #endif }; TEST_F(LAMMPS_extract_global, dt) { - f_lammps_setup_extract_global(); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_dt(), 0.005); + f_lammps_setup_extract_global(); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_dt(), 0.005); }; TEST_F(LAMMPS_extract_global, boxprops) { - f_lammps_setup_extract_global(); - double boxlo[3], boxhi[3]; - f_lammps_extract_global_boxlo(boxlo); - EXPECT_DOUBLE_EQ(boxlo[0], 0.0); - EXPECT_DOUBLE_EQ(boxlo[1], 0.0); - EXPECT_DOUBLE_EQ(boxlo[2], 0.0); - f_lammps_extract_global_boxhi(boxhi); - EXPECT_DOUBLE_EQ(boxhi[0], 2.0); - EXPECT_DOUBLE_EQ(boxhi[1], 3.0); - EXPECT_DOUBLE_EQ(boxhi[2], 4.0); + f_lammps_setup_extract_global(); + double boxlo[3], boxhi[3]; + f_lammps_extract_global_boxlo(boxlo); + EXPECT_DOUBLE_EQ(boxlo[0], 0.0); + EXPECT_DOUBLE_EQ(boxlo[1], 0.0); + EXPECT_DOUBLE_EQ(boxlo[2], 0.0); + f_lammps_extract_global_boxhi(boxhi); + EXPECT_DOUBLE_EQ(boxhi[0], 2.0); + EXPECT_DOUBLE_EQ(boxhi[1], 3.0); + EXPECT_DOUBLE_EQ(boxhi[2], 4.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxlo(), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxhi(), 2.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxylo(), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxyhi(), 3.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzlo(), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzhi(), 4.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxxhi(), 2.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxylo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxyhi(), 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzlo(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boxzhi(), 4.0); - int periodicity[3]; - f_lammps_extract_global_periodicity(periodicity); - EXPECT_EQ(periodicity[0], 1); - EXPECT_EQ(periodicity[1], 1); - EXPECT_EQ(periodicity[2], 1); + int periodicity[3]; + f_lammps_extract_global_periodicity(periodicity); + EXPECT_EQ(periodicity[0], 1); + EXPECT_EQ(periodicity[1], 1); + EXPECT_EQ(periodicity[2], 1); - EXPECT_EQ(f_lammps_extract_global_triclinic(), 0); + EXPECT_EQ(f_lammps_extract_global_triclinic(), 0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_xy(), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_yz(), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_xz(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_xy(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_yz(), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_xz(), 0.0); }; TEST_F(LAMMPS_extract_global, atomprops) { - f_lammps_setup_extract_global(); + f_lammps_setup_extract_global(); #ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_natoms(), 2); - EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); - EXPECT_EQ(f_lammps_extract_global_nangles(), 0); - EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); + EXPECT_EQ(f_lammps_extract_global_natoms(), 2); + EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); + EXPECT_EQ(f_lammps_extract_global_nangles(), 0); + EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); #else - EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); - EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); - EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); - EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); + EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); #endif - EXPECT_EQ(f_lammps_extract_global_ntypes(), 1); - EXPECT_EQ(f_lammps_extract_global_nlocal(), 2); - EXPECT_EQ(f_lammps_extract_global_nghost(), 41); - EXPECT_EQ(f_lammps_extract_global_nmax(), 16384); + EXPECT_EQ(f_lammps_extract_global_ntypes(), 1); + EXPECT_EQ(f_lammps_extract_global_nlocal(), 2); + EXPECT_EQ(f_lammps_extract_global_nghost(), 41); + EXPECT_EQ(f_lammps_extract_global_nmax(), 16384); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_boltz(), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_hplanck(), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_angstrom(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_boltz(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_hplanck(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_angstrom(), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_global_femtosecond(), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_global_femtosecond(), 1.0); }; TEST_F(LAMMPS_extract_global, fullprops) { - if (! lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); - // This is not currently the world's most convincing test.... - f_lammps_setup_full_extract_global(); + if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); + // This is not currently the world's most convincing test.... + f_lammps_setup_full_extract_global(); #ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_natoms(), 2); - EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); - EXPECT_EQ(f_lammps_extract_global_nangles(), 0); - EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); + EXPECT_EQ(f_lammps_extract_global_natoms(), 2); + EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); + EXPECT_EQ(f_lammps_extract_global_nangles(), 0); + EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); #else - EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); - EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); - EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); - EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); + EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); + EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); #endif } diff --git a/unittest/fortran/wrap_extract_variable.cpp b/unittest/fortran/wrap_extract_variable.cpp index 095b0b3be7..0c1ffcc37e 100644 --- a/unittest/fortran/wrap_extract_variable.cpp +++ b/unittest/fortran/wrap_extract_variable.cpp @@ -5,15 +5,14 @@ #include "library.h" #include "platform.h" -#include -#include +#include +#include +#include #include #include -#include -#include -#include +#include +#include #include -#include #include "gtest/gtest.h" @@ -22,21 +21,21 @@ // prototypes for Fortran reverse wrapper functions extern "C" { -void *f_lammps_with_c_args(int,char**); +void *f_lammps_with_c_args(int, char **); void f_lammps_close(); void f_lammps_setup_extract_variable(); int f_lammps_extract_variable_index_1(); int f_lammps_extract_variable_index_2(); int f_lammps_extract_variable_loop(); -char* f_lammps_extract_variable_loop_pad(); -char* f_lammps_extract_variable_world(); -char* f_lammps_extract_variable_universe(); +char *f_lammps_extract_variable_loop_pad(); +char *f_lammps_extract_variable_world(); +char *f_lammps_extract_variable_universe(); int f_lammps_extract_variable_uloop(); -char* f_lammps_extract_variable_string(); -char* f_lammps_extract_variable_format(); -char* f_lammps_extract_variable_format_pad(); -char* f_lammps_extract_variable_getenv(); -char* f_lammps_extract_variable_file(); +char *f_lammps_extract_variable_string(); +char *f_lammps_extract_variable_format(); +char *f_lammps_extract_variable_format_pad(); +char *f_lammps_extract_variable_getenv(); +char *f_lammps_extract_variable_file(); double f_lammps_extract_variable_atomfile(int); double f_lammps_extract_variable_python(); double f_lammps_extract_variable_timer(); @@ -45,21 +44,22 @@ double f_lammps_extract_variable_equal(); double f_lammps_extract_variable_atom(int); double f_lammps_extract_variable_vector(int); void f_lammps_set_variable_string(); -char* c_path_join(const char*, const char*); +char *c_path_join(const char *, const char *); } -char* c_path_join(const char* a, const char* b) +char *c_path_join(const char *a, const char *b) { - std::string A = a; - std::string B = b; - std::string C = LAMMPS_NS::platform::path_join(A, B); - size_t length = C.length() + 1; - char *retval = (char*) malloc(length*sizeof(char)); - C.copy(retval, length); - retval[length-1] = '\0'; - return retval; + std::string A = a; + std::string B = b; + std::string C = LAMMPS_NS::platform::path_join(A, B); + size_t length = C.length() + 1; + char *retval = (char *)malloc(length * sizeof(char)); + C.copy(retval, length); + retval[length - 1] = '\0'; + return retval; } +constexpr char input_dir[] = STRINGIFY(TEST_INPUT_FOLDER); class LAMMPS_extract_variable : public ::testing::Test { protected: LAMMPS_NS::LAMMPS *lmp; @@ -68,17 +68,20 @@ protected: void SetUp() override { - const char *args[] = {"LAMMPS_Fortran_test", "-l", "none", - "-echo", "screen", "-nocite", "-var", - "input_dir", STRINGIFY(TEST_INPUT_FOLDER), - "-var", "zpos", "1.5", "-var", "x", "2"}; - char** argv = (char**) args; - int argc = sizeof(args) / sizeof(const char*); + // clang-format off + const char *args[] = + { "LAMMPS_Fortran_test", "-l", "none", "-echo", "screen", "-nocite", + "-var", "input_dir", input_dir, "-var", "zpos", "1.5", "-var", "x", "2" }; + // clang-format on + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(const char *); ::testing::internal::CaptureStdout(); - lmp = (LAMMPS_NS::LAMMPS*)f_lammps_with_c_args(argc, argv); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_c_args(argc, argv); + std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); } + void TearDown() override { ::testing::internal::CaptureStdout(); @@ -91,192 +94,190 @@ protected: TEST_F(LAMMPS_extract_variable, index) { - f_lammps_setup_extract_variable(); - EXPECT_EQ(f_lammps_extract_variable_index_1(), 1); - EXPECT_EQ(f_lammps_extract_variable_index_2(), 0); - lammps_command(lmp, "next idx"); - EXPECT_EQ(f_lammps_extract_variable_index_1(), 0); - EXPECT_EQ(f_lammps_extract_variable_index_2(), 1); + f_lammps_setup_extract_variable(); + EXPECT_EQ(f_lammps_extract_variable_index_1(), 1); + EXPECT_EQ(f_lammps_extract_variable_index_2(), 0); + lammps_command(lmp, "next idx"); + EXPECT_EQ(f_lammps_extract_variable_index_1(), 0); + EXPECT_EQ(f_lammps_extract_variable_index_2(), 1); }; TEST_F(LAMMPS_extract_variable, loop) { - f_lammps_setup_extract_variable(); - int i; - for ( i = 1; i <= 10; i++ ) { - EXPECT_EQ(f_lammps_extract_variable_loop(), i); - lammps_command(lmp, "next lp"); - } + f_lammps_setup_extract_variable(); + int i; + for (i = 1; i <= 10; i++) { + EXPECT_EQ(f_lammps_extract_variable_loop(), i); + lammps_command(lmp, "next lp"); + } }; TEST_F(LAMMPS_extract_variable, loop_pad) { - f_lammps_setup_extract_variable(); - int i; - char str[10]; - char* fstr; - for ( i = 1; i <= 10; i++ ) { - std::sprintf(str,"%02d",i); - fstr = f_lammps_extract_variable_loop_pad(); - EXPECT_STREQ(fstr, str); - std::free(fstr); - lammps_command(lmp, "next lp_pad"); - } + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char *fstr; + for (i = 1; i <= 10; i++) { + std::sprintf(str, "%02d", i); + fstr = f_lammps_extract_variable_loop_pad(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp_pad"); + } }; TEST_F(LAMMPS_extract_variable, world) { - f_lammps_setup_extract_variable(); - char* fstr = f_lammps_extract_variable_world(); - EXPECT_STREQ(fstr, "group1"); - std::free(fstr); + f_lammps_setup_extract_variable(); + char *fstr = f_lammps_extract_variable_world(); + EXPECT_STREQ(fstr, "group1"); + std::free(fstr); }; TEST_F(LAMMPS_extract_variable, universe) { - f_lammps_setup_extract_variable(); - char* fstr = f_lammps_extract_variable_universe(); - EXPECT_STREQ(fstr, "universe1"); - std::free(fstr); + f_lammps_setup_extract_variable(); + char *fstr = f_lammps_extract_variable_universe(); + EXPECT_STREQ(fstr, "universe1"); + std::free(fstr); }; TEST_F(LAMMPS_extract_variable, uloop) { - f_lammps_setup_extract_variable(); - EXPECT_EQ(f_lammps_extract_variable_uloop(), 1); + f_lammps_setup_extract_variable(); + EXPECT_EQ(f_lammps_extract_variable_uloop(), 1); }; TEST_F(LAMMPS_extract_variable, string) { - f_lammps_setup_extract_variable(); - char* fstr = f_lammps_extract_variable_string(); - EXPECT_STREQ(fstr, "this is a string"); - std::free(fstr); - f_lammps_set_variable_string(); - fstr = f_lammps_extract_variable_string(); - EXPECT_STREQ(fstr, "this is the new string"); - std::free(fstr); + f_lammps_setup_extract_variable(); + char *fstr = f_lammps_extract_variable_string(); + EXPECT_STREQ(fstr, "this is a string"); + std::free(fstr); + f_lammps_set_variable_string(); + fstr = f_lammps_extract_variable_string(); + EXPECT_STREQ(fstr, "this is the new string"); + std::free(fstr); }; TEST_F(LAMMPS_extract_variable, format) { - f_lammps_setup_extract_variable(); - int i; - char str[10]; - char* fstr; - for ( i = 1; i <= 10; i++ ) { - std::sprintf(str,"%.6G",std::exp(i)); - fstr = f_lammps_extract_variable_format(); - EXPECT_STREQ(fstr, str); - std::free(fstr); - lammps_command(lmp, "next lp"); - } + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char *fstr; + for (i = 1; i <= 10; i++) { + std::sprintf(str, "%.6G", std::exp(i)); + fstr = f_lammps_extract_variable_format(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp"); + } }; TEST_F(LAMMPS_extract_variable, format_pad) { - f_lammps_setup_extract_variable(); - int i; - char str[10]; - char* fstr; - for ( i = 1; i <= 10; i++ ) { - std::sprintf(str,"%08.6G",std::exp(i)); - fstr = f_lammps_extract_variable_format_pad(); - EXPECT_STREQ(fstr, str); - std::free(fstr); - lammps_command(lmp, "next lp"); - } + f_lammps_setup_extract_variable(); + int i; + char str[10]; + char *fstr; + for (i = 1; i <= 10; i++) { + std::sprintf(str, "%08.6G", std::exp(i)); + fstr = f_lammps_extract_variable_format_pad(); + EXPECT_STREQ(fstr, str); + std::free(fstr); + lammps_command(lmp, "next lp"); + } }; TEST_F(LAMMPS_extract_variable, getenv) { - LAMMPS_NS::platform::putenv("FORTRAN_USER=myuser"); - f_lammps_setup_extract_variable(); - char *env = std::getenv("FORTRAN_USER"); - char *fenv = f_lammps_extract_variable_getenv(); - EXPECT_STREQ(fenv, env); - std::free(fenv); + LAMMPS_NS::platform::putenv("FORTRAN_USER=myuser"); + f_lammps_setup_extract_variable(); + char *env = std::getenv("FORTRAN_USER"); + char *fenv = f_lammps_extract_variable_getenv(); + EXPECT_STREQ(fenv, env); + std::free(fenv); }; TEST_F(LAMMPS_extract_variable, file) { - f_lammps_setup_extract_variable(); - int i; - const char* str[9] = {"hello","god_dag","hola","bonjour","guten_Tag", - "konnichiwa","shalom","salve","goedendag"}; - char* fstr; - for ( i = 0; i < 9; i++ ) { - fstr = f_lammps_extract_variable_file(); - EXPECT_STREQ(fstr, str[i]); - std::free(fstr); - lammps_command(lmp, "next greeting"); - } + f_lammps_setup_extract_variable(); + int i; + const char *str[9] = {"hello", "god_dag", "hola", "bonjour", "guten_Tag", + "konnichiwa", "shalom", "salve", "goedendag"}; + char *fstr; + for (i = 0; i < 9; i++) { + fstr = f_lammps_extract_variable_file(); + EXPECT_STREQ(fstr, str[i]); + std::free(fstr); + lammps_command(lmp, "next greeting"); + } }; TEST_F(LAMMPS_extract_variable, atomfile) { - f_lammps_setup_extract_variable(); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), 5.2); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 1.6); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), -1.4); - lammps_command(lmp, "next atfile"); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), -1.1); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 0.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), 2.5); + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), 5.2); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 1.6); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), -1.4); + lammps_command(lmp, "next atfile"); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(1), -1.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(2), 0.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atomfile(3), 2.5); }; TEST_F(LAMMPS_extract_variable, python) { - if ( lammps_config_has_package("PYTHON") ) { - f_lammps_setup_extract_variable(); - for (int i = 1; i <= 10; i++) { - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_python(), - static_cast(i*i)); - lammps_command(lmp, "next lp"); - } - } + if (lammps_config_has_package("PYTHON")) { + f_lammps_setup_extract_variable(); + for (int i = 1; i <= 10; i++) { + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_python(), static_cast(i * i)); + lammps_command(lmp, "next lp"); + } + } }; TEST_F(LAMMPS_extract_variable, timer) { - f_lammps_setup_extract_variable(); - double initial_t, final_t; - initial_t = f_lammps_extract_variable_timer(); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - lammps_command(lmp,"variable time timer"); // update the time - final_t = f_lammps_extract_variable_timer(); - EXPECT_GT(final_t, initial_t + 0.1); + f_lammps_setup_extract_variable(); + double initial_t, final_t; + initial_t = f_lammps_extract_variable_timer(); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + lammps_command(lmp, "variable time timer"); // update the time + final_t = f_lammps_extract_variable_timer(); + EXPECT_GT(final_t, initial_t + 0.1); }; TEST_F(LAMMPS_extract_variable, internal) { - f_lammps_setup_extract_variable(); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_internal(), 4.0); + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_internal(), 4.0); }; TEST_F(LAMMPS_extract_variable, equal) { - f_lammps_setup_extract_variable(); - int i; - for ( i = 1; i <= 10; i++ ) { - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_equal(), - std::exp(static_cast(i))); - lammps_command(lmp, "next lp"); - } + f_lammps_setup_extract_variable(); + int i; + for (i = 1; i <= 10; i++) { + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_equal(), std::exp(static_cast(i))); + lammps_command(lmp, "next lp"); + } }; TEST_F(LAMMPS_extract_variable, atom) { - f_lammps_setup_extract_variable(); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(1), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(3), 0.5); + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_atom(3), 0.5); }; TEST_F(LAMMPS_extract_variable, vector) { - f_lammps_setup_extract_variable(); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(1), (1+0.2+0.5)/3.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(2), (1+0.1+0.5)/3.0); - EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(3), (1.5+0.1+0.5)/3.0); + f_lammps_setup_extract_variable(); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(1), (1 + 0.2 + 0.5) / 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(2), (1 + 0.1 + 0.5) / 3.0); + EXPECT_DOUBLE_EQ(f_lammps_extract_variable_vector(3), (1.5 + 0.1 + 0.5) / 3.0); }; diff --git a/unittest/fortran/wrap_gather_scatter.cpp b/unittest/fortran/wrap_gather_scatter.cpp index efb33467d9..3b70c4393e 100644 --- a/unittest/fortran/wrap_gather_scatter.cpp +++ b/unittest/fortran/wrap_gather_scatter.cpp @@ -3,10 +3,10 @@ #include "lammps.h" #include "library.h" +#include +#include #include #include -#include -#include #include "gtest/gtest.h" @@ -18,185 +18,185 @@ void f_lammps_setup_gather_scatter(); int f_lammps_gather_atoms_mask(int); double f_lammps_gather_atoms_position(int); int f_lammps_gather_atoms_concat_mask(int); -double f_lammps_gather_atoms_concat_position(int,int); +double f_lammps_gather_atoms_concat_position(int, int); int f_lammps_gather_atoms_subset_mask(int); -double f_lammps_gather_atoms_subset_position(int,int); +double f_lammps_gather_atoms_subset_position(int, int); void f_lammps_scatter_atoms_masks(); void f_lammps_scatter_atoms_positions(); } class LAMMPS_gather_scatter : public ::testing::Test { protected: - LAMMPS_NS::LAMMPS *lmp; - LAMMPS_gather_scatter() = default; - ~LAMMPS_gather_scatter() override = default; + LAMMPS_NS::LAMMPS *lmp; + LAMMPS_gather_scatter() = default; + ~LAMMPS_gather_scatter() override = default; - void SetUp() override - { - ::testing::internal::CaptureStdout(); - lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); - std::string output = ::testing::internal::GetCapturedStdout(); - EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); - } - void TearDown() override - { - ::testing::internal::CaptureStdout(); - f_lammps_close(); - std::string output = ::testing::internal::GetCapturedStdout(); - EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); - lmp = nullptr; - } + void SetUp() override + { + ::testing::internal::CaptureStdout(); + lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + f_lammps_close(); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_STREQ(output.substr(0, 16).c_str(), "Total wall time:"); + lmp = nullptr; + } }; TEST_F(LAMMPS_gather_scatter, gather_atoms_masks) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); - EXPECT_EQ(f_lammps_gather_atoms_mask(2), 1); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); - EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); - lammps_command(lmp, "group other id 1"); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 7); - EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 7); + EXPECT_EQ(f_lammps_gather_atoms_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); }; TEST_F(LAMMPS_gather_scatter, gather_atoms_positions) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(2), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(3), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(4), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(5), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(6), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(7), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(8), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(9), 0.5); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(2), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(3), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(4), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(5), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(6), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(7), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(8), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_position(9), 0.5); }; TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_masks) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 1); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 1); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 3); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); - lammps_command(lmp, "group other id 1"); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 7); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); - EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 1); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); + lammps_command(lmp, "group other id 1"); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(1), 7); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_EQ(f_lammps_gather_atoms_concat_mask(3), 9); }; TEST_F(LAMMPS_gather_scatter, gather_atoms_concat_positions) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 0.5); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 3), 0.5); }; TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_masks) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 9); - lammps_command(lmp, "group other id 3"); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 13); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 9); + lammps_command(lmp, "group other id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_mask(3), 13); }; TEST_F(LAMMPS_gather_scatter, gather_atoms_subset_positions) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1,2), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3,3), 0.5); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1, 2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(1, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(2, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_subset_position(3, 3), 0.5); }; TEST_F(LAMMPS_gather_scatter, scatter_atoms_masks) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 3); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 9); - f_lammps_scatter_atoms_masks(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 9); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 3); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 3); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 9); + f_lammps_scatter_atoms_masks(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(1), 9); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(2), 5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_mask(3), 3); }; TEST_F(LAMMPS_gather_scatter, scatter_atoms_positions) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 0.5); - f_lammps_scatter_atoms_positions(); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,3), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,3), 1.0); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,3), 1.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,2), 0.2); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,2), 0.1); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1,1), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2,1), 0.5); - EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3,1), 0.5); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 1), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 1), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 3), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 3), 0.5); + f_lammps_scatter_atoms_positions(); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 3), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 3), 1.0); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 3), 1.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 2), 0.2); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 2), 0.1); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(1, 1), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(2, 1), 0.5); + EXPECT_DOUBLE_EQ(f_lammps_gather_atoms_concat_position(3, 1), 0.5); }; TEST_F(LAMMPS_gather_scatter, scatter_atoms_subset_mask) { - if ( lammps_extract_setting(nullptr,"tagint") == 8 ) GTEST_SKIP(); - f_lammps_setup_gather_scatter(); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); - lammps_command(lmp, "group special id 1"); - lammps_command(lmp, "group other id 2"); - lammps_command(lmp, "group spiffy id 3"); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); - f_lammps_scatter_atoms_masks(); - EXPECT_EQ(f_lammps_gather_atoms_mask(1), 9); - EXPECT_EQ(f_lammps_gather_atoms_mask(3), 3); + if (lammps_extract_setting(nullptr, "tagint") == 8) GTEST_SKIP(); + f_lammps_setup_gather_scatter(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 1); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 1); + lammps_command(lmp, "group special id 1"); + lammps_command(lmp, "group other id 2"); + lammps_command(lmp, "group spiffy id 3"); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 3); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 9); + f_lammps_scatter_atoms_masks(); + EXPECT_EQ(f_lammps_gather_atoms_mask(1), 9); + EXPECT_EQ(f_lammps_gather_atoms_mask(3), 3); }; diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index 21c953a514..d2daa22cf4 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -13,9 +13,9 @@ extern "C" { void *f_lammps_with_args(); void f_lammps_close(); int f_lammps_version(); -void f_lammps_memory_usage(double*); +void f_lammps_memory_usage(double *); int f_lammps_get_mpi_comm(); -int f_lammps_extract_setting(const char*); +int f_lammps_extract_setting(const char *); int f_lammps_has_error(); int f_lammps_get_last_error_message(char *, int); } @@ -26,17 +26,17 @@ using ::testing::ContainsRegex; class LAMMPS_properties : public ::testing::Test { protected: - LAMMPS_NS::LAMMPS *lmp; - LAMMPS_properties() = default; - ~LAMMPS_properties() override = default; + LAMMPS *lmp; void SetUp() override { ::testing::internal::CaptureStdout(); - lmp = (LAMMPS_NS::LAMMPS *)f_lammps_with_args(); + lmp = (LAMMPS *)f_lammps_with_args(); + std::string output = ::testing::internal::GetCapturedStdout(); EXPECT_STREQ(output.substr(0, 8).c_str(), "LAMMPS ("); } + void TearDown() override { ::testing::internal::CaptureStdout(); @@ -54,10 +54,10 @@ TEST_F(LAMMPS_properties, version) TEST_F(LAMMPS_properties, memory_usage) { -// copied from c-library, with a two-character modification - double meminfo[3]; - f_lammps_memory_usage(meminfo); - EXPECT_GT(meminfo[0], 0.0); + // copied from c-library, with a two-character modification + double meminfo[3]; + f_lammps_memory_usage(meminfo); + EXPECT_GT(meminfo[0], 0.0); #if defined(__linux__) || defined(_WIN32) EXPECT_GE(meminfo[1], 0.0); #endif @@ -68,11 +68,11 @@ TEST_F(LAMMPS_properties, memory_usage) TEST_F(LAMMPS_properties, get_mpi_comm) { - int f_comm = f_lammps_get_mpi_comm(); - if ( lammps_config_has_mpi_support() ) - EXPECT_GE(f_comm, 0); - else - EXPECT_EQ(f_comm, -1); + int f_comm = f_lammps_get_mpi_comm(); + if (lammps_config_has_mpi_support()) + EXPECT_GE(f_comm, 0); + else + EXPECT_EQ(f_comm, -1); }; TEST_F(LAMMPS_properties, extract_setting) From 4e9b97d5cba2a16b9770cb5172d6fa09afdb91c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 23:49:17 -0400 Subject: [PATCH 311/364] make capitalization and whitespace fortran coding style more consistent --- fortran/lammps.f90 | 211 ++++++------- unittest/fortran/test_fortran_box.f90 | 42 +-- .../fortran/test_fortran_extract_atom.f90 | 66 ++-- .../fortran/test_fortran_extract_compute.f90 | 62 ++-- unittest/fortran/test_fortran_extract_fix.f90 | 44 +-- .../fortran/test_fortran_extract_global.f90 | 298 +++++++++--------- .../fortran/test_fortran_extract_variable.f90 | 48 +-- .../fortran/test_fortran_gather_scatter.f90 | 22 +- unittest/fortran/test_fortran_get_thermo.f90 | 50 +-- unittest/fortran/test_fortran_properties.f90 | 50 +-- 10 files changed, 449 insertions(+), 444 deletions(-) diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 2a4a16bdd0..d37b12c7db 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -483,10 +483,10 @@ MODULE LIBLAMMPS END FUNCTION lammps_version SUBROUTINE lammps_get_os_info(buffer, buf_size) BIND(C) - IMPORT :: C_ptr, C_int + IMPORT :: c_ptr, c_int IMPLICIT NONE - TYPE(C_ptr), VALUE :: buffer - INTEGER(C_int), VALUE :: buf_size + TYPE(c_ptr), VALUE :: buffer + INTEGER(c_int), VALUE :: buf_size END SUBROUTINE lammps_get_os_info FUNCTION lammps_config_has_mpi_support() BIND(C) @@ -526,24 +526,24 @@ MODULE LIBLAMMPS END FUNCTION lammps_config_has_exceptions FUNCTION lammps_config_has_package(name) BIND(C) - IMPORT :: C_int, C_ptr + IMPORT :: c_int, c_ptr IMPLICIT NONE - TYPE(C_ptr), VALUE :: name + TYPE(c_ptr), VALUE :: name INTEGER(c_int) :: lammps_config_has_package END FUNCTION lammps_config_has_package FUNCTION lammps_config_package_count() BIND(C) - IMPORT :: C_int + IMPORT :: c_int IMPLICIT NONE - INTEGER(C_int) :: lammps_config_package_count + INTEGER(c_int) :: lammps_config_package_count END FUNCTION lammps_config_package_count FUNCTION lammps_config_package_name(idx, buffer, buf_size) BIND(C) - IMPORT :: C_int, C_ptr + IMPORT :: c_int, c_ptr IMPLICIT NONE - INTEGER(C_int) :: lammps_config_package_name - INTEGER(C_int), VALUE :: idx, buf_size - TYPE(C_ptr), VALUE :: buffer + INTEGER(c_int) :: lammps_config_package_name + INTEGER(c_int), VALUE :: idx, buf_size + TYPE(c_ptr), VALUE :: buffer END FUNCTION lammps_config_package_name !LOGICAL FUNCTION lammps_config_accelerator @@ -551,10 +551,10 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_get_gpu_device !LOGICAL FUNCTION lammps_has_id - !INTEGER(C_int) FUNCTION lammps_id_count + !INTEGER(c_int) FUNCTION lammps_id_count !SUBROUTINE lammps_id_name - !INTEGER(C_int) FUNCTION lammps_plugin_count + !INTEGER(c_int) FUNCTION lammps_plugin_count !SUBROUTINE lammps_plugin_name !Both of these use LAMMPS_BIGBIG @@ -572,9 +572,9 @@ MODULE LIBLAMMPS !SUBROUTINE lammps_fix_external_set_vector SUBROUTINE lammps_flush_buffers(handle) BIND(C) - IMPORT :: C_ptr + IMPORT :: c_ptr IMPLICIT NONE - TYPE(C_ptr), VALUE :: handle + TYPE(c_ptr), VALUE :: handle END SUBROUTINE lammps_flush_buffers FUNCTION lammps_malloc(size) BIND(C, name='malloc') @@ -602,7 +602,7 @@ MODULE LIBLAMMPS TYPE(c_ptr), VALUE :: handle END SUBROUTINE lammps_force_timeout - INTEGER(C_int) FUNCTION lammps_has_error(handle) BIND(C) + INTEGER(c_int) FUNCTION lammps_has_error(handle) BIND(C) IMPORT :: c_ptr, c_int IMPLICIT NONE TYPE(c_ptr), VALUE :: handle @@ -758,7 +758,7 @@ CONTAINS REAL(c_double) FUNCTION lmp_get_thermo(self,name) CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*) :: name - TYPE(C_ptr) :: Cname + TYPE(c_ptr) :: Cname Cname = f2c_string(name) lmp_get_thermo = lammps_get_thermo(self%handle, Cname) @@ -771,27 +771,27 @@ CONTAINS REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: boxlo(3), boxhi(3) REAL(c_double), INTENT(OUT), TARGET, OPTIONAL :: xy, yz, xz LOGICAL, INTENT(OUT), OPTIONAL :: pflags(3), boxflag - INTEGER(c_int), TARGET :: C_pflags(3), C_boxflag + INTEGER(c_int), TARGET :: c_pflags(3), c_boxflag TYPE(c_ptr) :: ptr(7) ptr = c_null_ptr - IF ( PRESENT(boxlo) ) ptr(1) = C_LOC(boxlo(1)) - IF ( PRESENT(boxhi) ) ptr(2) = C_LOC(boxhi(1)) - IF ( PRESENT(xy) ) ptr(3) = C_LOC(xy) - IF ( PRESENT(yz) ) ptr(4) = C_LOC(yz) - IF ( PRESENT(xz) ) ptr(5) = C_LOC(xz) - IF ( PRESENT(pflags) ) ptr(6) = C_LOC(C_pflags(1)) - IF ( PRESENT(boxflag) ) ptr(7) = C_LOC(C_boxflag) + IF (PRESENT(boxlo)) ptr(1) = C_LOC(boxlo(1)) + IF (PRESENT(boxhi)) ptr(2) = C_LOC(boxhi(1)) + IF (PRESENT(xy)) ptr(3) = C_LOC(xy) + IF (PRESENT(yz)) ptr(4) = C_LOC(yz) + IF (PRESENT(xz)) ptr(5) = C_LOC(xz) + IF (PRESENT(pflags)) ptr(6) = C_LOC(c_pflags(1)) + IF (PRESENT(boxflag)) ptr(7) = C_LOC(c_boxflag) CALL lammps_extract_box(self%handle, ptr(1), ptr(2), ptr(3), ptr(4), & ptr(5), ptr(6), ptr(7)) - IF ( PRESENT(pflags) ) pflags = ( C_pflags /= 0_C_int ) - IF ( PRESENT(boxflag) ) boxflag = ( C_boxflag /= 0_C_int ) + IF (PRESENT(pflags)) pflags = (c_pflags /= 0_c_int) + IF (PRESENT(boxflag)) boxflag = (c_boxflag /= 0_c_int) END SUBROUTINE lmp_extract_box ! equivalent function to lammps_reset_box SUBROUTINE lmp_reset_box(self, boxlo, boxhi, xy, yz, xz) CLASS(lammps), INTENT(IN) :: self - REAL(C_double), INTENT(IN) :: boxlo(3), boxhi(3), xy, yz, xz + REAL(c_double), INTENT(IN) :: boxlo(3), boxhi(3), xy, yz, xz CALL lammps_reset_box(self%handle, boxlo, boxhi, xy, yz, xz) END SUBROUTINE lmp_reset_box @@ -857,7 +857,7 @@ CONTAINS global_data%lammps_instance => self SELECT CASE (datatype) CASE (LAMMPS_INT) - IF ( length == 1 ) THEN + IF (length == 1) THEN global_data%datatype = DATA_INT CALL C_F_POINTER(Cptr, global_data%i32) ELSE @@ -865,7 +865,7 @@ CONTAINS CALL C_F_POINTER(Cptr, global_data%i32_vec, [length]) END IF CASE (LAMMPS_INT64) - IF ( length == 1 ) THEN + IF (length == 1) THEN global_data%datatype = DATA_INT64 CALL C_F_POINTER(Cptr, global_data%i64) ELSE @@ -873,7 +873,7 @@ CONTAINS CALL C_F_POINTER(Cptr, global_data%i64_vec, [length]) END IF CASE (LAMMPS_DOUBLE) - IF ( length == 1 ) THEN + IF (length == 1) THEN global_data%datatype = DATA_DOUBLE CALL C_F_POINTER(Cptr, global_data%r64) ELSE @@ -884,8 +884,8 @@ CONTAINS global_data%datatype = DATA_STRING length = c_strlen(Cptr) CALL C_F_POINTER(Cptr, Fptr, [length]) - ALLOCATE ( CHARACTER(LEN=length) :: global_data%str ) - FORALL ( i=1:length ) + ALLOCATE(CHARACTER(LEN=length) :: global_data%str) + FORALL (i=1:length) global_data%str(i:i) = Fptr(i) END FORALL CASE DEFAULT @@ -939,7 +939,7 @@ CONTAINS CALL C_F_POINTER(Cptr, peratom_data%i64_vec, [ncols]) CASE (LAMMPS_DOUBLE) peratom_data%datatype = DATA_DOUBLE_1D - IF ( name == 'mass' ) THEN + IF (name == 'mass') THEN CALL C_F_POINTER(Cptr, dummy, [ncols]) peratom_data%r64_vec(0:) => dummy ELSE @@ -978,7 +978,7 @@ CONTAINS Cid = f2c_string(id) Cptr = lammps_extract_compute(self%handle, Cid, style, type) - IF ( .NOT. C_ASSOCIATED(Cptr) ) THEN + IF (.NOT. C_ASSOCIATED(Cptr)) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'Pointer from LAMMPS is NULL [Fortran/extract_compute]') END IF @@ -1046,8 +1046,8 @@ CONTAINS ! global data, as it would be if we could access the C++ array directly Cnrow = -1 Cncol = -1 - IF ( PRESENT(nrow) ) THEN - IF ( .NOT. PRESENT(ncol) ) THEN + IF (PRESENT(nrow)) THEN + IF (.NOT. PRESENT(ncol)) THEN ! Presumably the argument that's there is the vector length Cnrow = nrow - 1_c_int Cncol = -1_c_int @@ -1057,11 +1057,11 @@ CONTAINS END IF END IF - IF ( PRESENT(ncol) ) Cnrow = ncol - 1_c_int + IF (PRESENT(ncol)) Cnrow = ncol - 1_c_int Cid = f2c_string(id) Cptr = lammps_extract_fix(self%handle, Cid, style, type, Cnrow, Cncol) - IF ( .NOT. C_ASSOCIATED(Cptr) ) THEN + IF (.NOT. C_ASSOCIATED(Cptr)) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'Pointer from LAMMPS is NULL for fix id "' // id & // '" [Fortran/extract_fix]') @@ -1082,7 +1082,7 @@ CONTAINS & [Fortran/extract_fix]') CASE (LMP_TYPE_VECTOR) fix_data%datatype = DATA_DOUBLE_1D - IF ( STYLE == LMP_STYLE_ATOM ) THEN + IF (STYLE == LMP_STYLE_ATOM) THEN nrows = self%extract_setting('nmax') ELSE Ctemp = lammps_extract_fix(self%handle, Cid, style, & @@ -1093,7 +1093,7 @@ CONTAINS CALL C_F_POINTER(Cptr, fix_data%r64_vec, [nrows]) CASE (LMP_TYPE_ARRAY) fix_data%datatype = DATA_DOUBLE_2D - IF ( STYLE == LMP_STYLE_ATOM ) THEN + IF (STYLE == LMP_STYLE_ATOM) THEN ! Fortran array is transposed relative to C ncols = self%extract_setting('nmax') Ctemp = lammps_extract_fix(self%handle, Cid, style, & @@ -1142,7 +1142,7 @@ CONTAINS INTEGER(c_int), POINTER :: Clength => NULL() Cname = f2c_string(name) - IF ( PRESENT(group) ) THEN + IF (PRESENT(group)) THEN Cgroup = f2c_string(group) ELSE Cgroup = c_null_ptr @@ -1163,9 +1163,8 @@ CONTAINS variable_data%datatype = DATA_DOUBLE_1D length = lmp_extract_setting(self, 'nlocal') CALL C_F_POINTER(Cptr, double_vec, [length]) - IF ( ALLOCATED(variable_data%r64_vec) ) & - DEALLOCATE(variable_data%r64_vec) - ALLOCATE( variable_data%r64_vec(length) ) + IF (ALLOCATED(variable_data%r64_vec)) DEALLOCATE(variable_data%r64_vec) + ALLOCATE(variable_data%r64_vec(length)) variable_data%r64_vec = double_vec CALL lammps_free(Cptr) CASE (LMP_VAR_VECTOR) @@ -1179,17 +1178,17 @@ CONTAINS CALL lammps_free(Cname) CALL lammps_free(Cveclength) CALL C_F_POINTER(Cptr, double_vec, [length]) - IF ( ALLOCATED(variable_data%r64_vec) ) & + IF (ALLOCATED(variable_data%r64_vec)) & DEALLOCATE(variable_data%r64_vec) - ALLOCATE( variable_data%r64_vec(length) ) + ALLOCATE(variable_data%r64_vec(length)) variable_data%r64_vec = double_vec ! DO NOT deallocate the C pointer CASE (LMP_VAR_STRING) variable_data%datatype = DATA_STRING length = c_strlen(Cptr) CALL C_F_POINTER(Cptr, Cstring, [length]) - ALLOCATE ( CHARACTER(LEN=length) :: variable_data%str ) - FORALL ( i=1:length ) + ALLOCATE(CHARACTER(LEN=length) :: variable_data%str) + FORALL (i=1:length) variable_data%str(i:i) = Cstring(i) END FORALL ! DO NOT deallocate the C pointer @@ -1209,14 +1208,14 @@ CONTAINS CLASS(lammps), INTENT(IN) :: self CHARACTER(LEN=*), INTENT(IN) :: name, str INTEGER :: err - TYPE(C_ptr) :: Cstr, Cname + TYPE(c_ptr) :: Cstr, Cname Cstr = f2c_string(str) Cname = f2c_string(name) err = lammps_set_variable(self%handle, Cname, Cstr) CALL lammps_free(Cname) CALL lammps_free(Cstr) - IF ( err /= 0 ) THEN + IF (err /= 0) THEN CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & 'WARNING: unable to set string variable "' // name & // '" [Fortran/set_variable]') @@ -1235,13 +1234,13 @@ CONTAINS REAL(c_double) :: dnatoms CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& & requires "count" to be 1 or 3 [Fortran/gather_atoms]') END IF dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function gather_atoms with more than', & HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' @@ -1250,7 +1249,7 @@ CONTAINS natoms = NINT(dnatoms, c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(natoms*count)) Cdata = C_LOC(data(1)) CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) @@ -1266,16 +1265,16 @@ CONTAINS TYPE(c_ptr) :: Cdata, Cname INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 1_c_int - REAL(C_double) :: dnatoms + REAL(c_double) :: dnatoms CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, 'gather_atoms& & requires "count" to be 1 or 3 [Fortran/gather_atoms]') END IF dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function gather_atoms with more than', & HUGE(0_c_int), 'atoms [Fortran/gather_atoms]' @@ -1284,7 +1283,7 @@ CONTAINS natoms = NINT(dnatoms, c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(natoms*count)) Cdata = C_LOC(data(1)) CALL lammps_gather_atoms(self%handle, Cname, Ctype, count, Cdata) @@ -1300,17 +1299,17 @@ CONTAINS TYPE(c_ptr) :: Cdata, Cname INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 0_c_int - REAL(C_double) :: dnatoms + REAL(c_double) :: dnatoms CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'gather_atoms_concat requires "count" to be 1 or 3 & &[Fortran/gather_atoms_concat]') END IF dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function gather_atoms_concat with more than', & HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' @@ -1319,7 +1318,7 @@ CONTAINS natoms = NINT(dnatoms, c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(natoms*count)) Cdata = C_LOC(data(1)) CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) @@ -1335,17 +1334,17 @@ CONTAINS TYPE(c_ptr) :: Cdata, Cname INTEGER(c_int) :: natoms INTEGER(c_int), PARAMETER :: Ctype = 1_c_int - REAL(C_double) :: dnatoms + REAL(c_double) :: dnatoms CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'gather_atoms_concat requires "count" to be 1 or 3 & &[Fortran/gather_atoms_concat]') END IF dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function gather_atoms_concat with more than', & HUGE(0_c_int), 'atoms [Fortran/gather_atoms_concat]' @@ -1354,7 +1353,7 @@ CONTAINS natoms = NINT(dnatoms, c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(natoms*count)) Cdata = C_LOC(data(1)) CALL lammps_gather_atoms_concat(self%handle, Cname, Ctype, count, Cdata) @@ -1373,7 +1372,7 @@ CONTAINS INTEGER(c_int), PARAMETER :: Ctype = 0_c_int CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'gather_atoms_subset requires "count" to be 1 or 3 & &[Fortran/gather_atoms]') @@ -1382,7 +1381,7 @@ CONTAINS ndata = SIZE(ids, KIND=c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(ndata*count)) data = -1_c_int Cdata = C_LOC(data(1)) @@ -1404,7 +1403,7 @@ CONTAINS INTEGER(c_int), PARAMETER :: Ctype = 1_c_int CHARACTER(LEN=100) :: error_msg - IF ( count /= 1 .AND. count /= 3 ) THEN + IF (count /= 1 .AND. count /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'gather_atoms_subset requires "count" to be 1 or 3 & &[Fortran/gather_atoms]') @@ -1413,7 +1412,7 @@ CONTAINS ndata = SIZE(ids, KIND=c_int) Cname = f2c_string(name) - IF ( ALLOCATED(data) ) DEALLOCATE(data) + IF (ALLOCATED(data)) DEALLOCATE(data) ALLOCATE(data(ndata*count)) Cdata = C_LOC(data(1)) Cids = C_LOC(ids(1)) @@ -1434,7 +1433,7 @@ CONTAINS CHARACTER(LEN=100) :: error_msg dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function scatter_atoms with more than', & HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' @@ -1446,7 +1445,7 @@ CONTAINS Cdata = C_LOC(data(1)) Ccount = SIZE(data) / natoms - IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + IF (Ccount /= 1 .AND. Ccount /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'lammps_scatter_atoms requires either 1 or 3 data per atom') END IF @@ -1466,7 +1465,7 @@ CONTAINS CHARACTER(LEN=100) :: error_msg dnatoms = lmp_get_natoms(self) - IF ( dnatoms > HUGE(1_c_int) ) THEN + IF (dnatoms > HUGE(1_c_int)) THEN WRITE(error_msg,'(A,1X,I0,1X,A)') & 'Cannot use library function scatter_atoms with more than', & HUGE(0_c_int), 'atoms [Fortran/scatter_atoms]' @@ -1478,7 +1477,7 @@ CONTAINS Cdata = C_LOC(data(1)) Ccount = SIZE(data) / natoms - IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + IF (Ccount /= 1 .AND. Ccount /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'scatter_atoms requires either 1 or 3 data per atom & &[Fortran/scatter_atoms]') @@ -1499,7 +1498,7 @@ CONTAINS Cndata = SIZE(ids, KIND=c_int) Ccount = SIZE(data, KIND=c_int) / Cndata - IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + IF (Ccount /= 1 .AND. Ccount /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'scatter_atoms_subset requires either 1 or 3 data per atom') END IF @@ -1524,7 +1523,7 @@ CONTAINS Cndata = SIZE(ids, KIND=c_int) Ccount = SIZE(data, KIND=c_int) / Cndata - IF ( Ccount /= 1 .AND. Ccount /= 3 ) THEN + IF (Ccount /= 1 .AND. Ccount /= 3) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'scatter_atoms_subset requires either 1 or 3 data per atom') END IF @@ -1557,7 +1556,7 @@ CONTAINS buf_size = LEN(buffer) CALL lammps_get_os_info(ptr, buf_size) DO i=1,buf_size - IF ( Cbuffer(i) == C_NULL_CHAR ) EXIT + IF (Cbuffer(i) == c_null_char) EXIT buffer(i:i) = Cbuffer(i) END DO END SUBROUTINE lmp_get_os_info @@ -1580,7 +1579,7 @@ CONTAINS ! equivalent function to lammps_config_has_png_support LOGICAL FUNCTION lmp_config_has_png_support() - INTEGER(C_int) :: has_png_support + INTEGER(c_int) :: has_png_support has_png_support = lammps_config_has_png_support() lmp_config_has_png_support = (has_png_support /= 0_c_int) @@ -1634,10 +1633,10 @@ CONTAINS Cidx = idx - 1 Cptr = C_LOC(Cbuffer(1)) Csuccess = lammps_config_package_name(Cidx, Cptr, LEN(buffer)+1) - buffer = '' - IF ( Csuccess /= 0_c_int ) THEN + buffer = ' ' + IF (Csuccess /= 0_c_int) THEN strlen = c_strlen(Cptr) - FORALL ( i = 1:strlen ) + FORALL (i = 1:strlen) buffer(i:i) = Cbuffer(i) END FORALL END IF @@ -1650,15 +1649,15 @@ CONTAINS INTEGER, PARAMETER :: MAX_BUFFER_LENGTH = 31 INTEGER :: i, npackage, buf_length - IF ( PRESENT(length) ) THEN + IF (PRESENT(length)) THEN buf_length = length ELSE buf_length = MAX_BUFFER_LENGTH END IF - IF ( ALLOCATED(package) ) DEALLOCATE(package) + IF (ALLOCATED(package)) DEALLOCATE(package) npackage = lammps_config_package_count() - ALLOCATE( CHARACTER(LEN=MAX_BUFFER_LENGTH) :: package(npackage) ) + ALLOCATE(CHARACTER(LEN=MAX_BUFFER_LENGTH) :: package(npackage)) DO i=1, npackage CALL lmp_config_package_name(i, package(i)) END DO @@ -1675,7 +1674,7 @@ CONTAINS LOGICAL FUNCTION lmp_is_running(self) CLASS(lammps), INTENT(IN) :: self - lmp_is_running = ( lammps_is_running(self%handle) /= 0_C_int ) + lmp_is_running = (lammps_is_running(self%handle) /= 0_c_int) END FUNCTION lmp_is_running ! equivalent function to lammps_force_timeout @@ -1705,7 +1704,7 @@ CONTAINS CHARACTER(LEN=1, KIND=c_char), POINTER :: c_string(:) buffer = ' ' - IF ( lmp_has_error(self) ) THEN + IF (lmp_has_error(self)) THEN buflen = LEN(buffer) length = buflen Cptr = lammps_malloc(length) @@ -1715,13 +1714,13 @@ CONTAINS buffer(i:i) = c_string(i) IF (c_string(i) == c_null_char) EXIT END DO - IF ( PRESENT(status) ) THEN + IF (PRESENT(status)) THEN status = Cstatus END IF CALL lammps_free(Cptr) ELSE buffer = ' ' - IF ( PRESENT(status) ) THEN + IF (PRESENT(status)) THEN status = 0 END IF END IF @@ -1734,7 +1733,7 @@ CONTAINS INTEGER(c_int), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_INT ) THEN + IF (rhs%datatype == DATA_INT) THEN lhs => rhs%i32 ELSE CALL assignment_error(rhs, 'scalar int') @@ -1745,7 +1744,7 @@ CONTAINS INTEGER(c_int64_t), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_INT64 ) THEN + IF (rhs%datatype == DATA_INT64) THEN lhs => rhs%i64 ELSE CALL assignment_error(rhs, 'scalar long int') @@ -1756,7 +1755,7 @@ CONTAINS INTEGER(c_int), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_INT_1D ) THEN + IF (rhs%datatype == DATA_INT_1D) THEN lhs => rhs%i32_vec ELSE CALL assignment_error(rhs, 'vector of ints') @@ -1767,7 +1766,7 @@ CONTAINS INTEGER(c_int64_t), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_INT64_1D ) THEN + IF (rhs%datatype == DATA_INT64_1D) THEN lhs => rhs%i64_vec ELSE CALL assignment_error(rhs, 'vector of long ints') @@ -1778,7 +1777,7 @@ CONTAINS REAL(c_double), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE ) THEN + IF (rhs%datatype == DATA_DOUBLE) THEN lhs => rhs%r64 ELSE CALL assignment_error(rhs, 'scalar double') @@ -1789,7 +1788,7 @@ CONTAINS REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + IF (rhs%datatype == DATA_DOUBLE_1D) THEN lhs => rhs%r64_vec ELSE CALL assignment_error(rhs, 'vector of doubles') @@ -1800,7 +1799,7 @@ CONTAINS REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE_2D ) THEN + IF (rhs%datatype == DATA_DOUBLE_2D) THEN lhs => rhs%r64_mat ELSE CALL assignment_error(rhs, 'matrix of doubles') @@ -1811,9 +1810,9 @@ CONTAINS CHARACTER(LEN=*), INTENT(OUT) :: lhs CLASS(lammps_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_STRING ) THEN + IF (rhs%datatype == DATA_STRING) THEN lhs = rhs%str - IF ( LEN_TRIM(rhs%str) > LEN(lhs) ) THEN + IF (LEN_TRIM(rhs%str) > LEN(lhs)) THEN CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & 'String provided by user required truncation [Fortran API]') END IF @@ -1829,7 +1828,7 @@ CONTAINS REAL(c_double), INTENT(OUT) :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE ) THEN + IF (rhs%datatype == DATA_DOUBLE) THEN lhs = rhs%r64 ELSE CALL assignment_error(rhs, 'scalar double') @@ -1840,7 +1839,7 @@ CONTAINS REAL(c_double), DIMENSION(:), INTENT(OUT), POINTER :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN + IF (rhs%datatype == DATA_DOUBLE_1D) THEN lhs => rhs%r64_vec ELSE CALL assignment_error(rhs, 'vector of doubles') @@ -1851,7 +1850,7 @@ CONTAINS REAL(c_double), DIMENSION(:,:), INTENT(OUT), POINTER :: lhs CLASS(lammps_fix_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE_2D ) THEN + IF (rhs%datatype == DATA_DOUBLE_2D) THEN lhs => rhs%r64_mat ELSE CALL assignment_error(rhs, 'matrix of doubles') @@ -1865,7 +1864,7 @@ CONTAINS REAL(c_double), INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE ) THEN + IF (rhs%datatype == DATA_DOUBLE) THEN lhs = rhs%r64 ELSE CALL assignment_error(rhs, 'scalar double') @@ -1876,9 +1875,9 @@ CONTAINS REAL(c_double), DIMENSION(:), ALLOCATABLE, INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_DOUBLE_1D ) THEN - IF ( ALLOCATED(lhs) ) DEALLOCATE(lhs) - ALLOCATE( lhs(SIZE(rhs%r64_vec)) ) + IF (rhs%datatype == DATA_DOUBLE_1D) THEN + IF (ALLOCATED(lhs)) DEALLOCATE(lhs) + ALLOCATE(lhs(SIZE(rhs%r64_vec))) lhs = rhs%r64_vec ELSE CALL assignment_error(rhs, 'vector of doubles') @@ -1889,9 +1888,9 @@ CONTAINS CHARACTER(LEN=*), INTENT(OUT) :: lhs CLASS(lammps_variable_data), INTENT(IN) :: rhs - IF ( rhs%datatype == DATA_STRING ) THEN + IF (rhs%datatype == DATA_STRING) THEN lhs = rhs%str - IF ( LEN_TRIM(rhs%str) > LEN(lhs) ) THEN + IF (LEN_TRIM(rhs%str) > LEN(lhs)) THEN CALL lmp_error(rhs%lammps_instance, LMP_ERROR_WARNING, & 'String provided by user required truncation [Fortran API]') END IF diff --git a/unittest/fortran/test_fortran_box.f90 b/unittest/fortran/test_fortran_box.f90 index 2123ae0c15..164a8a97b1 100644 --- a/unittest/fortran/test_fortran_box.f90 +++ b/unittest/fortran/test_fortran_box.f90 @@ -23,7 +23,7 @@ SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_box_setup () BIND(C) +SUBROUTINE f_lammps_box_setup() BIND(C) USE liblammps USE keepstuff, ONLY : lmp, demo_input IMPLICIT NONE @@ -39,84 +39,84 @@ SUBROUTINE f_lammps_delete_everything() BIND(C) CALL lmp%command("delete_atoms group all"); END SUBROUTINE f_lammps_delete_everything -FUNCTION f_lammps_extract_box_xlo () BIND(C) +FUNCTION f_lammps_extract_box_xlo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_xlo - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_xlo + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxlo=boxdim) f_lammps_extract_box_xlo = boxdim(1) END FUNCTION f_lammps_extract_box_xlo -FUNCTION f_lammps_extract_box_xhi () BIND(C) +FUNCTION f_lammps_extract_box_xhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_xhi - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_xhi + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxhi=boxdim) f_lammps_extract_box_xhi = boxdim(1) END FUNCTION f_lammps_extract_box_xhi -FUNCTION f_lammps_extract_box_ylo () BIND(C) +FUNCTION f_lammps_extract_box_ylo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_ylo - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_ylo + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxlo=boxdim) f_lammps_extract_box_ylo = boxdim(2) END FUNCTION f_lammps_extract_box_ylo -FUNCTION f_lammps_extract_box_yhi () BIND(C) +FUNCTION f_lammps_extract_box_yhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_yhi - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_yhi + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxhi=boxdim) f_lammps_extract_box_yhi = boxdim(2) END FUNCTION f_lammps_extract_box_yhi -FUNCTION f_lammps_extract_box_zlo () BIND(C) +FUNCTION f_lammps_extract_box_zlo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_zlo - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_zlo + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxlo=boxdim) f_lammps_extract_box_zlo = boxdim(2) END FUNCTION f_lammps_extract_box_zlo -FUNCTION f_lammps_extract_box_zhi () BIND(C) +FUNCTION f_lammps_extract_box_zhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_extract_box_zhi - REAL (c_double) :: boxdim(3) + REAL(c_double) :: f_lammps_extract_box_zhi + REAL(c_double) :: boxdim(3) CALL lmp%extract_box(boxhi=boxdim) f_lammps_extract_box_zhi = boxdim(2) END FUNCTION f_lammps_extract_box_zhi -SUBROUTINE f_lammps_reset_box_2x () BIND(C) +SUBROUTINE f_lammps_reset_box_2x() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: newlo(3), newhi(3), xy, yz, xz + REAL(c_double) :: newlo(3), newhi(3), xy, yz, xz xy = 0.0_c_double yz = 0.0_c_double diff --git a/unittest/fortran/test_fortran_extract_atom.f90 b/unittest/fortran/test_fortran_extract_atom.f90 index eb55754561..262e5de47d 100644 --- a/unittest/fortran/test_fortran_extract_atom.f90 +++ b/unittest/fortran/test_fortran_extract_atom.f90 @@ -22,7 +22,7 @@ SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_setup_extract_atom () BIND(C) +SUBROUTINE f_lammps_setup_extract_atom() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE @@ -32,91 +32,91 @@ SUBROUTINE f_lammps_setup_extract_atom () BIND(C) CALL lmp%commands_list(pair_input) END SUBROUTINE f_lammps_setup_extract_atom -FUNCTION f_lammps_extract_atom_mass () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_atom_mass() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL(C_double) :: f_lammps_extract_atom_mass - REAL(C_double), DIMENSION(:), POINTER :: mass => NULL() + REAL(c_double) :: f_lammps_extract_atom_mass + REAL(c_double), DIMENSION(:), POINTER :: mass => NULL() mass = lmp%extract_atom('mass') f_lammps_extract_atom_mass = mass(1) END FUNCTION f_lammps_extract_atom_mass -FUNCTION f_lammps_extract_atom_tag_int (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_atom_tag_int(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_tag_int - INTEGER(C_int), DIMENSION(:), POINTER :: tag => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_extract_atom_tag_int + INTEGER(c_int), DIMENSION(:), POINTER :: tag => NULL() tag = lmp%extract_atom('id') f_lammps_extract_atom_tag_int = tag(i) END FUNCTION f_lammps_extract_atom_tag_int -FUNCTION f_lammps_extract_atom_tag_int64 (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int64_t +FUNCTION f_lammps_extract_atom_tag_int64(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int64_t USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int64_t), INTENT(IN), VALUE :: i - INTEGER(C_int64_t) :: f_lammps_extract_atom_tag_int64 - INTEGER(C_int64_t), DIMENSION(:), POINTER :: tag => NULL() + INTEGER(c_int64_t), INTENT(IN), VALUE :: i + INTEGER(c_int64_t) :: f_lammps_extract_atom_tag_int64 + INTEGER(c_int64_t), DIMENSION(:), POINTER :: tag => NULL() tag = lmp%extract_atom('id') f_lammps_extract_atom_tag_int64 = tag(i) END FUNCTION f_lammps_extract_atom_tag_int64 FUNCTION f_lammps_extract_atom_type(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_type - INTEGER(C_int), DIMENSION(:), POINTER :: atype => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_extract_atom_type + INTEGER(c_int), DIMENSION(:), POINTER :: atype => NULL() atype = lmp%extract_atom('type') f_lammps_extract_atom_type = atype(i) END FUNCTION f_lammps_extract_atom_type FUNCTION f_lammps_extract_atom_mask(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - INTEGER(C_int) :: f_lammps_extract_atom_mask - INTEGER(C_int), DIMENSION(:), POINTER :: mask => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + INTEGER(c_int) :: f_lammps_extract_atom_mask + INTEGER(c_int), DIMENSION(:), POINTER :: mask => NULL() mask = lmp%extract_atom('mask') f_lammps_extract_atom_mask = mask(i) END FUNCTION f_lammps_extract_atom_mask -SUBROUTINE f_lammps_extract_atom_x (i, x) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +SUBROUTINE f_lammps_extract_atom_x(i, x) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double), DIMENSION(3) :: x - REAL(C_double), DIMENSION(:,:), POINTER :: xptr => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double), DIMENSION(3) :: x + REAL(c_double), DIMENSION(:,:), POINTER :: xptr => NULL() xptr = lmp%extract_atom('x') x = xptr(:,i) END SUBROUTINE f_lammps_extract_atom_x -SUBROUTINE f_lammps_extract_atom_v (i, v) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +SUBROUTINE f_lammps_extract_atom_v(i, v) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double), DIMENSION(3) :: v - REAL(C_double), DIMENSION(:,:), POINTER :: vptr => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double), DIMENSION(3) :: v + REAL(c_double), DIMENSION(:,:), POINTER :: vptr => NULL() vptr = lmp%extract_atom('v') v = vptr(:,i) diff --git a/unittest/fortran/test_fortran_extract_compute.f90 b/unittest/fortran/test_fortran_extract_compute.f90 index 8f5bbdfd51..e3515f2a7a 100644 --- a/unittest/fortran/test_fortran_extract_compute.f90 +++ b/unittest/fortran/test_fortran_extract_compute.f90 @@ -22,7 +22,7 @@ SUBROUTINE f_lammps_close() BIND(C) lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_setup_extract_compute () BIND(C) +SUBROUTINE f_lammps_setup_extract_compute() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp, big_input, cont_input, more_input, pair_input IMPLICIT NONE @@ -42,91 +42,91 @@ SUBROUTINE f_lammps_setup_extract_compute () BIND(C) CALL lmp%command("run 0") ! must be here, otherwise will SEGFAULT END SUBROUTINE f_lammps_setup_extract_compute -FUNCTION f_lammps_extract_compute_peratom_vector (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_peratom_vector(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double) :: f_lammps_extract_compute_peratom_vector - REAL(C_double), DIMENSION(:), POINTER :: vector => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_compute_peratom_vector + REAL(c_double), DIMENSION(:), POINTER :: vector => NULL() vector = lmp%extract_compute('peratompe', lmp%style%atom, lmp%type%vector) f_lammps_extract_compute_peratom_vector = vector(i) END FUNCTION f_lammps_extract_compute_peratom_vector -FUNCTION f_lammps_extract_compute_peratom_array (i,j) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_peratom_array(i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i, j - REAL(C_double) :: f_lammps_extract_compute_peratom_array - REAL(C_double), DIMENSION(:,:), POINTER :: array => NULL() + INTEGER(c_int), INTENT(IN), VALUE :: i, j + REAL(c_double) :: f_lammps_extract_compute_peratom_array + REAL(c_double), DIMENSION(:,:), POINTER :: array => NULL() array = lmp%extract_compute('stress', lmp%style%atom, lmp%type%array) f_lammps_extract_compute_peratom_array = array(i,j) END FUNCTION f_lammps_extract_compute_peratom_array -FUNCTION f_lammps_extract_compute_global_scalar () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_global_scalar() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL(C_double) :: f_lammps_extract_compute_global_scalar - REAL(C_double), POINTER :: scalar + REAL(c_double) :: f_lammps_extract_compute_global_scalar + REAL(c_double), POINTER :: scalar scalar = lmp%extract_compute('totalpe', lmp%style%global, lmp%type%scalar) f_lammps_extract_compute_global_scalar = scalar END FUNCTION f_lammps_extract_compute_global_scalar -FUNCTION f_lammps_extract_compute_global_vector (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_global_vector(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - REAL(C_double) :: f_lammps_extract_compute_global_vector - REAL(C_double), DIMENSION(:), POINTER :: vector + REAL(c_double) :: f_lammps_extract_compute_global_vector + REAL(c_double), DIMENSION(:), POINTER :: vector vector = lmp%extract_compute('COM', lmp%style%global, lmp%type%vector) f_lammps_extract_compute_global_vector = vector(i) END FUNCTION f_lammps_extract_compute_global_vector -FUNCTION f_lammps_extract_compute_global_array (i,j) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_global_array(i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i, j - REAL(C_double) :: f_lammps_extract_compute_global_array - REAL(C_double), DIMENSION(:,:), POINTER :: array + REAL(c_double) :: f_lammps_extract_compute_global_array + REAL(c_double), DIMENSION(:,:), POINTER :: array array = lmp%extract_compute('RDF', lmp%style%global, lmp%type%array) f_lammps_extract_compute_global_array = array(i,j) END FUNCTION f_lammps_extract_compute_global_array -FUNCTION f_lammps_extract_compute_local_vector (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_local_vector(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i - REAL(C_double) :: f_lammps_extract_compute_local_vector - REAL(C_double), DIMENSION(:), POINTER :: vector + REAL(c_double) :: f_lammps_extract_compute_local_vector + REAL(c_double), DIMENSION(:), POINTER :: vector vector = lmp%extract_compute('pairdist', lmp%style%local, lmp%type%vector) f_lammps_extract_compute_local_vector = vector(i) END FUNCTION f_lammps_extract_compute_local_vector -FUNCTION f_lammps_extract_compute_local_array (i, j) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_compute_local_array(i, j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTEGER(c_int), INTENT(IN), VALUE :: i, j - REAL(C_double) :: f_lammps_extract_compute_local_array - REAL(C_double), DIMENSION(:,:), POINTER :: array + REAL(c_double) :: f_lammps_extract_compute_local_array + REAL(c_double), DIMENSION(:,:), POINTER :: array array = lmp%extract_compute('pairlocal', lmp%style%local, lmp%type%array) f_lammps_extract_compute_local_array = array(i,j) diff --git a/unittest/fortran/test_fortran_extract_fix.f90 b/unittest/fortran/test_fortran_extract_fix.f90 index 7d5e18016b..24f90553a5 100644 --- a/unittest/fortran/test_fortran_extract_fix.f90 +++ b/unittest/fortran/test_fortran_extract_fix.f90 @@ -22,7 +22,7 @@ SUBROUTINE f_lammps_close() BIND(C) lmp%handle = C_NULL_PTR END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_setup_extract_fix () BIND(C) +SUBROUTINE f_lammps_setup_extract_fix() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input, more_input IMPLICIT NONE @@ -40,59 +40,59 @@ SUBROUTINE f_lammps_setup_extract_fix () BIND(C) CALL lmp%command("run 1") ! must be 1, otherwise move/recenter won't happen END SUBROUTINE f_lammps_setup_extract_fix -FUNCTION f_lammps_extract_fix_global_scalar () BIND(C) RESULT(scalar) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_fix_global_scalar() BIND(C) RESULT(scalar) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL(C_double) :: scalar + REAL(c_double) :: scalar scalar = lmp%extract_fix("recenter", lmp%style%global, lmp%type%scalar) END FUNCTION f_lammps_extract_fix_global_scalar -FUNCTION f_lammps_extract_fix_global_vector (i) BIND(C) RESULT(element) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_fix_global_vector(i) BIND(C) RESULT(element) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double) :: element + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: element element = lmp%extract_fix("recenter", lmp%style%global, lmp%type%vector, i) END FUNCTION f_lammps_extract_fix_global_vector -FUNCTION f_lammps_extract_fix_global_array (i,j) BIND(C) RESULT(element) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_fix_global_array(i,j) BIND(C) RESULT(element) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i, j - REAL(C_double) :: element + INTEGER(c_int), INTENT(IN), VALUE :: i, j + REAL(c_double) :: element element = lmp%extract_fix("vec", lmp%style%global, lmp%type%array, i, j) END FUNCTION f_lammps_extract_fix_global_array -FUNCTION f_lammps_extract_fix_peratom_vector (i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_fix_peratom_vector(i) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i - REAL(C_double) :: f_lammps_extract_fix_peratom_vector - REAL(C_double), DIMENSION(:), POINTER :: vector + INTEGER(c_int), INTENT(IN), VALUE :: i + REAL(c_double) :: f_lammps_extract_fix_peratom_vector + REAL(c_double), DIMENSION(:), POINTER :: vector vector = lmp%extract_fix("state", lmp%style%atom, lmp%type%vector, -1, -1) f_lammps_extract_fix_peratom_vector = vector(i) END FUNCTION f_lammps_extract_fix_peratom_vector -FUNCTION f_lammps_extract_fix_peratom_array (i,j) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int +FUNCTION f_lammps_extract_fix_peratom_array(i,j) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER(C_int), INTENT(IN), VALUE :: i, j - REAL(C_double) :: f_lammps_extract_fix_peratom_array - REAL(C_double), DIMENSION(:,:), POINTER :: array + INTEGER(c_int), INTENT(IN), VALUE :: i, j + REAL(c_double) :: f_lammps_extract_fix_peratom_array + REAL(c_double), DIMENSION(:,:), POINTER :: array array = lmp%extract_fix("move", lmp%style%atom, lmp%type%array, -1, -1) f_lammps_extract_fix_peratom_array = array(i,j) diff --git a/unittest/fortran/test_fortran_extract_global.f90 b/unittest/fortran/test_fortran_extract_global.f90 index f89087869c..5add92c1be 100644 --- a/unittest/fortran/test_fortran_extract_global.f90 +++ b/unittest/fortran/test_fortran_extract_global.f90 @@ -22,7 +22,7 @@ SUBROUTINE f_lammps_close() BIND(C, name="f_lammps_close") lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_setup_extract_global () BIND(C) +SUBROUTINE f_lammps_setup_extract_global() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE @@ -33,12 +33,12 @@ SUBROUTINE f_lammps_setup_extract_global () BIND(C) CALL lmp%command('run 0') END SUBROUTINE f_lammps_setup_extract_global -SUBROUTINE f_lammps_setup_full_extract_global () BIND(C) +SUBROUTINE f_lammps_setup_full_extract_global() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE INTERFACE - SUBROUTINE f_lammps_setup_extract_global () BIND(C) + SUBROUTINE f_lammps_setup_extract_global() BIND(C) END SUBROUTINE f_lammps_setup_extract_global END INTERFACE @@ -50,422 +50,428 @@ SUBROUTINE f_lammps_setup_full_extract_global () BIND(C) CALL lmp%command('run 0') END SUBROUTINE f_lammps_setup_full_extract_global -FUNCTION f_lammps_extract_global_units () BIND(C) RESULT(success) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_units() BIND(C) RESULT(success) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER (C_int) :: success - CHARACTER (LEN=16) :: units + INTEGER(c_int) :: success + CHARACTER(LEN=16) :: units ! passing strings from Fortran to C is icky, so we do the test here and ! report the result instead units = lmp%extract_global('units') - IF ( TRIM(units) == 'lj' ) THEN - success = 1_C_int + IF (TRIM(units) == 'lj') THEN + success = 1_c_int ELSE - success = 0_C_int + success = 0_c_int END IF END FUNCTION f_lammps_extract_global_units -FUNCTION f_lammps_extract_global_ntimestep () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_ntimestep() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: ntimestep - INTEGER (C_int) :: f_lammps_extract_global_ntimestep + INTEGER(c_int), POINTER :: ntimestep + INTEGER(c_int) :: f_lammps_extract_global_ntimestep ntimestep = lmp%extract_global("ntimestep") f_lammps_extract_global_ntimestep = ntimestep END FUNCTION f_lammps_extract_global_ntimestep -FUNCTION f_lammps_extract_global_ntimestep_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_ntimestep_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: ntimestep - INTEGER (C_int64_t) :: f_lammps_extract_global_ntimestep_big + INTEGER(c_int64_t), POINTER :: ntimestep + INTEGER(c_int64_t) :: f_lammps_extract_global_ntimestep_big ntimestep = lmp%extract_global("ntimestep") f_lammps_extract_global_ntimestep_big = ntimestep END FUNCTION f_lammps_extract_global_ntimestep_big -FUNCTION f_lammps_extract_global_dt () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_dt() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double), POINTER :: dt - REAL (C_double) :: f_lammps_extract_global_dt + REAL(c_double), POINTER :: dt + REAL(c_double) :: f_lammps_extract_global_dt dt = lmp%extract_global("dt") f_lammps_extract_global_dt = dt END FUNCTION f_lammps_extract_global_dt -SUBROUTINE f_lammps_extract_global_boxlo (C_boxlo) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +SUBROUTINE f_lammps_extract_global_boxlo(C_boxlo) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double), DIMENSION(3) :: C_boxlo - REAL (C_double), DIMENSION(:), POINTER :: boxlo + REAL(c_double), DIMENSION(3) :: C_boxlo + REAL(c_double), DIMENSION(:), POINTER :: boxlo boxlo = lmp%extract_global("boxlo") C_boxlo = boxlo END SUBROUTINE f_lammps_extract_global_boxlo -SUBROUTINE f_lammps_extract_global_boxhi (C_boxhi) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +SUBROUTINE f_lammps_extract_global_boxhi(C_boxhi) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double), DIMENSION(3) :: C_boxhi - REAL (C_double), DIMENSION(:), POINTER :: boxhi + REAL(c_double), DIMENSION(3) :: C_boxhi + REAL(c_double), DIMENSION(:), POINTER :: boxhi boxhi = lmp%extract_global("boxhi") C_boxhi = boxhi END SUBROUTINE f_lammps_extract_global_boxhi -FUNCTION f_lammps_extract_global_boxxlo () BIND(C) RESULT(C_boxxlo) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxxlo() BIND(C) RESULT(C_boxxlo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxxlo - REAL (C_double), POINTER :: boxxlo + REAL(c_double) :: C_boxxlo + REAL(c_double), POINTER :: boxxlo boxxlo = lmp%extract_global("boxxlo") C_boxxlo = boxxlo END FUNCTION f_lammps_extract_global_boxxlo -FUNCTION f_lammps_extract_global_boxxhi () BIND(C) RESULT(C_boxxhi) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxxhi() BIND(C) RESULT(C_boxxhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxxhi - REAL (C_double), POINTER :: boxxhi + REAL(c_double) :: C_boxxhi + REAL(c_double), POINTER :: boxxhi boxxhi = lmp%extract_global("boxxhi") C_boxxhi = boxxhi END FUNCTION f_lammps_extract_global_boxxhi -FUNCTION f_lammps_extract_global_boxylo () BIND(C) RESULT(C_boxylo) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxylo() BIND(C) RESULT(C_boxylo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxylo - REAL (C_double), POINTER :: boxylo + REAL(c_double) :: C_boxylo + REAL(c_double), POINTER :: boxylo boxylo = lmp%extract_global("boxylo") C_boxylo = boxylo END FUNCTION f_lammps_extract_global_boxylo -FUNCTION f_lammps_extract_global_boxyhi () BIND(C) RESULT(C_boxyhi) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxyhi() BIND(C) RESULT(C_boxyhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxyhi - REAL (C_double), POINTER :: boxyhi + REAL(c_double) :: C_boxyhi + REAL(c_double), POINTER :: boxyhi boxyhi = lmp%extract_global("boxyhi") C_boxyhi = boxyhi END FUNCTION f_lammps_extract_global_boxyhi -FUNCTION f_lammps_extract_global_boxzlo () BIND(C) RESULT(C_boxzlo) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxzlo() BIND(C) RESULT(C_boxzlo) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxzlo - REAL (C_double), POINTER :: boxzlo + REAL(c_double) :: C_boxzlo + REAL(c_double), POINTER :: boxzlo boxzlo = lmp%extract_global("boxzlo") C_boxzlo = boxzlo END FUNCTION f_lammps_extract_global_boxzlo -FUNCTION f_lammps_extract_global_boxzhi () BIND(C) RESULT(C_boxzhi) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boxzhi() BIND(C) RESULT(C_boxzhi) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_boxzhi - REAL (C_double), POINTER :: boxzhi + REAL(c_double) :: C_boxzhi + REAL(c_double), POINTER :: boxzhi boxzhi = lmp%extract_global("boxzhi") C_boxzhi = boxzhi END FUNCTION f_lammps_extract_global_boxzhi -SUBROUTINE f_lammps_extract_global_periodicity (C_periodicity) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +SUBROUTINE f_lammps_extract_global_periodicity(C_periodicity) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), DIMENSION(3) :: C_periodicity - INTEGER (C_int), DIMENSION(:), POINTER :: periodicity + INTEGER(c_int), DIMENSION(3) :: C_periodicity + INTEGER(c_int), DIMENSION(:), POINTER :: periodicity periodicity = lmp%extract_global("periodicity") C_periodicity = periodicity END SUBROUTINE f_lammps_extract_global_periodicity -FUNCTION f_lammps_extract_global_triclinic () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_triclinic() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: triclinic - INTEGER (C_int) :: f_lammps_extract_global_triclinic + INTEGER(c_int), POINTER :: triclinic + INTEGER(c_int) :: f_lammps_extract_global_triclinic triclinic = lmp%extract_global("triclinic") f_lammps_extract_global_triclinic = triclinic END FUNCTION f_lammps_extract_global_triclinic -FUNCTION f_lammps_extract_global_xy () BIND(C) RESULT(C_xy) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_xy() BIND(C) RESULT(C_xy) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_xy - REAL (C_double), POINTER :: xy + REAL(c_double) :: C_xy + REAL(c_double), POINTER :: xy xy = lmp%extract_global("xy") C_xy = xy END FUNCTION f_lammps_extract_global_xy -FUNCTION f_lammps_extract_global_xz () BIND(C) RESULT(C_xz) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_xz() BIND(C) RESULT(C_xz) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_xz - REAL (C_double), POINTER :: xz + REAL(c_double) :: C_xz + REAL(c_double), POINTER :: xz xz = lmp%extract_global("xz") C_xz = xz END FUNCTION f_lammps_extract_global_xz -FUNCTION f_lammps_extract_global_yz () BIND(C) RESULT(C_yz) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_yz() BIND(C) RESULT(C_yz) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_yz - REAL (C_double), POINTER :: yz + REAL(c_double) :: C_yz + REAL(c_double), POINTER :: yz yz = lmp%extract_global("yz") C_yz = yz END FUNCTION f_lammps_extract_global_yz -FUNCTION f_lammps_extract_global_natoms () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_natoms() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: natoms - INTEGER (C_int) :: f_lammps_extract_global_natoms + INTEGER(c_int), POINTER :: natoms + INTEGER(c_int) :: f_lammps_extract_global_natoms natoms = lmp%extract_global("natoms") f_lammps_extract_global_natoms = natoms END FUNCTION f_lammps_extract_global_natoms -FUNCTION f_lammps_extract_global_natoms_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_natoms_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: natoms - INTEGER (C_int64_t) :: f_lammps_extract_global_natoms_big + INTEGER(c_int64_t), POINTER :: natoms + INTEGER(c_int64_t) :: f_lammps_extract_global_natoms_big natoms = lmp%extract_global("natoms") f_lammps_extract_global_natoms_big = natoms END FUNCTION f_lammps_extract_global_natoms_big -FUNCTION f_lammps_extract_global_nbonds () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nbonds() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nbonds - INTEGER (C_int) :: f_lammps_extract_global_nbonds + INTEGER(c_int), POINTER :: nbonds + INTEGER(c_int) :: f_lammps_extract_global_nbonds nbonds = lmp%extract_global("nbonds") f_lammps_extract_global_nbonds = nbonds END FUNCTION f_lammps_extract_global_nbonds -FUNCTION f_lammps_extract_global_nbonds_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_nbonds_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: nbonds - INTEGER (C_int64_t) :: f_lammps_extract_global_nbonds_big + INTEGER(c_int64_t), POINTER :: nbonds + INTEGER(c_int64_t) :: f_lammps_extract_global_nbonds_big nbonds = lmp%extract_global("nbonds") f_lammps_extract_global_nbonds_big = nbonds END FUNCTION f_lammps_extract_global_nbonds_big -FUNCTION f_lammps_extract_global_nangles () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nangles() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nangles - INTEGER (C_int) :: f_lammps_extract_global_nangles + INTEGER(c_int), POINTER :: nangles + INTEGER(c_int) :: f_lammps_extract_global_nangles nangles = lmp%extract_global("nangles") f_lammps_extract_global_nangles = nangles END FUNCTION f_lammps_extract_global_nangles -FUNCTION f_lammps_extract_global_nangles_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_nangles_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: nangles - INTEGER (C_int64_t) :: f_lammps_extract_global_nangles_big + INTEGER(c_int64_t), POINTER :: nangles + INTEGER(c_int64_t) :: f_lammps_extract_global_nangles_big nangles = lmp%extract_global("nangles") f_lammps_extract_global_nangles_big = nangles END FUNCTION f_lammps_extract_global_nangles_big -FUNCTION f_lammps_extract_global_ndihedrals () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_ndihedrals() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: ndihedrals - INTEGER (C_int) :: f_lammps_extract_global_ndihedrals + INTEGER(c_int), POINTER :: ndihedrals + INTEGER(c_int) :: f_lammps_extract_global_ndihedrals ndihedrals = lmp%extract_global("ndihedrals") f_lammps_extract_global_ndihedrals = ndihedrals END FUNCTION f_lammps_extract_global_ndihedrals -FUNCTION f_lammps_extract_global_ndihedrals_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_ndihedrals_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: ndihedrals - INTEGER (C_int64_t) :: f_lammps_extract_global_ndihedrals_big + INTEGER(c_int64_t), POINTER :: ndihedrals + INTEGER(c_int64_t) :: f_lammps_extract_global_ndihedrals_big ndihedrals = lmp%extract_global("ndihedrals") f_lammps_extract_global_ndihedrals_big = ndihedrals END FUNCTION f_lammps_extract_global_ndihedrals_big -FUNCTION f_lammps_extract_global_nimpropers () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nimpropers() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nimpropers - INTEGER (C_int) :: f_lammps_extract_global_nimpropers + INTEGER(c_int), POINTER :: nimpropers + INTEGER(c_int) :: f_lammps_extract_global_nimpropers nimpropers = lmp%extract_global("nimpropers") f_lammps_extract_global_nimpropers = nimpropers END FUNCTION f_lammps_extract_global_nimpropers -FUNCTION f_lammps_extract_global_nimpropers_big () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int64_t + +FUNCTION f_lammps_extract_global_nimpropers_big() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int64_t USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int64_t), POINTER :: nimpropers - INTEGER (C_int64_t) :: f_lammps_extract_global_nimpropers_big + INTEGER(c_int64_t), POINTER :: nimpropers + INTEGER(c_int64_t) :: f_lammps_extract_global_nimpropers_big nimpropers = lmp%extract_global("nimpropers") f_lammps_extract_global_nimpropers_big = nimpropers END FUNCTION f_lammps_extract_global_nimpropers_big -FUNCTION f_lammps_extract_global_ntypes () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_ntypes() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: ntypes - INTEGER (C_int) :: f_lammps_extract_global_ntypes + INTEGER(c_int), POINTER :: ntypes + INTEGER(c_int) :: f_lammps_extract_global_ntypes ntypes = lmp%extract_global("ntypes") f_lammps_extract_global_ntypes = ntypes END FUNCTION f_lammps_extract_global_ntypes -FUNCTION f_lammps_extract_global_nlocal () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nlocal() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nlocal - INTEGER (C_int) :: f_lammps_extract_global_nlocal + INTEGER(c_int), POINTER :: nlocal + INTEGER(c_int) :: f_lammps_extract_global_nlocal nlocal = lmp%extract_global("nlocal") f_lammps_extract_global_nlocal = nlocal END FUNCTION f_lammps_extract_global_nlocal -FUNCTION f_lammps_extract_global_nghost () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nghost() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nghost - INTEGER (C_int) :: f_lammps_extract_global_nghost + INTEGER(c_int), POINTER :: nghost + INTEGER(c_int) :: f_lammps_extract_global_nghost nghost = lmp%extract_global("nghost") f_lammps_extract_global_nghost = nghost END FUNCTION f_lammps_extract_global_nghost -FUNCTION f_lammps_extract_global_nmax () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_extract_global_nmax() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int), POINTER :: nmax - INTEGER (C_int) :: f_lammps_extract_global_nmax + INTEGER(c_int), POINTER :: nmax + INTEGER(c_int) :: f_lammps_extract_global_nmax nmax = lmp%extract_global("nmax") f_lammps_extract_global_nmax = nmax END FUNCTION f_lammps_extract_global_nmax -FUNCTION f_lammps_extract_global_boltz () BIND(C) RESULT(C_k_B) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_boltz() BIND(C) RESULT(C_k_B) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_k_B - REAL (C_double), POINTER :: k_B + REAL(c_double) :: C_k_B + REAL(c_double), POINTER :: k_B k_B = lmp%extract_global("boltz") C_k_B = k_B END FUNCTION f_lammps_extract_global_boltz -FUNCTION f_lammps_extract_global_hplanck () BIND(C) RESULT(C_h) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_hplanck() BIND(C) RESULT(C_h) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: C_h - REAL (C_double), POINTER :: h + REAL(c_double) :: C_h + REAL(c_double), POINTER :: h h = lmp%extract_global("boltz") C_h = h END FUNCTION f_lammps_extract_global_hplanck -FUNCTION f_lammps_extract_global_angstrom () BIND(C) RESULT(Angstrom) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_angstrom() BIND(C) RESULT(Angstrom) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: Angstrom - REAL (C_double), POINTER :: A + REAL(c_double) :: Angstrom + REAL(c_double), POINTER :: A A = lmp%extract_global("angstrom") Angstrom = A END FUNCTION f_lammps_extract_global_angstrom -FUNCTION f_lammps_extract_global_femtosecond () BIND(C) RESULT(fs) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +FUNCTION f_lammps_extract_global_femtosecond() BIND(C) RESULT(fs) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - REAL (C_double) :: fs - REAL (C_double), POINTER :: femtosecond + REAL(c_double) :: fs + REAL(c_double), POINTER :: femtosecond femtosecond = lmp%extract_global("femtosecond") fs = femtosecond diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index 1e05dd5a27..34ccb766de 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -42,7 +42,7 @@ CONTAINS c_absolute_path = c_path_join(c_test_input_directory, c_filename) length = c_strlen(c_absolute_path) CALL C_F_POINTER(c_absolute_path, F_absolute_path, [length]) - ALLOCATE( CHARACTER(LEN=length) :: absolute_path ) + ALLOCATE(CHARACTER(LEN=length) :: absolute_path) DO i = 1, length absolute_path(i:i) = F_absolute_path(i) END DO @@ -159,7 +159,7 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) CALL lmp%command('variable greeting file ' // absolute_path('greetings.txt')) CALL lmp%command('variable atfile atomfile ' & // absolute_path('atomdata.txt')) - IF ( lmp%config_has_package('PYTHON') ) THEN + IF (lmp%config_has_package('PYTHON')) THEN CALL lmp%command(py_input) CALL lmp%command('variable py python square_it') END IF @@ -174,7 +174,7 @@ SUBROUTINE f_lammps_setup_extract_variable () BIND(C) END SUBROUTINE f_lammps_setup_extract_variable FUNCTION f_lammps_extract_variable_index_1 () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -182,7 +182,7 @@ FUNCTION f_lammps_extract_variable_index_1 () BIND(C) CHARACTER(LEN=256) :: str str = lmp%extract_variable("idx") - IF ( trim(str) == 'hello' ) THEN + IF (trim(str) == 'hello') THEN f_lammps_extract_variable_index_1 = 1_c_int ELSE f_lammps_extract_variable_index_1 = 0_c_int @@ -190,7 +190,7 @@ FUNCTION f_lammps_extract_variable_index_1 () BIND(C) END FUNCTION f_lammps_extract_variable_index_1 FUNCTION f_lammps_extract_variable_index_2 () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -198,7 +198,7 @@ FUNCTION f_lammps_extract_variable_index_2 () BIND(C) CHARACTER(LEN=256) :: str str = lmp%extract_variable("idx") - IF ( trim(str) == 'goodbye' ) THEN + IF (trim(str) == 'goodbye') THEN f_lammps_extract_variable_index_2 = 1_c_int ELSE f_lammps_extract_variable_index_2 = 0_c_int @@ -206,7 +206,7 @@ FUNCTION f_lammps_extract_variable_index_2 () BIND(C) END FUNCTION f_lammps_extract_variable_index_2 FUNCTION f_lammps_extract_variable_loop () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -218,7 +218,7 @@ FUNCTION f_lammps_extract_variable_loop () BIND(C) END FUNCTION f_lammps_extract_variable_loop FUNCTION f_lammps_extract_variable_loop_pad () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -231,7 +231,7 @@ FUNCTION f_lammps_extract_variable_loop_pad () BIND(C) END FUNCTION f_lammps_extract_variable_loop_pad FUNCTION f_lammps_extract_variable_world () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -244,7 +244,7 @@ FUNCTION f_lammps_extract_variable_world () BIND(C) END FUNCTION f_lammps_extract_variable_world FUNCTION f_lammps_extract_variable_universe () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -257,7 +257,7 @@ FUNCTION f_lammps_extract_variable_universe () BIND(C) END FUNCTION f_lammps_extract_variable_universe FUNCTION f_lammps_extract_variable_uloop () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -269,7 +269,7 @@ FUNCTION f_lammps_extract_variable_uloop () BIND(C) END FUNCTION f_lammps_extract_variable_uloop FUNCTION f_lammps_extract_variable_string () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -282,7 +282,7 @@ FUNCTION f_lammps_extract_variable_string () BIND(C) END FUNCTION f_lammps_extract_variable_string FUNCTION f_lammps_extract_variable_format () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -295,7 +295,7 @@ FUNCTION f_lammps_extract_variable_format () BIND(C) END FUNCTION f_lammps_extract_variable_format FUNCTION f_lammps_extract_variable_format_pad () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -308,7 +308,7 @@ FUNCTION f_lammps_extract_variable_format_pad () BIND(C) END FUNCTION f_lammps_extract_variable_format_pad FUNCTION f_lammps_extract_variable_getenv () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -321,7 +321,7 @@ FUNCTION f_lammps_extract_variable_getenv () BIND(C) END FUNCTION f_lammps_extract_variable_getenv FUNCTION f_lammps_extract_variable_file () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_ptr + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string @@ -334,7 +334,7 @@ FUNCTION f_lammps_extract_variable_file () BIND(C) END FUNCTION f_lammps_extract_variable_file FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -347,7 +347,7 @@ FUNCTION f_lammps_extract_variable_atomfile(i) BIND(C) END FUNCTION f_lammps_extract_variable_atomfile FUNCTION f_lammps_extract_variable_python(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -358,7 +358,7 @@ FUNCTION f_lammps_extract_variable_python(i) BIND(C) END FUNCTION f_lammps_extract_variable_python FUNCTION f_lammps_extract_variable_timer() BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -368,7 +368,7 @@ FUNCTION f_lammps_extract_variable_timer() BIND(C) END FUNCTION f_lammps_extract_variable_timer FUNCTION f_lammps_extract_variable_internal() BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -378,7 +378,7 @@ FUNCTION f_lammps_extract_variable_internal() BIND(C) END FUNCTION f_lammps_extract_variable_internal FUNCTION f_lammps_extract_variable_equal() BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -388,7 +388,7 @@ FUNCTION f_lammps_extract_variable_equal() BIND(C) END FUNCTION f_lammps_extract_variable_equal FUNCTION f_lammps_extract_variable_atom(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -401,7 +401,7 @@ FUNCTION f_lammps_extract_variable_atom(i) BIND(C) END FUNCTION f_lammps_extract_variable_atom FUNCTION f_lammps_extract_variable_vector(i) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp IMPLICIT NONE @@ -414,7 +414,7 @@ FUNCTION f_lammps_extract_variable_vector(i) BIND(C) END FUNCTION f_lammps_extract_variable_vector SUBROUTINE f_lammps_set_variable_string() BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double, C_int + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double, c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp USE keepvar, ONLY : f2c_string diff --git a/unittest/fortran/test_fortran_gather_scatter.f90 b/unittest/fortran/test_fortran_gather_scatter.f90 index dd9182afaa..69bb0e030f 100644 --- a/unittest/fortran/test_fortran_gather_scatter.f90 +++ b/unittest/fortran/test_fortran_gather_scatter.f90 @@ -22,7 +22,7 @@ SUBROUTINE f_lammps_close() BIND(C) lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_setup_gather_scatter () BIND(C) +SUBROUTINE f_lammps_setup_gather_scatter() BIND(C) USE LIBLAMMPS USE keepstuff, ONLY : lmp, big_input, cont_input, more_input IMPLICIT NONE @@ -33,7 +33,7 @@ SUBROUTINE f_lammps_setup_gather_scatter () BIND(C) CALL lmp%commands_list(more_input) END SUBROUTINE f_lammps_setup_gather_scatter -FUNCTION f_lammps_gather_atoms_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_mask(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -46,7 +46,7 @@ FUNCTION f_lammps_gather_atoms_mask (i) BIND(C) f_lammps_gather_atoms_mask = mask(i) END FUNCTION f_lammps_gather_atoms_mask -FUNCTION f_lammps_gather_atoms_position (i) BIND(C) +FUNCTION f_lammps_gather_atoms_position(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -59,7 +59,7 @@ FUNCTION f_lammps_gather_atoms_position (i) BIND(C) f_lammps_gather_atoms_position = positions(i) END FUNCTION f_lammps_gather_atoms_position -FUNCTION f_lammps_gather_atoms_concat_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_concat_mask(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -72,7 +72,7 @@ FUNCTION f_lammps_gather_atoms_concat_mask (i) BIND(C) CALL lmp%gather_atoms_concat('mask', 1_c_int, mask) CALL lmp%gather_atoms_concat('id', 1_c_int, tag) DO j = 1, SIZE(tag) - IF ( tag(j) == i ) THEN + IF (tag(j) == i) THEN f_lammps_gather_atoms_concat_mask = mask(j) RETURN END IF @@ -80,7 +80,7 @@ FUNCTION f_lammps_gather_atoms_concat_mask (i) BIND(C) f_lammps_gather_atoms_concat_mask = -1 END FUNCTION f_lammps_gather_atoms_concat_mask -FUNCTION f_lammps_gather_atoms_concat_position (xyz, id) BIND(C) +FUNCTION f_lammps_gather_atoms_concat_position(xyz, id) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -94,13 +94,13 @@ FUNCTION f_lammps_gather_atoms_concat_position (xyz, id) BIND(C) CALL lmp%gather_atoms_concat('x', 3_c_int, positions) CALL lmp%gather_atoms_concat('id', 1_c_int, tag) DO j = 1, SIZE(tag) - IF ( tag(j) == id ) THEN + IF (tag(j) == id) THEN f_lammps_gather_atoms_concat_position = positions((j-1)*3 + xyz) END IF END DO END FUNCTION f_lammps_gather_atoms_concat_position -FUNCTION f_lammps_gather_atoms_subset_mask (i) BIND(C) +FUNCTION f_lammps_gather_atoms_subset_mask(i) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -113,7 +113,7 @@ FUNCTION f_lammps_gather_atoms_subset_mask (i) BIND(C) CALL lmp%gather_atoms_subset('mask', 1_c_int, tag, mask) DO j = 1, SIZE(tag) - IF ( tag(j) == i ) THEN + IF (tag(j) == i) THEN f_lammps_gather_atoms_subset_mask = mask(j) RETURN END IF @@ -121,7 +121,7 @@ FUNCTION f_lammps_gather_atoms_subset_mask (i) BIND(C) f_lammps_gather_atoms_subset_mask = -1 END FUNCTION f_lammps_gather_atoms_subset_mask -FUNCTION f_lammps_gather_atoms_subset_position (xyz,id) BIND(C) +FUNCTION f_lammps_gather_atoms_subset_position(xyz,id) BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_double USE LIBLAMMPS USE keepstuff, ONLY : lmp @@ -134,7 +134,7 @@ FUNCTION f_lammps_gather_atoms_subset_position (xyz,id) BIND(C) CALL lmp%gather_atoms_subset('x', 3_c_int, tag, positions) DO j = 1, SIZE(tag) - IF ( tag(j) == id ) THEN + IF (tag(j) == id) THEN f_lammps_gather_atoms_subset_position = positions((j-1)*3 + xyz) RETURN END IF diff --git a/unittest/fortran/test_fortran_get_thermo.f90 b/unittest/fortran/test_fortran_get_thermo.f90 index d1b193e188..7911ab07d5 100644 --- a/unittest/fortran/test_fortran_get_thermo.f90 +++ b/unittest/fortran/test_fortran_get_thermo.f90 @@ -23,7 +23,7 @@ SUBROUTINE f_lammps_close() BIND(C) lmp%handle = c_null_ptr END SUBROUTINE f_lammps_close -SUBROUTINE f_lammps_get_thermo_setup () BIND(C) +SUBROUTINE f_lammps_get_thermo_setup() BIND(C) USE liblammps USE keepstuff, ONLY : lmp, big_input, cont_input, pair_input IMPLICIT NONE @@ -33,122 +33,122 @@ SUBROUTINE f_lammps_get_thermo_setup () BIND(C) CALL lmp%commands_list(pair_input) END SUBROUTINE f_lammps_get_thermo_setup -FUNCTION f_lammps_get_thermo_natoms () BIND(C) +FUNCTION f_lammps_get_thermo_natoms() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_natoms + REAL(c_double) :: f_lammps_get_thermo_natoms f_lammps_get_thermo_natoms = lmp%get_thermo('atoms') END FUNCTION f_lammps_get_thermo_natoms -FUNCTION f_lammps_get_thermo_dt () BIND (C) +FUNCTION f_lammps_get_thermo_dt() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_dt + REAL(c_double) :: f_lammps_get_thermo_dt f_lammps_get_thermo_dt = lmp%get_thermo('dt') END FUNCTION f_lammps_get_thermo_dt -FUNCTION f_lammps_get_thermo_vol () BIND (C) +FUNCTION f_lammps_get_thermo_vol() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_vol + REAL(c_double) :: f_lammps_get_thermo_vol f_lammps_get_thermo_vol = lmp%get_thermo('vol') END FUNCTION f_lammps_get_thermo_vol -FUNCTION f_lammps_get_thermo_lx () BIND (C) +FUNCTION f_lammps_get_thermo_lx() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_lx + REAL(c_double) :: f_lammps_get_thermo_lx f_lammps_get_thermo_lx = lmp%get_thermo('lx') END FUNCTION f_lammps_get_thermo_lx -FUNCTION f_lammps_get_thermo_ly () BIND (C) +FUNCTION f_lammps_get_thermo_ly() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_ly + REAL(c_double) :: f_lammps_get_thermo_ly f_lammps_get_thermo_ly = lmp%get_thermo('ly') END FUNCTION f_lammps_get_thermo_ly -FUNCTION f_lammps_get_thermo_lz () BIND (C) +FUNCTION f_lammps_get_thermo_lz() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_lz + REAL(c_double) :: f_lammps_get_thermo_lz f_lammps_get_thermo_lz = lmp%get_thermo('lz') END FUNCTION f_lammps_get_thermo_lz -FUNCTION f_lammps_get_thermo_xlo () BIND (C) +FUNCTION f_lammps_get_thermo_xlo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_xlo + REAL(c_double) :: f_lammps_get_thermo_xlo f_lammps_get_thermo_xlo = lmp%get_thermo('xlo') END FUNCTION f_lammps_get_thermo_xlo -FUNCTION f_lammps_get_thermo_xhi () BIND (C) +FUNCTION f_lammps_get_thermo_xhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_xhi + REAL(c_double) :: f_lammps_get_thermo_xhi f_lammps_get_thermo_xhi = lmp%get_thermo('xhi') END FUNCTION f_lammps_get_thermo_xhi -FUNCTION f_lammps_get_thermo_ylo () BIND (C) +FUNCTION f_lammps_get_thermo_ylo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_ylo + REAL(c_double) :: f_lammps_get_thermo_ylo f_lammps_get_thermo_ylo = lmp%get_thermo('ylo') END FUNCTION f_lammps_get_thermo_ylo -FUNCTION f_lammps_get_thermo_yhi () BIND (C) +FUNCTION f_lammps_get_thermo_yhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_yhi + REAL(c_double) :: f_lammps_get_thermo_yhi f_lammps_get_thermo_yhi = lmp%get_thermo('yhi') END FUNCTION f_lammps_get_thermo_yhi -FUNCTION f_lammps_get_thermo_zlo () BIND (C) +FUNCTION f_lammps_get_thermo_zlo() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_zlo + REAL(c_double) :: f_lammps_get_thermo_zlo f_lammps_get_thermo_zlo = lmp%get_thermo('zlo') END FUNCTION f_lammps_get_thermo_zlo -FUNCTION f_lammps_get_thermo_zhi () BIND (C) +FUNCTION f_lammps_get_thermo_zhi() BIND(C) USE, INTRINSIC :: ISO_C_BINDING, ONLY: c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (c_double) :: f_lammps_get_thermo_zhi + REAL(c_double) :: f_lammps_get_thermo_zhi f_lammps_get_thermo_zhi = lmp%get_thermo('zhi') END FUNCTION f_lammps_get_thermo_zhi diff --git a/unittest/fortran/test_fortran_properties.f90 b/unittest/fortran/test_fortran_properties.f90 index e8ea330bd6..32f02789af 100644 --- a/unittest/fortran/test_fortran_properties.f90 +++ b/unittest/fortran/test_fortran_properties.f90 @@ -1,78 +1,78 @@ -FUNCTION f_lammps_version () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_version() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER (C_int) :: f_lammps_version + INTEGER(c_int) :: f_lammps_version f_lammps_version = lmp%version() END FUNCTION f_lammps_version -SUBROUTINE f_lammps_memory_usage (meminfo) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_double +SUBROUTINE f_lammps_memory_usage(meminfo) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_double USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - REAL (C_double), DIMENSION(3), INTENT(OUT) :: meminfo + REAL(c_double), DIMENSION(3), INTENT(OUT) :: meminfo CALL lmp%memory_usage(meminfo) END SUBROUTINE f_lammps_memory_usage -FUNCTION f_lammps_get_mpi_comm () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_get_mpi_comm() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE liblammps USE keepstuff, ONLY : lmp IMPLICIT NONE - INTEGER (C_int) :: f_lammps_get_mpi_comm + INTEGER(c_int) :: f_lammps_get_mpi_comm f_lammps_get_mpi_comm = lmp%get_mpi_comm() END FUNCTION f_lammps_get_mpi_comm -FUNCTION f_lammps_extract_setting (Cstr) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char +FUNCTION f_lammps_extract_setting(Cstr) BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER (C_int) :: f_lammps_extract_setting - CHARACTER (KIND=C_char, LEN=1), DIMENSION(*), INTENT(IN) :: Cstr + INTEGER(c_int) :: f_lammps_extract_setting + CHARACTER(KIND=c_char, LEN=1), DIMENSION(*), INTENT(IN) :: Cstr INTEGER :: strlen, i - CHARACTER (LEN=:), ALLOCATABLE :: Fstr + CHARACTER(LEN=:), ALLOCATABLE :: Fstr i = 1 DO WHILE (Cstr(i) /= ACHAR(0)) i = i + 1 END DO strlen = i - allocate ( CHARACTER(LEN=strlen) :: Fstr) + allocate (CHARACTER(LEN=strlen) :: Fstr) FORALL (i=1:strlen) Fstr(i:i) = Cstr(i) END FORALL f_lammps_extract_setting = lmp%extract_setting(Fstr) - deallocate (Fstr) + DEALLOCATE(Fstr) END FUNCTION f_lammps_extract_setting -FUNCTION f_lammps_has_error () BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int +FUNCTION f_lammps_has_error() BIND(C) + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER(C_int) :: f_lammps_has_error + INTEGER(c_int) :: f_lammps_has_error - IF ( lmp%has_error() ) THEN - f_lammps_has_error = 1_C_int + IF (lmp%has_error()) THEN + f_lammps_has_error = 1_c_int ELSE - f_lammps_has_error = 0_C_int + f_lammps_has_error = 0_c_int END IF END FUNCTION f_lammps_has_error FUNCTION f_lammps_get_last_error_message(errmesg, errlen) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_int, C_char, C_ptr, C_F_POINTER + USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_int, c_char, c_ptr, C_F_POINTER USE keepstuff, ONLY : lmp USE LIBLAMMPS IMPLICIT NONE - INTEGER(C_int) :: f_lammps_get_last_error_message + INTEGER(c_int) :: f_lammps_get_last_error_message CHARACTER(KIND=c_char), DIMENSION(*) :: errmesg - INTEGER(C_int), VALUE, INTENT(IN) :: errlen + INTEGER(c_int), VALUE, INTENT(IN) :: errlen CHARACTER(LEN=:), ALLOCATABLE :: buffer INTEGER :: status, i From d7d2802061d47d77fb1af976c8337fc67d76a2f5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 3 Oct 2022 23:51:21 -0400 Subject: [PATCH 312/364] remove intentional false positive --- unittest/fortran/wrap_properties.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index d2daa22cf4..59e98891c3 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -133,6 +133,6 @@ TEST_F(LAMMPS_properties, has_error) char errmsg[1024]; int err = f_lammps_get_last_error_message(errmsg, 1023); EXPECT_EQ(err, 1); - EXPECT_THAT(errmsg, ContainsRegex(".*ERRORx: Unknown command: this_is_not_a_known_command.*")); + EXPECT_THAT(errmsg, ContainsRegex(".*ERROR: Unknown command: this_is_not_a_known_command.*")); }; } // namespace LAMMPS_NS From bca8e6b85a06bc62b29b5712bd99cc1189db8898 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 00:14:06 -0400 Subject: [PATCH 313/364] store squared cutoff as documented --- src/MISC/pair_list.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index f6ac2e3190..be4e2cf92b 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "math_special.h" #include "memory.h" #include "text_file_reader.h" @@ -31,6 +32,7 @@ #include using namespace LAMMPS_NS; +using MathSpecial::square; enum { NONE = 0, HARM, MORSE, LJ126 }; @@ -265,7 +267,7 @@ void PairList::settings(int narg, char **arg) break; } if (values.has_next()) - oneparam.cutsq = values.next_double(); + oneparam.cutsq = square(values.next_double()); else oneparam.cutsq = cut_global*cut_global; From 5508c7f25e2233960f3dbf139cc20129127e53c8 Mon Sep 17 00:00:00 2001 From: Terry Suun Date: Tue, 4 Oct 2022 13:27:32 +0800 Subject: [PATCH 314/364] Bug fix for pair_style list quartic. --- doc/src/pair_list.rst | 2 +- src/MISC/pair_list.cpp | 3 --- src/MISC/pair_list.h | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index 322da79369..76b31623ad 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -120,7 +120,7 @@ and the coefficients: * :math:`b_2` (distance units) * :math:`r_c` (distance units) -Note that the cutoff :math:`r_c` should always be specified to ensure zero energy and smooth force at cutoff. +Note that the global cutoff specified by *pair_style list* command is ignored, unless :math:`r_c` is not specified. In this case, :math:`r_c` equals the sqare root of the globle cutoff. ---------- diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index 1eff74564d..ad3ef44717 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -276,7 +276,6 @@ void PairList::settings(int narg, char **arg) oneparam.param.quartic.k = values.next_double(); oneparam.param.quartic.b1 = values.next_double(); oneparam.param.quartic.b2 = values.next_double(); - oneparam.param.quartic.rc = values.next_double(); ++nquartic; break; @@ -365,8 +364,6 @@ void PairList::init_style() } else if (par.style == QUARTIC) { // the offset is always 0 at rc par.offset = 0.0; - // correct cutsq - par.cutsq = mypow(par.param.quartic.rc, 2); } } } diff --git a/src/MISC/pair_list.h b/src/MISC/pair_list.h index 2d00788811..dab8ba3fc9 100644 --- a/src/MISC/pair_list.h +++ b/src/MISC/pair_list.h @@ -50,7 +50,7 @@ class PairList : public Pair { double epsilon, sigma; }; struct quartic_p { - double k, b1, b2, rc; + double k, b1, b2; }; From bc6e42a6104999f5d35ca9a9997a275e7ca9854d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 04:11:39 -0400 Subject: [PATCH 315/364] add more extensive whitespace checking for fortran and unittests --- python/examples/mc.py | 4 +- python/examples/pizza/gl.py | 144 +++++++++--------- python/examples/pizza/vizinfo.py | 28 ++-- python/examples/pizza/vmd.py | 40 ++--- python/examples/pylammps/elastic/README | 2 +- python/examples/split.py | 6 +- python/examples/viz_gl.py | 2 +- python/examples/viz_pymol.py | 4 +- tools/coding_standard/whitespace.py | 4 +- .../fortran/test_fortran_extract_variable.f90 | 4 +- unittest/tools/test_lammps_shell.py | 2 +- unittest/utils/testshared.c | 4 +- 12 files changed, 123 insertions(+), 121 deletions(-) diff --git a/python/examples/mc.py b/python/examples/mc.py index fe7f6838c8..c12b4bd6bc 100755 --- a/python/examples/mc.py +++ b/python/examples/mc.py @@ -60,7 +60,7 @@ lmp.command("thermo_style custom step v_emin v_elast pe") lmp.command("run 0") x = lmp.extract_atom("x") lmp.command("variable elast equal $e") - + estart = lmp.extract_compute("thermo_pe", LMP_STYLE_GLOBAL, LAMMPS_INT) / natoms # loop over Monte Carlo moves @@ -92,7 +92,7 @@ for i in range(nloop): else: x[iatom][0] = x0 x[iatom][1] = y0 - + # final energy and stats lmp.command("variable nbuild equal nbuild") diff --git a/python/examples/pizza/gl.py b/python/examples/pizza/gl.py index 7c5633ac55..c567c0805f 100644 --- a/python/examples/pizza/gl.py +++ b/python/examples/pizza/gl.py @@ -3,7 +3,7 @@ # # Copyright (2005) 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 +# certain rights in this software. This software is distributed under # the GNU General Public License. # for python3 compatibility @@ -19,8 +19,8 @@ g = gl(d) create OpenGL display for data in d d = atom snapshot object (dump, data) g.bg("black") set background color (def = "black") -g.size(N) set image size to NxN -g.size(N,M) set image size to NxM +g.size(N) set image size to NxN +g.size(N,M) set image size to NxM g.rotate(60,135) view from z theta and azimuthal phi (def = 60,30) g.shift(x,y) translate by x,y pixels in view window (def = 0,0) g.zoom(0.5) scale image by factor (def = 1) @@ -30,7 +30,7 @@ g.box(0/1/2,"red",4) set box edge thickness g.file = "image" file prefix for created images (def = "image") g.show(N) show image of snapshot at timestep N - + g.all() make images of all selected snapshots g.all(P) images of all, start file label at P g.all(N,M,P) make M images of snapshot N, start label at P @@ -43,12 +43,12 @@ g.pan() no pan during all() (default) g.select = "$x > %g*3.0" string to pass to d.aselect.test() during all() g.select = "" no extra aselect (default) - + %g varies from 0.0 to 1.0 from beginning to end of all() - -g.acol(2,"green") set atom colors by atom type (1-N) -g.acol([2,4],["red","blue"]) 1st arg = one type or list of types -g.acol(0,"blue") 2nd arg = one color or list of colors + +g.acol(2,"green") set atom colors by atom type (1-N) +g.acol([2,4],["red","blue"]) 1st arg = one type or list of types +g.acol(0,"blue") 2nd arg = one color or list of colors g.acol(range(20),["red","blue"]) if list lengths unequal, interpolate g.acol(range(10),"loop") assign colors in loop, randomly ordered @@ -58,23 +58,23 @@ g.acol(range(10),"loop") assign colors in loop, randomly ordered g.arad([1,2],[0.5,0.3]) set atom radii, same rules as acol() -g.bcol() set bond color, same args as acol() -g.brad() set bond thickness, same args as arad() +g.bcol() set bond color, same args as acol() +g.brad() set bond thickness, same args as arad() -g.tcol() set triangle color, same args as acol() -g.tfill() set triangle fill, 0 fill, 1 line, 2 both +g.tcol() set triangle color, same args as acol() +g.tfill() set triangle fill, 0 fill, 1 line, 2 both g.lcol() set line color, same args as acol() g.lrad() set line thickness, same args as arad() g.adef() set atom/bond/tri/line properties to default -g.bdef() default = "loop" for colors, 0.45 for radii -g.tdef() default = 0.25 for bond/line thickness -g.ldef() default = 0 fill +g.bdef() default = "loop" for colors, 0.45 for radii +g.tdef() default = 0.25 for bond/line thickness +g.ldef() default = 0 fill by default 100 types are assigned if atom/bond/tri/line has type > # defined properties, is an error - + from vizinfo import colors access color list print(colors) list defined color names and RGB values colors["nickname"] = [R,G,B] set new RGB values from 0 to 255 @@ -148,7 +148,7 @@ class gl: self.azphi = 30 self.scale = 1.0 self.xshift = self.yshift = 0 - + self.file = "image" self.boxflag = 0 self.bxcol = [1,1,0] @@ -165,7 +165,7 @@ class gl: self.nsides = 10 self.theta_amplify = 2 self.shiny = 2 - + self.clipflag = 0 self.clipxlo = self.clipylo = self.clipzlo = 0.0 self.clipxhi = self.clipyhi = self.clipzhi = 1.0 @@ -189,7 +189,7 @@ class gl: self.bdef() self.tdef() self.ldef() - + self.center = 3*[0] self.view = 3*[0] self.up = 3*[0] @@ -211,7 +211,7 @@ class gl: if not ynew: self.ypixels = self.xpixels else: self.ypixels = ynew self.create_window() - + # -------------------------------------------------------------------- def axis(self,value): @@ -223,7 +223,7 @@ class gl: def create_window(self): if self.root: self.root.destroy() - + from __main__ import tkroot self.root = Toplevel(tkroot) self.root.title('Pizza.py gl tool') @@ -232,7 +232,7 @@ class gl: double=1,depth=1) self.w.pack(expand=YES) # self.w.pack(expand=YES,fill=BOTH) - + glViewport(0,0,self.xpixels,self.ypixels) glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); @@ -247,7 +247,7 @@ class gl: self.w.parent = self self.w.tkRedraw() tkroot.update_idletasks() # force window to appear - + # -------------------------------------------------------------------- def clip(self,which,value): @@ -314,7 +314,7 @@ class gl: self.up[1] = sin(pi*self.azphi/180) self.up[2] = 0.0 else: - dot = self.view[2] # dot = (0,0,1) . view + dot = self.view[2] # dot = (0,0,1) . view self.up[0] = -dot*self.view[0] # up projected onto v = dot * v self.up[1] = -dot*self.view[1] # up perp to v = up - dot * v self.up[2] = 1.0 - dot*self.view[2] @@ -325,7 +325,7 @@ class gl: # -------------------------------------------------------------------- # reset ztheta,azphi and thus view,up.right # called as function from Pizza.py - + def rotate(self,ztheta,azphi): self.ztheta = ztheta self.azphi = azphi @@ -366,11 +366,11 @@ class gl: # rotate view,up around axis of rotation = old x new # right = up x view # reset ztheta,azphi from view - + def mouse_rotate(self,xnew,ynew,xold,yold): # change y pixels to measure from bottom of window instead of top - + yold = self.ypixels - yold ynew = self.ypixels - ynew @@ -407,7 +407,7 @@ class gl: axis[1] = rot[0]*self.right[1] + rot[1]*self.up[1] + rot[2]*self.view[1] axis[2] = rot[0]*self.right[2] + rot[1]*self.up[2] + rot[2]*self.view[2] axis = vecnorm(axis) - + # view is changed by (axis x view) scaled by theta # up is changed by (axis x up) scaled by theta # force up to be perp to view via up_perp = up - (up . view) view @@ -468,14 +468,14 @@ class gl: # output: eye = distance to view scene from # xto,yto,zto = point to look to # xfrom,yfrom,zfrom = point to look from - + def setview(self): if not self.ready: return # no distance since no scene yet - + self.eye = 3 * self.distance / self.scale xfactor = 0.5*self.eye*self.xshift/self.xpixels yfactor = 0.5*self.eye*self.yshift/self.ypixels - + self.xto = self.center[0] - xfactor*self.right[0] - yfactor*self.up[0] self.yto = self.center[1] - xfactor*self.right[1] - yfactor*self.up[1] self.zto = self.center[2] - xfactor*self.right[2] - yfactor*self.up[2] @@ -486,7 +486,7 @@ class gl: # -------------------------------------------------------------------- # box attributes, also used for triangle lines - + def box(self,*args): self.boxflag = args[0] if len(args) > 1: @@ -500,7 +500,7 @@ class gl: # -------------------------------------------------------------------- # grab all selected snapshots from data object # add GL-specific info to each bond - + def reload(self): print("Loading data into gl tool ...") data = self.data @@ -529,7 +529,7 @@ class gl: self.bondframes.append(bonds) self.triframes.append(tris) self.lineframes.append(lines) - + print(time,end='') sys.stdout.flush() print() @@ -545,11 +545,11 @@ class gl: def nolabel(self): self.cachelist = -self.cachelist self.labels = [] - + # -------------------------------------------------------------------- # show a single snapshot # distance from snapshot box or max box for all selected steps - + def show(self,ntime): data = self.data which = data.findtime(ntime) @@ -571,7 +571,7 @@ class gl: self.cachelist = -self.cachelist self.w.tkRedraw() self.save() - + # -------------------------------------------------------------------- def pan(self,*list): @@ -584,7 +584,7 @@ class gl: self.ztheta_stop = list[3] self.azphi_stop = list[4] self.scale_stop = list[5] - + # -------------------------------------------------------------------- def all(self,*list): @@ -615,7 +615,7 @@ class gl: if flag == -1: break fraction = float(i) / (ncount-1) - + if self.select != "": newstr = self.select % fraction data.aselect.test(newstr,time) @@ -653,7 +653,7 @@ class gl: self.cachelist = -self.cachelist self.w.tkRedraw() self.save(file) - + print(time,end='') sys.stdout.flush() i += 1 @@ -731,19 +731,19 @@ class gl: # -------------------------------------------------------------------- # draw the GL scene - + def redraw(self,o): # clear window to background color - + glClearColor(self.bgcol[0],self.bgcol[1],self.bgcol[2],0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # not ready if no scene yet - + if not self.ready: return # set view from eye, distance, 3 lookat vectors (from,to,up) - + glMatrixMode(GL_PROJECTION) glLoadIdentity() if self.orthoflag: @@ -759,14 +759,14 @@ class gl: # draw scene from display list if caching allowed and list hasn't changed # else redraw and store as new display list if caching allowed - + if self.cache and self.cachelist > 0: glCallList(self.cachelist); else: if self.cache: if self.cachelist < 0: glDeleteLists(-self.cachelist,1) self.cachelist = glGenLists(1) glNewList(self.cachelist,GL_COMPILE_AND_EXECUTE) - + # draw box, clip-box, xyz axes, lines glDisable(GL_LIGHTING) @@ -842,7 +842,7 @@ class gl: if self.tridraw: fillflag = self.vizinfo.tfill[int(self.tridraw[0][1])] - + if fillflag != 1: if fillflag: glEnable(GL_POLYGON_OFFSET_FILL) @@ -921,7 +921,7 @@ class gl: gluCylinder(obj,rad,rad,bond[10],self.nsides,self.nsides) glPopMatrix() - if self.tridraw: + if self.tridraw: fillflag = self.vizinfo.tfill[int(self.tridraw[0][1])] if fillflag != 1: @@ -975,7 +975,7 @@ class gl: glEnd() glEnable(GL_LIGHTING) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL) - + if self.cache: glEndList() glFlush() @@ -983,16 +983,16 @@ class gl: # -------------------------------------------------------------------- # make new call list for each atom type # called when atom color/rad/quality is changed - + def make_atom_calllist(self): # extend calllist array if necessary - + if self.vizinfo.nacolor > self.nclist: for i in range(self.vizinfo.nacolor-self.nclist): self.calllist.append(0) self.nclist = self.vizinfo.nacolor # create new calllist for each atom type - + for itype in xrange(1,self.vizinfo.nacolor+1): if self.calllist[itype]: glDeleteLists(self.calllist[itype],1) ilist = glGenLists(1) @@ -1001,12 +1001,12 @@ class gl: red,green,blue = self.vizinfo.acolor[itype] rad = self.vizinfo.arad[itype] glColor3f(red,green,blue); - + # glPointSize(10.0*rad) # glBegin(GL_POINTS) # glVertex3f(0.0,0.0,0.0) # glEnd() - + glMaterialfv(GL_FRONT,GL_EMISSION,[red,green,blue,1.0]); glMaterialf(GL_FRONT,GL_SHININESS,self.shiny); glutSolidSphere(rad,self.nslices,self.nstacks) @@ -1015,7 +1015,7 @@ class gl: # -------------------------------------------------------------------- # augment bond info returned by viz() with info needed for GL draw # info = length, theta, -dy, dx for bond orientation - + def bonds_augment(self,bonds): for bond in bonds: dx = bond[5] - bond[2] @@ -1046,7 +1046,7 @@ class gl: glLineWidth(self.bxthick) glColor3f(self.bxcol[0],self.bxcol[1],self.bxcol[2]) - + glBegin(GL_LINE_LOOP) glVertex3f(xlo,ylo,zlo) glVertex3f(xhi,ylo,zlo) @@ -1081,7 +1081,7 @@ class gl: if yhi-ylo > delta: delta = yhi-ylo if zhi-zlo > delta: delta = zhi-zlo delta *= 0.1 - + glLineWidth(self.bxthick) glBegin(GL_LINES) @@ -1100,7 +1100,7 @@ class gl: def save(self,file=None): self.w.update() # force image on screen to be current before saving it - + pstring = glReadPixels(0,0,self.xpixels,self.ypixels, GL_RGBA,GL_UNSIGNED_BYTE) snapshot = Image.fromstring("RGBA",(self.xpixels,self.ypixels),pstring) @@ -1110,14 +1110,14 @@ class gl: snapshot.save(file + ".png") # -------------------------------------------------------------------- - + def adef(self): self.vizinfo.setcolors("atom",range(100),"loop") self.vizinfo.setradii("atom",range(100),0.45) self.make_atom_calllist() self.cachelist = -self.cachelist self.w.tkRedraw() - + # -------------------------------------------------------------------- def bdef(self): @@ -1130,14 +1130,14 @@ class gl: def tdef(self): self.vizinfo.setcolors("tri",range(100),"loop") - self.vizinfo.setfills("tri",range(100),0) + self.vizinfo.setfills("tri",range(100),0) self.cachelist = -self.cachelist self.w.tkRedraw() # -------------------------------------------------------------------- def ldef(self): - self.vizinfo.setcolors("line",range(100),"loop") + self.vizinfo.setcolors("line",range(100),"loop") self.vizinfo.setradii("line",range(100),0.25) self.cachelist = -self.cachelist self.w.tkRedraw() @@ -1149,29 +1149,29 @@ class gl: self.make_atom_calllist() self.cachelist = -self.cachelist self.w.tkRedraw() - + # -------------------------------------------------------------------- def arad(self,atypes,radii): - self.vizinfo.setradii("atom",atypes,radii) + self.vizinfo.setradii("atom",atypes,radii) self.make_atom_calllist() self.cachelist = -self.cachelist self.w.tkRedraw() - + # -------------------------------------------------------------------- def bcol(self,btypes,colors): self.vizinfo.setcolors("bond",btypes,colors) self.cachelist = -self.cachelist self.w.tkRedraw() - + # -------------------------------------------------------------------- def brad(self,btypes,radii): self.vizinfo.setradii("bond",btypes,radii) self.cachelist = -self.cachelist self.w.tkRedraw() - + # -------------------------------------------------------------------- def tcol(self,ttypes,colors): @@ -1210,10 +1210,10 @@ class MyOpengl(Opengl): args = (self,master,cnf) Opengl.__init__(*args,**kw) Opengl.autospin_allowed = 0 - + # redraw Opengl scene # call parent redraw() method - + def tkRedraw(self,*dummy): if not self.initialised: return self.tk.call(self._w,'makecurrent') @@ -1222,7 +1222,7 @@ class MyOpengl(Opengl): # left button translate # access parent xshift/yshift and call parent trans() method - + def tkTranslate(self,event): dx = event.x - self.xmouse dy = event.y - self.ymouse @@ -1242,7 +1242,7 @@ class MyOpengl(Opengl): # right button zoom # access parent scale and call parent zoom() method - + def tkScale(self,event): scale = 1 - 0.01 * (event.y - self.ymouse) if scale < 0.001: scale = 0.001 diff --git a/python/examples/pizza/vizinfo.py b/python/examples/pizza/vizinfo.py index a150a9c84f..e3a05d71ce 100644 --- a/python/examples/pizza/vizinfo.py +++ b/python/examples/pizza/vizinfo.py @@ -3,7 +3,7 @@ # # Copyright (2005) 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 +# certain rights in this software. This software is distributed under # the GNU General Public License. # vizinfo class, not a top-level Pizza.py tool @@ -25,7 +25,7 @@ import types class vizinfo: """ Information holder for Pizza.py visualization tools - + acolor,bcolor,tcolor,lcolor = RGB values for each atom/bond/tri/line type arad = radius of each atom type brad,lrad = thickness of each bond/line type @@ -41,7 +41,7 @@ class vizinfo: setfill() = set triangle fill factor extend() = grow an array """ - + # -------------------------------------------------------------------- def __init__(self): @@ -57,15 +57,15 @@ class vizinfo: self.nbcolor = self.nbrad = 0 self.ntcolor = self.ntfill = 0 self.nlcolor = self.nlrad = 0 - + # -------------------------------------------------------------------- # set color RGB for which = atoms, bonds, triangles - + def setcolors(self,which,ids,rgbs): # convert args into lists if single values # if arg = 0, convert to full-range list - + if type(ids) is types.IntType and ids == 0: if which == "atom": ids = range(self.nacolor) if which == "bond": ids = range(self.nbcolor) @@ -101,11 +101,11 @@ class vizinfo: if max(ids) > self.nlcolor: self.nlcolor = self.extend(self.lcolor,max(ids)) self.nlcolor = self.extend(self.lrad,max(ids)) - + # set color for each type # if list lengths match, set directly, else interpolate # convert final color from 0-255 to 0.0-1.0 - + ntypes = len(ids) nrgbs = len(rgbs) @@ -135,7 +135,7 @@ class vizinfo: if which == "bond": self.bcolor[id] = color if which == "tri": self.tcolor[id] = color if which == "line": self.lcolor[id] = color - + # -------------------------------------------------------------------- # set radii for which = atoms, bonds, lines @@ -143,7 +143,7 @@ class vizinfo: # convert args into lists if single values # if arg = 0, convert to full-range list - + if type(ids) is types.IntType and ids == 0: if which == "atom": ids = range(self.narad) if which == "bond": ids = range(self.nbrad) @@ -199,16 +199,16 @@ class vizinfo: if which == "atom": self.arad[id] = rad if which == "bond": self.brad[id] = rad if which == "line": self.lrad[id] = rad - + # -------------------------------------------------------------------- # set triangle fill style # 0 = fill only, 1 = line only, 2 = fill and line - + def setfills(self,which,ids,fills): # convert args into lists if single values # if arg = 0, convert to full-range list - + if type(ids) is types.IntType and ids == 0: ids = range(self.ntfill) if type(ids) is not types.ListType and type(ids) is not types.TupleType: @@ -237,7 +237,7 @@ class vizinfo: for i in range(len(ids)): self.tfill[ids[i]] = int(fills[i]) else: for id in ids: self.tfill[id] = int(fills[0]) - + # -------------------------------------------------------------------- def extend(self,array,n): diff --git a/python/examples/pizza/vmd.py b/python/examples/pizza/vmd.py index 00b8615092..5c8461f6ca 100644 --- a/python/examples/pizza/vmd.py +++ b/python/examples/pizza/vmd.py @@ -3,7 +3,7 @@ # # Copyright (2005) 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 +# certain rights in this software. This software is distributed under # the GNU General Public License. # for python3 compatibility @@ -20,24 +20,24 @@ from __future__ import print_function oneline = "Control VMD from python" docstr = """ -v = vmd() start up VMD -v.stop() shut down VMD instance -v.clear() delete all visualizations +v = vmd() start up VMD +v.stop() shut down VMD instance +v.clear() delete all visualizations -v.rep(style) set default representation style. One of - (Lines|VDW|Licorice|DynamicBonds|Points|CPK) -v.new(file[,type]) load new file (default file type 'lammpstrj') +v.rep(style) set default representation style. One of + (Lines|VDW|Licorice|DynamicBonds|Points|CPK) +v.new(file[,type]) load new file (default file type 'lammpstrj') v.data(file[,atomstyle]) load new data file (default atom style 'full') -v.replace(file[,type]) replace current frames with new file -v.append(file[,type]) append file to current frame(s) +v.replace(file[,type]) replace current frames with new file +v.append(file[,type]) append file to current frame(s) v.set(snap,x,y,z,(True|False)) set coordinates from a pizza.py snapshot to new or current frame -v.frame(frame) set current frame -v.flush() flush pending input to VMD and update GUI -v.read(file) read Tcl script file (e.g. saved state) - -v.enter() enter interactive shell -v.debug([True|False]) display generated VMD script commands? +v.frame(frame) set current frame +v.flush() flush pending input to VMD and update GUI +v.read(file) read Tcl script file (e.g. saved state) + +v.enter() enter interactive shell +v.debug([True|False]) display generated VMD script commands? """ # History @@ -71,7 +71,7 @@ except ImportError: # Class definition class vmd: - + # -------------------------------------------------------------------- def __init__(self): @@ -103,7 +103,7 @@ class vmd: # open pipe to vmd and wait until we have a prompt self.VMD = pexpect.spawn(self.vmdexe) self.VMD.expect('vmd >') - + # -------------------------------------------------------------------- # post command to vmd and wait until the prompt returns. def __call__(self,command): @@ -113,7 +113,7 @@ class vmd: if self.debugme: print("call+result:"+self.VMD.before) return - + # -------------------------------------------------------------------- # exit VMD def stop(self): @@ -198,7 +198,7 @@ class vmd: self.__call__('mol addfile ' + filename + ' mol $tmol type ' + filetype + ' waitfor all') self.__call__('foreach mol [molinfo list] { molinfo $mol set {center_matrix rotate_matrix scale_matrix global_matrix} $viewpoints($mol)}') self.flush() - + # -------------------------------------------------------------------- # replace all frames of a molecule with those from a given file def update(self,filename,filetype='lammpstrj'): @@ -209,7 +209,7 @@ class vmd: self.__call__('mol addfile ' + filename + ' mol $tmol type ' + filetype + ' waitfor all') self.__call__('foreach mol [molinfo list] {molinfo $mol set {center_matrix rotate_matrix scale_matrix global_matrix} $viewpoints($mol)}') self.flush() - + # -------------------------------------------------------------------- # add or overwrite coordinates with coordinates in a snapshot def set(self,snap,x,y,z,append=True): diff --git a/python/examples/pylammps/elastic/README b/python/examples/pylammps/elastic/README index 8d1712cd10..40ba34fa62 100644 --- a/python/examples/pylammps/elastic/README +++ b/python/examples/pylammps/elastic/README @@ -1,4 +1,4 @@ conversion of lammps scripts to python code using PyLammps interface -Example for elastic.py +Example for elastic.py python elastic.py Au.data EAM_Dynamo_Ackland_1987_Au__MO_754413982908_000 Au diff --git a/python/examples/split.py b/python/examples/split.py index bd2896c004..2e63d57621 100755 --- a/python/examples/split.py +++ b/python/examples/split.py @@ -32,7 +32,7 @@ nprocs = comm.Get_size() if me < nprocs // 2: color = 0 else: color = 1 - + split = comm.Split(color,key=0) if color == 0: @@ -69,12 +69,12 @@ else: # could run a 2nd calculation on second partition # with different LAMMPS instance or another code # in this case, just sleep on second partition - + import time time.sleep(2) print("Calculation on partition 1 complete") # shutdown mpi4py - + comm.Barrier() MPI.Finalize() diff --git a/python/examples/viz_gl.py b/python/examples/viz_gl.py index 6266682b9c..ab527e0329 100755 --- a/python/examples/viz_gl.py +++ b/python/examples/viz_gl.py @@ -50,7 +50,7 @@ ntimestep = 0 if me == 0: tkroot = None - try: + try: import Tkinter except: import tkinter as Tkinter diff --git a/python/examples/viz_pymol.py b/python/examples/viz_pymol.py index b5061d4c20..1b139dc37e 100755 --- a/python/examples/viz_pymol.py +++ b/python/examples/viz_pymol.py @@ -63,7 +63,7 @@ if me == 0: p.single(ntimestep) pm.load("tmp.pdb") pm.show("spheres","tmp") - + # run nfreq steps at a time w/out pre/post, read dump snapshot, display it while ntimestep < nsteps: @@ -75,7 +75,7 @@ while ntimestep < nsteps: p.single(ntimestep) pm.load("tmp.pdb") pm.forward() - + lmp.command("run 0 pre no post yes") # uncomment if running in parallel via mpi4py diff --git a/tools/coding_standard/whitespace.py b/tools/coding_standard/whitespace.py index be53f60380..1c980717d6 100644 --- a/tools/coding_standard/whitespace.py +++ b/tools/coding_standard/whitespace.py @@ -24,11 +24,13 @@ include: - cmake/** - doc - doc/src/** - - python + - fortran/** + - python/** - src/** - lib/** - tools/coding_standard - tools/python + - unittest/** exclude: - lib/colvars/Install.py - lib/gpu/geryon/file_to_cstr.sh diff --git a/unittest/fortran/test_fortran_extract_variable.f90 b/unittest/fortran/test_fortran_extract_variable.f90 index 34ccb766de..ded3743409 100644 --- a/unittest/fortran/test_fortran_extract_variable.f90 +++ b/unittest/fortran/test_fortran_extract_variable.f90 @@ -100,7 +100,7 @@ FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) TYPE(c_ptr), INTENT(IN), VALUE :: str INTEGER(c_size_t) :: c_strlen END FUNCTION c_strlen - END INTERFACE + END INTERFACE CALL C_F_POINTER(argv, Fargv, [argc]) DO i = 1, argc @@ -111,7 +111,7 @@ FUNCTION f_lammps_with_C_args(argc, argv) BIND(C) args(i)(j:j) = Cstr(j) END FORALL END DO - + lmp = lammps(args) f_lammps_with_C_args = lmp%handle END FUNCTION f_lammps_with_C_args diff --git a/unittest/tools/test_lammps_shell.py b/unittest/tools/test_lammps_shell.py index 15cb259f84..2a55be0a4e 100644 --- a/unittest/tools/test_lammps_shell.py +++ b/unittest/tools/test_lammps_shell.py @@ -138,7 +138,7 @@ class LammpsShell(unittest.TestCase): for line in lines: if line.startswith('LAMMPS Shell>'): break idx += 1 - + self.assertEqual(lines[idx+4],"dimension 2") self.assertEqual(lines[idx+6],"units real") self.assertEqual(lines[idx+8],"dimension 2") diff --git a/unittest/utils/testshared.c b/unittest/utils/testshared.c index 869be91c2a..12922dea91 100644 --- a/unittest/utils/testshared.c +++ b/unittest/utils/testshared.c @@ -16,5 +16,5 @@ double some_double_function(double arg1, int arg2) return sum; } - - + + From a3c676015beb19aa100a1a0750c922dbd2c8c9bd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 04:13:42 -0400 Subject: [PATCH 316/364] store squared cutoff as documented --- src/MISC/pair_list.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index ad3ef44717..588af2b01a 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "math_special.h" #include "memory.h" #include "text_file_reader.h" @@ -31,6 +32,7 @@ #include using namespace LAMMPS_NS; +using MathSpecial::square; enum { NONE = 0, HARM, MORSE, LJ126, QUARTIC }; @@ -286,7 +288,7 @@ void PairList::settings(int narg, char **arg) break; } if (values.has_next()) - oneparam.cutsq = mypow(values.next_double(), 2); + oneparam.cutsq = square(values.next_double()); else oneparam.cutsq = cut_global*cut_global; From 6a97ca246842096992d2a9cd6b0b0278be62309b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 05:02:46 -0400 Subject: [PATCH 317/364] better error checking and reporting --- src/MISC/pair_list.cpp | 82 +++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index 588af2b01a..141afba4e6 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -89,7 +89,15 @@ void PairList::compute(int eflag, int vflag) { ev_init(eflag,vflag); + // get maximum allowed tag. + + bigint maxtag_one, maxtag; + maxtag_one = maxtag = 0; const int nlocal = atom->nlocal; + const tagint * _noalias const tag = atom->tag; + for (int i = 0; i < nlocal; ++i) maxtag_one = MAX(maxtag_one, tag[i]); + MPI_Allreduce(&maxtag_one, &maxtag, 1, MPI_LMP_TAGINT, MPI_MAX, world); + const int newton_pair = force->newton_pair; const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; dbl3_t * _noalias const f = (dbl3_t *) atom->f[0]; // NOLINT @@ -98,8 +106,21 @@ void PairList::compute(int eflag, int vflag) int i,j; int pc = 0; - for (int n=0; n < npairs; ++n) { + for (int n = 0; n < npairs; ++n) { const list_param &par = params[n]; + + // can only use valid tags or else atom->map() below will segfault. + if ((par.id1 < 1) || (par.id1 > maxtag)) { + if (check_flag) + error->all(FLERR, "Invalid pair list atom ID {}", par.id1); + else continue; + } + if ((par.id2 < 1) || (par.id2 > maxtag)) { + if (check_flag) + error->all(FLERR, "Invalid pair list atom ID {}", par.id2); + else continue; + } + i = atom->map(par.id1); j = atom->map(par.id2); @@ -144,8 +165,7 @@ void PairList::compute(int eflag, int vflag) const double r = sqrt(rsq); const double dr = par.param.morse.r0 - r; const double dexp = exp(par.param.morse.alpha * dr); - fpair = 2.0*par.param.morse.d0*par.param.morse.alpha - * (dexp*dexp - dexp) / r; + fpair = 2.0 * par.param.morse.d0 * par.param.morse.alpha * (dexp*dexp - dexp) / r; if (eflag_either) epair = par.param.morse.d0 * (dexp*dexp - 2.0*dexp) - par.offset; @@ -154,27 +174,24 @@ void PairList::compute(int eflag, int vflag) const double r6inv = r2inv*r2inv*r2inv; const double sig6 = mypow(par.param.lj126.sigma,6); - fpair = 24.0*par.param.lj126.epsilon*r6inv - * (2.0*sig6*sig6*r6inv - sig6) * r2inv; + fpair = 24.0 * par.param.lj126.epsilon * r6inv * (2.0 * sig6 * sig6 * r6inv - sig6) * r2inv; if (eflag_either) - epair = 4.0*par.param.lj126.epsilon*r6inv - * (sig6*sig6*r6inv - sig6) - par.offset; - + epair = 4.0 * par.param.lj126.epsilon * r6inv * (sig6 * sig6 * r6inv - sig6) - par.offset; + } else if (par.style == QUARTIC) { const double r = sqrt(rsq); double dr = r - sqrt(par.cutsq); - double ra = dr - par.param.quartic.b1; - double rb = dr - par.param.quartic.b2; - double r2 = dr * dr; + double ra = dr - par.param.quartic.b1; + double rb = dr - par.param.quartic.b2; + double r2 = dr * dr; fpair = -par.param.quartic.k / r * (r2 * (ra + rb) + 2.0 * dr * ra * rb); if (eflag_either) epair = par.param.quartic.k * r2 * ra * rb; } - if (newton_pair || i < nlocal) { f[i].x += dx*fpair; f[i].y += dy*fpair; @@ -207,14 +224,14 @@ void PairList::compute(int eflag, int vflag) void PairList::allocate() { allocated = 1; - int n = atom->ntypes; + int np1 = atom->ntypes + 1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + memory->create(setflag,np1,np1,"pair:setflag"); + for (int i = 1; i < np1; i++) + for (int j = i; j < np1; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutsq,np1,np1,"pair:cutsq"); } /* ---------------------------------------------------------------------- @@ -223,13 +240,18 @@ void PairList::allocate() void PairList::settings(int narg, char **arg) { - if (narg < 2) - error->all(FLERR,"Illegal pair_style command"); + if (narg < 2) utils::missing_cmd_args(FLERR, "pair_style list", error); cut_global = utils::numeric(FLERR,arg[1],false,lmp); - if (narg > 2) { - if (strcmp(arg[2],"nocheck") == 0) check_flag = 0; - if (strcmp(arg[2],"check") == 0) check_flag = 1; + int iarg = 2; + while (iarg < narg) { + if (strcmp(arg[iarg],"nocheck") == 0) { + check_flag = 0; + ++iarg; + } else if (strcmp(arg[2],"check") == 0) { + check_flag = 1; + ++iarg; + } else error->all(FLERR, "Unknown pair style list keyword: {}", arg[iarg]); } std::vector mystyles; @@ -239,11 +261,13 @@ void PairList::settings(int narg, char **arg) if (comm->me == 0) { int nharm, nmorse, nlj126, nquartic, nskipped; FILE *fp = utils::open_potential(arg[0],lmp,nullptr); - TextFileReader reader(fp,"pair list coeffs"); + if (!fp) + error->one(FLERR, "Error opening pair list coeffs file {}: {}", arg[0], utils::getsyserror()); + TextFileReader reader(fp, "pair list coeffs"); npairs = nharm = nmorse = nlj126 = nquartic = nskipped = 0; + char *line; try { - char *line; while ((line = reader.next_line())) { ValueTokenizer values(line); list_param oneparam; @@ -278,6 +302,8 @@ void PairList::settings(int narg, char **arg) oneparam.param.quartic.k = values.next_double(); oneparam.param.quartic.b1 = values.next_double(); oneparam.param.quartic.b2 = values.next_double(); + if (!values.has_next()) + throw FileReaderException("Must specify individual cutoff for quartic interaction"); ++nquartic; break; @@ -295,7 +321,7 @@ void PairList::settings(int narg, char **arg) myparams.push_back(oneparam); } } catch (std::exception &e) { - error->one(FLERR,"Error reading pair list coeffs file: {}", e.what()); + error->one(FLERR,"Error reading pair list coeffs file: {}\n{}", e.what(),line); } utils::logmesg(lmp, "Read {} ({}/{}/{}/{}) interacting pair lines from {}. " "{} skipped entries.\n", npairs, nharm, nmorse, nlj126, nquartic, arg[0], nskipped); @@ -310,12 +336,12 @@ void PairList::settings(int narg, char **arg) } /* ---------------------------------------------------------------------- - there are no coeffs to be set, but we need to update setflag and pretend + there are no coeffs to be set, but we need to update setflag and pretend there are ------------------------------------------------------------------------- */ void PairList::coeff(int narg, char **arg) { - if (narg < 2) error->all(FLERR,"Incorrect args for pair coefficients"); + if (narg < 2) utils::missing_cmd_args(FLERR,"pair_coeff list", error); if (!allocated) allocate(); int ilo,ihi,jlo,jhi; @@ -362,7 +388,7 @@ void PairList::init_style() const double r6inv = par.cutsq*par.cutsq*par.cutsq; const double sig6 = mypow(par.param.lj126.sigma,6); par.offset = 4.0*par.param.lj126.epsilon*r6inv * (sig6*sig6*r6inv - sig6); - + } else if (par.style == QUARTIC) { // the offset is always 0 at rc par.offset = 0.0; From 74d5893dd937361a3b38e3753e12786f4c91d256 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 05:06:31 -0400 Subject: [PATCH 318/364] enable and apply clang-format --- src/MISC/pair_list.cpp | 221 +++++++++++++++++++++-------------------- 1 file changed, 112 insertions(+), 109 deletions(-) diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index 141afba4e6..e826ff0693 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -26,8 +25,8 @@ #include "memory.h" #include "text_file_reader.h" -#include #include +#include #include #include @@ -36,27 +35,32 @@ using MathSpecial::square; enum { NONE = 0, HARM, MORSE, LJ126, QUARTIC }; +// clang-format off static std::map stylename = { - { "none", NONE }, - { "harmonic", HARM }, - { "morse", MORSE }, - { "lj126", LJ126 }, - { "quartic", QUARTIC } + {"none", NONE}, + {"harmonic", HARM}, + {"morse", MORSE}, + {"lj126", LJ126}, + {"quartic", QUARTIC} }; +// clang-format on // fast power function for integer exponent > 0 -static double mypow(double x, int n) { +static double mypow(double x, int n) +{ double yy; if (x == 0.0) return 0.0; - for (yy = 1.0; n != 0; n >>= 1, x *=x) + for (yy = 1.0; n != 0; n >>= 1, x *= x) if (n & 1) yy *= x; return yy; } -typedef struct { double x,y,z; } dbl3_t; +typedef struct { + double x, y, z; +} dbl3_t; /* ---------------------------------------------------------------------- */ @@ -87,23 +91,23 @@ PairList::~PairList() void PairList::compute(int eflag, int vflag) { - ev_init(eflag,vflag); + ev_init(eflag, vflag); // get maximum allowed tag. bigint maxtag_one, maxtag; maxtag_one = maxtag = 0; const int nlocal = atom->nlocal; - const tagint * _noalias const tag = atom->tag; + const tagint *_noalias const tag = atom->tag; for (int i = 0; i < nlocal; ++i) maxtag_one = MAX(maxtag_one, tag[i]); MPI_Allreduce(&maxtag_one, &maxtag, 1, MPI_LMP_TAGINT, MPI_MAX, world); const int newton_pair = force->newton_pair; - const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - dbl3_t * _noalias const f = (dbl3_t *) atom->f[0]; // NOLINT + const dbl3_t *_noalias const x = (dbl3_t *) atom->x[0]; + dbl3_t *_noalias const f = (dbl3_t *) atom->f[0]; // NOLINT - double fpair,epair; - int i,j; + double fpair, epair; + int i, j; int pc = 0; for (int n = 0; n < npairs; ++n) { @@ -113,12 +117,14 @@ void PairList::compute(int eflag, int vflag) if ((par.id1 < 1) || (par.id1 > maxtag)) { if (check_flag) error->all(FLERR, "Invalid pair list atom ID {}", par.id1); - else continue; + else + continue; } if ((par.id2 < 1) || (par.id2 > maxtag)) { if (check_flag) error->all(FLERR, "Invalid pair list atom ID {}", par.id2); - else continue; + else + continue; } i = atom->map(par.id1); @@ -134,14 +140,14 @@ void PairList::compute(int eflag, int vflag) // if id1 is a ghost, we skip if the sum of both ids is even. // if id2 is a ghost, we skip if the sum of both ids is odd. if (newton_pair) { - if ((i >= nlocal) && ((par.id1+par.id2) & 1) == 0) continue; - if ((j >= nlocal) && ((par.id1+par.id2) & 1) == 1) continue; + if ((i >= nlocal) && ((par.id1 + par.id2) & 1) == 0) continue; + if ((j >= nlocal) && ((par.id1 + par.id2) & 1) == 1) continue; } const double dx = x[i].x - x[j].x; const double dy = x[i].y - x[j].y; const double dz = x[i].z - x[j].z; - const double rsq = dx*dx + dy*dy + dz*dz; + const double rsq = dx * dx + dy * dy + dz * dz; fpair = epair = 0.0; if (check_flag) { @@ -150,30 +156,28 @@ void PairList::compute(int eflag, int vflag) } if (rsq < par.cutsq) { - const double r2inv = 1.0/rsq; + const double r2inv = 1.0 / rsq; if (par.style == HARM) { const double r = sqrt(rsq); const double dr = par.param.harm.r0 - r; - fpair = 2.0*par.param.harm.k*dr/r; + fpair = 2.0 * par.param.harm.k * dr / r; - if (eflag_either) - epair = par.param.harm.k*dr*dr - par.offset; + if (eflag_either) epair = par.param.harm.k * dr * dr - par.offset; } else if (par.style == MORSE) { const double r = sqrt(rsq); const double dr = par.param.morse.r0 - r; const double dexp = exp(par.param.morse.alpha * dr); - fpair = 2.0 * par.param.morse.d0 * par.param.morse.alpha * (dexp*dexp - dexp) / r; + fpair = 2.0 * par.param.morse.d0 * par.param.morse.alpha * (dexp * dexp - dexp) / r; - if (eflag_either) - epair = par.param.morse.d0 * (dexp*dexp - 2.0*dexp) - par.offset; + if (eflag_either) epair = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp) - par.offset; } else if (par.style == LJ126) { - const double r6inv = r2inv*r2inv*r2inv; - const double sig6 = mypow(par.param.lj126.sigma,6); + const double r6inv = r2inv * r2inv * r2inv; + const double sig6 = mypow(par.param.lj126.sigma, 6); fpair = 24.0 * par.param.lj126.epsilon * r6inv * (2.0 * sig6 * sig6 * r6inv - sig6) * r2inv; if (eflag_either) @@ -188,32 +192,31 @@ void PairList::compute(int eflag, int vflag) double r2 = dr * dr; fpair = -par.param.quartic.k / r * (r2 * (ra + rb) + 2.0 * dr * ra * rb); - if (eflag_either) - epair = par.param.quartic.k * r2 * ra * rb; + if (eflag_either) epair = par.param.quartic.k * r2 * ra * rb; } if (newton_pair || i < nlocal) { - f[i].x += dx*fpair; - f[i].y += dy*fpair; - f[i].z += dz*fpair; + f[i].x += dx * fpair; + f[i].y += dy * fpair; + f[i].z += dz * fpair; } if (newton_pair || j < nlocal) { - f[j].x -= dx*fpair; - f[j].y -= dy*fpair; - f[j].z -= dz*fpair; + f[j].x -= dx * fpair; + f[j].y -= dy * fpair; + f[j].z -= dz * fpair; } - if (evflag) ev_tally(i,j,nlocal,newton_pair,epair,0.0,fpair,dx,dy,dz); + if (evflag) ev_tally(i, j, nlocal, newton_pair, epair, 0.0, fpair, dx, dy, dz); } } if (vflag_fdotr) virial_fdotr_compute(); if (check_flag) { int tmp; - MPI_Allreduce(&pc,&tmp,1,MPI_INT,MPI_SUM,world); - if (tmp != 2*npairs) - error->all(FLERR,"Not all pairs processed in pair_style list"); + MPI_Allreduce(&pc, &tmp, 1, MPI_INT, MPI_SUM, world); + if (tmp != 2 * npairs) + error->all(FLERR, "Not all pairs processed in pair_style list: {} vs {}", tmp, 2 * npairs); } } @@ -226,12 +229,11 @@ void PairList::allocate() allocated = 1; int np1 = atom->ntypes + 1; - memory->create(setflag,np1,np1,"pair:setflag"); + memory->create(setflag, np1, np1, "pair:setflag"); for (int i = 1; i < np1; i++) - for (int j = i; j < np1; j++) - setflag[i][j] = 0; + for (int j = i; j < np1; j++) setflag[i][j] = 0; - memory->create(cutsq,np1,np1,"pair:cutsq"); + memory->create(cutsq, np1, np1, "pair:cutsq"); } /* ---------------------------------------------------------------------- @@ -242,16 +244,17 @@ void PairList::settings(int narg, char **arg) { if (narg < 2) utils::missing_cmd_args(FLERR, "pair_style list", error); - cut_global = utils::numeric(FLERR,arg[1],false,lmp); + cut_global = utils::numeric(FLERR, arg[1], false, lmp); int iarg = 2; while (iarg < narg) { - if (strcmp(arg[iarg],"nocheck") == 0) { + if (strcmp(arg[iarg], "nocheck") == 0) { check_flag = 0; ++iarg; - } else if (strcmp(arg[2],"check") == 0) { + } else if (strcmp(arg[2], "check") == 0) { check_flag = 1; ++iarg; - } else error->all(FLERR, "Unknown pair style list keyword: {}", arg[iarg]); + } else + error->all(FLERR, "Unknown pair style list keyword: {}", arg[iarg]); } std::vector mystyles; @@ -260,7 +263,7 @@ void PairList::settings(int narg, char **arg) // read and parse potential file only on MPI rank 0. if (comm->me == 0) { int nharm, nmorse, nlj126, nquartic, nskipped; - FILE *fp = utils::open_potential(arg[0],lmp,nullptr); + FILE *fp = utils::open_potential(arg[0], lmp, nullptr); if (!fp) error->one(FLERR, "Error opening pair list coeffs file {}: {}", arg[0], utils::getsyserror()); TextFileReader reader(fp, "pair list coeffs"); @@ -279,60 +282,62 @@ void PairList::settings(int narg, char **arg) switch (oneparam.style) { - case HARM: - oneparam.param.harm.k = values.next_double(); - oneparam.param.harm.r0 = values.next_double(); - ++nharm; - break; + case HARM: + oneparam.param.harm.k = values.next_double(); + oneparam.param.harm.r0 = values.next_double(); + ++nharm; + break; - case MORSE: - oneparam.param.morse.d0 = values.next_double(); - oneparam.param.morse.alpha = values.next_double(); - oneparam.param.morse.r0 = values.next_double(); - ++nmorse; - break; + case MORSE: + oneparam.param.morse.d0 = values.next_double(); + oneparam.param.morse.alpha = values.next_double(); + oneparam.param.morse.r0 = values.next_double(); + ++nmorse; + break; - case LJ126: - oneparam.param.lj126.epsilon = values.next_double(); - oneparam.param.lj126.sigma = values.next_double(); - ++nlj126; - break; + case LJ126: + oneparam.param.lj126.epsilon = values.next_double(); + oneparam.param.lj126.sigma = values.next_double(); + ++nlj126; + break; - case QUARTIC: - oneparam.param.quartic.k = values.next_double(); - oneparam.param.quartic.b1 = values.next_double(); - oneparam.param.quartic.b2 = values.next_double(); - if (!values.has_next()) - throw FileReaderException("Must specify individual cutoff for quartic interaction"); - ++nquartic; - break; + case QUARTIC: + oneparam.param.quartic.k = values.next_double(); + oneparam.param.quartic.b1 = values.next_double(); + oneparam.param.quartic.b2 = values.next_double(); + if (!values.has_next()) + throw FileReaderException("Must specify individual cutoff for quartic interaction"); + ++nquartic; + break; - case NONE: // fallthrough - error->warning(FLERR,"Skipping unrecognized pair list potential entry: {}", - utils::trim(line)); - ++nskipped; - break; + case NONE: // fallthrough + error->warning(FLERR, "Skipping unrecognized pair list potential entry: {}", + utils::trim(line)); + ++nskipped; + break; } if (values.has_next()) oneparam.cutsq = square(values.next_double()); else - oneparam.cutsq = cut_global*cut_global; + oneparam.cutsq = cut_global * cut_global; myparams.push_back(oneparam); } } catch (std::exception &e) { - error->one(FLERR,"Error reading pair list coeffs file: {}\n{}", e.what(),line); + error->one(FLERR, "Error reading pair list coeffs file: {}\n{}", e.what(), line); } - utils::logmesg(lmp, "Read {} ({}/{}/{}/{}) interacting pair lines from {}. " - "{} skipped entries.\n", npairs, nharm, nmorse, nlj126, nquartic, arg[0], nskipped); + utils::logmesg(lmp, + "Read {} ({}/{}/{}/{}) interacting pair lines from {}. " + "{} skipped entries.\n", + npairs, nharm, nmorse, nlj126, nquartic, arg[0], nskipped); - memory->create(params,npairs,"pair_list:params"); - memcpy(params, myparams.data(),npairs*sizeof(list_param)); + memory->create(params, npairs, "pair_list:params"); + memcpy(params, myparams.data(), npairs * sizeof(list_param)); fclose(fp); } MPI_Bcast(&npairs, 1, MPI_INT, 0, world); - if (comm->me != 0) memory->create(params,npairs,"pair_list:params"); - MPI_Bcast(params, npairs*sizeof(list_param), MPI_BYTE, 0, world); + if (comm->me != 0) memory->create(params, npairs, "pair_list:params"); + MPI_Bcast(params, npairs * sizeof(list_param), MPI_BYTE, 0, world); } /* ---------------------------------------------------------------------- @@ -341,22 +346,22 @@ void PairList::settings(int narg, char **arg) void PairList::coeff(int narg, char **arg) { - if (narg < 2) utils::missing_cmd_args(FLERR,"pair_coeff list", error); + if (narg < 2) utils::missing_cmd_args(FLERR, "pair_coeff list", error); if (!allocated) allocate(); - int ilo,ihi,jlo,jhi; - utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error); - utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error); + int ilo, ihi, jlo, jhi; + utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error); + utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error); int count = 0; for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { setflag[i][j] = 1; count++; } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } /* ---------------------------------------------------------------------- @@ -365,29 +370,27 @@ void PairList::coeff(int narg, char **arg) void PairList::init_style() { - if (atom->tag_enable == 0) - error->all(FLERR,"Pair style list requires atom IDs"); + if (atom->tag_enable == 0) error->all(FLERR, "Pair style list requires atom IDs"); - if (atom->map_style == Atom::MAP_NONE) - error->all(FLERR,"Pair style list requires an atom map"); + if (atom->map_style == Atom::MAP_NONE) error->all(FLERR, "Pair style list requires an atom map"); if (offset_flag) { - for (int n=0; n < npairs; ++n) { + for (int n = 0; n < npairs; ++n) { list_param &par = params[n]; if (par.style == HARM) { const double dr = sqrt(par.cutsq) - par.param.harm.r0; - par.offset = par.param.harm.k*dr*dr; + par.offset = par.param.harm.k * dr * dr; } else if (par.style == MORSE) { const double dr = par.param.morse.r0 - sqrt(par.cutsq); const double dexp = exp(par.param.morse.alpha * dr); - par.offset = par.param.morse.d0 * (dexp*dexp - 2.0*dexp); + par.offset = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp); } else if (par.style == LJ126) { - const double r6inv = par.cutsq*par.cutsq*par.cutsq; - const double sig6 = mypow(par.param.lj126.sigma,6); - par.offset = 4.0*par.param.lj126.epsilon*r6inv * (sig6*sig6*r6inv - sig6); + const double r6inv = par.cutsq * par.cutsq * par.cutsq; + const double sig6 = mypow(par.param.lj126.sigma, 6); + par.offset = 4.0 * par.param.lj126.epsilon * r6inv * (sig6 * sig6 * r6inv - sig6); } else if (par.style == QUARTIC) { // the offset is always 0 at rc @@ -413,10 +416,10 @@ double PairList::init_one(int, int) double PairList::memory_usage() { - double bytes = (double)npairs * sizeof(int); - bytes += (double)npairs * sizeof(list_param); - const int n = atom->ntypes+1; - bytes += (double)n*(n*sizeof(int) + sizeof(int *)); - bytes += (double)n*(n*sizeof(double) + sizeof(double *)); + double bytes = (double) npairs * sizeof(int); + bytes += (double) npairs * sizeof(list_param); + const int n = atom->ntypes + 1; + bytes += (double) n * (n * sizeof(int) + sizeof(int *)); + bytes += (double) n * (n * sizeof(double) + sizeof(double *)); return bytes; } From 4a06559da5d8ff43f23dbb77fac19b86f0859b18 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 05:18:42 -0400 Subject: [PATCH 319/364] update docs --- doc/src/pair_list.rst | 50 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index 76b31623ad..be7ec0c239 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -30,15 +30,17 @@ Description """"""""""" Style *list* computes interactions between explicitly listed pairs of -atoms with the option to select functional form and parameters for -each individual pair. Because the parameters are set in the list -file, the pair_coeff command has no parameters (but still needs to be -provided). The *check* and *nocheck* keywords enable/disable a test -that checks whether all listed bonds were present and computed. +atoms with the option to select functional form and parameters for each +individual pair. Because the parameters are set in the list file, the +pair_coeff command has no parameters (but still needs to be provided). +The *check* and *nocheck* keywords enable/disable tests that checks +whether all listed pairs of atom IDs were present and the interactions +computed. If *nocheck* is set and either atom ID is not present, the +interaction is skipped. This pair style can be thought of as a hybrid between bonded, -non-bonded, and restraint interactions. It will typically be used as -an additional interaction within the *hybrid/overlay* pair style. It +non-bonded, and restraint interactions. It will typically be used as an +additional interaction within the *hybrid/overlay* pair style. It currently supports three interaction styles: a 12-6 Lennard-Jones, a Morse and a harmonic potential. @@ -55,10 +57,10 @@ The format of the list file is as follows: ID2 = atom ID of second atom style = style of interaction coeffs = list of coeffs - cutoff = cutoff for interaction (optional) + cutoff = cutoff for interaction (optional, except for style *quartic*) -The cutoff parameter is optional. If not specified, the global cutoff -is used. +The cutoff parameter is optional for all but the *quartic* interactions. +If it is not specified, the global cutoff is used. Here is an example file: @@ -120,7 +122,7 @@ and the coefficients: * :math:`b_2` (distance units) * :math:`r_c` (distance units) -Note that the global cutoff specified by *pair_style list* command is ignored, unless :math:`r_c` is not specified. In this case, :math:`r_c` equals the sqare root of the globle cutoff. +Note that the per list entry cutoff :math:`r_c` is **required** for *quartic* interactions. ---------- @@ -136,8 +138,9 @@ pair style. The :doc:`pair_modify ` table and tail options are not relevant for this pair style. -This pair style does not write its information to :doc:`binary restart files `, so pair_style and pair_coeff commands need -to be specified in an input script that reads a restart file. +This pair style does not write its information to :doc:`binary restart +files `, so pair_style and pair_coeff commands need to be +specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the @@ -149,17 +152,18 @@ Restrictions """""""""""" This pair style does not use a neighbor list and instead identifies -atoms by their IDs. This has two consequences: 1) The cutoff has to be -chosen sufficiently large, so that the second atom of a pair has to be -a ghost atom on the same node on which the first atom is local; -otherwise the interaction will be skipped. You can use the *check* -option to detect, if interactions are missing. 2) Unlike other pair -styles in LAMMPS, an atom I will not interact with multiple images of -atom J (assuming the images are within the cutoff distance), but only -with the nearest image. +atoms by their IDs. This has two consequences: 1) The cutoff has to be +chosen sufficiently large, so that the second atom of a pair has to be a +ghost atom on the same node on which the first atom is local; otherwise +the interaction will be skipped. You can use the *check* option to +detect, if interactions are missing. 2) Unlike other pair styles in +LAMMPS, an atom I will not interact with multiple images of atom J +(assuming the images are within the cutoff distance), but only with the +closest image. -This style is part of the MISC package. It is only enabled if -LAMMPS is build with that package. See the :doc:`Build package ` page on for more info. +This style is part of the MISC package. It is only enabled if LAMMPS is +build with that package. See the :doc:`Build package ` +page on for more info. Related commands """""""""""""""" From f2b3d8e8c35e18ef605922a8956bca5e0326676f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 07:02:44 -0400 Subject: [PATCH 320/364] use morse interaction energy from bond style morse not pair style morse --- doc/src/pair_list.rst | 5 +++-- src/MISC/pair_list.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index be7ec0c239..762afb888c 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -88,7 +88,7 @@ The style *morse* computes pairwise interactions with the formula .. math:: - E = D_0 \left[ e^{- 2 \alpha (r - r_0)} - 2 e^{- \alpha (r - r_0)} \right] \qquad r < r_c + E = D_0 \left[ 1 - e^{-\alpha (r - r_0)} \right]^2 \qquad r < r_c and the coefficients: @@ -171,8 +171,9 @@ Related commands :doc:`pair_coeff `, :doc:`pair_style hybrid/overlay `, :doc:`pair_style lj/cut `, -:doc:`pair_style morse `, +:doc:`bond_style morse `, :doc:`bond_style harmonic ` +:doc:`bond_style quartic ` Default """"""" diff --git a/src/MISC/pair_list.cpp b/src/MISC/pair_list.cpp index e826ff0693..f6a27538ab 100644 --- a/src/MISC/pair_list.cpp +++ b/src/MISC/pair_list.cpp @@ -168,11 +168,11 @@ void PairList::compute(int eflag, int vflag) } else if (par.style == MORSE) { const double r = sqrt(rsq); - const double dr = par.param.morse.r0 - r; - const double dexp = exp(par.param.morse.alpha * dr); + const double dr = r - par.param.morse.r0; + const double dexp = exp(-par.param.morse.alpha * dr); fpair = 2.0 * par.param.morse.d0 * par.param.morse.alpha * (dexp * dexp - dexp) / r; - if (eflag_either) epair = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp) - par.offset; + if (eflag_either) epair = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp + 1.0) - par.offset; } else if (par.style == LJ126) { @@ -385,7 +385,7 @@ void PairList::init_style() } else if (par.style == MORSE) { const double dr = par.param.morse.r0 - sqrt(par.cutsq); const double dexp = exp(par.param.morse.alpha * dr); - par.offset = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp); + par.offset = par.param.morse.d0 * (dexp * dexp - 2.0 * dexp - 1.0); } else if (par.style == LJ126) { const double r6inv = par.cutsq * par.cutsq * par.cutsq; From 3ff203b70521ee995eb529db17549035aa689450 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 07:03:13 -0400 Subject: [PATCH 321/364] add unit test for pair style list comparing it to pair lj/cut + harmonic/morse bonds --- unittest/force-styles/CMakeLists.txt | 4 + unittest/force-styles/test_pair_list.cpp | 99 ++++++++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 unittest/force-styles/test_pair_list.cpp diff --git a/unittest/force-styles/CMakeLists.txt b/unittest/force-styles/CMakeLists.txt index 294ece3a1f..878492d6c7 100644 --- a/unittest/force-styles/CMakeLists.txt +++ b/unittest/force-styles/CMakeLists.txt @@ -260,3 +260,7 @@ if(MLIAP_ENABLE_PYTHON AND (NOT WIN32)) set_tests_properties(TestMliapPyUnified PROPERTIES ENVIRONMENT "PYTHONPATH=${LAMMPS_PYTHON_DIR};PYTHONDONTWRITEBYTECODE=1") endif() +add_executable(test_pair_list test_pair_list.cpp) +target_link_libraries(test_pair_list PRIVATE lammps GTest::GMockMain) +add_test(NAME TestPairList COMMAND test_pair_list) + diff --git a/unittest/force-styles/test_pair_list.cpp b/unittest/force-styles/test_pair_list.cpp new file mode 100644 index 0000000000..32a38d8708 --- /dev/null +++ b/unittest/force-styles/test_pair_list.cpp @@ -0,0 +1,99 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "library.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +const char parms[] = "print \"\"\"\n" + "1 2 lj126 0.3 3.5 4.0\n" + "2 3 lj126 0.3 3.5 5.0\n" + "1 4 harmonic 10.0 7.0\n" + "2 4 harmonic 10.0 7.0\n" + "3 4 morse 10.0 0.3 6.5\n" + "\"\"\" file list.param\n"; + +const char first[] = "units real\n" + "atom_style bond\n" + "atom_modify map array\n" + "boundary f f f\n" + "special_bonds lj/coul 0.0 1.0 1.0\n" + "region box block -5 5 -5 5 -5 5\n" + "create_box 1 box bond/types 2 extra/bond/per/atom 4\n" + "create_atoms 1 single -2.0 0.0 0.0\n" + "create_atoms 1 single 0.0 1.0 0.0\n" + "create_atoms 1 single 4.0 1.0 0.0\n" + "create_atoms 1 single 4.0 -4.0 -4.0\n" + "create_bonds single/bond 1 1 4\n" + "create_bonds single/bond 1 2 4\n" + "create_bonds single/bond 2 3 4\n" + "mass 1 10.0\n" + "velocity all create 10.0 87287 loop geom\n"; + +const char second[] = "timestep 0.2\n" + "fix 1 all nve\n" + "run 2 post no\n"; + +static constexpr double EPSILON = 1.0e-10; + +namespace LAMMPS_NS { + +TEST(PairList, ListVsPairBond) +{ + if (!lammps_config_has_package("MOLECULE")) GTEST_SKIP(); + + const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; + int lmpargc = sizeof(lmpargv) / sizeof(const char *); + + ::testing::internal::CaptureStdout(); + void *ljmelt = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + lmpargv[0] = "plist"; + void *plist = lammps_open_no_mpi(lmpargc, (char **)lmpargv, nullptr); + + lammps_commands_string(ljmelt, first); + lammps_command(ljmelt, "pair_style lj/cut 5.0"); + lammps_command(ljmelt, "pair_coeff * * 0.3 3.5"); + lammps_command(ljmelt, "bond_style hybrid harmonic morse"); + lammps_command(ljmelt, "bond_coeff 1 harmonic 10.0 7.0"); + lammps_command(ljmelt, "bond_coeff 2 morse 10.0 0.3 6.5"); + + lammps_commands_string(ljmelt, second); + + lammps_command(plist, parms); + lammps_commands_string(plist, first); + lammps_command(plist, "pair_style list list.param 10.0"); + lammps_command(plist, "pair_coeff * *"); + lammps_command(plist, "bond_style zero"); + lammps_command(plist, "bond_coeff * 2.0"); + lammps_commands_string(plist, second); + ::testing::internal::GetCapturedStdout(); + + double lj_pe = lammps_get_thermo(ljmelt, "pe"); + double ml_pe = lammps_get_thermo(plist, "pe"); + EXPECT_NEAR(lj_pe, ml_pe, EPSILON); + double lj_ke = lammps_get_thermo(ljmelt, "ke"); + double ml_ke = lammps_get_thermo(plist, "ke"); + EXPECT_NEAR(lj_ke, ml_ke, EPSILON); + double lj_press = lammps_get_thermo(ljmelt, "press"); + double ml_press = lammps_get_thermo(plist, "press"); + EXPECT_NEAR(lj_press, ml_press, EPSILON); + + ::testing::internal::CaptureStdout(); + lammps_command(plist, "shell rm list.param"); + lammps_close(ljmelt); + lammps_close(plist); + ::testing::internal::GetCapturedStdout(); +} + +} // namespace LAMMPS_NS From 90e820e8ec5b3bad110f4356c8c123e4874611a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 08:55:53 -0400 Subject: [PATCH 322/364] format mpirun/mpiexec consistently --- doc/src/Fortran.rst | 12 ++++++------ doc/src/Run_basics.rst | 9 +++++---- doc/src/Run_options.rst | 20 ++++++++++---------- doc/src/Speed_gpu.rst | 13 +++++++------ doc/src/Speed_kokkos.rst | 17 +++++++++-------- doc/src/Speed_omp.rst | 8 ++++---- 6 files changed, 41 insertions(+), 38 deletions(-) diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index e7b44c4686..28254e056c 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -29,12 +29,12 @@ or dynamic library `. If the LAMMPS library itself has been compiled with MPI support, the resulting executable will still be able to run LAMMPS in parallel with -``mpiexec`` or equivalent. Please also note that the order of the source -files matters: the ``lammps.f90`` file needs to be compiled first, since -it provides the ``LIBLAMMPS`` module that is imported by the Fortran -code that uses the interface. A working example can be found together -with equivalent examples in C and C++ in the ``examples/COUPLE/simple`` -folder of the LAMMPS distribution. +``mpirun``, ``mpiexec`` or equivalent. Please also note that the order +of the source files matters: the ``lammps.f90`` file needs to be +compiled first, since it provides the ``LIBLAMMPS`` module that is +imported by the Fortran code that uses the interface. A working example +can be found together with equivalent examples in C and C++ in the +``examples/COUPLE/simple`` folder of the LAMMPS distribution. .. versionadded:: 9Oct2020 diff --git a/doc/src/Run_basics.rst b/doc/src/Run_basics.rst index 5f1211d093..d2810f5986 100644 --- a/doc/src/Run_basics.rst +++ b/doc/src/Run_basics.rst @@ -30,12 +30,13 @@ executable itself can be placed elsewhere. .. note:: - The redirection operator "<" will not always work when running - in parallel with mpirun or mpiexec; for those systems the -in form is required. + The redirection operator "<" will not always work when running in + parallel with ``mpirun`` or ``mpiexec``; for those systems the -in + form is required. As LAMMPS runs it prints info to the screen and a logfile named -*log.lammps*\ . More info about output is given on the -:doc:`screen and logfile output ` page. +*log.lammps*\ . More info about output is given on the :doc:`screen and +logfile output ` page. If LAMMPS encounters errors in the input script or while running a simulation it will print an ERROR message and stop or a WARNING diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index f3c7973197..f7bb652ea9 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -93,13 +93,13 @@ switch is not set (the default), LAMMPS will operate as if the KOKKOS package were not installed; i.e. you can run standard LAMMPS or with the GPU or OPENMP packages, for testing or benchmarking purposes. -Additional optional keyword/value pairs can be specified which -determine how Kokkos will use the underlying hardware on your -platform. These settings apply to each MPI task you launch via the -"mpirun" or "mpiexec" command. You may choose to run one or more MPI -tasks per physical node. Note that if you are running on a desktop -machine, you typically have one physical node. On a cluster or -supercomputer there may be dozens or 1000s of physical nodes. +Additional optional keyword/value pairs can be specified which determine +how Kokkos will use the underlying hardware on your platform. These +settings apply to each MPI task you launch via the ``mpirun`` or +``mpiexec`` command. You may choose to run one or more MPI tasks per +physical node. Note that if you are running on a desktop machine, you +typically have one physical node. On a cluster or supercomputer there +may be dozens or 1000s of physical nodes. Either the full word or an abbreviation can be used for the keywords. Note that the keywords do not use a leading minus sign. I.e. the @@ -148,9 +148,9 @@ one of these 4 environment variables MV2_COMM_WORLD_LOCAL_RANK (Mvapich) OMPI_COMM_WORLD_LOCAL_RANK (OpenMPI) -which are initialized by the "srun", "mpirun" or "mpiexec" commands. -The environment variable setting for each MPI rank is used to assign a -unique GPU ID to the MPI task. +which are initialized by the ``srun``, ``mpirun``, or ``mpiexec`` +commands. The environment variable setting for each MPI rank is used to +assign a unique GPU ID to the MPI task. .. parsed-literal:: diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index 883bc9c7e3..e95787ebee 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -76,10 +76,11 @@ instructions. **Run with the GPU package from the command line:** -The mpirun or mpiexec command sets the total number of MPI tasks used -by LAMMPS (one or multiple per compute node) and the number of MPI -tasks used per node. E.g. the mpirun command in MPICH does this via -its -np and -ppn switches. Ditto for OpenMPI via -np and -npernode. +The ``mpirun`` or ``mpiexec`` command sets the total number of MPI tasks +used by LAMMPS (one or multiple per compute node) and the number of MPI +tasks used per node. E.g. the ``mpirun`` command in MPICH does this via +its ``-np`` and ``-ppn`` switches. Ditto for OpenMPI via ``-np`` and +``-npernode``. When using the GPU package, you cannot assign more than one GPU to a single MPI task. However multiple MPI tasks can share the same GPU, @@ -129,8 +130,8 @@ GPU package pair styles. **Or run with the GPU package by editing an input script:** -The discussion above for the mpirun/mpiexec command, MPI tasks/node, -and use of multiple MPI tasks/GPU is the same. +The discussion above for the ``mpirun`` or ``mpiexec`` command, MPI +tasks/node, and use of multiple MPI tasks/GPU is the same. Use the :doc:`suffix gpu ` command, or you can explicitly add an "gpu" suffix to individual styles in your input script, e.g. diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst index 8b9b2e99af..73345b7e88 100644 --- a/doc/src/Speed_kokkos.rst +++ b/doc/src/Speed_kokkos.rst @@ -72,12 +72,12 @@ See the :ref:`Build extras ` page for instructions. Running LAMMPS with the KOKKOS package """""""""""""""""""""""""""""""""""""" -All Kokkos operations occur within the context of an individual MPI -task running on a single node of the machine. The total number of MPI -tasks used by LAMMPS (one or multiple per compute node) is set in the -usual manner via the mpirun or mpiexec commands, and is independent of -Kokkos. E.g. the mpirun command in OpenMPI does this via its -np and --npernode switches. Ditto for MPICH via -np and -ppn. +All Kokkos operations occur within the context of an individual MPI task +running on a single node of the machine. The total number of MPI tasks +used by LAMMPS (one or multiple per compute node) is set in the usual +manner via the ``mpirun`` or ``mpiexec`` commands, and is independent of +Kokkos. E.g. the mpirun command in OpenMPI does this via its ``-np`` and +``-npernode`` switches. Ditto for MPICH via ``-np`` and ``-ppn``. Running on a multi-core CPU ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -168,7 +168,7 @@ for your MPI installation), binding can be forced with these flags: .. parsed-literal:: - OpenMPI 1.8: mpirun -np 2 --bind-to socket --map-by socket ./lmp_openmpi ... + OpenMPI 1.8: mpirun -np 2 --bind-to socket --map-by socket ./lmp_openmpi ... Mvapich2 2.0: mpiexec -np 2 --bind-to socket --map-by socket ./lmp_mvapich ... For binding threads with KOKKOS OpenMP, use thread affinity environment @@ -310,7 +310,8 @@ Alternatively the effect of the "-sf" or "-pk" switches can be duplicated by adding the :doc:`package kokkos ` or :doc:`suffix kk ` commands to your input script. The discussion above for building LAMMPS with the KOKKOS package, the -mpirun/mpiexec command, and setting appropriate thread are the same. +``mpirun`` or ``mpiexec`` command, and setting appropriate thread +properties are the same. You must still use the "-k on" :doc:`command-line switch ` to enable the KOKKOS package, and specify its additional arguments for diff --git a/doc/src/Speed_omp.rst b/doc/src/Speed_omp.rst index 29c55df62f..7f8913d20f 100644 --- a/doc/src/Speed_omp.rst +++ b/doc/src/Speed_omp.rst @@ -33,8 +33,8 @@ These examples assume one or more 16-core nodes. mpirun -np 4 lmp_omp -sf omp -pk omp 4 -in in.script # 4 MPI tasks, 4 threads/task mpirun -np 32 -ppn 4 lmp_omp -sf omp -pk omp 4 -in in.script # 8 nodes, 4 MPI tasks/node, 4 threads/task -The mpirun or mpiexec command sets the total number of MPI tasks used -by LAMMPS (one or multiple per compute node) and the number of MPI +The ``mpirun`` or ``mpiexec`` command sets the total number of MPI tasks +used by LAMMPS (one or multiple per compute node) and the number of MPI tasks used per node. E.g. the mpirun command in MPICH does this via its -np and -ppn switches. Ditto for OpenMPI via -np and -npernode. @@ -58,8 +58,8 @@ OMP_NUM_THREADS environment variable. Or run with the OPENMP package by editing an input script """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -The discussion above for the mpirun/mpiexec command, MPI tasks/node, -and threads/MPI task is the same. +The discussion above for the ``mpirun`` or ``mpiexec`` command, MPI +tasks/node, and threads/MPI task is the same. Use the :doc:`suffix omp ` command, or you can explicitly add an "omp" suffix to individual styles in your input script, e.g. From b0e3c2a440c0ce2978bd1f0cc502c41f67e67957 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 09:16:15 -0400 Subject: [PATCH 323/364] retrieving the error message clears the error status --- unittest/fortran/wrap_properties.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index 59e98891c3..5268548d48 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -134,5 +134,11 @@ TEST_F(LAMMPS_properties, has_error) int err = f_lammps_get_last_error_message(errmsg, 1023); EXPECT_EQ(err, 1); EXPECT_THAT(errmsg, ContainsRegex(".*ERROR: Unknown command: this_is_not_a_known_command.*")); + + // retrieving the error message clear the error status + EXPECT_EQ(f_lammps_has_error(), 0); + err = f_lammps_get_last_error_message(errmsg, 1023); + EXPECT_EQ(err, 0); + EXPECT_THAT(errmsg, ContainsRegex(" ")); }; } // namespace LAMMPS_NS From 74705c811107ebc036bf519e973c8ebb0e3bb28d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 09:27:52 -0400 Subject: [PATCH 324/364] port error check test from fortran wrapper to c-library interface test --- .../c-library/test_library_properties.cpp | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 56c89a6c13..bbb363dfab 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -434,6 +434,33 @@ TEST_F(LibraryProperties, neighlist) } }; +TEST_F(LibraryProperties, has_error) +{ + // need errors to throw exceptions to be able to intercept them. + if (!lammps_config_has_exceptions()) GTEST_SKIP(); + + EXPECT_EQ(lammps_has_error(lmp), 0); + + // trigger an error, but hide output + ::testing::internal::CaptureStdout(); + lammps_command(lmp, "this_is_not_a_known_command"); + ::testing::internal::GetCapturedStdout(); + + EXPECT_EQ(lammps_has_error(lmp), 1); + + // retrieve error message + char errmsg[1024]; + int err = lammps_get_last_error_message(lmp, errmsg, 1024); + EXPECT_EQ(err, 1); + EXPECT_THAT(errmsg, HasSubstr("ERROR: Unknown command: this_is_not_a_known_command")); + + // retrieving the error message clear the error status + EXPECT_EQ(lammps_has_error(lmp), 0); + err = lammps_get_last_error_message(lmp, errmsg, 1024); + EXPECT_EQ(err, 0); + EXPECT_THAT(errmsg, StrEq("")); +}; + class AtomProperties : public ::testing::Test { protected: void *lmp; From 7f90e43d0a31f8ad403d3d5712a760b0e93a158d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 14:34:52 -0400 Subject: [PATCH 325/364] must skip test for pair style list, if MISC package is not available --- unittest/force-styles/test_pair_list.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/unittest/force-styles/test_pair_list.cpp b/unittest/force-styles/test_pair_list.cpp index 32a38d8708..9e249613f3 100644 --- a/unittest/force-styles/test_pair_list.cpp +++ b/unittest/force-styles/test_pair_list.cpp @@ -52,6 +52,7 @@ namespace LAMMPS_NS { TEST(PairList, ListVsPairBond) { if (!lammps_config_has_package("MOLECULE")) GTEST_SKIP(); + if (!lammps_config_has_package("MISC")) GTEST_SKIP(); const char *lmpargv[] = {"melt", "-log", "none", "-nocite"}; int lmpargc = sizeof(lmpargv) / sizeof(const char *); From 8fd19fe7fe32bc0dcbde24eaea7bf5c55cfff7e2 Mon Sep 17 00:00:00 2001 From: Karl Hammond Date: Tue, 4 Oct 2022 14:35:24 -0500 Subject: [PATCH 326/364] Fixed a typo in library.cpp (documentation) and adjusted spacing to be consistent --- src/library.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index bfa0fc803a..e430614b13 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1145,7 +1145,7 @@ int lammps_extract_setting(void *handle, const char *keyword) This function returns an integer that encodes the data type of the global property with the specified name. See :cpp:enum:`_LMP_DATATYPE_CONST` for valid values. Callers of :cpp:func:`lammps_extract_global` can use this information -to then decide how to cast the (void*) pointer and access the data. +to then decide how to cast the ``void *`` pointer and access the data. .. versionadded:: 18Sep2020 @@ -1622,7 +1622,7 @@ void *lammps_extract_global(void *handle, const char *name) This function returns an integer that encodes the data type of the per-atom property with the specified name. See :cpp:enum:`_LMP_DATATYPE_CONST` for valid values. Callers of :cpp:func:`lammps_extract_atom` can use this information -to then decide how to cast the (void*) pointer and access the data. +to then decide how to cast the ``void *`` pointer and access the data. .. versionadded:: 18Sep2020 @@ -2080,7 +2080,7 @@ For *vector*\ -style variables, the returned pointer is to actual LAMMPS data. The pointer should not be deallocated. Its length depends on the variable, compute, or fix data used to construct the *vector*\ -style variable. This length can be fetched by calling this function with *group* set to the -constant "LMP_SIZE_VECTOR", which returns a ``void\*`` pointer that can be +constant "LMP_SIZE_VECTOR", which returns a ``void *`` pointer that can be dereferenced to an integer that is the length of the vector. This pointer needs to be deallocated when finished with it to avoid memory leaks. @@ -2157,7 +2157,7 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) This function returns an integer that encodes the data type of the variable with the specified name. See :cpp:enum:`_LMP_VAR_CONST` for valid values. Callers of :cpp:func:`lammps_extract_variable` can use this information to -decide how to cast the (void*) pointer and access the data. +decide how to cast the ``void *`` pointer and access the data. .. versionadded:: TBD @@ -3071,7 +3071,7 @@ Below is a brief C code demonstrating accessing this collected bond information. void lammps_gather_bonds(void *handle, void *data) { - auto lmp = (LAMMPS *)handle; + auto lmp = (LAMMPS *) handle; BEGIN_CAPTURE { void *val = lammps_extract_global(handle,"nbonds"); bigint nbonds = *(bigint *)val; @@ -4526,7 +4526,7 @@ int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { * multiple requests from the same compute * \return return neighbor list index if found, otherwise -1 */ -int lammps_find_compute_neighlist(void* handle, const char *id, int reqid) { +int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { auto lmp = (LAMMPS *) handle; auto compute = lmp->modify->get_compute_by_id(id); if (!compute) return -1; @@ -5773,8 +5773,8 @@ has thrown a :ref:`C++ exception `. */ int lammps_has_error(void *handle) { #ifdef LAMMPS_EXCEPTIONS - LAMMPS * lmp = (LAMMPS *) handle; - Error * error = lmp->error; + LAMMPS *lmp = (LAMMPS *) handle; + Error *error = lmp->error; return (error->get_last_error().empty()) ? 0 : 1; #else return 0; From 82d6c1de9927ebb481f15256b8f46fe8317445c3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 4 Oct 2022 15:48:01 -0400 Subject: [PATCH 327/364] recover MDI library build with windows cross-compilation --- cmake/Modules/Packages/MDI.cmake | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index 82b036a583..c1e25347af 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -49,6 +49,14 @@ if(DOWNLOAD_MDI) set(MDI_USE_PYTHON_PLUGINS ON) endif() endif() + # python plugins are not supported and thus must be always off on Windows + if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + unset(Python_Development_FOUND) + set(MDI_USE_PYTHON_PLUGINS OFF) + if(CMAKE_CROSSCOMPILING) + set(CMAKE_INSTALL_LIBDIR lib) + endif() + endif() # download/ build MDI library # always build static library with -fpic @@ -57,8 +65,9 @@ if(DOWNLOAD_MDI) ExternalProject_Add(mdi_build URL ${MDI_URL} URL_MD5 ${MDI_MD5} + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX= + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} @@ -70,21 +79,22 @@ if(DOWNLOAD_MDI) -Dplugins=ON -Dpython_plugins=${MDI_USE_PYTHON_PLUGINS} UPDATE_COMMAND "" - BUILD_BYPRODUCTS "/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" + INSTALL_COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext/src/mdi_build-build --target install + BUILD_BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/mdi_build_ext/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" ) # where is the compiled library? - ExternalProject_get_property(mdi_build INSTALL_DIR) + ExternalProject_get_property(mdi_build PREFIX) # workaround for older CMake versions - file(MAKE_DIRECTORY ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/mdi) - file(MAKE_DIRECTORY ${INSTALL_DIR}/include/mdi) + file(MAKE_DIRECTORY ${PREFIX}/${CMAKE_INSTALL_LIBDIR}/mdi) + file(MAKE_DIRECTORY ${PREFIX}/include/mdi) # create imported target for the MDI library add_library(LAMMPS::MDI UNKNOWN IMPORTED) add_dependencies(LAMMPS::MDI mdi_build) set_target_properties(LAMMPS::MDI PROPERTIES - IMPORTED_LOCATION "${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" - INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include/mdi + IMPORTED_LOCATION "${PREFIX}/${CMAKE_INSTALL_LIBDIR}/mdi/${CMAKE_STATIC_LIBRARY_PREFIX}mdi${CMAKE_STATIC_LIBRARY_SUFFIX}" + INTERFACE_INCLUDE_DIRECTORIES ${PREFIX}/include/mdi ) set(MDI_DEP_LIBS "") From f9f9e44f2d6cc8df994d1797722d1253c5ed1b88 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 4 Oct 2022 14:04:40 -0600 Subject: [PATCH 328/364] Update Kokkos library in LAMMPS to v3.7.0 --- lib/kokkos/BUILD.md | 20 +- lib/kokkos/CHANGELOG.md | 152 + lib/kokkos/CMakeLists.txt | 31 +- lib/kokkos/Makefile.kokkos | 248 +- lib/kokkos/Makefile.targets | 25 +- lib/kokkos/README.md | 266 +- lib/kokkos/algorithms/src/CMakeLists.txt | 1 + lib/kokkos/algorithms/src/Kokkos_Random.hpp | 125 +- lib/kokkos/algorithms/src/Kokkos_Sort.hpp | 94 +- .../algorithms/src/Kokkos_StdAlgorithms.hpp | 126 +- .../Kokkos_AdjacentDifference.hpp | 99 +- .../std_algorithms/Kokkos_AdjacentFind.hpp | 124 + .../src/std_algorithms/Kokkos_AllOf.hpp | 94 + .../src/std_algorithms/Kokkos_AnyOf.hpp | 94 + .../src/std_algorithms/Kokkos_BeginEnd.hpp | 4 +- .../src/std_algorithms/Kokkos_Copy.hpp | 97 + .../std_algorithms/Kokkos_CopyBackward.hpp | 95 + .../src/std_algorithms/Kokkos_CopyIf.hpp | 99 + .../src/std_algorithms/Kokkos_CopyN.hpp | 98 + .../src/std_algorithms/Kokkos_Count.hpp | 94 + .../src/std_algorithms/Kokkos_CountIf.hpp | 99 + .../src/std_algorithms/Kokkos_Distance.hpp | 4 +- .../src/std_algorithms/Kokkos_Equal.hpp | 198 ++ .../std_algorithms/Kokkos_ExclusiveScan.hpp | 190 ++ .../src/std_algorithms/Kokkos_Fill.hpp | 86 + .../src/std_algorithms/Kokkos_FillN.hpp | 91 + .../src/std_algorithms/Kokkos_Find.hpp | 89 + .../src/std_algorithms/Kokkos_FindEnd.hpp | 149 + .../src/std_algorithms/Kokkos_FindFirstOf.hpp | 150 + .../src/std_algorithms/Kokkos_FindIf.hpp | 95 + .../src/std_algorithms/Kokkos_FindIfNot.hpp | 98 + .../src/std_algorithms/Kokkos_ForEach.hpp | 95 + .../src/std_algorithms/Kokkos_ForEachN.hpp | 96 + .../src/std_algorithms/Kokkos_Generate.hpp | 91 + .../src/std_algorithms/Kokkos_GenerateN.hpp | 93 + .../std_algorithms/Kokkos_InclusiveScan.hpp | 223 ++ .../std_algorithms/Kokkos_IsPartitioned.hpp | 92 + .../src/std_algorithms/Kokkos_IsSorted.hpp | 131 + .../std_algorithms/Kokkos_IsSortedUntil.hpp | 134 + ...yingOperations.hpp => Kokkos_IterSwap.hpp} | 31 +- .../Kokkos_LexicographicalCompare.hpp | 154 + .../src/std_algorithms/Kokkos_MaxElement.hpp | 132 + .../src/std_algorithms/Kokkos_MinElement.hpp | 132 + .../std_algorithms/Kokkos_MinMaxElement.hpp | 133 + .../Kokkos_MinMaxElementOperations.hpp | 409 --- .../src/std_algorithms/Kokkos_Mismatch.hpp | 160 + .../src/std_algorithms/Kokkos_Move.hpp | 94 + .../std_algorithms/Kokkos_MoveBackward.hpp | 95 + .../Kokkos_NonModifyingSequenceOperations.hpp | 2406 --------------- .../src/std_algorithms/Kokkos_NoneOf.hpp | 94 + .../std_algorithms/Kokkos_PartitionCopy.hpp | 110 + .../std_algorithms/Kokkos_PartitionPoint.hpp | 91 + .../Kokkos_PartitioningOperations.hpp | 491 --- .../{numeric => }/Kokkos_Reduce.hpp | 113 +- .../src/std_algorithms/Kokkos_Remove.hpp | 91 + .../src/std_algorithms/Kokkos_RemoveCopy.hpp | 106 + .../std_algorithms/Kokkos_RemoveCopyIf.hpp | 110 + .../src/std_algorithms/Kokkos_RemoveIf.hpp | 92 + .../src/std_algorithms/Kokkos_Replace.hpp | 93 + .../src/std_algorithms/Kokkos_ReplaceCopy.hpp | 107 + .../std_algorithms/Kokkos_ReplaceCopyIf.hpp | 111 + .../src/std_algorithms/Kokkos_ReplaceIf.hpp | 96 + .../src/std_algorithms/Kokkos_Reverse.hpp | 87 + .../src/std_algorithms/Kokkos_ReverseCopy.hpp | 95 + .../src/std_algorithms/Kokkos_Rotate.hpp | 89 + .../src/std_algorithms/Kokkos_RotateCopy.hpp | 100 + .../src/std_algorithms/Kokkos_Search.hpp | 148 + .../src/std_algorithms/Kokkos_SearchN.hpp | 144 + .../src/std_algorithms/Kokkos_ShiftLeft.hpp | 89 + .../src/std_algorithms/Kokkos_ShiftRight.hpp | 89 + .../Kokkos_SortingOperations.hpp | 378 --- .../src/std_algorithms/Kokkos_Swap.hpp | 69 + .../src/std_algorithms/Kokkos_SwapRanges.hpp | 97 + .../src/std_algorithms/Kokkos_Transform.hpp | 166 + .../Kokkos_TransformExclusiveScan.hpp | 131 + .../Kokkos_TransformInclusiveScan.hpp | 190 ++ .../{numeric => }/Kokkos_TransformReduce.hpp | 213 +- .../src/std_algorithms/Kokkos_Unique.hpp | 124 + .../src/std_algorithms/Kokkos_UniqueCopy.hpp | 143 + .../impl/Kokkos_AdjacentDifference.hpp | 135 + .../impl/Kokkos_AdjacentFind.hpp | 140 + .../impl/Kokkos_AllOfAnyOfNoneOf.hpp | 77 + .../{ => impl}/Kokkos_Constraints.hpp | 0 .../impl/Kokkos_CopyBackward.hpp | 103 + .../std_algorithms/impl/Kokkos_CopyCopyN.hpp | 116 + .../src/std_algorithms/impl/Kokkos_CopyIf.hpp | 142 + .../impl/Kokkos_CountCountIf.hpp | 112 + .../src/std_algorithms/impl/Kokkos_Equal.hpp | 147 + .../impl/Kokkos_ExclusiveScan.hpp | 232 ++ .../std_algorithms/impl/Kokkos_FillFillN.hpp} | 112 +- .../std_algorithms/impl/Kokkos_FindEnd.hpp | 191 ++ .../impl/Kokkos_FindFirstOf.hpp | 161 + .../impl/Kokkos_FindIfOrNot.hpp | 146 + .../impl/Kokkos_ForEachForEachN.hpp | 113 + .../impl/Kokkos_GenerateGenerateN.hpp | 105 + .../{ => impl}/Kokkos_HelperPredicates.hpp | 4 +- .../Kokkos_IdentityReferenceUnaryFunctor.hpp | 4 +- .../impl/Kokkos_InclusiveScan.hpp | 243 ++ .../impl/Kokkos_IsPartitioned.hpp | 148 + .../std_algorithms/impl/Kokkos_IsSorted.hpp | 117 + .../impl/Kokkos_IsSortedUntil.hpp | 153 + .../impl/Kokkos_LexicographicalCompare.hpp | 184 ++ .../impl/Kokkos_MinMaxMinmaxElement.hpp | 167 + .../std_algorithms/impl/Kokkos_Mismatch.hpp | 162 + .../src/std_algorithms/impl/Kokkos_Move.hpp | 100 + .../impl/Kokkos_MoveBackward.hpp | 104 + .../impl/Kokkos_PartitionCopy.hpp | 180 ++ .../impl/Kokkos_PartitionPoint.hpp | 132 + .../Kokkos_RandomAccessIterator.hpp | 24 +- .../src/std_algorithms/impl/Kokkos_Reduce.hpp | 186 ++ ...cerWithArbitraryJoinerNoNeutralElement.hpp | 11 +- .../impl/Kokkos_RemoveAllVariants.hpp | 212 ++ .../std_algorithms/impl/Kokkos_Replace.hpp | 103 + .../impl/Kokkos_ReplaceCopy.hpp | 122 + .../impl/Kokkos_ReplaceCopyIf.hpp | 123 + .../std_algorithms/impl/Kokkos_ReplaceIf.hpp | 105 + .../std_algorithms/impl/Kokkos_Reverse.hpp | 111 + .../impl/Kokkos_ReverseCopy.hpp | 102 + .../src/std_algorithms/impl/Kokkos_Rotate.hpp | 219 ++ .../std_algorithms/impl/Kokkos_RotateCopy.hpp | 149 + .../src/std_algorithms/impl/Kokkos_Search.hpp | 191 ++ .../std_algorithms/impl/Kokkos_SearchN.hpp | 205 ++ .../std_algorithms/impl/Kokkos_ShiftLeft.hpp | 139 + .../std_algorithms/impl/Kokkos_ShiftRight.hpp | 139 + .../std_algorithms/impl/Kokkos_SwapRanges.hpp | 112 + .../std_algorithms/impl/Kokkos_Transform.hpp | 158 + .../impl/Kokkos_TransformExclusiveScan.hpp | 153 + .../impl/Kokkos_TransformInclusiveScan.hpp | 235 ++ .../impl/Kokkos_TransformReduce.hpp | 245 ++ .../src/std_algorithms/impl/Kokkos_Unique.hpp | 193 ++ .../std_algorithms/impl/Kokkos_UniqueCopy.hpp | 156 + ...Kokkos_ValueWrapperForNoNeutralElement.hpp | 10 +- ...Kokkos_ModifyingSequenceOperationsSet1.hpp | 1285 -------- ...Kokkos_ModifyingSequenceOperationsSet2.hpp | 1783 ----------- .../numeric/Kokkos_ExclusiveScan.hpp | 517 ---- .../numeric/Kokkos_InclusiveScan.hpp | 699 ----- .../algorithms/unit_tests/CMakeLists.txt | 1 + .../algorithms/unit_tests/TestRandom.hpp | 20 +- .../unit_tests/TestRandomAccessIterator.cpp | 39 +- lib/kokkos/algorithms/unit_tests/TestSort.hpp | 13 +- .../TestStdAlgorithmsAdjacentDifference.cpp | 12 +- .../TestStdAlgorithmsAdjacentFind.cpp | 4 +- .../TestStdAlgorithmsAllAnyNoneOf.cpp | 4 +- .../unit_tests/TestStdAlgorithmsCommon.hpp | 68 +- .../TestStdAlgorithmsCompileOnly.cpp | 19 - .../TestStdAlgorithmsConstraints.cpp | 2 +- .../unit_tests/TestStdAlgorithmsCopyIf.cpp | 71 +- .../unit_tests/TestStdAlgorithmsCount.cpp | 2 - .../unit_tests/TestStdAlgorithmsEqual.cpp | 3 - .../TestStdAlgorithmsExclusiveScan.cpp | 58 +- .../unit_tests/TestStdAlgorithmsFind.cpp | 2 - .../unit_tests/TestStdAlgorithmsFindEnd.cpp | 10 +- .../TestStdAlgorithmsFindFirstOf.cpp | 10 +- .../unit_tests/TestStdAlgorithmsForEach.cpp | 2 - .../TestStdAlgorithmsHelperFunctors.hpp | 6 - .../TestStdAlgorithmsInclusiveScan.cpp | 58 +- .../unit_tests/TestStdAlgorithmsIsSorted.cpp | 4 +- .../TestStdAlgorithmsIsSortedUntil.cpp | 20 +- ...estStdAlgorithmsLexicographicalCompare.cpp | 5 +- .../TestStdAlgorithmsMinMaxElementOps.cpp | 23 +- .../unit_tests/TestStdAlgorithmsMismatch.cpp | 18 +- .../unit_tests/TestStdAlgorithmsModOps.cpp | 45 +- .../unit_tests/TestStdAlgorithmsModSeqOps.cpp | 42 +- .../TestStdAlgorithmsMoveBackward.cpp | 135 + .../unit_tests/TestStdAlgorithmsNumerics.cpp | 155 +- .../TestStdAlgorithmsPartitionCopy.cpp | 38 +- .../TestStdAlgorithmsPartitioningOps.cpp | 7 +- .../unit_tests/TestStdAlgorithmsRemove.cpp | 6 +- .../TestStdAlgorithmsRemoveCopy.cpp | 6 +- .../TestStdAlgorithmsRemoveCopyIf.cpp | 6 +- .../unit_tests/TestStdAlgorithmsRemoveIf.cpp | 6 +- .../unit_tests/TestStdAlgorithmsReplace.cpp | 26 +- .../TestStdAlgorithmsReplaceCopy.cpp | 58 +- .../TestStdAlgorithmsReplaceCopyIf.cpp | 58 +- .../unit_tests/TestStdAlgorithmsReplaceIf.cpp | 4 +- .../unit_tests/TestStdAlgorithmsReverse.cpp | 4 +- .../unit_tests/TestStdAlgorithmsRotate.cpp | 6 +- .../TestStdAlgorithmsRotateCopy.cpp | 12 +- .../TestStdAlgorithmsScalarRedVsView.cpp | 235 -- .../unit_tests/TestStdAlgorithmsSearch.cpp | 10 +- .../unit_tests/TestStdAlgorithmsSearch_n.cpp | 10 +- .../unit_tests/TestStdAlgorithmsShiftLeft.cpp | 6 +- .../TestStdAlgorithmsShiftRight.cpp | 6 +- ...estStdAlgorithmsTransformExclusiveScan.cpp | 22 +- ...estStdAlgorithmsTransformInclusiveScan.cpp | 22 +- .../TestStdAlgorithmsTransformUnaryOp.cpp | 4 +- .../unit_tests/TestStdAlgorithmsUnique.cpp | 12 +- .../TestStdAlgorithmsUniqueCopy.cpp | 72 +- .../algorithms/unit_tests/TestStdReducers.cpp | 4 +- lib/kokkos/appveyor.yml | 2 +- .../benchmarks/bytes_and_flops/bench.hpp | 36 +- .../bytes_and_flops/bench_double.cpp | 2 +- .../bytes_and_flops/bench_float.cpp | 2 +- .../bytes_and_flops/bench_int32_t.cpp | 2 +- .../bytes_and_flops/bench_int64_t.cpp | 2 +- .../bytes_and_flops/bench_stride.hpp | 51 +- .../bytes_and_flops/bench_unroll_stride.hpp | 90 +- .../benchmarks/bytes_and_flops/main.cpp | 42 +- lib/kokkos/bin/nvcc_wrapper | 79 +- lib/kokkos/cmake/Dependencies.cmake | 12 + lib/kokkos/cmake/KokkosConfigCommon.cmake.in | 1 + lib/kokkos/cmake/KokkosCore_config.h.in | 11 +- lib/kokkos/cmake/Modules/FindTPLLIBDL.cmake | 2 +- lib/kokkos/cmake/Modules/FindTPLTHREADS.cmake | 2 +- lib/kokkos/cmake/fake_tribits.cmake | 2 - lib/kokkos/cmake/kokkos_arch.cmake | 278 +- lib/kokkos/cmake/kokkos_compiler_id.cmake | 14 +- lib/kokkos/cmake/kokkos_enable_devices.cmake | 2 + lib/kokkos/cmake/kokkos_enable_options.cmake | 1 + lib/kokkos/cmake/kokkos_functions.cmake | 78 +- lib/kokkos/cmake/kokkos_pick_cxx_std.cmake | 4 +- lib/kokkos/cmake/kokkos_test_cxx_std.cmake | 4 +- lib/kokkos/cmake/kokkos_tpls.cmake | 5 + lib/kokkos/cmake/kokkos_tribits.cmake | 4 +- .../performance_tests/TestGlobal2LocalIds.hpp | 4 +- .../performance_tests/TestScatterView.hpp | 6 +- .../TestUnorderedMapPerformance.hpp | 2 +- lib/kokkos/containers/src/Kokkos_Bitset.hpp | 16 +- lib/kokkos/containers/src/Kokkos_DualView.hpp | 220 +- .../containers/src/Kokkos_DynRankView.hpp | 1058 ++++--- .../containers/src/Kokkos_DynamicView.hpp | 498 ++- .../containers/src/Kokkos_ErrorReporter.hpp | 8 + .../containers/src/Kokkos_Functional.hpp | 82 +- .../containers/src/Kokkos_OffsetView.hpp | 681 +++-- .../containers/src/Kokkos_ScatterView.hpp | 122 +- .../containers/src/Kokkos_StaticCrsGraph.hpp | 14 +- .../containers/src/Kokkos_UnorderedMap.hpp | 42 +- lib/kokkos/containers/src/Kokkos_Vector.hpp | 11 +- .../src/impl/Kokkos_Bitset_impl.hpp | 4 +- .../impl/Kokkos_StaticCrsGraph_factory.hpp | 18 +- .../src/impl/Kokkos_UnorderedMap_impl.cpp | 4 + .../src/impl/Kokkos_UnorderedMap_impl.hpp | 11 +- .../containers/unit_tests/TestBitset.hpp | 12 +- .../containers/unit_tests/TestDualView.hpp | 17 +- .../containers/unit_tests/TestDynViewAPI.hpp | 48 +- .../containers/unit_tests/TestOffsetView.hpp | 8 +- .../containers/unit_tests/TestScatterView.hpp | 60 +- .../unit_tests/TestUnorderedMap.hpp | 10 +- .../containers/unit_tests/TestVector.hpp | 13 + .../unit_tests/TestWithoutInitializing.hpp | 562 +++- lib/kokkos/core/perf_test/CMakeLists.txt | 3 + .../core/perf_test/PerfTestBlasKernels.hpp | 6 +- .../core/perf_test/PerfTestGramSchmidt.cpp | 2 +- lib/kokkos/core/src/CMakeLists.txt | 54 +- lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp | 88 +- .../Cuda/Kokkos_Cuda_Atomic_Intrinsics.hpp | 125 +- .../core/src/Cuda/Kokkos_Cuda_Error.hpp | 31 +- .../src/Cuda/Kokkos_Cuda_Half_Conversion.hpp | 90 +- .../core/src/Cuda/Kokkos_Cuda_Instance.cpp | 263 +- .../src/Cuda/Kokkos_Cuda_KernelLaunch.hpp | 2 +- .../core/src/Cuda/Kokkos_Cuda_Locks.cpp | 11 +- .../core/src/Cuda/Kokkos_Cuda_Locks.hpp | 58 +- .../core/src/Cuda/Kokkos_Cuda_Parallel.hpp | 2722 ----------------- .../src/Cuda/Kokkos_Cuda_Parallel_MDRange.hpp | 477 +++ .../src/Cuda/Kokkos_Cuda_Parallel_Range.hpp | 1049 +++++++ .../src/Cuda/Kokkos_Cuda_Parallel_Team.hpp | 1139 +++++++ .../core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp | 559 ++-- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp | 4 + lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp | 9 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp | 605 ++-- .../src/Cuda/Kokkos_Cuda_Vectorization.hpp | 27 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp | 31 +- .../src/Cuda/Kokkos_Cuda_WorkGraphPolicy.hpp | 10 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Abort.hpp | 22 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Atomic.hpp | 89 +- .../HIP/Kokkos_HIP_BlockSize_Deduction.hpp | 6 +- .../core/src/HIP/Kokkos_HIP_Instance.cpp | 61 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp | 4 + .../src/HIP/Kokkos_HIP_Parallel_MDRange.hpp | 67 +- .../src/HIP/Kokkos_HIP_Parallel_Range.hpp | 201 +- .../core/src/HIP/Kokkos_HIP_Parallel_Team.hpp | 144 +- .../core/src/HIP/Kokkos_HIP_ReduceScan.hpp | 266 +- .../src/HIP/Kokkos_HIP_Shuffle_Reduce.hpp | 174 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp | 265 +- lib/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp | 122 +- .../core/src/HIP/Kokkos_HIP_UniqueToken.hpp | 3 +- .../core/src/HIP/Kokkos_HIP_Vectorization.hpp | 22 +- .../src/HIP/Kokkos_HIP_WorkGraphPolicy.hpp | 10 +- lib/kokkos/core/src/HPX/Kokkos_HPX.cpp | 81 +- lib/kokkos/core/src/HPX/Kokkos_HPX_Task.cpp | 4 + lib/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp | 6 +- .../src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp | 8 +- lib/kokkos/core/src/KokkosExp_InterOp.hpp | 8 + .../core/src/KokkosExp_MDRangePolicy.hpp | 11 +- .../src/Kokkos_AcquireUniqueTokenImpl.hpp | 9 + lib/kokkos/core/src/Kokkos_AnonymousSpace.hpp | 9 + lib/kokkos/core/src/Kokkos_Array.hpp | 107 +- lib/kokkos/core/src/Kokkos_Atomic.hpp | 8 + .../core/src/Kokkos_Atomics_Desul_Config.hpp | 9 + .../Kokkos_Atomics_Desul_Volatile_Wrapper.hpp | 10 + .../core/src/Kokkos_Atomics_Desul_Wrapper.hpp | 10 + lib/kokkos/core/src/Kokkos_Complex.hpp | 229 +- lib/kokkos/core/src/Kokkos_Concepts.hpp | 41 +- lib/kokkos/core/src/Kokkos_CopyViews.hpp | 1242 +++++--- lib/kokkos/core/src/Kokkos_Core.hpp | 250 +- lib/kokkos/core/src/Kokkos_Core_fwd.hpp | 34 +- lib/kokkos/core/src/Kokkos_Crs.hpp | 12 +- lib/kokkos/core/src/Kokkos_Cuda.hpp | 43 +- lib/kokkos/core/src/Kokkos_CudaSpace.hpp | 107 +- lib/kokkos/core/src/Kokkos_DetectionIdiom.hpp | 8 + lib/kokkos/core/src/Kokkos_ExecPolicy.hpp | 56 +- lib/kokkos/core/src/Kokkos_Extents.hpp | 16 +- lib/kokkos/core/src/Kokkos_Future.hpp | 90 +- lib/kokkos/core/src/Kokkos_Graph.hpp | 8 + lib/kokkos/core/src/Kokkos_GraphNode.hpp | 34 +- lib/kokkos/core/src/Kokkos_Graph_fwd.hpp | 8 + lib/kokkos/core/src/Kokkos_HBWSpace.hpp | 9 + lib/kokkos/core/src/Kokkos_HIP.hpp | 9 + lib/kokkos/core/src/Kokkos_HIP_Space.hpp | 226 +- lib/kokkos/core/src/Kokkos_HPX.hpp | 584 ++-- lib/kokkos/core/src/Kokkos_Half.hpp | 8 + lib/kokkos/core/src/Kokkos_HostSpace.hpp | 56 +- lib/kokkos/core/src/Kokkos_Layout.hpp | 61 +- lib/kokkos/core/src/Kokkos_LogicalSpaces.hpp | 23 +- lib/kokkos/core/src/Kokkos_Macros.hpp | 65 +- lib/kokkos/core/src/Kokkos_MasterLock.hpp | 9 + .../core/src/Kokkos_MathematicalConstants.hpp | 8 + .../core/src/Kokkos_MathematicalFunctions.hpp | 140 +- .../Kokkos_MathematicalSpecialFunctions.hpp | 62 +- lib/kokkos/core/src/Kokkos_MemoryPool.hpp | 9 + lib/kokkos/core/src/Kokkos_MemoryTraits.hpp | 9 + lib/kokkos/core/src/Kokkos_MinMaxClamp.hpp | 18 +- lib/kokkos/core/src/Kokkos_NumericTraits.hpp | 8 + lib/kokkos/core/src/Kokkos_OpenMP.hpp | 61 +- lib/kokkos/core/src/Kokkos_OpenMPTarget.hpp | 50 +- .../core/src/Kokkos_OpenMPTargetSpace.hpp | 44 +- lib/kokkos/core/src/Kokkos_Pair.hpp | 29 +- lib/kokkos/core/src/Kokkos_Parallel.hpp | 219 +- .../core/src/Kokkos_Parallel_Reduce.hpp | 403 +-- .../core/src/Kokkos_PointerOwnership.hpp | 9 + .../src/Kokkos_Profiling_ProfileSection.hpp | 8 + lib/kokkos/core/src/Kokkos_Rank.hpp | 9 + lib/kokkos/core/src/Kokkos_SYCL.hpp | 76 +- lib/kokkos/core/src/Kokkos_SYCL_Space.hpp | 69 + lib/kokkos/core/src/Kokkos_ScratchSpace.hpp | 9 + lib/kokkos/core/src/Kokkos_Serial.hpp | 984 +----- lib/kokkos/core/src/Kokkos_TaskScheduler.hpp | 69 +- .../core/src/Kokkos_TaskScheduler_fwd.hpp | 9 + lib/kokkos/core/src/Kokkos_Threads.hpp | 51 +- lib/kokkos/core/src/Kokkos_Timer.hpp | 8 + lib/kokkos/core/src/Kokkos_Tuners.hpp | 9 + lib/kokkos/core/src/Kokkos_UniqueToken.hpp | 9 + lib/kokkos/core/src/Kokkos_Vectorization.hpp | 9 + lib/kokkos/core/src/Kokkos_View.hpp | 1278 ++++---- .../core/src/Kokkos_WorkGraphPolicy.hpp | 11 +- lib/kokkos/core/src/Kokkos_hwloc.hpp | 9 + .../core/src/OpenACC/Kokkos_OpenACC.cpp | 98 + .../core/src/OpenACC/Kokkos_OpenACC.hpp | 126 + .../core/src/OpenACC/Kokkos_OpenACCSpace.cpp | 222 ++ .../core/src/OpenACC/Kokkos_OpenACCSpace.hpp | 249 ++ .../src/OpenACC/Kokkos_OpenACC_Instance.cpp | 118 + .../src/OpenACC/Kokkos_OpenACC_Instance.hpp | 79 + .../src/OpenACC/Kokkos_OpenACC_Traits.hpp | 65 + ...MP_Exec.cpp => Kokkos_OpenMP_Instance.cpp} | 237 +- ...MP_Exec.hpp => Kokkos_OpenMP_Instance.hpp} | 123 +- .../src/OpenMP/Kokkos_OpenMP_Parallel.hpp | 604 ++-- .../core/src/OpenMP/Kokkos_OpenMP_Task.cpp | 4 + .../core/src/OpenMP/Kokkos_OpenMP_Task.hpp | 17 +- .../core/src/OpenMP/Kokkos_OpenMP_Team.hpp | 2 +- .../OpenMP/Kokkos_OpenMP_WorkGraphPolicy.hpp | 4 +- .../OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp | 108 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp | 9 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp | 210 +- .../Kokkos_OpenMPTarget_Instance.cpp | 85 +- .../Kokkos_OpenMPTarget_Instance.hpp | 2 +- .../Kokkos_OpenMPTarget_Parallel.hpp | 288 +- .../Kokkos_OpenMPTarget_Parallel_MDRange.hpp | 251 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp | 4 + lib/kokkos/core/src/SYCL/Kokkos_SYCL.cpp | 115 +- .../core/src/SYCL/Kokkos_SYCL_Instance.cpp | 23 +- .../core/src/SYCL/Kokkos_SYCL_Instance.hpp | 20 +- .../src/SYCL/Kokkos_SYCL_Parallel_Range.hpp | 10 +- .../src/SYCL/Kokkos_SYCL_Parallel_Reduce.hpp | 322 +- .../src/SYCL/Kokkos_SYCL_Parallel_Scan.hpp | 77 +- .../src/SYCL/Kokkos_SYCL_Parallel_Team.hpp | 385 ++- .../core/src/SYCL/Kokkos_SYCL_Space.cpp | 136 +- lib/kokkos/core/src/SYCL/Kokkos_SYCL_Team.hpp | 134 +- .../src/{impl => Serial}/Kokkos_Serial.cpp | 74 +- .../Serial/Kokkos_Serial_Parallel_MDRange.hpp | 213 ++ .../Serial/Kokkos_Serial_Parallel_Range.hpp | 337 ++ .../Serial/Kokkos_Serial_Parallel_Team.hpp | 424 +++ .../{impl => Serial}/Kokkos_Serial_Task.cpp | 11 +- .../{impl => Serial}/Kokkos_Serial_Task.hpp | 6 +- .../src/Serial/Kokkos_Serial_UniqueToken.hpp | 109 + .../Kokkos_Serial_WorkGraphPolicy.hpp | 4 +- .../core/src/Threads/Kokkos_ThreadsExec.cpp | 137 +- .../core/src/Threads/Kokkos_ThreadsExec.hpp | 195 +- .../core/src/Threads/Kokkos_ThreadsTeam.hpp | 158 +- .../src/Threads/Kokkos_Threads_Parallel.hpp | 1034 ------- .../Kokkos_Threads_Parallel_MDRange.hpp | 322 ++ .../Threads/Kokkos_Threads_Parallel_Range.hpp | 485 +++ .../Threads/Kokkos_Threads_Parallel_Team.hpp | 279 ++ .../Threads/Kokkos_Threads_UniqueToken.hpp | 157 + .../Kokkos_Threads_WorkGraphPolicy.hpp | 4 +- .../core/src/View/Hooks/Kokkos_ViewHooks.hpp | 151 + .../core/src/decl/Kokkos_Declare_CUDA.hpp | 5 +- .../src/decl/Kokkos_Declare_OPENACC.hpp} | 11 +- lib/kokkos/core/src/desul/.clang-format | 3 - lib/kokkos/core/src/desul/atomics.hpp | 19 - .../core/src/desul/atomics/Atomic_Ref.hpp | 541 ---- lib/kokkos/core/src/desul/atomics/CUDA.hpp | 541 ---- lib/kokkos/core/src/desul/atomics/Common.hpp | 201 -- .../src/desul/atomics/Compare_Exchange.hpp | 37 - .../desul/atomics/Compare_Exchange_CUDA.hpp | 268 -- .../desul/atomics/Compare_Exchange_GCC.hpp | 91 - .../desul/atomics/Compare_Exchange_HIP.hpp | 253 -- .../desul/atomics/Compare_Exchange_MSVC.hpp | 237 -- .../desul/atomics/Compare_Exchange_OpenMP.hpp | 139 - .../desul/atomics/Compare_Exchange_SYCL.hpp | 227 -- .../atomics/Compare_Exchange_ScopeCaller.hpp | 43 - .../desul/atomics/Compare_Exchange_Serial.hpp | 45 - lib/kokkos/core/src/desul/atomics/GCC.hpp | 131 - lib/kokkos/core/src/desul/atomics/Generic.hpp | 766 ----- lib/kokkos/core/src/desul/atomics/HIP.hpp | 225 -- .../core/src/desul/atomics/Lock_Array.hpp | 75 - .../src/desul/atomics/Lock_Array_Cuda.hpp | 172 -- .../core/src/desul/atomics/Lock_Array_HIP.hpp | 170 - lib/kokkos/core/src/desul/atomics/Macros.hpp | 66 - lib/kokkos/core/src/desul/atomics/OpenMP.hpp | 15 - lib/kokkos/core/src/desul/atomics/SYCL.hpp | 116 - .../src/desul/atomics/SYCLConversions.hpp | 97 - .../core/src/desul/atomics/cuda/CUDA_asm.hpp | 18 - .../desul/atomics/cuda/CUDA_asm_exchange.hpp | 8 - .../src/desul/atomics/cuda/cuda_cc7_asm.inc | 20 - .../cuda/cuda_cc7_asm_atomic_fetch_op.inc | 18 - ...da_cc7_asm_atomic_fetch_op.inc_forceglobal | 153 - .../cuda_cc7_asm_atomic_fetch_op.inc_generic | 151 - .../cuda_cc7_asm_atomic_fetch_op.inc_isglobal | 208 -- ...cuda_cc7_asm_atomic_fetch_op.inc_predicate | 250 -- .../atomics/cuda/cuda_cc7_asm_atomic_op.inc | 18 - .../cuda_cc7_asm_atomic_op.inc_forceglobal | 64 - .../cuda/cuda_cc7_asm_atomic_op.inc_generic | 64 - .../cuda/cuda_cc7_asm_atomic_op.inc_isglobal | 88 - .../cuda/cuda_cc7_asm_atomic_op.inc_predicate | 106 - .../atomics/cuda/cuda_cc7_asm_exchange.inc | 20 - .../cuda/cuda_cc7_asm_exchange_memorder.inc | 27 - .../atomics/cuda/cuda_cc7_asm_exchange_op.inc | 40 - .../atomics/cuda/cuda_cc7_asm_memorder.inc | 29 - .../src/desul/atomics/openmp/OpenMP_40.hpp | 97 - .../src/desul/atomics/openmp/OpenMP_40_op.inc | 101 - .../core/src/desul/src/Lock_Array_CUDA.cpp | 98 - .../core/src/desul/src/Lock_Array_HIP.cpp | 101 - lib/kokkos/core/src/fwd/Kokkos_Fwd_HIP.hpp | 1 + .../core/src/fwd/Kokkos_Fwd_OPENACC.hpp | 56 + lib/kokkos/core/src/impl/CMakeLists.txt | 2 +- .../src/impl/KokkosExp_Host_IterateTile.hpp | 79 +- .../src/impl/KokkosExp_IterateTileGPU.hpp | 3 - .../core/src/impl/Kokkos_AnalyzePolicy.hpp | 15 + .../Kokkos_Atomic_Compare_Exchange_Strong.hpp | 64 +- .../Kokkos_Atomic_Compare_Exchange_Weak.hpp | 28 +- .../core/src/impl/Kokkos_Atomic_Exchange.hpp | 82 +- .../core/src/impl/Kokkos_Atomic_Fetch_Add.hpp | 53 +- .../core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp | 34 +- .../core/src/impl/Kokkos_Atomic_Generic.hpp | 199 +- .../core/src/impl/Kokkos_Atomic_Load.hpp | 36 +- .../core/src/impl/Kokkos_Atomic_Store.hpp | 36 +- .../core/src/impl/Kokkos_Atomic_Windows.hpp | 14 +- lib/kokkos/core/src/impl/Kokkos_BitOps.hpp | 204 +- .../core/src/impl/Kokkos_CPUDiscovery.cpp | 4 + lib/kokkos/core/src/impl/Kokkos_ChaseLev.hpp | 4 +- lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp | 32 +- .../core/src/impl/Kokkos_Combined_Reducer.hpp | 115 +- .../src/impl/Kokkos_Command_Line_Parsing.cpp | 265 +- .../src/impl/Kokkos_Command_Line_Parsing.hpp | 18 +- lib/kokkos/core/src/impl/Kokkos_Core.cpp | 1138 +++---- ...alizer.hpp => Kokkos_DeviceManagement.hpp} | 27 +- lib/kokkos/core/src/impl/Kokkos_EBO.hpp | 44 +- lib/kokkos/core/src/impl/Kokkos_Error.cpp | 7 + lib/kokkos/core/src/impl/Kokkos_Error.hpp | 100 +- .../core/src/impl/Kokkos_ExecPolicy.cpp | 14 +- .../core/src/impl/Kokkos_ExecSpaceManager.hpp | 162 + .../core/src/impl/Kokkos_FunctorAdapter.hpp | 2055 ------------- .../core/src/impl/Kokkos_FunctorAnalysis.hpp | 495 ++- lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp | 4 + .../core/src/impl/Kokkos_HostBarrier.cpp | 4 + lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp | 160 +- .../src/impl/Kokkos_HostSpace_deepcopy.cpp | 10 +- .../src/impl/Kokkos_HostSpace_deepcopy.hpp | 2 + .../core/src/impl/Kokkos_HostThreadTeam.cpp | 4 + .../core/src/impl/Kokkos_HostThreadTeam.hpp | 221 +- .../impl/Kokkos_InitializationSettings.hpp | 195 ++ lib/kokkos/core/src/impl/Kokkos_LIFO.hpp | 7 +- .../core/src/impl/Kokkos_MemoryPool.cpp | 4 + .../src/impl/Kokkos_MemoryPoolAllocator.hpp | 2 +- .../core/src/impl/Kokkos_MemorySpace.cpp | 4 + .../core/src/impl/Kokkos_MemorySpace.hpp | 14 + .../core/src/impl/Kokkos_Memory_Fence.hpp | 3 +- .../src/impl/Kokkos_MultipleTaskQueue.hpp | 45 +- .../core/src/impl/Kokkos_NumericTraits.cpp | 5 + .../core/src/impl/Kokkos_OptionalRef.hpp | 14 +- ...ndLineArgumentsAndEnvironmentVariables.hpp | 58 + lib/kokkos/core/src/impl/Kokkos_Profiling.cpp | 159 +- lib/kokkos/core/src/impl/Kokkos_Profiling.hpp | 8 +- .../src/impl/Kokkos_Profiling_Interface.hpp | 2 + .../src/impl/Kokkos_QuadPrecisionMath.hpp | 78 +- .../core/src/impl/Kokkos_SharedAlloc.cpp | 9 +- .../core/src/impl/Kokkos_SharedAlloc.hpp | 38 +- .../src/impl/Kokkos_SimpleTaskScheduler.hpp | 7 +- .../core/src/impl/Kokkos_SingleTaskQueue.hpp | 1 - lib/kokkos/core/src/impl/Kokkos_Spinwait.cpp | 4 + lib/kokkos/core/src/impl/Kokkos_Spinwait.hpp | 24 +- .../core/src/impl/Kokkos_Stacktrace.cpp | 5 + .../src/impl/Kokkos_StringManipulation.hpp | 220 ++ lib/kokkos/core/src/impl/Kokkos_TaskBase.hpp | 5 +- lib/kokkos/core/src/impl/Kokkos_TaskNode.hpp | 1 - lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp | 1 - .../core/src/impl/Kokkos_TaskQueueCommon.hpp | 1 - .../impl/Kokkos_TaskQueueMemoryManager.hpp | 1 - .../src/impl/Kokkos_TaskQueueMultiple.hpp | 1 - .../core/src/impl/Kokkos_TaskResult.hpp | 1 - .../core/src/impl/Kokkos_TaskTeamMember.hpp | 5 +- .../core/src/impl/Kokkos_Tools_Generic.hpp | 15 +- lib/kokkos/core/src/impl/Kokkos_Traits.hpp | 13 +- lib/kokkos/core/src/impl/Kokkos_Utilities.hpp | 3 + .../core/src/impl/Kokkos_VLAEmulation.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_ViewArray.hpp | 88 +- lib/kokkos/core/src/impl/Kokkos_ViewCtor.hpp | 33 +- .../core/src/impl/Kokkos_ViewLayoutTiled.hpp | 383 +-- .../core/src/impl/Kokkos_ViewMapping.hpp | 373 ++- .../core/src/impl/Kokkos_ViewTracker.hpp | 2 +- .../core/src/impl/Kokkos_ViewUniformType.hpp | 8 +- lib/kokkos/core/src/impl/Kokkos_hwloc.cpp | 29 +- .../core/src/setup/Kokkos_Setup_Cuda.hpp | 2 - .../core/src/setup/Kokkos_Setup_SYCL.hpp | 9 + .../core/src/traits/Kokkos_WorkTagTrait.hpp | 11 +- lib/kokkos/core/unit_test/CMakeLists.txt | 73 +- lib/kokkos/core/unit_test/Makefile | 5 +- lib/kokkos/core/unit_test/TestAbort.hpp | 138 + lib/kokkos/core/unit_test/TestAggregate.hpp | 11 +- lib/kokkos/core/unit_test/TestArray.cpp | 84 + .../core/unit_test/TestAtomicOperations.hpp | 1 - lib/kokkos/core/unit_test/TestAtomicViews.hpp | 3 +- lib/kokkos/core/unit_test/TestAtomics.hpp | 12 +- lib/kokkos/core/unit_test/TestCXX11.hpp | 3 +- lib/kokkos/core/unit_test/TestComplex.hpp | 10 +- .../core/unit_test/TestConcurrentBitset.hpp | 1 - .../core/unit_test/TestDeepCopyAlignment.hpp | 12 +- .../unit_test/TestDefaultDeviceTypeInit.hpp | 4 +- .../unit_test/TestExecSpacePartitioning.hpp | 1 - .../core/unit_test/TestExecutionSpace.hpp | 46 +- .../core/unit_test/TestFunctorAnalysis.hpp | 14 +- .../core/unit_test/TestHalfOperators.hpp | 1 - .../core/unit_test/TestHostSharedPtr.hpp | 2 +- .../TestHostSharedPtrAccessOnDevice.hpp | 16 +- lib/kokkos/core/unit_test/TestInit.hpp | 1 - .../unit_test/TestInitializationSettings.cpp | 124 + lib/kokkos/core/unit_test/TestInterOp.cpp | 38 +- .../core/unit_test/TestIrregularLayout.hpp | 1 - .../TestJoinBackwardCompatibility.hpp | 154 + .../unit_test/TestLegionInteroperability.cpp | 159 + .../core/unit_test/TestLocalDeepCopy.hpp | 1 - lib/kokkos/core/unit_test/TestMDRange.hpp | 28 +- .../unit_test/TestMathematicalFunctions.hpp | 135 +- .../unit_test/TestMathematicalFunctions1.hpp | 47 + .../unit_test/TestMathematicalFunctions2.hpp | 47 + .../TestMathematicalSpecialFunctions.hpp | 20 +- lib/kokkos/core/unit_test/TestMemoryPool.hpp | 11 +- lib/kokkos/core/unit_test/TestMinMaxClamp.hpp | 162 +- .../unit_test/TestNonTrivialScalarTypes.hpp | 81 +- .../core/unit_test/TestNumericTraits.hpp | 76 +- lib/kokkos/core/unit_test/TestOther.hpp | 6 +- .../TestParseCmdLineArgsAndEnvVars.cpp | 499 +++ .../core/unit_test/TestPolicyConstruction.hpp | 33 +- .../core/unit_test/TestQuadPrecisionMath.hpp | 52 +- lib/kokkos/core/unit_test/TestRealloc.hpp | 56 +- lib/kokkos/core/unit_test/TestReduce.hpp | 54 +- .../unit_test/TestReduceCombinatorical.hpp | 48 +- lib/kokkos/core/unit_test/TestReducers.hpp | 39 +- lib/kokkos/core/unit_test/TestReducers_d.hpp | 55 +- lib/kokkos/core/unit_test/TestResize.hpp | 64 +- lib/kokkos/core/unit_test/TestScan.hpp | 3 +- lib/kokkos/core/unit_test/TestSharedAlloc.hpp | 1 - .../core/unit_test/TestStringManipulation.cpp | 217 ++ .../core/unit_test/TestTaskScheduler.hpp | 1 - lib/kokkos/core/unit_test/TestTeam.hpp | 189 +- lib/kokkos/core/unit_test/TestTeamBasic.hpp | 54 +- .../core/unit_test/TestTeamReductionScan.hpp | 45 +- lib/kokkos/core/unit_test/TestTeamScan.hpp | 21 +- .../core/unit_test/TestTeamTeamSize.hpp | 9 - lib/kokkos/core/unit_test/TestTeamVector.hpp | 7 +- .../core/unit_test/TestTeamVectorRange.hpp | 56 - .../unit_test/TestTemplateMetaFunctions.hpp | 181 -- lib/kokkos/core/unit_test/TestUniqueToken.hpp | 26 +- lib/kokkos/core/unit_test/TestUtilities.hpp | 1 - lib/kokkos/core/unit_test/TestViewAPI.hpp | 118 +- lib/kokkos/core/unit_test/TestViewAPI_b.hpp | 2 + lib/kokkos/core/unit_test/TestViewAPI_e.hpp | 38 +- .../core/unit_test/TestViewCtorDimMatch.hpp | 430 +++ lib/kokkos/core/unit_test/TestViewHooks.hpp | 159 + .../core/unit_test/TestViewIsAssignable.hpp | 4 +- .../TestViewLayoutStrideAssignment.hpp | 21 +- .../core/unit_test/TestViewLayoutTiled.hpp | 6 + .../core/unit_test/TestViewMapping_a.hpp | 21 +- .../core/unit_test/TestViewMapping_b.hpp | 1 - .../unit_test/TestViewMapping_subview.hpp | 1 - .../TestViewMemoryAccessViolation.hpp | 221 ++ lib/kokkos/core/unit_test/TestViewOfClass.hpp | 1 - .../core/unit_test/TestViewSpaceAssign.hpp | 1 - lib/kokkos/core/unit_test/TestViewSubview.hpp | 5 +- .../unit_test/TestWithoutInitializing.hpp | 265 ++ .../TestHIPHostPinned_Category.hpp | 1 + .../TestHIPManaged_Category.hpp} | 17 +- .../category_files/TestHIP_Category.hpp | 1 + .../TestSYCLHostUSM_Category.hpp | 1 + .../TestSYCLSharedUSM_Category.hpp | 1 + .../category_files/TestSYCL_Category.hpp | 1 + .../unit_test/cuda/TestCuda_InterOp_Init.cpp | 3 +- .../cuda/TestCuda_InterOp_Streams.cpp | 3 +- .../cuda/TestCuda_ReducerViewSizeLimit.cpp | 8 - .../default/TestDefaultDeviceTypeViewAPI.cpp | 6 +- .../headers_self_contained/tstHeader.cpp | 2 + .../unit_test/hip/TestHIP_InterOp_Init.cpp | 3 +- .../unit_test/hip/TestHIP_InterOp_Streams.cpp | 3 +- .../hip/TestHIP_Memory_Requirements.cpp | 86 + .../core/unit_test/hip/TestHIP_ScanUnit.cpp | 7 +- .../core/unit_test/hip/TestHIP_Spaces.cpp | 96 + .../hpx/TestHPX_IndependentInstances.cpp | 118 +- ...X_IndependentInstancesDelayedExecution.cpp | 44 +- ...estHPX_IndependentInstancesInstanceIds.cpp | 108 +- ...estHPX_IndependentInstancesRefCounting.cpp | 50 +- .../core/unit_test/hpx/TestHPX_InterOp.cpp | 6 +- .../incremental/Test01_execspace.hpp | 6 +- .../incremental/Test14_MDRangeReduce.hpp | 6 - .../core/unit_test/openmp/TestOpenMP.hpp | 1 - .../unit_test/openmp/TestOpenMP_InterOp.cpp | 3 +- .../openmptarget/TestOpenMPTarget.hpp | 1 - .../unit_test/sycl/TestSYCL_InterOp_Init.cpp | 5 +- .../sycl/TestSYCL_InterOp_Init_Context.cpp | 4 +- .../sycl/TestSYCL_InterOp_Streams.cpp | 8 +- .../sycl/TestSYCL_TeamScratchStreams.cpp | 2 +- .../unit_test/tools/TestLogicalSpaces.hpp | 3 + .../tools/TestWithoutInitializing.cpp | 76 + .../tools/include/ToolTestingUtilities.hpp | 18 + .../build_cmake_installed/CMakeLists.txt | 6 - .../build_cmake_installed/cmake_example.cpp | 2 +- .../CMakeLists.txt | 4 - .../foo.cpp | 2 +- .../cmake_example.cpp | 2 +- .../simple_mdrangepolicy.cpp | 36 +- lib/kokkos/generate_makefile.bash | 26 +- lib/kokkos/gnu_generate_makefile.bash | 9 + lib/kokkos/master_history.txt | 1 + lib/kokkos/simd/CMakeLists.txt | 10 + lib/kokkos/simd/cmake/Dependencies.cmake | 5 + lib/kokkos/simd/src/CMakeLists.txt | 29 + lib/kokkos/simd/src/Kokkos_SIMD.hpp | 161 + lib/kokkos/simd/src/Kokkos_SIMD_AVX512.hpp | 1023 +++++++ lib/kokkos/simd/src/Kokkos_SIMD_Common.hpp | 428 +++ lib/kokkos/simd/src/Kokkos_SIMD_Scalar.hpp | 353 +++ lib/kokkos/simd/src/Kokkos_SIMD_dummy.cpp | 7 + lib/kokkos/simd/unit_tests/CMakeLists.txt | 5 + lib/kokkos/simd/unit_tests/TestSIMD.cpp | 376 +++ lib/kokkos/simd/unit_tests/UnitTestMain.cpp | 54 + 653 files changed, 41432 insertions(+), 33597 deletions(-) rename lib/kokkos/algorithms/src/std_algorithms/{numeric => }/Kokkos_AdjacentDifference.hpp (72%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp rename lib/kokkos/algorithms/src/std_algorithms/{Kokkos_ModifyingOperations.hpp => Kokkos_IterSwap.hpp} (79%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Mismatch.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Move.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_MoveBackward.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_NonModifyingSequenceOperations.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_NoneOf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitionPoint.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_PartitioningOperations.hpp rename lib/kokkos/algorithms/src/std_algorithms/{numeric => }/Kokkos_Reduce.hpp (70%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Remove.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveCopyIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_RemoveIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Replace.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceCopyIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReplaceIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Reverse.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ReverseCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Rotate.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_RotateCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Search.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_SearchN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftLeft.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_ShiftRight.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_SortingOperations.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Swap.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_SwapRanges.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Transform.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformExclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_TransformInclusiveScan.hpp rename lib/kokkos/algorithms/src/std_algorithms/{numeric => }/Kokkos_TransformReduce.hpp (62%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_Unique.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/Kokkos_UniqueCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentDifference.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AdjacentFind.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_AllOfAnyOfNoneOf.hpp rename lib/kokkos/algorithms/src/std_algorithms/{ => impl}/Kokkos_Constraints.hpp (100%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyBackward.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyCopyN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CopyIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_CountCountIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Equal.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ExclusiveScan.hpp rename lib/kokkos/{core/src/Threads/Kokkos_ThreadsExec_base.cpp => algorithms/src/std_algorithms/impl/Kokkos_FillFillN.hpp} (52%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindEnd.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindFirstOf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_FindIfOrNot.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ForEachForEachN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_GenerateGenerateN.hpp rename lib/kokkos/algorithms/src/std_algorithms/{ => impl}/Kokkos_HelperPredicates.hpp (97%) rename lib/kokkos/algorithms/src/std_algorithms/{numeric => impl}/Kokkos_IdentityReferenceUnaryFunctor.hpp (93%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_InclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsPartitioned.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSorted.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_IsSortedUntil.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_LexicographicalCompare.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MinMaxMinmaxElement.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Mismatch.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Move.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_MoveBackward.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_PartitionCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_PartitionPoint.hpp rename lib/kokkos/algorithms/src/std_algorithms/{ => impl}/Kokkos_RandomAccessIterator.hpp (88%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Reduce.hpp rename lib/kokkos/algorithms/src/std_algorithms/{ => impl}/Kokkos_ReducerWithArbitraryJoinerNoNeutralElement.hpp (91%) create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_RemoveAllVariants.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Replace.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ReplaceCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ReplaceCopyIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ReplaceIf.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Reverse.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ReverseCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Rotate.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_RotateCopy.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Search.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_SearchN.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ShiftLeft.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_ShiftRight.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_SwapRanges.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Transform.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_TransformExclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_TransformInclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_TransformReduce.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_Unique.hpp create mode 100644 lib/kokkos/algorithms/src/std_algorithms/impl/Kokkos_UniqueCopy.hpp rename lib/kokkos/algorithms/src/std_algorithms/{ => impl}/Kokkos_ValueWrapperForNoNeutralElement.hpp (89%) delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/modifying_sequence_ops/Kokkos_ModifyingSequenceOperationsSet1.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/modifying_sequence_ops/Kokkos_ModifyingSequenceOperationsSet2.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_ExclusiveScan.hpp delete mode 100644 lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_InclusiveScan.hpp create mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsMoveBackward.cpp delete mode 100644 lib/kokkos/algorithms/unit_tests/TestStdAlgorithmsScalarRedVsView.cpp delete mode 100644 lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp create mode 100644 lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel_MDRange.hpp create mode 100644 lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel_Range.hpp create mode 100644 lib/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel_Team.hpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACC.cpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACC.hpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACCSpace.cpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACCSpace.hpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACC_Instance.cpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACC_Instance.hpp create mode 100644 lib/kokkos/core/src/OpenACC/Kokkos_OpenACC_Traits.hpp rename lib/kokkos/core/src/OpenMP/{Kokkos_OpenMP_Exec.cpp => Kokkos_OpenMP_Instance.cpp} (72%) rename lib/kokkos/core/src/OpenMP/{Kokkos_OpenMP_Exec.hpp => Kokkos_OpenMP_Instance.hpp} (80%) rename lib/kokkos/core/src/{impl => Serial}/Kokkos_Serial.cpp (82%) create mode 100644 lib/kokkos/core/src/Serial/Kokkos_Serial_Parallel_MDRange.hpp create mode 100644 lib/kokkos/core/src/Serial/Kokkos_Serial_Parallel_Range.hpp create mode 100644 lib/kokkos/core/src/Serial/Kokkos_Serial_Parallel_Team.hpp rename lib/kokkos/core/src/{impl => Serial}/Kokkos_Serial_Task.cpp (92%) rename lib/kokkos/core/src/{impl => Serial}/Kokkos_Serial_Task.hpp (98%) create mode 100644 lib/kokkos/core/src/Serial/Kokkos_Serial_UniqueToken.hpp rename lib/kokkos/core/src/{impl => Serial}/Kokkos_Serial_WorkGraphPolicy.hpp (95%) delete mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel_MDRange.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel_Range.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_Parallel_Team.hpp create mode 100644 lib/kokkos/core/src/Threads/Kokkos_Threads_UniqueToken.hpp create mode 100644 lib/kokkos/core/src/View/Hooks/Kokkos_ViewHooks.hpp rename lib/kokkos/{algorithms/src/std_algorithms/Kokkos_ModifyingSequenceOperations.hpp => core/src/decl/Kokkos_Declare_OPENACC.hpp} (89%) delete mode 100644 lib/kokkos/core/src/desul/.clang-format delete mode 100644 lib/kokkos/core/src/desul/atomics.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Atomic_Ref.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/CUDA.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Common.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_CUDA.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_GCC.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_HIP.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_MSVC.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_OpenMP.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_SYCL.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_ScopeCaller.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Compare_Exchange_Serial.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/GCC.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Generic.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/HIP.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Lock_Array.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Lock_Array_Cuda.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Lock_Array_HIP.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/Macros.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/OpenMP.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/SYCL.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/SYCLConversions.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/CUDA_asm.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/CUDA_asm_exchange.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_forceglobal delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_generic delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_isglobal delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_predicate delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_forceglobal delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_generic delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_isglobal delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_predicate delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange_memorder.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange_op.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_memorder.inc delete mode 100644 lib/kokkos/core/src/desul/atomics/openmp/OpenMP_40.hpp delete mode 100644 lib/kokkos/core/src/desul/atomics/openmp/OpenMP_40_op.inc delete mode 100644 lib/kokkos/core/src/desul/src/Lock_Array_CUDA.cpp delete mode 100644 lib/kokkos/core/src/desul/src/Lock_Array_HIP.cpp create mode 100644 lib/kokkos/core/src/fwd/Kokkos_Fwd_OPENACC.hpp rename lib/kokkos/core/src/impl/{Kokkos_ExecSpaceInitializer.hpp => Kokkos_DeviceManagement.hpp} (75%) create mode 100644 lib/kokkos/core/src/impl/Kokkos_ExecSpaceManager.hpp delete mode 100644 lib/kokkos/core/src/impl/Kokkos_FunctorAdapter.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_InitializationSettings.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_ParseCommandLineArgumentsAndEnvironmentVariables.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_StringManipulation.hpp create mode 100644 lib/kokkos/core/unit_test/TestAbort.hpp create mode 100644 lib/kokkos/core/unit_test/TestArray.cpp create mode 100644 lib/kokkos/core/unit_test/TestInitializationSettings.cpp create mode 100644 lib/kokkos/core/unit_test/TestJoinBackwardCompatibility.hpp create mode 100644 lib/kokkos/core/unit_test/TestLegionInteroperability.cpp create mode 100644 lib/kokkos/core/unit_test/TestMathematicalFunctions1.hpp create mode 100644 lib/kokkos/core/unit_test/TestMathematicalFunctions2.hpp create mode 100644 lib/kokkos/core/unit_test/TestParseCmdLineArgsAndEnvVars.cpp create mode 100644 lib/kokkos/core/unit_test/TestStringManipulation.cpp delete mode 100644 lib/kokkos/core/unit_test/TestTemplateMetaFunctions.hpp create mode 100644 lib/kokkos/core/unit_test/TestViewCtorDimMatch.hpp create mode 100644 lib/kokkos/core/unit_test/TestViewHooks.hpp create mode 100644 lib/kokkos/core/unit_test/TestViewMemoryAccessViolation.hpp rename lib/kokkos/{algorithms/src/std_algorithms/Kokkos_Numeric.hpp => core/unit_test/category_files/TestHIPManaged_Category.hpp} (82%) create mode 100644 lib/kokkos/core/unit_test/hip/TestHIP_Memory_Requirements.cpp create mode 100644 lib/kokkos/simd/CMakeLists.txt create mode 100644 lib/kokkos/simd/cmake/Dependencies.cmake create mode 100644 lib/kokkos/simd/src/CMakeLists.txt create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD.hpp create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD_AVX512.hpp create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD_Common.hpp create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD_Scalar.hpp create mode 100644 lib/kokkos/simd/src/Kokkos_SIMD_dummy.cpp create mode 100644 lib/kokkos/simd/unit_tests/CMakeLists.txt create mode 100644 lib/kokkos/simd/unit_tests/TestSIMD.cpp create mode 100644 lib/kokkos/simd/unit_tests/UnitTestMain.cpp diff --git a/lib/kokkos/BUILD.md b/lib/kokkos/BUILD.md index 114baf99f1..a8985ef1fd 100644 --- a/lib/kokkos/BUILD.md +++ b/lib/kokkos/BUILD.md @@ -27,7 +27,7 @@ When configuring your project just set: -DKokkos_ROOT=${kokkos_install_prefix} \ -DCMAKE_CXX_COMPILER=${compiler_used_to_build_kokkos} ```` -Note: You may need the following if using some versions of CMake (e.g. 3.12): +Note: You may need the following if your project requires a minimum CMake version older than 3.12: ````cmake cmake_policy(SET CMP0074 NEW) ```` @@ -171,6 +171,9 @@ Options can be enabled by specifying `-DKokkos_ENABLE_X`. * Kokkos_ENABLE_HPX_ASYNC_DISPATCH * Whether HPX supports asynchronous dispatch * BOOL Default: OFF +* Kokkos_ENABLE_IMPL_CUDA_MALLOC_ASYNC + * Whether to enable CudaMallocAsync (requires CUDA Toolkit 11.2). This is an experimental performance feature and currently has issue when using with UCX. See https://github.com/kokkos/kokkos/issues/4228 for more details. + * BOOL Default: OFF * Kokkos_ENABLE_LARGE_MEM_TESTS * Whether to perform extra large memory tests * BOOL_Default: OFF @@ -235,6 +238,9 @@ The following options control `find_package` paths for CMake-based TPLs: ## Architecture Keywords Architecture-specific optimizations can be enabled by specifying `-DKokkos_ARCH_X`. +* Kokkos_ARCH_NATIVE + * Whether to optimize for the the local CPU architecture + * BOOL Default: OFF * Kokkos_ARCH_AMDAVX * Whether to optimize for the AMDAVX architecture * BOOL Default: OFF @@ -310,12 +316,24 @@ Architecture-specific optimizations can be enabled by specifying `-DKokkos_ARCH_ * Kokkos_ARCH_POWER9 * Whether to optimize for the POWER9 architecture * BOOL Default: OFF +* Kokkos_ARCH_ICL + * Whether to optimize for the ICL architecture + * BOOL Default: OFF +* Kokkos_ARCH_ICX + * Whether to optimize for the ICX architecture + * BOOL Default: OFF +* Kokkos_ARCH_SKL + * Whether to optimize for the SKL architecture + * BOOL Default: OFF * Kokkos_ARCH_SKX * Whether to optimize for the SKX architecture * BOOL Default: OFF * Kokkos_ARCH_SNB * Whether to optimize for the SNB architecture * BOOL Default: OFF +* Kokkos_ARCH_SPR + * Whether to optimize for the SPR architecture + * BOOL Default: OFF * Kokkos_ARCH_TURING75 * Whether to optimize for the TURING75 architecture * BOOL Default: OFF diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index a908507704..e81f294451 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,157 @@ # Change Log +## [3.7.00](https://github.com/kokkos/kokkos/tree/3.7.00) (2022-08-22) +[Full Changelog](https://github.com/kokkos/kokkos/compare/3.6.01...3.7.00) + +### Features: +- Use non-volatile `join()` member functions and `operator+=` in `parallel_reduce/scan` [\#4931](https://github.com/kokkos/kokkos/pull/4931) [\#4954](https://github.com/kokkos/kokkos/pull/4954) [\#4951](https://github.com/kokkos/kokkos/pull/4951) +- Add `SIMD` sub package (requires C++17) [\#5016](https://github.com/kokkos/kokkos/pull/5016) +- Add `is_finalized()` [\#5247](https://github.com/kokkos/kokkos/pull/5247) +- Promote mathematical functions from `namespace Kokkos::Experimental` to `namespace Kokkos` [\#4791](https://github.com/kokkos/kokkos/pull/4791) +- Promote `min`, `max`, `clamp`, `minmax` functions from `namespace Kokkos::Experimental` to `namespace Kokkos` [\#5170](https://github.com/kokkos/kokkos/pull/5170) +- Add `round`, `logb`, `nextafter`, `copysign`, and `signbit` math functions [\#4768](https://github.com/kokkos/kokkos/pull/4768) +- Add `HIPManagedSpace`, similar to `CudaUVMSpace` [\#5112](https://github.com/kokkos/kokkos/pull/5112) +- Accept view construction allocation properties in `create_mirror[_view,_view_and_copy]` and `resize/realloc` [\#5125](https://github.com/kokkos/kokkos/pull/5125) [\#5095](https://github.com/kokkos/kokkos/pull/5095) [\#5035](https://github.com/kokkos/kokkos/pull/5035) [\#4805](https://github.com/kokkos/kokkos/pull/4805) [\#4844](https://github.com/kokkos/kokkos/pull/4844) +- Allow `MemorySpace::allocate()` to be called with execution space [\#4826](https://github.com/kokkos/kokkos/pull/4826) +- Experimental: Compile time view subscriber [\#4197](https://github.com/kokkos/kokkos/pull/4197) + +### Backends and Archs Enhancements: +- Add support for Sapphire Rapids Intel architecture [\#5015](https://github.com/kokkos/kokkos/pull/5015) +- Add support for ICX, SKL and ICL Intel architectures [\#5013](https://github.com/kokkos/kokkos/pull/5013) [\#4929](https://github.com/kokkos/kokkos/pull/4929) +- Add arch flags for Intel GPU Ponte Vecchio [\#4932](https://github.com/kokkos/kokkos/pull/4932) +- SYCL: require GPU if GPU architecture was set at configuration time (i.e. do not allow fallback to CPU device) [\#5264](https://github.com/kokkos/kokkos/pull/5264) [\#5222](https://github.com/kokkos/kokkos/pull/5222) +- SYCL: Add `SYCL::sycl_queue()` for interoperability [\#5241](https://github.com/kokkos/kokkos/pull/5241) +- SYCL: Loosen restriction for using built-in `sycl::group_broadcast` [\#4552](https://github.com/kokkos/kokkos/pull/4552) +- SYCL: preserve address space [\#4396](https://github.com/kokkos/kokkos/pull/4396) +- OpenMPTarget: Adding a workaound for team scan [\#5219](https://github.com/kokkos/kokkos/pull/5219) +- OpenMPTarget: Adding logic to skip the kernel launch if `league_size=0` [\#5067](https://github.com/kokkos/kokkos/pull/5067) +- OpenMPTarget: Make sure `Kokkos::abort()` causes abnormal program termination when called on the host-side [\#4808](https://github.com/kokkos/kokkos/pull/4808) +- HIP: Make HIPHostPinnedSpace coarse-grained [\#5152](https://github.com/kokkos/kokkos/pull/5152) +- Refactor OpenMP `parallel_for` implementation to use more native OpenMP constructs [\#4664](https://github.com/kokkos/kokkos/pull/4664) +- Add option to optimize for local CPU architecture `Kokkos_ARCH_NATIVE` [\#4930](https://github.com/kokkos/kokkos/pull/4930) + + +### Implemented enhancements +- Add command line argument/environment variable to print the configuration [\#5233](https://github.com/kokkos/kokkos/pull/5233) +- Improve error message in view memory access violations [\#4950](https://github.com/kokkos/kokkos/pull/4950) +- Remove unnecessary fences in View initialization [\#4823](https://github.com/kokkos/kokkos/pull/4823) +- Make `View::shmem_size()` device-callable [\#4936](https://github.com/kokkos/kokkos/pull/4936) +- Update numerics support for `__float128` [\#5081](https://github.com/kokkos/kokkos/pull/5081) +- Add `log10` overload for `Kokkos::complex` [\#5009](https://github.com/kokkos/kokkos/pull/5009) +- Add `[[nodiscard]]` to `ScopeGuard` [\#5224](https://github.com/kokkos/kokkos/pull/5224) +- Add structured binding support for `Kokkos::Array` [\#4962](https://github.com/kokkos/kokkos/pull/4962) +- Enable accessing `Kokkos::Array` elements in constant expressions [\#4916](https://github.com/kokkos/kokkos/pull/4916) +- Mark `as_view_of_rank_n` as KOKKOS_FUNCTION [\#5248](https://github.com/kokkos/kokkos/pull/5248) +- Cleanup/rework fence overloads [\#5148](https://github.com/kokkos/kokkos/pull/5148) +- Assert that `Layout` construction from extents is valid in functions taking integer extents [\#5209](https://github.com/kokkos/kokkos/pull/5209) +- Add `fill_random` overload that takes an execution space as first argument [\#5181](https://github.com/kokkos/kokkos/pull/5181) +- Avoid some unnecessary fences in `parallel_reduce/scan` [\#5154](https://github.com/kokkos/kokkos/pull/5154) +- Include `KOKKOS_ENABLE_LIBDL` in options when printing configuration [\#5086](https://github.com/kokkos/kokkos/pull/5086) +- DynRankView: make `layout()` return the same as a corresponding static View [\#5026](https://github.com/kokkos/kokkos/pull/5026) +- Use `_mm_malloc` for icpx [\#5012](https://github.com/kokkos/kokkos/pull/5012) +- Avoid forcing matching execution spaces in `BinSort` constructor and `sort()` [\#4919](https://github.com/kokkos/kokkos/pull/4919) +- Check number of bins in `BinSort` [\#4890](https://github.com/kokkos/kokkos/pull/4890) +- Improve performance in parallel STL-like algorithms [\#4887](https://github.com/kokkos/kokkos/pull/4887) [\#4886](https://github.com/kokkos/kokkos/pull/4886) +- Disable `memset` on A64FX and launch `parallel_for` instead (performance) [\#4884](https://github.com/kokkos/kokkos/pull/4884) +- Allow non-power-of-two team sizes for team reductions and scans [\#4809](https://github.com/kokkos/kokkos/pull/4809) + +#### Harmonization of Kokkos execution environment initialization: +- Warn when unable to detect local MPI rank and user explicitly asked for it [\#5263](https://github.com/kokkos/kokkos/pull/5263) +- Refactor parsing of command line arguments and environment variables [\#5221](https://github.com/kokkos/kokkos/pull/5221) +- Refactor device selection at initialization [\#5211](https://github.com/kokkos/kokkos/pull/5211) +- Rename tools settings for consistency [\#5201](https://github.com/kokkos/kokkos/pull/5201) +- Print help only once [\#5128](https://github.com/kokkos/kokkos/pull/5128) +- Update precedence rule in initialization [\#5130](https://github.com/kokkos/kokkos/pull/5130) +- Warn instead of just ignoring user settings when kokkos-tools is disabled [\#5088](https://github.com/kokkos/kokkos/pull/5088) +- Drop numa args in threads backend initialization [\#5127](https://github.com/kokkos/kokkos/pull/5127) +- Warn users when a flag prefixed with -[-]kokkos is not recognized and do not remove it [\#5256](https://github.com/kokkos/kokkos/pull/5256) +- Give back to Core what belongs to Core (aka moving tune_internals option from Tools back to Core) [\#5202](https://github.com/kokkos/kokkos/pull/5202) + +#### Build system updates: +- `nvcc_wrapper`: filter out -pedantic-errors from nvcc options [\#5235](https://github.com/kokkos/kokkos/pull/5235) +- `nvcc_wrapper`: add known nvcc option --source-in-ptx [\#5052](https://github.com/kokkos/kokkos/pull/5052) +- Link libdl as interface library [\#5179](https://github.com/kokkos/kokkos/pull/5179) +- Only show GPU architectures with enabled corresponding backend [\#5119](https://github.com/kokkos/kokkos/pull/5119) +- Enable optional external desul build [\#5021](https://github.com/kokkos/kokkos/pull/5021) [\#5132](https://github.com/kokkos/kokkos/pull/5132) +- Export `Kokkos_CXX_STANDARD` variable with CMake [\#5068](https://github.com/kokkos/kokkos/pull/5068) +- Suppress warnings with nvc++ [\#5031](https://github.com/kokkos/kokkos/pull/5031) +- Disallow multiple host architectures in CMake [\#4996](https://github.com/kokkos/kokkos/pull/4996) +- Do not include compiler warning flags in the compile option of the cmake target [\#4989](https://github.com/kokkos/kokkos/pull/4989) +- AOT flags for OpenMPTarget targeting Intel GPUs [\#4915](https://github.com/kokkos/kokkos/pull/4915) +- Repurpose `Kokkos_ARCH_INTEL_GEN` for SYCL to mean JIT to be conforming with OMPT [\#4894](https://github.com/kokkos/kokkos/pull/4894) +- Replace amdgpu-target with offload-arch [\#4874](https://github.com/kokkos/kokkos/pull/4874) +- Do not enable `kokkos_launch_compiler` when `CMAKE_CXX_COMPILER_LAUNCHER` is set [\#4870](https://github.com/kokkos/kokkos/pull/4870) +- Move CMake version check up [\#4797](https://github.com/kokkos/kokkos/pull/4797) + +### Incompatibilities: +- Remove `KOKKOS_THREAD_LOCAL` [\#5064](https://github.com/kokkos/kokkos/pull/5064) +- Remove `KOKKOS_ENABLE_POSIX_MEMALIGN` [\#5011](https://github.com/kokkos/kokkos/pull/5011) +- Remove unused `KOKKOS_ENABLE_TM` [\#4995](https://github.com/kokkos/kokkos/pull/4995) +- Remove unused cmakedefine `KOKKOS_ENABLE_COMPILER_WARNINGS` [\#4883](https://github.com/kokkos/kokkos/pull/4883) +- Remove unused `KOKKOS_ENABLE_DUALVIEW_MODIFY_CHECK` [\#4882](https://github.com/kokkos/kokkos/pull/4882) +- Drop Instruction Set Architecture (ISA) macros [\#4981](https://github.com/kokkos/kokkos/pull/4981) +- Warn in `ScopeGuard` about illegal usage [\#5250](https://github.com/kokkos/kokkos/pull/5250) + +### Deprecations: +- Guard against non-public header inclusion [\#5178](https://github.com/kokkos/kokkos/pull/5178) +- Raise deprecation warnings if non empty WorkTag class is used [\#5230](https://github.com/kokkos/kokkos/pull/5230) +- Deprecate `parallel_*` overloads taking the label as trailing argument [\#5141](https://github.com/kokkos/kokkos/pull/5141) +- Deprecate nested types in functional [\#5185](https://github.com/kokkos/kokkos/pull/5185) +- Deprecate `InitArguments` struct and replace it with `InitializationSettings` [\#5135](https://github.com/kokkos/kokkos/pull/5135) +- Deprecate `finalize_all()` [\#5134](https://github.com/kokkos/kokkos/pull/5134) +- Deprecate command line arguments (other than `--help`) that are not prefixed with `kokkos-*` [\#5120](https://github.com/kokkos/kokkos/pull/5120) +- Deprecate `--[kokkos-]numa` cmdline arg and `KOKKOS_NUMA` env var [\#5117](https://github.com/kokkos/kokkos/pull/5117) +- Deprecate `--[kokkos-]threads` command line argument in favor of `--[kokkos-]num-threads` [\#5111](https://github.com/kokkos/kokkos/pull/5111) +- Deprecate `Kokkos::common_view_alloc_prop` [\#5059](https://github.com/kokkos/kokkos/pull/5059) +- Deprecate `Kokkos::is_reducer_type` [\#4957](https://github.com/kokkos/kokkos/pull/4957) +- Deprecate `OffsetView` constructors taking `index_list_type` [\#4810](https://github.com/kokkos/kokkos/pull/4810) +- Deprecate overloads of `Kokkos::sort` taking a parameter `bool always_use_kokkos_sort` [\#5382](https://github.com/kokkos/kokkos/issues/5382) +- Warn about `parallel_reduce` cases that call `join()` with volatile-qualified arguments [\#5215](https://github.com/kokkos/kokkos/pull/5215) + +### Bug Fixes: +- CUDA Reductions: Fix data races reported by Nvidia `compute-sanitizer` [\#4855](https://github.com/kokkos/kokkos/pull/4855) +- Work around Intel compiler bug [\#5301](https://github.com/kokkos/kokkos/pull/5301) +- Avoid allocating memory for UniqueToken [\#5300](https://github.com/kokkos/kokkos/pull/5300) +- DynamicView: Properly resize mirror instances after construction [\#5276](https://github.com/kokkos/kokkos/pull/5276) +- Remove Kokkos::Rank limit of 6 ranks [\#5271](https://github.com/kokkos/kokkos/pull/5271) +- Do not forget to set last element to nullptr when removing a flag in `Kokkos::initialize` [\#5272](https://github.com/kokkos/kokkos/pull/5272) +- Fix CUDA+MSVC build issue [\#5261](https://github.com/kokkos/kokkos/pull/5261) +- Fix `DynamicView::resize_serial` [\#5220](https://github.com/kokkos/kokkos/pull/5220) +- Fix cmake default compiler flags for unknown compiler [\#5217](https://github.com/kokkos/kokkos/pull/5217) +- Fix `move_backward` [\#5191](https://github.com/kokkos/kokkos/pull/5191) +- Fixing issue 5196 - missing symbol with intel compiler [\#5207](https://github.com/kokkos/kokkos/pull/5207) +- Preserve `KOKKOS_INVALID_INDEX` in ViewDimension and ArrayLayout construction [\#5188](https://github.com/kokkos/kokkos/pull/5188) +- Finalize `deep_copy_space` early avoiding printing to `std::cerr` for Cuda [\#5151](https://github.com/kokkos/kokkos/pull/5151) +- Use correct policy in Threads MDRange `parallel_reduce` [\#5123](https://github.com/kokkos/kokkos/pull/5123) +- Fix building with NVCC as the CXX compiler while the CUDA backend is not enabled [\#5115](https://github.com/kokkos/kokkos/pull/5115) +- OpenMPTarget Index range fix for MDRange. [\#5089](https://github.com/kokkos/kokkos/pull/5089) +- Fix bug with CUDA's team reduction for empty ranges [\#5079](https://github.com/kokkos/kokkos/pull/5079) +- Fix using `ZeroMemset` for Serial [\#5077](https://github.com/kokkos/kokkos/pull/5077) +- Fix `Kokkos::Vector::push_back` for default execution space [\#5047](https://github.com/kokkos/kokkos/pull/5047) +- ScatterView: Fix ScatterMin/ScatterMax to use proper atomics [\#5045](https://github.com/kokkos/kokkos/pull/5045) +- Fix calling `ZeroMemset` in `deep_copy` [\#5040](https://github.com/kokkos/kokkos/pull/5040) +- Make View self-assignment not produce double-free [\#5024](https://github.com/kokkos/kokkos/pull/5024) +- Guard against unrecognized pragma with intel compilers [\#5019](https://github.com/kokkos/kokkos/pull/5019) +- Fix racing condition in `HIPParallelLaunch` [\#5008](https://github.com/kokkos/kokkos/pull/5008) +- KokkosP: Fix `device_id` in profiling [\#4997](https://github.com/kokkos/kokkos/pull/4997) +- Fix for `Kokkos::vector::insert` into empty vector with begin and end iterators [\#4988](https://github.com/kokkos/kokkos/pull/4988) +- Fix Core header files installation [\#4984](https://github.com/kokkos/kokkos/pull/4984) +- Fix bounds errors with `Kokkos::sort` [\#4980](https://github.com/kokkos/kokkos/pull/4980) +- Fixup let `RangePolicy::set_chunk_size` return a reference to self [\#4918](https://github.com/kokkos/kokkos/pull/4918) +- Fix allocating large Views [\#4907](https://github.com/kokkos/kokkos/pull/4907) +- Fix combined reductions with `Kokkos::View` [\#4896](https://github.com/kokkos/kokkos/pull/4896) +- Fixed `_CUDA_ARCH__` to `__CUDA_ARCH__` for CUDA LDG [\#4893](https://github.com/kokkos/kokkos/pull/4893) +- Fixup `View::access()` truncate parameter pack [\#4876](https://github.com/kokkos/kokkos/pull/4876) +- Fix `abort` with HIP backend for ROCm 5.0.2 and beyond [\#4873](https://github.com/kokkos/kokkos/pull/4873) +- Fix HIP version when printing the configuration [\#4872](https://github.com/kokkos/kokkos/pull/4872) +- Fix scratch lock array when using scratch level 1 [\#4871](https://github.com/kokkos/kokkos/pull/4871) +- Fix Makefile.kokkos to work with fujitsu compiler [\#4867](https://github.com/kokkos/kokkos/pull/4867) +- cmake: Correct link THREADS link option [\#4854](https://github.com/kokkos/kokkos/pull/4854) +- UniqueToken `impl_acquire` function should be device only [\#4819](https://github.com/kokkos/kokkos/pull/4819) +- Fix example calls to non existing static `print_configuration` [\#4806](https://github.com/kokkos/kokkos/pull/4806) +- Fix requests for large team scratch sizes [\#4728](https://github.com/kokkos/kokkos/pull/4728) + + ## [3.6.01](https://github.com/kokkos/kokkos/tree/3.6.01) (2022-05-23) [Full Changelog](https://github.com/kokkos/kokkos/compare/3.6.00...3.6.01) diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index b0a54118a0..a05bfcdb94 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.16 FATAL_ERROR) # Disable in-source builds to prevent source tree corruption. if( "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}" ) @@ -28,11 +29,6 @@ SET(KOKKOS_SRC_PATH ${Kokkos_SOURCE_DIR}) SET(KOKKOS_PATH ${Kokkos_SOURCE_DIR}) SET(KOKKOS_TOP_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}) -# Needed to simplify syntax of if statements -CMAKE_POLICY(SET CMP0054 NEW) -# Needed to make IN_LIST a valid operator -CMAKE_POLICY(SET CMP0057 NEW) - # Is this a build as part of Trilinos? IF(COMMAND TRIBITS_PACKAGE_DECL) SET(KOKKOS_HAS_TRILINOS ON) @@ -72,7 +68,6 @@ ENDFUNCTION() LIST(APPEND CMAKE_MODULE_PATH cmake/Modules) IF(NOT KOKKOS_HAS_TRILINOS) - cmake_minimum_required(VERSION 3.16 FATAL_ERROR) set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) @@ -80,7 +75,7 @@ IF(NOT KOKKOS_HAS_TRILINOS) # downstream dependencies need to match this! SET(KOKKOS_COMPILE_LANGUAGE CXX) # use lower case here since we didn't parse options yet - IF (Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE) + IF (Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE AND Kokkos_ENABLE_CUDA) # Without this as a language for the package we would get a C++ compiler enabled. # but we still need a C++ compiler even if we build all our cpp files as CUDA only @@ -90,9 +85,7 @@ IF(NOT KOKKOS_HAS_TRILINOS) # days. SET(KOKKOS_INTERNAL_EXTRA_COMPILE_LANGUAGE CXX) - IF (Kokkos_ENABLE_CUDA) - SET(KOKKOS_COMPILE_LANGUAGE CUDA) - ENDIF() + SET(KOKKOS_COMPILE_LANGUAGE CUDA) ENDIF() IF (Spack_WORKAROUND) @@ -135,14 +128,11 @@ ENDIF() set(Kokkos_VERSION_MAJOR 3) -set(Kokkos_VERSION_MINOR 6) -set(Kokkos_VERSION_PATCH 01) +set(Kokkos_VERSION_MINOR 7) +set(Kokkos_VERSION_PATCH 00) set(Kokkos_VERSION "${Kokkos_VERSION_MAJOR}.${Kokkos_VERSION_MINOR}.${Kokkos_VERSION_PATCH}") math(EXPR KOKKOS_VERSION "${Kokkos_VERSION_MAJOR} * 10000 + ${Kokkos_VERSION_MINOR} * 100 + ${Kokkos_VERSION_PATCH}") -MESSAGE(STATUS "Setting policy CMP0074 to use _ROOT variables") -CMAKE_POLICY(SET CMP0074 NEW) - # Load either the real TriBITS or a TriBITS wrapper # for certain utility functions that are universal (like GLOBAL_SET) INCLUDE(${KOKKOS_SRC_PATH}/cmake/fake_tribits.cmake) @@ -204,11 +194,16 @@ KOKKOS_SETUP_BUILD_ENVIRONMENT() OPTION(BUILD_SHARED_LIBS "Build shared libraries" OFF) SET(KOKKOS_EXT_LIBRARIES Kokkos::kokkos Kokkos::kokkoscore Kokkos::kokkoscontainers Kokkos::kokkosalgorithms) -SET(KOKKOS_INT_LIBRARIES kokkos kokkoscore kokkoscontainers kokkosalgorithms) +SET(KOKKOS_SUB_LIBRARIES kokkoscore kokkoscontainers kokkosalgorithms) +IF (KOKKOS_CXX_STANDARD GREATER_EQUAL 17) + LIST(APPEND KOKKOS_EXT_LIBRARIES Kokkos::kokkossimd) + LIST(APPEND KOKKOS_SUB_LIBRARIES kokkossimd) +ENDIF() +SET(KOKKOS_INT_LIBRARIES kokkos ${KOKKOS_SUB_LIBRARIES}) SET_PROPERTY(GLOBAL PROPERTY KOKKOS_INT_LIBRARIES ${KOKKOS_INT_LIBRARIES}) IF (KOKKOS_HAS_TRILINOS) - SET(TRILINOS_INCDIR ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}) + SET(TRILINOS_INCDIR ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}) SET(KOKKOS_HEADER_DIR ${TRILINOS_INCDIR}) SET(KOKKOS_IS_SUBDIRECTORY TRUE) ELSEIF(HAS_PARENT) @@ -296,7 +291,7 @@ IF (NOT KOKKOS_HAS_TRILINOS AND NOT Kokkos_INSTALL_TESTING) #Make sure in-tree projects can reference this as Kokkos:: #to match the installed target names ADD_LIBRARY(Kokkos::kokkos ALIAS kokkos) - TARGET_LINK_LIBRARIES(kokkos INTERFACE kokkoscore kokkoscontainers kokkosalgorithms) + TARGET_LINK_LIBRARIES(kokkos INTERFACE ${KOKKOS_SUB_LIBRARIES}) KOKKOS_INTERNAL_ADD_LIBRARY_INSTALL(kokkos) ENDIF() INCLUDE(${KOKKOS_SRC_PATH}/cmake/kokkos_install.cmake) diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 755831452b..7aa04aad7d 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -11,21 +11,21 @@ CXXFLAGS += $(SHFLAGS) endif KOKKOS_VERSION_MAJOR = 3 -KOKKOS_VERSION_MINOR = 6 -KOKKOS_VERSION_PATCH = 01 +KOKKOS_VERSION_MINOR = 7 +KOKKOS_VERSION_PATCH = 00 KOKKOS_VERSION = $(shell echo $(KOKKOS_VERSION_MAJOR)*10000+$(KOKKOS_VERSION_MINOR)*100+$(KOKKOS_VERSION_PATCH) | bc) # Options: Cuda,HIP,SYCL,OpenMPTarget,OpenMP,Threads,Serial KOKKOS_DEVICES ?= "OpenMP" #KOKKOS_DEVICES ?= "Threads" # Options: -# Intel: KNC,KNL,SNB,HSW,BDW,SKX +# Intel: KNC,KNL,SNB,HSW,BDW,SKL,SKX,ICL,ICX,SPR # NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,Volta70,Volta72,Turing75,Ampere80,Ampere86 # ARM: ARMv80,ARMv81,ARMv8-ThunderX,ARMv8-TX2,A64FX # IBM: BGQ,Power7,Power8,Power9 # AMD-GPUS: Vega900,Vega906,Vega908,Vega90A # AMD-CPUS: AMDAVX,Zen,Zen2,Zen3 -# Intel-GPUs: Gen9,Gen11,Gen12LP,DG1,XeHP +# Intel-GPUs: Gen9,Gen11,Gen12LP,DG1,XeHP,PVC KOKKOS_ARCH ?= "" # Options: yes,no KOKKOS_DEBUG ?= "no" @@ -193,6 +193,8 @@ KOKKOS_INTERNAL_COMPILER_INTEL_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VE KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),Apple clang) KOKKOS_INTERNAL_COMPILER_HCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),HCC) KOKKOS_INTERNAL_COMPILER_GCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),GCC) +# TODO fujitsu can emulate gcc or clang. Only clang mode works at the moment. +KOKKOS_INTERNAL_COMPILER_FUJITSU := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),FUJITSU) # Check Host Compiler if using NVCC through nvcc_wrapper ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) @@ -221,8 +223,23 @@ endif ifeq ($(KOKKOS_INTERNAL_COMPILER_HCC), 1) KOKKOS_INTENAL_COMPILER_CLANG = 0 endif +# Fujitsu passes also as clang and gcc respectively +ifeq ($(KOKKOS_INTERNAL_COMPILER_FUJITSU), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_GCC), 1) + # TODO handle gcc flags and workaround for bug? + # fujitsu (gcc mode) is bugged, see https://github.com/kokkos/kokkos/issues/4730 + $(warning Warning: ${CXX} in Trad Mode '-Nnoclang' (default) is not recommended. Use 'CXX = ${CXX} -Nclang' instead.) + # HACK since fujitsu only accepts some gcc flags, disable gcc here? + # KOKKOS_INTERNAL_COMPILER_GCC = 0 + endif + # TODO handle clang flags + # warnings: works fine as is + # openmp: handled + #KOKKOS_INTERNAL_COMPILER_CLANG = 0 +endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + # TODO empty variable if fujitsu (clang mode) passes as clang KOKKOS_INTERNAL_COMPILER_CLANG_VERSION := $(shell $(CXX) --version | grep version | cut -d ' ' -f3 | tr -d '.') ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) @@ -272,7 +289,12 @@ else ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY_CLANG), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp else - KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp + ifeq ($(KOKKOS_INTERNAL_COMPILER_FUJITSU), 1) + # fujitsu (clang mode) fails with `=libomp` + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + else + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp + endif endif else ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) @@ -300,11 +322,15 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) #KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_BUG_WORKAROUND_IBM_CLANG_OMP45_VIEW_INIT -fopenmp-implicit-declare-target -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp -fopenmp=libomp - KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_WORKAROUND_OPENMPTARGET_CLANG -fopenmp -fopenmp=libomp + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_WORKAROUND_OPENMPTARGET_CLANG -fopenmp -fopenmp=libomp -Wno-openmp-mapping KOKKOS_INTERNAL_OPENMPTARGET_LIB := -lomptarget else - #Assume GCC - KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fopenmp -foffload=nvptx-none + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL_CLANG), 1) + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fiopenmp -Wno-openmp-mapping + else + #Assume GCC + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -fopenmp -foffload=nvptx-none + endif endif endif @@ -344,8 +370,12 @@ KOKKOS_INTERNAL_USE_ARCH_WSM := $(call kokkos_has_string,$(KOKKOS_ARCH),WSM) KOKKOS_INTERNAL_USE_ARCH_SNB := $(call kokkos_has_string,$(KOKKOS_ARCH),SNB) KOKKOS_INTERNAL_USE_ARCH_HSW := $(call kokkos_has_string,$(KOKKOS_ARCH),HSW) KOKKOS_INTERNAL_USE_ARCH_BDW := $(call kokkos_has_string,$(KOKKOS_ARCH),BDW) +KOKKOS_INTERNAL_USE_ARCH_SKL := $(call kokkos_has_string,$(KOKKOS_ARCH),SKL) KOKKOS_INTERNAL_USE_ARCH_SKX := $(call kokkos_has_string,$(KOKKOS_ARCH),SKX) KOKKOS_INTERNAL_USE_ARCH_KNL := $(call kokkos_has_string,$(KOKKOS_ARCH),KNL) +KOKKOS_INTERNAL_USE_ARCH_ICL := $(call kokkos_has_string,$(KOKKOS_ARCH),ICL) +KOKKOS_INTERNAL_USE_ARCH_ICX := $(call kokkos_has_string,$(KOKKOS_ARCH),ICX) +KOKKOS_INTERNAL_USE_ARCH_SPR := $(call kokkos_has_string,$(KOKKOS_ARCH),SPR) KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen) KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen9) @@ -353,6 +383,7 @@ KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11 := $(call kokkos_has_string,$(KOKKOS_ARCH), KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen12LP) KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelDG1) KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelXeHP) +KOKKOS_INTERNAL_USE_ARCH_INTEL_PVC := $(call kokkos_has_string,$(KOKKOS_ARCH),PVC) # NVIDIA based. NVCC_WRAPPER := $(KOKKOS_PATH)/bin/nvcc_wrapper @@ -436,19 +467,9 @@ KOKKOS_INTERNAL_USE_ARCH_SSE42 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_W KOKKOS_INTERNAL_USE_ARCH_AVX := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_AMDAVX)) KOKKOS_INTERNAL_USE_ARCH_AVX2 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) KOKKOS_INTERNAL_USE_ARCH_AVX512MIC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNL)) -KOKKOS_INTERNAL_USE_ARCH_AVX512XEON := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SKX)) - -# Decide what ISA level we are able to support. -KOKKOS_INTERNAL_USE_ISA_X86_64 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM) + $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_KNL) + $(KOKKOS_INTERNAL_USE_ARCH_SKX) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) -KOKKOS_INTERNAL_USE_ISA_KNC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNC)) -KOKKOS_INTERNAL_USE_ISA_POWERPCLE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER8) + $(KOKKOS_INTERNAL_USE_ARCH_POWER9)) -KOKKOS_INTERNAL_USE_ISA_POWERPCBE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER7)) - -# Decide whether we can support transactional memory -KOKKOS_INTERNAL_USE_TM := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_SKX)) # Incompatible flags? -KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc) +KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_SKL)+$(KOKKOS_INTERNAL_USE_ARCH_SKX)+$(KOKKOS_INTERNAL_USE_ARCH_ICL)+$(KOKKOS_INTERNAL_USE_ARCH_ICX)+$(KOKKOS_INTERNAL_USE_ARCH_SPR)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc) KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1") | bc) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MULTIHOST), 1) @@ -551,36 +572,6 @@ ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_SERIAL") endif -ifeq ($(KOKKOS_INTERNAL_USE_TM), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_TM") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_X86_64), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_X86_64") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_KNC), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_KNC") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCLE), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_POWERPCLE") - tmp := $(call kokkos_append_header,"$H""endif") -endif - -ifeq ($(KOKKOS_INTERNAL_USE_ISA_POWERPCBE), 1) - tmp := $(call kokkos_append_header,"$H""ifndef __CUDA_ARCH__") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_USE_ISA_POWERPCBE") - tmp := $(call kokkos_append_header,"$H""endif") -endif - #only add the c++ standard flags if this is not CMake tmp := $(call kokkos_append_header,"/* General Settings */") ifneq ($(KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE), 1) @@ -1041,7 +1032,28 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) endif endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SKL), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) + KOKKOS_CXXFLAGS += -xSKYLAKE + KOKKOS_LDFLAGS += -xSKYLAKE + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + + else + # Nothing here yet. + KOKKOS_CXXFLAGS += -march=skylake + KOKKOS_LDFLAGS += -march=skylake + endif + endif + endif +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SKX), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) @@ -1055,13 +1067,31 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) else # Nothing here yet. - KOKKOS_CXXFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm - KOKKOS_LDFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm + KOKKOS_CXXFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 + KOKKOS_LDFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 endif endif endif endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ICL), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=icelake-client -mtune=icelake-client + KOKKOS_LDFLAGS += -march=icelake-client -mtune=icelake-client +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ICX), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=icelake-server -mtune=icelake-server + KOKKOS_LDFLAGS += -march=icelake-server -mtune=icelake-server +endif + +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_SPR), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_AVX512XEON") + KOKKOS_CXXFLAGS += -march=sapphirerapids -mtune=sapphirerapids + KOKKOS_LDFLAGS += -march=sapphirerapids -mtune=sapphirerapids +endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KNC), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_KNC") KOKKOS_CXXFLAGS += -mmic @@ -1091,7 +1121,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-fopenmp-targets=nvptx64-nvidia-cuda -Xopenmp-target -march + KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-fopenmp-targets=nvptx64 -Xopenmp-target -march endif KOKKOS_INTERNAL_USE_CUDA_ARCH = 1 endif @@ -1192,29 +1222,29 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA900), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA900") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx900 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx900 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA906), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA906") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx906 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx906 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA908), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA908") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx908 + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx908 endif ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA90A), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA90A") tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA") - KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx90a + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --offload-arch=gfx90a endif KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/HIP/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/HIP/*.hpp) ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) - KOKKOS_SRC += $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp + KOKKOS_SRC += $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp endif KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_HIP_ARCH_FLAG) @@ -1230,51 +1260,67 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) endif endif -# Figure out the architecture flag for SYCL. +# Figure out Intel architecture flags. ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) - # Lets start with adding architecture defines - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9-" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN9") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN11") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen11" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN12LP") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen12lp" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_DG1") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device dg1" - endif - ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP), 1) - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") - tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_XEHP") - KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device xehp" - endif + KOKKOS_INTERNAL_LC_BACKEND := sycl +endif +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + KOKKOS_INTERNAL_LC_BACKEND := openmp +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64 +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN9") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen9" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN11") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen11" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN12LP") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device gen12lp" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_DG1") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device dg1" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_XEHP") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device xehp" +endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_PVC), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_PVC") + KOKKOS_INTERNAL_INTEL_ARCH_FLAG := -f${KOKKOS_INTERNAL_LC_BACKEND}-targets=spir64_gen -X${KOKKOS_INTERNAL_LC_BACKEND}-target-backend "-device 12.4.0" +endif +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.hpp) - KOKKOS_CXXFLAGS+=-fsycl -fno-sycl-id-queries-fit-in-int -fsycl-unnamed-lambda - KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) + KOKKOS_CXXFLAGS+=-fsycl -fno-sycl-id-queries-fit-in-int -fsycl-unnamed-lambda -fsycl-dead-args-optimization + KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) KOKKOS_LDFLAGS+=-fsycl - KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) + KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) +endif + +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) -D__STRICT_ANSI__ + KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_INTEL_ARCH_FLAG) endif ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_IMPL_DESUL_ATOMICS") + KOKKOS_CPPFLAGS+=-I$(KOKKOS_PATH)/tpls/desul/include else ifeq ($(KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS), 1) $(error Contradictory Desul atomics options: KOKKOS_OPTIONS=$(KOKKOS_OPTIONS) ) @@ -1359,7 +1405,7 @@ KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.cpp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.cpp) ifeq ($(KOKKOS_INTERNAL_DISABLE_DESUL_ATOMICS), 0) - KOKKOS_SRC += $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp + KOKKOS_SRC += $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp endif KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) ifneq ($(CUDA_PATH),) @@ -1417,6 +1463,11 @@ ifeq ($(KOKKOS_INTERNAL_USE_THREADS), 1) KOKKOS_TPL_LIBRARY_NAMES += pthread endif +ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) + KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Serial/*.cpp) + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Serial/*.hpp) +endif + ifeq ($(KOKKOS_INTERNAL_USE_HPX), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/HPX/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/HPX/*.hpp) @@ -1449,15 +1500,6 @@ ifneq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp,$(KOKKOS_SRC)) endif -# Don't include Kokkos_Serial.cpp or Kokkos_Serial_Task.cpp if not using Serial -# device to avoid a link warning. -ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) -endif -ifneq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) - KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp,$(KOKKOS_SRC)) - KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp,$(KOKKOS_SRC)) -endif - # With Cygwin functions such as fdopen and fileno are not defined # when strict ansi is enabled. strict ansi gets enabled with -std=c++14 # though. So we hard undefine it here. Not sure if that has any bad side effects diff --git a/lib/kokkos/Makefile.targets b/lib/kokkos/Makefile.targets index a9cb12e1b4..876726e947 100644 --- a/lib/kokkos/Makefile.targets +++ b/lib/kokkos/Makefile.targets @@ -16,10 +16,6 @@ Kokkos_HostSpace.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Ho $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HostSpace.cpp Kokkos_hwloc.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_hwloc.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_hwloc.cpp -Kokkos_Serial.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp -Kokkos_Serial_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp Kokkos_TaskQueue.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_TaskQueue.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_TaskQueue.cpp Kokkos_HostThreadTeam.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_HostThreadTeam.cpp @@ -41,6 +37,13 @@ Kokkos_HostSpace_deepcopy.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/ Kokkos_NumericTraits.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_NumericTraits.cpp +ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) +Kokkos_Serial.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial.cpp +Kokkos_Serial_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial_Task.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Serial/Kokkos_Serial_Task.cpp +endif + ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) Kokkos_Cuda_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Instance.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Instance.cpp @@ -50,8 +53,8 @@ Kokkos_Cuda_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cu $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Task.cpp Kokkos_Cuda_Locks.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp -Lock_Array_CUDA.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp +Lock_Array_CUDA.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_CUDA.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) @@ -70,20 +73,18 @@ Kokkos_HIP_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/HIP/Kokkos_ $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Instance.cpp Kokkos_HIP_Locks.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Locks.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/HIP/Kokkos_HIP_Locks.cpp -Lock_Array_HIP.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_HIP.cpp +Lock_Array_HIP.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/tpls/desul/src/Lock_Array_HIP.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_THREADS), 1) -Kokkos_ThreadsExec_base.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec_base.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec_base.cpp Kokkos_ThreadsExec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Threads/Kokkos_ThreadsExec.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) -Kokkos_OpenMP_Exec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp +Kokkos_OpenMP_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Instance.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Instance.cpp Kokkos_OpenMP_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp endif diff --git a/lib/kokkos/README.md b/lib/kokkos/README.md index f6c500cc1a..033346e956 100644 --- a/lib/kokkos/README.md +++ b/lib/kokkos/README.md @@ -10,270 +10,48 @@ hierarchies and multiple types of execution resources. It currently can use CUDA, HIP, SYCL, HPX, OpenMP and C++ threads as backend programming models with several other backends in development. -Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem, -which also provides math kernels (https://github.com/kokkos/kokkos-kernels), as well as -profiling and debugging tools (https://github.com/kokkos/kokkos-tools). +**Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem.** + +For the complete documentation, click below: + +# [kokkos.github.io/kokkos-core-wiki](https://kokkos.github.io/kokkos-core-wiki) # Learning about Kokkos -The best way to start learning about Kokkos is going through the Kokkos Lectures. -They are online available at https://kokkos.link/the-lectures and contain a mix -of lecture videos and hands-on exercises covering all the important Kokkos Ecosystem -capabilities. +To start learning about Kokkos: -A programming guide and API reference can be found on the Wiki -(https://github.com/kokkos/kokkos/wiki). +- [Kokkos Lectures](https://kokkos.github.io/kokkos-core-wiki/videolectures.html): they contain a mix of lecture videos and hands-on exercises covering all the important Kokkos Ecosystem capabilities. + +- [Programming guide](https://kokkos.github.io/kokkos-core-wiki/programmingguide.html): contains in "narrative" form a technical description of the programming model, machine model, and the main building blocks like the Views and parallel dispatch. + +- [API reference](https://kokkos.github.io/kokkos-core-wiki/): organized by category, i.e., [core](https://kokkos.github.io/kokkos-core-wiki/API/core-index.html), [algorithms](https://kokkos.github.io/kokkos-core-wiki/API/algorithms-index.html) and [containers](https://kokkos.github.io/kokkos-core-wiki/API/containers-index.html) or, if you prefer, in [alphabetical order](https://kokkos.github.io/kokkos-core-wiki/API/alphabetical.html). + +- [Use cases and Examples](https://kokkos.github.io/kokkos-core-wiki/usecases.html): a series of examples ranging from how to use Kokkos with MPI to Fortran interoperability. For questions find us on Slack: https://kokkosteam.slack.com or open a github issue. -For non-public questions send an email to -crtrott(at)sandia.gov +For non-public questions send an email to: *crtrott(at)sandia.gov* # Contributing to Kokkos -We are open and try to encourage contributions from external developers. -To do so please first open an issue describing the contribution and then issue -a pull request against the develop branch. For larger features it may be good -to get guidance from the core development team first through the github issue. +Please see [this page](https://kokkos.github.io/kokkos-core-wiki/contributing.html) for details on how to contribute. -Note that Kokkos Core is licensed under standard 3-clause BSD terms of use. -Which means contributing to Kokkos allows anyone else to use your contributions -not just for public purposes but also for closed source commercial projects. -For specifics see the LICENSE file contained in the repository or distribution. +# Requirements, Building and Installing -# Requirements - -### Minimum Compiler Versions - -Generally Kokkos should work with all compiler versions newer than the minimum. -However as in all sufficiently complex enough code, we have to work around compiler -bugs with almost all compilers. So compiler versions we don't test may have issues -we are unaware of. - -* GCC: 5.3.0 -* Clang: 4.0.0 -* Intel: 17.0.1 -* NVCC: 9.2.88 -* NVC++: 21.5 -* ROCm: 4.3 -* MSVC: 19.29 -* IBM XL: 16.1.1 -* Fujitsu: 4.5.0 -* ARM/Clang 20.1 - -### Primary Tested Compilers - -* GCC: 5.3.0, 6.1.0, 7.3.0, 8.3, 9.2, 10.0 -* NVCC: 9.2.88, 10.1, 11.0 -* Clang: 8.0.0, 9.0.0, 10.0.0, 12.0.0 -* Intel 17.4, 18.1, 19.5 -* MSVC: 19.29 -* ARM/Clang: 20.1 -* IBM XL: 16.1.1 -* ROCm: 4.3.0 - -### Build system: - -* CMake >= 3.16: required -* CMake >= 3.18: Fortran linkage. This does not affect most mixed Fortran/Kokkos builds. See [build issues](BUILD.md#KnownIssues). -* CMake >= 3.21.1 for NVC++ - -Primary tested compiler are passing in release mode -with warnings as errors. They also are tested with a comprehensive set of -backend combinations (i.e. OpenMP, Threads, Serial, OpenMP+Serial, ...). -We are using the following set of flags: -* GCC: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wignored-qualifiers -Wempty-body - -Wclobbered -Wuninitialized - ```` -* Intel: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` -* Clang: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` - -* NVCC: - ```` - -Wall -Wunused-parameter -Wshadow -pedantic - -Werror -Wsign-compare -Wtype-limits - -Wuninitialized - ```` - -Other compilers are tested occasionally, in particular when pushing from develop to -master branch. These are tested less rigorously without `-Werror` and only for a select set of backends. - -# Building and Installing Kokkos -Kokkos provide a CMake build system and a raw Makefile build system. -The CMake build system is strongly encouraged and will be the most rigorously supported in future releases. -Full details are given in the [build instructions](BUILD.md). Basic setups are shown here: - -## CMake - -The best way to install Kokkos is using the CMake build system. Assuming Kokkos lives in `$srcdir`: -````bash -cmake $srcdir \ - -DCMAKE_CXX_COMPILER=$path_to_compiler \ - -DCMAKE_INSTALL_PREFIX=$path_to_install \ - -DKokkos_ENABLE_OPENMP=On \ - -DKokkos_ARCH_HSW=On \ - -DKokkos_HWLOC_DIR=$path_to_hwloc -```` -then simply type `make install`. The Kokkos CMake package will then be installed in `$path_to_install` to be used by downstream packages. - -To validate the Kokkos build, configure with -```` - -DKokkos_ENABLE_TESTS=On -```` -and run `make test` after completing the build. - -For your CMake project using Kokkos, code such as the following: - -````cmake -find_package(Kokkos) -... -target_link_libraries(myTarget Kokkos::kokkos) -```` -should be added to your CMakeLists.txt. Your configure should additionally include -```` --DKokkos_DIR=$path_to_install/cmake/lib/Kokkos -```` -or -```` --DKokkos_ROOT=$path_to_install -```` -for the install location given above. - -## Spack -An alternative to manually building with the CMake is to use the Spack package manager. -To get started, download the Spack [repo](https://github.com/spack/spack). -```` -A basic installation would be done as: -````bash -> spack install kokkos -```` -Spack allows options and and compilers to be tuned in the install command. -````bash -> spack install kokkos@3.0 %gcc@7.3.0 +openmp -```` -This example illustrates the three most common parameters to Spack: -* Variants: specified with, e.g. `+openmp`, this activates (or deactivates with, e.g. `~openmp`) certain options. -* Version: immediately following `kokkos` the `@version` can specify a particular Kokkos to build -* Compiler: a default compiler will be chosen if not specified, but an exact compiler version can be given with the `%`option. - -For a complete list of Kokkos options, run: -````bash -> spack info kokkos -```` -Spack currently installs packages to a location determined by a unique hash. This hash name is not really "human readable". -Generally, Spack usage should never really require you to reference the computer-generated unique install folder. -More details are given in the [build instructions](BUILD.md). If you must know, you can locate Spack Kokkos installations with: -````bash -> spack find -p kokkos ... -```` -where `...` is the unique spec identifying the particular Kokkos configuration and version. -Some more details can found in the Kokkos spack [documentation](Spack.md) or the Spack [website](https://spack.readthedocs.io/en/latest). - -## Raw Makefile - -Raw Makefiles are only supported via inline builds. See below. - -## Inline Builds vs. Installed Package -For individual projects, it may be preferable to build Kokkos inline rather than link to an installed package. -The main reason is that you may otherwise need many different -configurations of Kokkos installed depending on the required compile time -features an application needs. For example there is only one default -execution space, which means you need different installations to have OpenMP -or C++ threads as the default space. Also for the CUDA backend there are certain -choices, such as allowing relocatable device code, which must be made at -installation time. Building Kokkos inline uses largely the same process -as compiling an application against an installed Kokkos library. - -For CMake, this means copying over the Kokkos source code into your project and adding `add_subdirectory(kokkos)` to your CMakeLists.txt. - -For raw Makefiles, see the example benchmarks/bytes_and_flops/Makefile which can be used with an installed library and or an inline build. - -# Kokkos and CUDA UVM - -Kokkos does support UVM as a specific memory space called CudaUVMSpace. -Allocations made with that space are accessible from host and device. -You can tell Kokkos to use that as the default space for Cuda allocations. -In either case UVM comes with a number of restrictions: -* You can't access allocations on the host while a kernel is potentially -running. This will lead to segfaults. To avoid that you either need to -call Kokkos::Cuda::fence() (or just Kokkos::fence()), after kernels, or -you can set the environment variable CUDA_LAUNCH_BLOCKING=1. -* In multi socket multi GPU machines without NVLINK, UVM defaults -to using zero copy allocations for technical reasons related to using multiple -GPUs from the same process. If an executable doesn't do that (e.g. each -MPI rank of an application uses a single GPU [can be the same GPU for -multiple MPI ranks]) you can set CUDA_MANAGED_FORCE_DEVICE_ALLOC=1. -This will enforce proper UVM allocations, but can lead to errors if -more than a single GPU is used by a single process. +All requirements including minimum and primary tested compiler versions can be found [here](https://kokkos.github.io/kokkos-core-wiki/requirements.html). +Building and installation instructions are described [here](https://kokkos.github.io/kokkos-core-wiki/building.html). # Citing Kokkos -If you publish work which mentions Kokkos, please cite the following paper: +Please see the [following page](https://kokkos.github.io/kokkos-core-wiki/citation.html). -````BibTex -@ARTICLE{9485033, - author={Trott, Christian R. and Lebrun-Grandié, Damien and Arndt, Daniel and Ciesko, Jan and Dang, Vinh and Ellingwood, Nathan and Gayatri, Rahulkumar and Harvey, Evan and Hollman, Daisy S. and Ibanez, Dan and Liber, Nevin and Madsen, Jonathan and Miles, Jeff and Poliakoff, David and Powell, Amy and Rajamanickam, Sivasankaran and Simberg, Mikael and Sunderland, Dan and Turcksin, Bruno and Wilke, Jeremiah}, - journal={IEEE Transactions on Parallel and Distributed Systems}, - title={Kokkos 3: Programming Model Extensions for the Exascale Era}, - year={2022}, - volume={33}, - number={4}, - pages={805-817}, - doi={10.1109/TPDS.2021.3097283}} -```` - -If you use more than one Kokkos EcoSystem package, please also cite: - -````BibTex -@ARTICLE{9502936, - author={Trott, Christian and Berger-Vergiat, Luc and Poliakoff, David and Rajamanickam, Sivasankaran and Lebrun-Grandie, Damien and Madsen, Jonathan and Al Awar, Nader and Gligoric, Milos and Shipman, Galen and Womeldorff, Geoff}, - journal={Computing in Science Engineering}, - title={The Kokkos EcoSystem: Comprehensive Performance Portability for High Performance Computing}, - year={2021}, - volume={23}, - number={5}, - pages={10-18}, - doi={10.1109/MCSE.2021.3098509}} -```` - - -And if you feel generous: feel free to cite the original Kokkos paper which describes most of the basic Kokkos concepts: - -````BibTeX -@article{CarterEdwards20143202, - title = "Kokkos: Enabling manycore performance portability through polymorphic memory access patterns ", - journal = "Journal of Parallel and Distributed Computing ", - volume = "74", - number = "12", - pages = "3202 - 3216", - year = "2014", - note = "Domain-Specific Languages and High-Level Frameworks for High-Performance Computing ", - issn = "0743-7315", - doi = "https://doi.org/10.1016/j.jpdc.2014.07.003", - url = "http://www.sciencedirect.com/science/article/pii/S0743731514001257", - author = "H. Carter Edwards and Christian R. Trott and Daniel Sunderland" -} -```` - -##### [LICENSE](https://github.com/kokkos/kokkos/blob/master/LICENSE) +# License [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software. +The full license statement used in all headers is available [here](https://kokkos.github.io/kokkos-core-wiki/license.html) or +[here](https://github.com/kokkos/kokkos/blob/master/LICENSE). diff --git a/lib/kokkos/algorithms/src/CMakeLists.txt b/lib/kokkos/algorithms/src/CMakeLists.txt index 4b60d887f7..597626b111 100644 --- a/lib/kokkos/algorithms/src/CMakeLists.txt +++ b/lib/kokkos/algorithms/src/CMakeLists.txt @@ -11,6 +11,7 @@ FILE(GLOB ALGO_HEADERS *.hpp) FILE(GLOB ALGO_SOURCES *.cpp) LIST(APPEND ALGO_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}_config.h) APPEND_GLOB(ALGO_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/std_algorithms/*.hpp) +APPEND_GLOB(ALGO_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/std_algorithms/impl/*.hpp) INSTALL ( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index 59c11afd9a..1d85ffdfb9 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -44,6 +44,10 @@ #ifndef KOKKOS_RANDOM_HPP #define KOKKOS_RANDOM_HPP +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#endif #include #include @@ -648,63 +652,44 @@ struct Random_UniqueIndex { } }; -#ifdef KOKKOS_ENABLE_CUDA -template -struct Random_UniqueIndex> { - using locks_view_type = - View>; - KOKKOS_FUNCTION - static int get_state_idx(const locks_view_type& locks_) { -#ifdef __CUDA_ARCH__ - const int i_offset = - (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; - int i = (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * - blockDim.x * blockDim.y * blockDim.z + - i_offset) % - locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { - i += blockDim.x * blockDim.y * blockDim.z; - if (i >= static_cast(locks_.extent(0))) { - i = i_offset; - } - } - return i; -#else - (void)locks_; - return 0; -#endif - } -}; +#if defined(KOKKOS_ENABLE_CUDA) || defined(KOKKOS_ENABLE_HIP) + +#if defined(KOKKOS_ENABLE_CUDA) +#define KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP Kokkos::Cuda +#elif defined(KOKKOS_ENABLE_HIP) +#define KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP Kokkos::Experimental::HIP #endif -#ifdef KOKKOS_ENABLE_HIP template struct Random_UniqueIndex< - Kokkos::Device> { + Kokkos::Device> { using locks_view_type = - View>; + View>; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks_) { -#ifdef __HIP_DEVICE_COMPILE__ - const int i_offset = - (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; - int i = (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * + KOKKOS_IF_ON_DEVICE(( + const int i_offset = + (threadIdx.x * blockDim.y + threadIdx.y) * blockDim.z + threadIdx.z; + int i = + (((blockIdx.x * gridDim.y + blockIdx.y) * gridDim.z + blockIdx.z) * blockDim.x * blockDim.y * blockDim.z + i_offset) % locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { - i += blockDim.x * blockDim.y * blockDim.z; - if (i >= static_cast(locks_.extent(0))) { - i = i_offset; - } - } - return i; -#else - (void)locks_; - return 0; -#endif + while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { + i += blockDim.x * blockDim.y * blockDim.z; + if (i >= static_cast(locks_.extent(0))) { + i = i_offset; + } + } + + return i;)) + KOKKOS_IF_ON_HOST(((void)locks_; return 0;)) } }; + +#undef KOKKOS_IMPL_EXECUTION_SPACE_CUDA_OR_HIP + #endif #ifdef KOKKOS_ENABLE_SYCL @@ -1279,7 +1264,6 @@ struct fill_random_functor_begin_end; template struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1303,7 +1287,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1331,7 +1314,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1361,7 +1343,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1392,7 +1373,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1424,7 +1404,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1458,7 +1437,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1494,7 +1472,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1532,7 +1509,6 @@ struct fill_random_functor_begin_end struct fill_random_functor_begin_end { - using execution_space = typename ViewType::execution_space; ViewType a; RandomPool rand_pool; typename ViewType::const_value_type begin, end; @@ -1569,34 +1545,57 @@ struct fill_random_functor_begin_end -void fill_random(ViewType a, RandomPool g, +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, typename ViewType::const_value_type begin, typename ViewType::const_value_type end) { int64_t LDA = a.extent(0); if (LDA > 0) - parallel_for("Kokkos::fill_random", (LDA + 127) / 128, - Impl::fill_random_functor_begin_end( - a, g, begin, end)); + parallel_for( + "Kokkos::fill_random", + Kokkos::RangePolicy(exec, 0, (LDA + 127) / 128), + Impl::fill_random_functor_begin_end( + a, g, begin, end)); } } // namespace Impl +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, + typename ViewType::const_value_type begin, + typename ViewType::const_value_type end) { + Impl::apply_to_view_of_static_rank( + [&](auto dst) { Kokkos::Impl::fill_random(exec, dst, g, begin, end); }, + a); +} + +template +void fill_random(const ExecutionSpace& exec, ViewType a, RandomPool g, + typename ViewType::const_value_type range) { + fill_random(exec, a, g, 0, range); +} + template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type begin, typename ViewType::const_value_type end) { - Impl::apply_to_view_of_static_rank( - [&](auto dst) { Kokkos::Impl::fill_random(dst, g, begin, end); }, a); + fill_random(typename ViewType::execution_space{}, a, g, begin, end); } template void fill_random(ViewType a, RandomPool g, typename ViewType::const_value_type range) { - fill_random(a, g, 0, range); + fill_random(typename ViewType::execution_space{}, a, g, 0, range); } } // namespace Kokkos +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_RANDOM +#endif #endif diff --git a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp index ce97de9b7d..ad0c2d47b6 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Sort.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Sort.hpp @@ -44,6 +44,10 @@ #ifndef KOKKOS_SORT_HPP_ #define KOKKOS_SORT_HPP_ +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#endif #include @@ -120,13 +124,13 @@ class BinSort { // If a Kokkos::View then can generate constant random access // otherwise can only use the constant type. - using src_view_type = typename std::conditional< + using src_view_type = std::conditional_t< Kokkos::is_view::value, Kokkos::View >, - typename SrcViewType::const_type>::type; + typename SrcViewType::const_type>; using perm_view_type = typename PermuteViewType::const_type; @@ -151,8 +155,11 @@ class BinSort { } }; - using execution_space = typename Space::execution_space; - using bin_op_type = BinSortOp; + // Naming this alias "execution_space" would be problematic since it would be + // considered as execution space for the various functors which might use + // another execution space through sort() or create_permute_vector(). + using exec_space = typename Space::execution_space; + using bin_op_type = BinSortOp; struct bin_count_tag {}; struct bin_offset_tag {}; @@ -171,13 +178,13 @@ class BinSort { // If a Kokkos::View then can generate constant random access // otherwise can only use the constant type. - using const_rnd_key_view_type = typename std::conditional< + using const_rnd_key_view_type = std::conditional_t< Kokkos::is_view::value, Kokkos::View >, - const_key_view_type>::type; + const_key_view_type>; using non_const_key_scalar = typename KeyViewType::non_const_value_type; using const_key_scalar = typename KeyViewType::const_value_type; @@ -220,6 +227,14 @@ class BinSort { range_begin(range_begin_), range_end(range_end_), sort_within_bins(sort_within_bins_) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + if (bin_op.max_bins() <= 0) + Kokkos::abort( + "The number of bins in the BinSortOp object must be greater than 0!"); bin_count_atomic = Kokkos::View( "Kokkos::SortImpl::BinSortFunctor::bin_count", bin_op.max_bins()); bin_count_const = bin_count_atomic; @@ -235,7 +250,7 @@ class BinSort { BinSort(const_key_view_type keys_, int range_begin_, int range_end_, BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(execution_space{}, keys_, range_begin_, range_end_, bin_op_, + : BinSort(exec_space{}, keys_, range_begin_, range_end_, bin_op_, sort_within_bins_) {} template @@ -245,13 +260,19 @@ class BinSort { BinSort(const_key_view_type keys_, BinSortOp bin_op_, bool sort_within_bins_ = false) - : BinSort(execution_space{}, keys_, bin_op_, sort_within_bins_) {} + : BinSort(exec_space{}, keys_, bin_op_, sort_within_bins_) {} //---------------------------------------- // Create the permutation vector, the bin_offset array and the bin_count // array. Can be called again if keys changed - template - void create_permute_vector(const ExecutionSpace& exec = execution_space{}) { + template + void create_permute_vector(const ExecutionSpace& exec = exec_space{}) { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + const size_t len = range_end - range_begin; Kokkos::parallel_for( "Kokkos::Sort::BinCount", @@ -281,6 +302,17 @@ class BinSort { template void sort(const ExecutionSpace& exec, ValuesViewType const& values, int values_range_begin, int values_range_end) const { + static_assert( + Kokkos::SpaceAccessibility::accessible, + "The provided execution space must be able to access the memory space " + "BinSort was initialized with!"); + static_assert( + Kokkos::SpaceAccessibility< + ExecutionSpace, typename ValuesViewType::memory_space>::accessible, + "The provided execution space must be able to access the memory space " + "of the View argument!"); + using scratch_view_type = Kokkos::View void sort(ValuesViewType const& values, int values_range_begin, int values_range_end) const { - execution_space exec; + exec_space exec; sort(exec, values, values_range_begin, values_range_end); exec.fence("Kokkos::Sort: fence after sorting"); } @@ -428,7 +460,7 @@ struct BinOp1D { BinOp1D() = default; - // Construct BinOp with number of bins, minimum value and maxuimum value + // Construct BinOp with number of bins, minimum value and maximum value BinOp1D(int max_bins__, typename KeyViewType::const_value_type min, typename KeyViewType::const_value_type max) : max_bins_(max_bins__ + 1), @@ -554,11 +586,7 @@ struct min_max_functor { template std::enable_if_t::value> sort( - const ExecutionSpace& exec, ViewType const& view, - bool const always_use_kokkos_sort = false) { - if (!always_use_kokkos_sort) { - if (Impl::try_std_sort(view, exec)) return; - } + const ExecutionSpace& exec, ViewType const& view) { using CompType = BinOp1D; Kokkos::MinMaxScalar result; @@ -596,12 +624,38 @@ std::enable_if_t::value> sort( bin_sort.sort(exec, view); } +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 +template +KOKKOS_DEPRECATED_WITH_COMMENT( + "Use the overload not taking bool always_use_kokkos_sort") +std::enable_if_t::value> sort( + const ExecutionSpace& exec, ViewType const& view, + bool const always_use_kokkos_sort) { + if (!always_use_kokkos_sort && Impl::try_std_sort(view, exec)) { + return; + } else { + sort(exec, view); + } +} +#endif + template -void sort(ViewType const& view, bool const always_use_kokkos_sort = false) { +void sort(ViewType const& view) { + typename ViewType::execution_space exec; + sort(exec, view); + exec.fence("Kokkos::Sort: fence after sorting"); +} + +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 +template +KOKKOS_DEPRECATED_WITH_COMMENT( + "Use the overload not taking bool always_use_kokkos_sort") +void sort(ViewType const& view, bool const always_use_kokkos_sort) { typename ViewType::execution_space exec; sort(exec, view, always_use_kokkos_sort); exec.fence("Kokkos::Sort: fence after sorting"); } +#endif template std::enable_if_t::value> sort( @@ -635,4 +689,8 @@ void sort(ViewType view, size_t const begin, size_t const end) { } // namespace Kokkos +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_SORT +#endif #endif diff --git a/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp b/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp index 2e3babbcf0..3e0f731cf0 100644 --- a/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_StdAlgorithms.hpp @@ -44,59 +44,103 @@ #ifndef KOKKOS_STD_ALGORITHMS_HPP #define KOKKOS_STD_ALGORITHMS_HPP +#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE +#define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#endif /// \file Kokkos_StdAlgorithms.hpp /// \brief Kokkos counterparts for Standard C++ Library algorithms -#include -#include -#include +#include "std_algorithms/impl/Kokkos_Constraints.hpp" +#include "std_algorithms/impl/Kokkos_RandomAccessIterator.hpp" +#include "std_algorithms/Kokkos_BeginEnd.hpp" // distance -#include +#include "std_algorithms/Kokkos_Distance.hpp" -// move, swap, iter_swap -#include "std_algorithms/Kokkos_ModifyingOperations.hpp" +// note that we categorize below the headers +// following the std classification. -// find, find_if, find_if_not -// for_each, for_each_n -// mismatch -// equal -// count_if, count -// all_of, any_of, none_of -// adjacent_find -// lexicographical_compare -// search, search_n -// find_first_of, find_end -#include +// modifying ops +#include "std_algorithms/Kokkos_Swap.hpp" +#include "std_algorithms/Kokkos_IterSwap.hpp" -// replace, replace_copy_if, replace_copy, replace_if -// copy, copy_n, copy_backward, copy_if -// fill, fill_n -// transform -// generate, generate_n -// reverse, reverse_copy -// move, move_backward -// swap_ranges -// unique, unique_copy -// rotate, rotate_copy -// remove, remove_if, remove_copy, remove_copy_if -// shift_left, shift_right -#include +// non-modifying sequence +#include "std_algorithms/Kokkos_AdjacentFind.hpp" +#include "std_algorithms/Kokkos_Count.hpp" +#include "std_algorithms/Kokkos_CountIf.hpp" +#include "std_algorithms/Kokkos_AllOf.hpp" +#include "std_algorithms/Kokkos_AnyOf.hpp" +#include "std_algorithms/Kokkos_NoneOf.hpp" +#include "std_algorithms/Kokkos_Equal.hpp" +#include "std_algorithms/Kokkos_Find.hpp" +#include "std_algorithms/Kokkos_FindIf.hpp" +#include "std_algorithms/Kokkos_FindIfNot.hpp" +#include "std_algorithms/Kokkos_FindEnd.hpp" +#include "std_algorithms/Kokkos_FindFirstOf.hpp" +#include "std_algorithms/Kokkos_ForEach.hpp" +#include "std_algorithms/Kokkos_ForEachN.hpp" +#include "std_algorithms/Kokkos_LexicographicalCompare.hpp" +#include "std_algorithms/Kokkos_Mismatch.hpp" +#include "std_algorithms/Kokkos_Search.hpp" +#include "std_algorithms/Kokkos_SearchN.hpp" -// is_sorted_until, is_sorted -#include +// modifying sequence +#include "std_algorithms/Kokkos_Fill.hpp" +#include "std_algorithms/Kokkos_FillN.hpp" +#include "std_algorithms/Kokkos_Replace.hpp" +#include "std_algorithms/Kokkos_ReplaceIf.hpp" +#include "std_algorithms/Kokkos_ReplaceCopyIf.hpp" +#include "std_algorithms/Kokkos_ReplaceCopy.hpp" +#include "std_algorithms/Kokkos_Copy.hpp" +#include "std_algorithms/Kokkos_CopyN.hpp" +#include "std_algorithms/Kokkos_CopyBackward.hpp" +#include "std_algorithms/Kokkos_CopyIf.hpp" +#include "std_algorithms/Kokkos_Transform.hpp" +#include "std_algorithms/Kokkos_Generate.hpp" +#include "std_algorithms/Kokkos_GenerateN.hpp" +#include "std_algorithms/Kokkos_Reverse.hpp" +#include "std_algorithms/Kokkos_ReverseCopy.hpp" +#include "std_algorithms/Kokkos_Move.hpp" +#include "std_algorithms/Kokkos_MoveBackward.hpp" +#include "std_algorithms/Kokkos_SwapRanges.hpp" +#include "std_algorithms/Kokkos_Unique.hpp" +#include "std_algorithms/Kokkos_UniqueCopy.hpp" +#include "std_algorithms/Kokkos_Rotate.hpp" +#include "std_algorithms/Kokkos_RotateCopy.hpp" +#include "std_algorithms/Kokkos_Remove.hpp" +#include "std_algorithms/Kokkos_RemoveIf.hpp" +#include "std_algorithms/Kokkos_RemoveCopy.hpp" +#include "std_algorithms/Kokkos_RemoveCopyIf.hpp" +#include "std_algorithms/Kokkos_ShiftLeft.hpp" +#include "std_algorithms/Kokkos_ShiftRight.hpp" -// min_element, max_element, minmax_element -#include +// sorting +#include "std_algorithms/Kokkos_IsSortedUntil.hpp" +#include "std_algorithms/Kokkos_IsSorted.hpp" -// is_partitioned, partition_copy, partition_point -#include +// min/max element +#include "std_algorithms/Kokkos_MinElement.hpp" +#include "std_algorithms/Kokkos_MaxElement.hpp" +#include "std_algorithms/Kokkos_MinMaxElement.hpp" -// adjacent_difference -// reduce, transform_reduce -// exclusive_scan, transform_exclusive_scan -// inclusive_scan, transform_inclusive_scan -#include +// partitioning +#include "std_algorithms/Kokkos_IsPartitioned.hpp" +#include "std_algorithms/Kokkos_PartitionCopy.hpp" +#include "std_algorithms/Kokkos_PartitionPoint.hpp" +// numeric +#include "std_algorithms/Kokkos_AdjacentDifference.hpp" +#include "std_algorithms/Kokkos_Reduce.hpp" +#include "std_algorithms/Kokkos_TransformReduce.hpp" +#include "std_algorithms/Kokkos_ExclusiveScan.hpp" +#include "std_algorithms/Kokkos_TransformExclusiveScan.hpp" +#include "std_algorithms/Kokkos_InclusiveScan.hpp" +#include "std_algorithms/Kokkos_TransformInclusiveScan.hpp" + +#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#undef KOKKOS_IMPL_PUBLIC_INCLUDE +#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_STD_ALGORITHMS +#endif #endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp similarity index 72% rename from lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp rename to lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp index 03e5fd6aeb..0a7cf06f5b 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/numeric/Kokkos_AdjacentDifference.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentDifference.hpp @@ -42,106 +42,15 @@ //@HEADER */ -#ifndef KOKKOS_STD_NUMERICS_ADJACENT_DIFFERENCE_HPP -#define KOKKOS_STD_NUMERICS_ADJACENT_DIFFERENCE_HPP +#ifndef KOKKOS_STD_ALGORITHMS_ADJACENT_DIFFERENCE_HPP +#define KOKKOS_STD_ALGORITHMS_ADJACENT_DIFFERENCE_HPP -#include -#include "../Kokkos_BeginEnd.hpp" -#include "../Kokkos_Constraints.hpp" -#include "../Kokkos_Distance.hpp" +#include "impl/Kokkos_AdjacentDifference.hpp" +#include "Kokkos_BeginEnd.hpp" namespace Kokkos { namespace Experimental { -namespace Impl { -// ------------------------ -// -// functors -// -// ------------------------ -template -struct StdAdjacentDifferenceDefaultBinaryOpFunctor { - KOKKOS_FUNCTION - constexpr RetType operator()(const ValueType1& a, const ValueType2& b) const { - return a - b; - } -}; - -template -struct StdAdjacentDiffFunctor { - using index_type = typename InputIteratorType::difference_type; - - const InputIteratorType m_first_from; - const OutputIteratorType m_first_dest; - BinaryOperator m_op; - - KOKKOS_FUNCTION - void operator()(const index_type i) const { - const auto& my_value = m_first_from[i]; - if (i == 0) { - m_first_dest[i] = my_value; - } else { - const auto& left_value = m_first_from[i - 1]; - m_first_dest[i] = m_op(my_value, left_value); - } - } - - KOKKOS_FUNCTION - StdAdjacentDiffFunctor(InputIteratorType first_from, - OutputIteratorType first_dest, BinaryOperator op) - : m_first_from(std::move(first_from)), - m_first_dest(std::move(first_dest)), - m_op(std::move(op)) {} -}; - -// ------------------------------------------ -// adjacent_difference_impl -// ------------------------------------------ -template -OutputIteratorType adjacent_difference_impl(const std::string& label, - const ExecutionSpace& ex, - InputIteratorType first_from, - InputIteratorType last_from, - OutputIteratorType first_dest, - BinaryOp bin_op) { - // checks - Impl::static_assert_random_access_and_accessible(ex, first_from, first_dest); - Impl::static_assert_iterators_have_matching_difference_type(first_from, - first_dest); - Impl::expect_valid_range(first_from, last_from); - - if (first_from == last_from) { - return first_dest; - } - - // aliases - using value_type = typename OutputIteratorType::value_type; - using aux_view_type = ::Kokkos::View; - using functor_t = - StdAdjacentDiffFunctor; - - // run - const auto num_elements = - Kokkos::Experimental::distance(first_from, last_from); - aux_view_type aux_view("aux_view", num_elements); - ::Kokkos::parallel_for(label, - RangePolicy(ex, 0, num_elements), - functor_t(first_from, first_dest, bin_op)); - ex.fence("Kokkos::adjacent_difference: fence after operation"); - - // return - return first_dest + num_elements; -} - -} // end namespace Impl - -// ------------------------ -// -// public API -// -// ------------------------ template std::enable_if_t::value, diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp new file mode 100644 index 0000000000..332f9dd369 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AdjacentFind.hpp @@ -0,0 +1,124 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ADJACENT_FIND_HPP +#define KOKKOS_STD_ALGORITHMS_ADJACENT_FIND_HPP + +#include "impl/Kokkos_AdjacentFind.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set1 +template +IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", + ex, first, last); +} + +template +IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::adjacent_find_impl(label, ex, first, last); +} + +template +auto adjacent_find(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, + KE::begin(v), KE::end(v)); +} + +template +auto adjacent_find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v)); +} + +// overload set2 +template +IteratorType adjacent_find(const ExecutionSpace& ex, IteratorType first, + IteratorType last, BinaryPredicateType pred) { + return Impl::adjacent_find_impl("Kokkos::adjacent_find_iterator_api_default", + ex, first, last, pred); +} + +template +IteratorType adjacent_find(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + BinaryPredicateType pred) { + return Impl::adjacent_find_impl(label, ex, first, last, pred); +} + +template +auto adjacent_find(const ExecutionSpace& ex, + const ::Kokkos::View& v, + BinaryPredicateType pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl("Kokkos::adjacent_find_view_api_default", ex, + KE::begin(v), KE::end(v), pred); +} + +template +auto adjacent_find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + BinaryPredicateType pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::adjacent_find_impl(label, ex, KE::begin(v), KE::end(v), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp new file mode 100644 index 0000000000..66a49541f3 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AllOf.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ALL_OF_HPP +#define KOKKOS_STD_ALGORITHMS_ALL_OF_HPP + +#include "impl/Kokkos_AllOfAnyOfNoneOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool all_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::all_of_impl("Kokkos::all_of_iterator_api_default", ex, first, + last, predicate); +} + +template +bool all_of(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, Predicate predicate) { + return Impl::all_of_impl(label, ex, first, last, predicate); +} + +template +bool all_of(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::all_of_impl("Kokkos::all_of_view_api_default", ex, KE::cbegin(v), + KE::cend(v), std::move(predicate)); +} + +template +bool all_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::all_of_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp new file mode 100644 index 0000000000..e50e90f6da --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_AnyOf.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_ANY_OF_HPP +#define KOKKOS_STD_ALGORITHMS_ANY_OF_HPP + +#include "impl/Kokkos_AllOfAnyOfNoneOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool any_of(const ExecutionSpace& ex, InputIterator first, InputIterator last, + Predicate predicate) { + return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, first, last, + predicate); +} + +template +bool any_of(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, Predicate predicate) { + return Impl::any_of_impl(label, ex, first, last, predicate); +} + +template +bool any_of(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::any_of_impl("Kokkos::any_of_view_api_default", ex, KE::cbegin(v), + KE::cend(v), std::move(predicate)); +} + +template +bool any_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::any_of_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp index beb53fdd70..5449196192 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_BeginEnd.hpp @@ -46,8 +46,8 @@ #define KOKKOS_BEGIN_END_HPP #include -#include "Kokkos_RandomAccessIterator.hpp" -#include "Kokkos_Constraints.hpp" +#include "impl/Kokkos_RandomAccessIterator.hpp" +#include "impl/Kokkos_Constraints.hpp" /// \file Kokkos_BeginEnd.hpp /// \brief Kokkos begin, end, cbegin, cend diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp new file mode 100644 index 0000000000..b3237041b7 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Copy.hpp @@ -0,0 +1,97 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_HPP + +#include "impl/Kokkos_CopyCopyN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy(const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first) { + return Impl::copy_impl("Kokkos::copy_iterator_api_default", ex, first, last, + d_first); +} + +template +OutputIterator copy(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first) { + return Impl::copy_impl(label, ex, first, last, d_first); +} + +template +auto copy(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_impl("Kokkos::copy_view_api_default", ex, + KE::cbegin(source), KE::cend(source), KE::begin(dest)); +} + +template +auto copy(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_impl(label, ex, KE::cbegin(source), KE::cend(source), + KE::begin(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp new file mode 100644 index 0000000000..83efd96672 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyBackward.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_BACKWARD_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_BACKWARD_HPP + +#include "impl/Kokkos_CopyBackward.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType2 copy_backward(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 d_last) { + return Impl::copy_backward_impl("Kokkos::copy_backward_iterator_api_default", + ex, first, last, d_last); +} + +template +IteratorType2 copy_backward(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 d_last) { + return Impl::copy_backward_impl(label, ex, first, last, d_last); +} + +template +auto copy_backward(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_backward_impl("Kokkos::copy_backward_view_api_default", ex, + cbegin(source), cend(source), end(dest)); +} + +template +auto copy_backward(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_backward_impl(label, ex, cbegin(source), cend(source), + end(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp new file mode 100644 index 0000000000..c83cc29886 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyIf.hpp @@ -0,0 +1,99 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_IF_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_IF_HPP + +#include "impl/Kokkos_CopyIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy_if(const ExecutionSpace& ex, InputIterator first, + InputIterator last, OutputIterator d_first, + Predicate pred) { + return Impl::copy_if_impl("Kokkos::copy_if_iterator_api_default", ex, first, + last, d_first, std::move(pred)); +} + +template +OutputIterator copy_if(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, + OutputIterator d_first, Predicate pred) { + return Impl::copy_if_impl(label, ex, first, last, d_first, std::move(pred)); +} + +template +auto copy_if(const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest, Predicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_if_impl("Kokkos::copy_if_view_api_default", ex, + cbegin(source), cend(source), begin(dest), + std::move(pred)); +} + +template +auto copy_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, + ::Kokkos::View& dest, Predicate pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + return Impl::copy_if_impl(label, ex, cbegin(source), cend(source), + begin(dest), std::move(pred)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp new file mode 100644 index 0000000000..7f3b9374c7 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CopyN.hpp @@ -0,0 +1,98 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COPY_N_HPP +#define KOKKOS_STD_ALGORITHMS_COPY_N_HPP + +#include "impl/Kokkos_CopyCopyN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +OutputIterator copy_n(const ExecutionSpace& ex, InputIterator first, Size count, + OutputIterator result) { + return Impl::copy_n_impl("Kokkos::copy_n_iterator_api_default", ex, first, + count, result); +} + +template +OutputIterator copy_n(const std::string& label, const ExecutionSpace& ex, + InputIterator first, Size count, OutputIterator result) { + return Impl::copy_n_impl(label, ex, first, count, result); +} + +template +auto copy_n(const ExecutionSpace& ex, + const ::Kokkos::View& source, Size count, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_n_impl("Kokkos::copy_n_view_api_default", ex, + KE::cbegin(source), count, KE::begin(dest)); +} + +template +auto copy_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& source, Size count, + ::Kokkos::View& dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(source); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(dest); + + namespace KE = ::Kokkos::Experimental; + return Impl::copy_n_impl(label, ex, KE::cbegin(source), count, + KE::begin(dest)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp new file mode 100644 index 0000000000..a885ee4ad2 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Count.hpp @@ -0,0 +1,94 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COUNT_HPP +#define KOKKOS_STD_ALGORITHMS_COUNT_HPP + +#include "impl/Kokkos_CountCountIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +typename IteratorType::difference_type count(const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + const T& value) { + return Impl::count_impl("Kokkos::count_iterator_api_default", ex, first, last, + value); +} + +template +typename IteratorType::difference_type count(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + const T& value) { + return Impl::count_impl(label, ex, first, last, value); +} + +template +auto count(const ExecutionSpace& ex, + const ::Kokkos::View& v, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_impl("Kokkos::count_view_api_default", ex, KE::cbegin(v), + KE::cend(v), value); +} + +template +auto count(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_impl(label, ex, KE::cbegin(v), KE::cend(v), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp new file mode 100644 index 0000000000..98b9d74c4c --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_CountIf.hpp @@ -0,0 +1,99 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_COUNT_IF_HPP +#define KOKKOS_STD_ALGORITHMS_COUNT_IF_HPP + +#include "impl/Kokkos_CountCountIf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +typename IteratorType::difference_type count_if(const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + Predicate predicate) { + return Impl::count_if_impl("Kokkos::count_if_iterator_api_default", ex, first, + last, std::move(predicate)); +} + +template +typename IteratorType::difference_type count_if(const std::string& label, + const ExecutionSpace& ex, + IteratorType first, + IteratorType last, + Predicate predicate) { + return Impl::count_if_impl(label, ex, first, last, std::move(predicate)); +} + +template +auto count_if(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_if_impl("Kokkos::count_if_view_api_default", ex, + KE::cbegin(v), KE::cend(v), std::move(predicate)); +} + +template +auto count_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::count_if_impl(label, ex, KE::cbegin(v), KE::cend(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp index ced4370472..4e148642b1 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Distance.hpp @@ -45,8 +45,8 @@ #ifndef KOKKOS_STD_ALGORITHMS_DISTANCE_HPP #define KOKKOS_STD_ALGORITHMS_DISTANCE_HPP -#include "Kokkos_Constraints.hpp" -#include "Kokkos_RandomAccessIterator.hpp" +#include "impl/Kokkos_Constraints.hpp" +#include "impl/Kokkos_RandomAccessIterator.hpp" namespace Kokkos { namespace Experimental { diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp new file mode 100644 index 0000000000..8634019fad --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Equal.hpp @@ -0,0 +1,198 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_EQUAL_HPP +#define KOKKOS_STD_ALGORITHMS_EQUAL_HPP + +#include "impl/Kokkos_Equal.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2) { + return Impl::equal_impl(label, ex, first1, last1, first2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, BinaryPredicateType predicate) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + BinaryPredicateType predicate) { + return Impl::equal_impl(label, ex, first1, last1, first2, + std::move(predicate)); +} + +template +bool equal(const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); +} + +template +bool equal(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2)); +} + +template +bool equal(const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, + BinaryPredicateType predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl("Kokkos::equal_view_api_default", ex, + KE::cbegin(view1), KE::cend(view1), KE::cbegin(view2), + std::move(predicate)); +} + +template +bool equal(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, + BinaryPredicateType predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::equal_impl(label, ex, KE::cbegin(view1), KE::cend(view1), + KE::cbegin(view2), std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, last2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2) { + return Impl::equal_impl(label, ex, first1, last1, first2, last2); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const ExecutionSpace& ex, IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_impl("Kokkos::equal_iterator_api_default", ex, first1, + last1, first2, last2, std::move(predicate)); +} + +template +std::enable_if_t< ::Kokkos::Experimental::Impl::are_iterators< + IteratorType1, IteratorType2>::value, + bool> +equal(const std::string& label, const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, IteratorType2 last2, + BinaryPredicateType predicate) { + return Impl::equal_impl(label, ex, first1, last1, first2, last2, + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp new file mode 100644 index 0000000000..b97710f24f --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ExclusiveScan.hpp @@ -0,0 +1,190 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_EXCLUSIVE_SCAN_HPP +#define KOKKOS_STD_ALGORITHMS_EXCLUSIVE_SCAN_HPP + +#include "impl/Kokkos_ExclusiveScan.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_default_op_impl( + "Kokkos::exclusive_scan_default_functors_iterator_api", ex, first, last, + first_dest, init_value); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, ValueType init_value) { + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_default_op_impl(label, ex, first, last, + first_dest, init_value); +} + +template +auto exclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_default_op_impl( + "Kokkos::exclusive_scan_default_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + init_value); +} + +template +auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest), init_value); +} + +// overload set 2 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_custom_op_impl( + "Kokkos::exclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, init_value, bop); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +exclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, ValueType init_value, + BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + return Impl::exclusive_scan_custom_op_impl(label, ex, first, last, first_dest, + init_value, bop); +} + +template +auto exclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_custom_op_impl( + "Kokkos::exclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + init_value, bop); +} + +template +auto exclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + ValueType init_value, BinaryOpType bop) { + Impl::static_assert_is_not_openmptarget(ex); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + static_assert(std::is_move_constructible::value, + "ValueType must be move constructible."); + namespace KE = ::Kokkos::Experimental; + return Impl::exclusive_scan_custom_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), init_value, bop); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp new file mode 100644 index 0000000000..200e03b9dc --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Fill.hpp @@ -0,0 +1,86 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FILL_HPP +#define KOKKOS_STD_ALGORITHMS_FILL_HPP + +#include "impl/Kokkos_FillFillN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +void fill(const ExecutionSpace& ex, IteratorType first, IteratorType last, + const T& value) { + Impl::fill_impl("Kokkos::fill_iterator_api_default", ex, first, last, value); +} + +template +void fill(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, const T& value) { + Impl::fill_impl(label, ex, first, last, value); +} + +template +void fill(const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::fill_impl("Kokkos::fill_view_api_default", ex, begin(view), end(view), + value); +} + +template +void fill(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::fill_impl(label, ex, begin(view), end(view), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp new file mode 100644 index 0000000000..2e814dc55f --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FillN.hpp @@ -0,0 +1,91 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FILL_N_HPP +#define KOKKOS_STD_ALGORITHMS_FILL_N_HPP + +#include "impl/Kokkos_FillFillN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType fill_n(const ExecutionSpace& ex, IteratorType first, SizeType n, + const T& value) { + return Impl::fill_n_impl("Kokkos::fill_n_iterator_api_default", ex, first, n, + value); +} + +template +IteratorType fill_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, SizeType n, const T& value) { + return Impl::fill_n_impl(label, ex, first, n, value); +} + +template +auto fill_n(const ExecutionSpace& ex, + const ::Kokkos::View& view, SizeType n, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::fill_n_impl("Kokkos::fill_n_view_api_default", ex, begin(view), + n, value); +} + +template +auto fill_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, SizeType n, + const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::fill_n_impl(label, ex, begin(view), n, value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp new file mode 100644 index 0000000000..6758f00ce4 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Find.hpp @@ -0,0 +1,89 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +InputIterator find(const ExecutionSpace& ex, InputIterator first, + InputIterator last, const T& value) { + return Impl::find_impl("Kokkos::find_iterator_api_default", ex, first, last, + value); +} + +template +InputIterator find(const std::string& label, const ExecutionSpace& ex, + InputIterator first, InputIterator last, const T& value) { + return Impl::find_impl(label, ex, first, last, value); +} + +template +auto find(const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_impl("Kokkos::find_view_api_default", ex, KE::begin(view), + KE::end(view), value); +} + +template +auto find(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, const T& value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_impl(label, ex, KE::begin(view), KE::end(view), value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp new file mode 100644 index 0000000000..61b54c8225 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindEnd.hpp @@ -0,0 +1,149 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_END_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_END_HPP + +#include "impl/Kokkos_FindEnd.hpp" +#include "Kokkos_Equal.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1: no binary predicate passed +template +IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, + last, s_first, s_last); +} + +template +IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + return Impl::find_end_impl(label, ex, first, last, s_first, s_last); +} + +template +auto find_end(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), KE::begin(s_view), + KE::end(s_view)); +} + +template +auto find_end(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template +IteratorType1 find_end(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, const BinaryPredicateType& pred) { + return Impl::find_end_impl("Kokkos::find_end_iterator_api_default", ex, first, + last, s_first, s_last, pred); +} + +template +IteratorType1 find_end(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_end_impl(label, ex, first, last, s_first, s_last, pred); +} + +template +auto find_end(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl("Kokkos::find_end_view_api_default", ex, + KE::begin(view), KE::end(view), KE::begin(s_view), + KE::end(s_view), pred); +} + +template +auto find_end(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_end_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp new file mode 100644 index 0000000000..b8c27cb272 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindFirstOf.hpp @@ -0,0 +1,150 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_FIRST_OF_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_FIRST_OF_HPP + +#include "impl/Kokkos_FindFirstOf.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1: no binary predicate passed +template +IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last) { + return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", + ex, first, last, s_first, s_last); +} + +template +IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last) { + return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last); +} + +template +auto find_first_of(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +template +auto find_first_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view)); +} + +// overload set 2: binary predicate passed +template +IteratorType1 find_first_of(const ExecutionSpace& ex, IteratorType1 first, + IteratorType1 last, IteratorType2 s_first, + IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_first_of_impl("Kokkos::find_first_of_iterator_api_default", + ex, first, last, s_first, s_last, pred); +} + +template +IteratorType1 find_first_of(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first, IteratorType1 last, + IteratorType2 s_first, IteratorType2 s_last, + const BinaryPredicateType& pred) { + return Impl::find_first_of_impl(label, ex, first, last, s_first, s_last, + pred); +} + +template +auto find_first_of(const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl("Kokkos::find_first_of_view_api_default", ex, + KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +template +auto find_first_of(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + const ::Kokkos::View& s_view, + const BinaryPredicateType& pred) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(s_view); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_first_of_impl(label, ex, KE::begin(view), KE::end(view), + KE::begin(s_view), KE::end(s_view), pred); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp new file mode 100644 index 0000000000..54896da117 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIf.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_IF_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_IF_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType find_if(const ExecutionSpace& ex, IteratorType first, + IteratorType last, PredicateType predicate) { + return Impl::find_if_or_not_impl("Kokkos::find_if_iterator_api_default", + ex, first, last, std::move(predicate)); +} + +template +IteratorType find_if(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + PredicateType predicate) { + return Impl::find_if_or_not_impl(label, ex, first, last, + std::move(predicate)); +} + +template +auto find_if(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl("Kokkos::find_if_view_api_default", ex, + KE::begin(v), KE::end(v), + std::move(predicate)); +} + +template +auto find_if(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp new file mode 100644 index 0000000000..cfe6bb84d8 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_FindIfNot.hpp @@ -0,0 +1,98 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FIND_IF_NOT_HPP +#define KOKKOS_STD_ALGORITHMS_FIND_IF_NOT_HPP + +#include "impl/Kokkos_FindIfOrNot.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType find_if_not(const ExecutionSpace& ex, IteratorType first, + IteratorType last, Predicate predicate) { + return Impl::find_if_or_not_impl( + "Kokkos::find_if_not_iterator_api_default", ex, first, last, + std::move(predicate)); +} + +template +IteratorType find_if_not(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + Predicate predicate) { + return Impl::find_if_or_not_impl(label, ex, first, last, + std::move(predicate)); +} + +template +auto find_if_not(const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl( + "Kokkos::find_if_not_view_api_default", ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +template +auto find_if_not(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + Predicate predicate) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::find_if_or_not_impl(label, ex, KE::begin(v), KE::end(v), + std::move(predicate)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp new file mode 100644 index 0000000000..8a2f90e82b --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEach.hpp @@ -0,0 +1,95 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FOR_EACH_HPP +#define KOKKOS_STD_ALGORITHMS_FOR_EACH_HPP + +#include "impl/Kokkos_ForEachForEachN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + UnaryFunctorType functor) { + return Impl::for_each_impl(label, ex, first, last, std::move(functor)); +} + +template +UnaryFunctorType for_each(const ExecutionSpace& ex, IteratorType first, + IteratorType last, UnaryFunctorType functor) { + return Impl::for_each_impl("Kokkos::for_each_iterator_api_default", ex, first, + last, std::move(functor)); +} + +template +UnaryFunctorType for_each(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_impl(label, ex, KE::begin(v), KE::end(v), + std::move(functor)); +} + +template +UnaryFunctorType for_each(const ExecutionSpace& ex, + const ::Kokkos::View& v, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_impl("Kokkos::for_each_view_api_default", ex, + KE::begin(v), KE::end(v), std::move(functor)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp new file mode 100644 index 0000000000..dd917a33e8 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ForEachN.hpp @@ -0,0 +1,96 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_FOR_EACH_N_HPP +#define KOKKOS_STD_ALGORITHMS_FOR_EACH_N_HPP + +#include "impl/Kokkos_ForEachForEachN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType for_each_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, SizeType n, + UnaryFunctorType functor) { + return Impl::for_each_n_impl(label, ex, first, n, std::move(functor)); +} + +template +IteratorType for_each_n(const ExecutionSpace& ex, IteratorType first, + SizeType n, UnaryFunctorType functor) { + return Impl::for_each_n_impl("Kokkos::for_each_n_iterator_api_default", ex, + first, n, std::move(functor)); +} + +template +auto for_each_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, SizeType n, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_n_impl(label, ex, KE::begin(v), n, std::move(functor)); +} + +template +auto for_each_n(const ExecutionSpace& ex, + const ::Kokkos::View& v, SizeType n, + UnaryFunctorType functor) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + namespace KE = ::Kokkos::Experimental; + return Impl::for_each_n_impl("Kokkos::for_each_n_view_api_default", ex, + KE::begin(v), n, std::move(functor)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp new file mode 100644 index 0000000000..955cb42d4b --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_Generate.hpp @@ -0,0 +1,91 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_GENERATE_HPP +#define KOKKOS_STD_ALGORITHMS_GENERATE_HPP + +#include "impl/Kokkos_GenerateGenerateN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +void generate(const ExecutionSpace& ex, IteratorType first, IteratorType last, + Generator g) { + Impl::generate_impl("Kokkos::generate_iterator_api_default", ex, first, last, + std::move(g)); +} + +template +void generate(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, Generator g) { + Impl::generate_impl(label, ex, first, last, std::move(g)); +} + +template +void generate(const ExecutionSpace& ex, + const ::Kokkos::View& view, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::generate_impl("Kokkos::generate_view_api_default", ex, begin(view), + end(view), std::move(g)); +} + +template +void generate(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + Impl::generate_impl(label, ex, begin(view), end(view), std::move(g)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp new file mode 100644 index 0000000000..470edb1596 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_GenerateN.hpp @@ -0,0 +1,93 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_GENERATE_N_HPP +#define KOKKOS_STD_ALGORITHMS_GENERATE_N_HPP + +#include "impl/Kokkos_GenerateGenerateN.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType generate_n(const ExecutionSpace& ex, IteratorType first, + Size count, Generator g) { + Impl::generate_n_impl("Kokkos::generate_n_iterator_api_default", ex, first, + count, std::move(g)); + return first + count; +} + +template +IteratorType generate_n(const std::string& label, const ExecutionSpace& ex, + IteratorType first, Size count, Generator g) { + Impl::generate_n_impl(label, ex, first, count, std::move(g)); + return first + count; +} + +template +auto generate_n(const ExecutionSpace& ex, + const ::Kokkos::View& view, Size count, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::generate_n_impl("Kokkos::generate_n_view_api_default", ex, + begin(view), count, std::move(g)); +} + +template +auto generate_n(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, Size count, + Generator g) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + return Impl::generate_n_impl(label, ex, begin(view), count, std::move(g)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp new file mode 100644 index 0000000000..c34b5f43c9 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_InclusiveScan.hpp @@ -0,0 +1,223 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_INCLUSIVE_SCAN_HPP +#define KOKKOS_STD_ALGORITHMS_INCLUSIVE_SCAN_HPP + +#include "impl/Kokkos_InclusiveScan.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +// overload set 1 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_impl( + "Kokkos::inclusive_scan_default_functors_iterator_api", ex, first, last, + first_dest); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest) { + return Impl::inclusive_scan_default_op_impl(label, ex, first, last, + first_dest); +} + +template +auto inclusive_scan( + const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_default_op_impl( + "Kokkos::inclusive_scan_default_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest)); +} + +template +auto inclusive_scan( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_default_op_impl(label, ex, KE::cbegin(view_from), + KE::cend(view_from), + KE::begin(view_dest)); +} + +// overload set 2 (accepting custom binary op) +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, binary_op); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, BinaryOp binary_op) { + return Impl::inclusive_scan_custom_binary_op_impl(label, ex, first, last, + first_dest, binary_op); +} + +template +auto inclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + binary_op); +} + +template +auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op); +} + +// overload set 3 +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const ExecutionSpace& ex, InputIteratorType first, + InputIteratorType last, OutputIteratorType first_dest, + BinaryOp binary_op, ValueType init_value) { + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_iterator_api", ex, first, last, + first_dest, binary_op, init_value); +} + +template +std::enable_if_t<::Kokkos::Experimental::Impl::are_iterators< + InputIteratorType, OutputIteratorType>::value, + OutputIteratorType> +inclusive_scan(const std::string& label, const ExecutionSpace& ex, + InputIteratorType first, InputIteratorType last, + OutputIteratorType first_dest, BinaryOp binary_op, + ValueType init_value) { + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, first, last, first_dest, binary_op, init_value); +} + +template +auto inclusive_scan(const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op, ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + "Kokkos::inclusive_scan_custom_functors_view_api", ex, + KE::cbegin(view_from), KE::cend(view_from), KE::begin(view_dest), + binary_op, init_value); +} + +template +auto inclusive_scan(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view_from, + const ::Kokkos::View& view_dest, + BinaryOp binary_op, ValueType init_value) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_from); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view_dest); + namespace KE = ::Kokkos::Experimental; + return Impl::inclusive_scan_custom_binary_op_impl( + label, ex, KE::cbegin(view_from), KE::cend(view_from), + KE::begin(view_dest), binary_op, init_value); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp new file mode 100644 index 0000000000..8a2ca207ae --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsPartitioned.hpp @@ -0,0 +1,92 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_PARTITIONED_HPP +#define KOKKOS_STD_ALGORITHMS_IS_PARTITIONED_HPP + +#include "impl/Kokkos_IsPartitioned.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool is_partitioned(const ExecutionSpace& ex, IteratorType first, + IteratorType last, PredicateType p) { + return Impl::is_partitioned_impl( + "Kokkos::is_partitioned_iterator_api_default", ex, first, last, + std::move(p)); +} + +template +bool is_partitioned(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, PredicateType p) { + return Impl::is_partitioned_impl(label, ex, first, last, std::move(p)); +} + +template +bool is_partitioned(const ExecutionSpace& ex, + const ::Kokkos::View& v, + PredicateType p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::is_partitioned_impl("Kokkos::is_partitioned_view_api_default", + ex, cbegin(v), cend(v), std::move(p)); +} + +template +bool is_partitioned(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + PredicateType p) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::is_partitioned_impl(label, ex, cbegin(v), cend(v), std::move(p)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp new file mode 100644 index 0000000000..0ab466f338 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSorted.hpp @@ -0,0 +1,131 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_SORTED_HPP +#define KOKKOS_STD_ALGORITHMS_IS_SORTED_HPP + +#include "impl/Kokkos_IsSorted.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool is_sorted(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, + first, last); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::is_sorted_impl(label, ex, first, last); +} + +template +bool is_sorted(const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view)); +} + +template +bool is_sorted(const ExecutionSpace& ex, IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_impl("Kokkos::is_sorted_iterator_api_default", ex, + first, last, std::move(comp)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_impl(label, ex, first, last, std::move(comp)); +} + +template +bool is_sorted(const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl("Kokkos::is_sorted_view_api_default", ex, + KE::cbegin(view), KE::cend(view), + std::move(comp)); +} + +template +bool is_sorted(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_impl(label, ex, KE::cbegin(view), KE::cend(view), + std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp new file mode 100644 index 0000000000..c480d9ee5a --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IsSortedUntil.hpp @@ -0,0 +1,134 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_IS_SORTED_UNTIL_HPP +#define KOKKOS_STD_ALGORITHMS_IS_SORTED_UNTIL_HPP + +#include "impl/Kokkos_IsSortedUntil.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::is_sorted_until_impl( + "Kokkos::is_sorted_until_iterator_api_default", ex, first, last); +} + +template +IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::is_sorted_until_impl(label, ex, first, last); +} + +template +auto is_sorted_until(const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", + ex, KE::begin(view), KE::end(view)); +} + +template +auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view)); +} + +template +IteratorType is_sorted_until(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + return Impl::is_sorted_until_impl( + "Kokkos::is_sorted_until_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +IteratorType is_sorted_until(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::is_sorted_until_impl(label, ex, first, last, std::move(comp)); +} + +template +auto is_sorted_until(const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl("Kokkos::is_sorted_until_view_api_default", + ex, KE::begin(view), KE::end(view), + std::move(comp)); +} + +template +auto is_sorted_until(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view); + Impl::static_assert_is_not_openmptarget(ex); + + namespace KE = ::Kokkos::Experimental; + return Impl::is_sorted_until_impl(label, ex, KE::begin(view), KE::end(view), + std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp similarity index 79% rename from lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp rename to lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp index f8ca3456e5..1174740a5b 100644 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_ModifyingOperations.hpp +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_IterSwap.hpp @@ -42,38 +42,17 @@ //@HEADER */ -#ifndef KOKKOS_MODIFYING_OPERATIONS_HPP -#define KOKKOS_MODIFYING_OPERATIONS_HPP +#ifndef KOKKOS_STD_ALGORITHMS_ITER_SWAP_HPP +#define KOKKOS_STD_ALGORITHMS_ITER_SWAP_HPP #include -#include "Kokkos_BeginEnd.hpp" -#include "Kokkos_Constraints.hpp" +#include "impl/Kokkos_Constraints.hpp" +#include "Kokkos_Swap.hpp" namespace Kokkos { namespace Experimental { - -// move -template -KOKKOS_INLINE_FUNCTION std::remove_reference_t&& move(T&& t) { - return static_cast&&>(t); -} - -// swap -template -KOKKOS_INLINE_FUNCTION void swap(T& a, T& b) noexcept { - static_assert( - std::is_move_assignable::value && std::is_move_constructible::value, - "Kokkos::Experimental::swap arguments must be move assignable " - "and move constructible"); - - T tmp = std::move(a); - a = std::move(b); - b = std::move(tmp); -} - -//---------------------------------------------------------------------------- -// this is here because we use the swap function above namespace Impl { + template struct StdIterSwapFunctor { IteratorType1 m_a; diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp new file mode 100644 index 0000000000..4704a9ec56 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_LexicographicalCompare.hpp @@ -0,0 +1,154 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_LEXICOGRAPHICAL_COMPARE_HPP +#define KOKKOS_STD_ALGORITHMS_LEXICOGRAPHICAL_COMPARE_HPP + +#include "impl/Kokkos_LexicographicalCompare.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2) { + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, + first2, last2); +} + +template +bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2) { + return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, + last2); +} + +template +bool lexicographical_compare( + const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), KE::cend(view2)); +} + +template +bool lexicographical_compare( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), + KE::cend(view2)); +} + +template +bool lexicographical_compare(const ExecutionSpace& ex, IteratorType1 first1, + IteratorType1 last1, IteratorType2 first2, + IteratorType2 last2, ComparatorType comp) { + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_iterator_api_default", ex, first1, last1, + first2, last2, comp); +} + +template +bool lexicographical_compare(const std::string& label, const ExecutionSpace& ex, + IteratorType1 first1, IteratorType1 last1, + IteratorType2 first2, IteratorType2 last2, + ComparatorType comp) { + return Impl::lexicographical_compare_impl(label, ex, first1, last1, first2, + last2, comp); +} + +template +bool lexicographical_compare( + const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl( + "Kokkos::lexicographical_compare_view_api_default", ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), KE::cend(view2), comp); +} + +template +bool lexicographical_compare( + const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& view1, + ::Kokkos::View& view2, ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view1); + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(view2); + + namespace KE = ::Kokkos::Experimental; + return Impl::lexicographical_compare_impl(label, ex, KE::cbegin(view1), + KE::cend(view1), KE::cbegin(view2), + KE::cend(view2), comp); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp new file mode 100644 index 0000000000..5f6e5cbf62 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MaxElement.hpp @@ -0,0 +1,132 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MAX_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MAX_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto max_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::min_or_max_element_impl( + "Kokkos::max_element_iterator_api_default", ex, first, last); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_impl(label, ex, first, last); +} + +template +auto max_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto max_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto max_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::max_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto max_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp new file mode 100644 index 0000000000..63cc548960 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinElement.hpp @@ -0,0 +1,132 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MIN_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MIN_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto min_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::min_or_max_element_impl( + "Kokkos::min_element_iterator_api_default", ex, first, last); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::min_or_max_element_impl(label, ex, first, last); +} + +template +auto min_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto min_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto min_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + "Kokkos::min_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::min_or_max_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto min_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::min_or_max_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp new file mode 100644 index 0000000000..07cdefcc05 --- /dev/null +++ b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElement.hpp @@ -0,0 +1,133 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_STD_ALGORITHMS_MINMAX_ELEMENT_HPP +#define KOKKOS_STD_ALGORITHMS_MINMAX_ELEMENT_HPP + +#include "impl/Kokkos_MinMaxMinmaxElement.hpp" +#include "Kokkos_BeginEnd.hpp" + +namespace Kokkos { +namespace Experimental { + +template +auto minmax_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last) { + return Impl::minmax_element_impl( + "Kokkos::minmax_element_iterator_api_default", ex, first, last); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last) { + return Impl::minmax_element_impl(label, ex, first, last); +} + +template +auto minmax_element(const ExecutionSpace& ex, IteratorType first, + IteratorType last, ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_iterator_api_default", ex, first, last, + std::move(comp)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + IteratorType first, IteratorType last, + ComparatorType comp) { + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + label, ex, first, last, std::move(comp)); +} + +template +auto minmax_element(const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + + return Impl::minmax_element_impl(label, ex, begin(v), + end(v)); +} + +template +auto minmax_element(const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + "Kokkos::minmax_element_view_api_default", ex, begin(v), end(v), + std::move(comp)); +} + +template +auto minmax_element(const std::string& label, const ExecutionSpace& ex, + const ::Kokkos::View& v, + ComparatorType comp) { + Impl::static_assert_is_admissible_to_kokkos_std_algorithms(v); + Impl::static_assert_is_not_openmptarget(ex); + + return Impl::minmax_element_impl( + label, ex, begin(v), end(v), std::move(comp)); +} + +} // namespace Experimental +} // namespace Kokkos + +#endif diff --git a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp b/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp deleted file mode 100644 index aa8f5ba376..0000000000 --- a/lib/kokkos/algorithms/src/std_algorithms/Kokkos_MinMaxElementOperations.hpp +++ /dev/null @@ -1,409 +0,0 @@ -/* -//@HEADER -// ************************************************************************ -// -// Kokkos v. 3.0 -// Copyright (2020) National Technology & Engineering -// Solutions of Sandia, LLC (NTESS). -// -// Under the terms of Contract DE-NA0003525 with NTESS, -// the U.S. Government retains certain rights in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the Corporation nor the names of the -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Questions? Contact Christian R. Trott (crtrott@sandia.gov) -// -// ************************************************************************ -//@HEADER -*/ - -#ifndef KOKKOS_STD_MIN_MAX_ELEMENT_OPERATIONS_HPP -#define KOKKOS_STD_MIN_MAX_ELEMENT_OPERATIONS_HPP - -#include -#include "Kokkos_BeginEnd.hpp" -#include "Kokkos_Constraints.hpp" -#include "Kokkos_Distance.hpp" -#include "Kokkos_ModifyingOperations.hpp" - -namespace Kokkos { -namespace Experimental { -namespace Impl { - -template -struct StdMinOrMaxElemFunctor { - using index_type = typename IteratorType::difference_type; - using red_value_type = typename ReducerType::value_type; - - IteratorType m_first; - ReducerType m_reducer; - - KOKKOS_FUNCTION - void operator()(const index_type i, red_value_type& red_value) const { - m_reducer.join(red_value, red_value_type{m_first[i], i}); - } - - KOKKOS_FUNCTION - StdMinOrMaxElemFunctor(IteratorType first, ReducerType reducer) - : m_first(std::move(first)), m_reducer(std::move(reducer)) {} -}; - -template -struct StdMinMaxElemFunctor { - using index_type = typename IteratorType::difference_type; - using red_value_type = typename ReducerType::value_type; - IteratorType m_first; - ReducerType m_reducer; - - KOKKOS_FUNCTION - void operator()(const index_type i, red_value_type& red_value) const { - const auto& my_value = m_first[i]; - m_reducer.join(red_value, red_value_type{my_value, my_value, i, i}); - } - - KOKKOS_FUNCTION - StdMinMaxElemFunctor(IteratorType first, ReducerType reducer) - : m_first(std::move(first)), m_reducer(std::move(reducer)) {} -}; - -// ------------------------------------------ -// min_or_max_element_impl -// ------------------------------------------ -template

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 z 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 z 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%0ABtf3mR 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 literal 0 HcmV?d00001 diff --git a/doc/src/JPG/pdlammps_fig2.png b/doc/src/JPG/pdlammps_fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..618a83be4c2a7d8404da919425d5d58a2861e184 GIT binary patch literal 2622167 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