Merge remote-tracking branch 'github/develop' into collected-small-changes

This commit is contained in:
Axel Kohlmeyer
2024-06-19 14:46:04 -04:00
33 changed files with 3706 additions and 22 deletions

2
.github/CODEOWNERS vendored
View File

@ -73,6 +73,8 @@ src/MC/fix_sgcmc.* @athomps
src/REAXFF/compute_reaxff_atom.* @rbberger src/REAXFF/compute_reaxff_atom.* @rbberger
src/KOKKOS/compute_reaxff_atom_kokkos.* @rbberger src/KOKKOS/compute_reaxff_atom_kokkos.* @rbberger
src/REPLICA/fix_pimd_langevin.* @Yi-FanLi src/REPLICA/fix_pimd_langevin.* @Yi-FanLi
src/DPD-BASIC/pair_dpd_coul_slater_long.* @Eddy-Barraud
src/GPU/pair_dpd_coul_slater_long.* @Eddy-Barraud
# core LAMMPS classes # core LAMMPS classes
src/lammps.* @sjplimp src/lammps.* @sjplimp

View File

@ -690,7 +690,7 @@ endif()
# packages which selectively include variants based on enabled styles # packages which selectively include variants based on enabled styles
# e.g. accelerator packages # e.g. accelerator packages
###################################################################### ######################################################################
foreach(PKG_WITH_INCL CORESHELL DPD-SMOOTH MC MISC PHONON QEQ OPENMP KOKKOS OPT INTEL GPU) foreach(PKG_WITH_INCL CORESHELL DPD-BASIC DPD-SMOOTH MC MISC PHONON QEQ OPENMP KOKKOS OPT INTEL GPU)
if(PKG_${PKG_WITH_INCL}) if(PKG_${PKG_WITH_INCL})
include(Packages/${PKG_WITH_INCL}) include(Packages/${PKG_WITH_INCL})
endif() endif()

View File

@ -0,0 +1,9 @@
# pair style dpd/coul/slater/long may only be installed if also KSPACE is installed
if(NOT PKG_KSPACE)
get_property(LAMMPS_PAIR_HEADERS GLOBAL PROPERTY PAIR)
list(REMOVE_ITEM LAMMPS_PAIR_HEADERS ${LAMMPS_SOURCE_DIR}/DPD-BASIC/pair_dpd_coul_slater_long.h)
set_property(GLOBAL PROPERTY PAIR "${LAMMPS_PAIR_HEADERS}")
get_target_property(LAMMPS_SOURCES lammps SOURCES)
list(REMOVE_ITEM LAMMPS_SOURCES ${LAMMPS_SOURCE_DIR}/DPD-BASIC/pair_dpd_coul_slater_long.cpp)
set_property(TARGET lammps PROPERTY SOURCES "${LAMMPS_SOURCES}")
endif()

View File

@ -1,5 +1,9 @@
# Plumed2 support for PLUMED package # Plumed2 support for PLUMED package
# for supporting multiple concurrent plumed2 installations for debugging and testing
set(PLUMED_SUFFIX "" CACHE STRING "Suffix for Plumed2 library")
mark_as_advanced(PLUMED_SUFFIX)
if(BUILD_MPI) if(BUILD_MPI)
set(PLUMED_CONFIG_MPI "--enable-mpi") set(PLUMED_CONFIG_MPI "--enable-mpi")
set(PLUMED_CONFIG_CC ${CMAKE_MPI_C_COMPILER}) set(PLUMED_CONFIG_CC ${CMAKE_MPI_C_COMPILER})
@ -153,15 +157,15 @@ else()
file(MAKE_DIRECTORY ${INSTALL_DIR}/include) file(MAKE_DIRECTORY ${INSTALL_DIR}/include)
else() else()
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(PLUMED REQUIRED plumed) pkg_check_modules(PLUMED REQUIRED plumed${PLUMED_SUFFIX})
add_library(LAMMPS::PLUMED INTERFACE IMPORTED) add_library(LAMMPS::PLUMED INTERFACE IMPORTED)
if(PLUMED_MODE STREQUAL "STATIC") if(PLUMED_MODE STREQUAL "STATIC")
include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.static) include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.static)
elseif(PLUMED_MODE STREQUAL "SHARED") elseif(PLUMED_MODE STREQUAL "SHARED")
include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.shared) include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.shared)
elseif(PLUMED_MODE STREQUAL "RUNTIME") elseif(PLUMED_MODE STREQUAL "RUNTIME")
set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}plumedKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_COMPILE_DEFINITIONS "__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}plumed${PLUMED_SUFFIX}Kernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.runtime) include(${PLUMED_LIBDIR}/plumed${PLUMED_SUFFIX}/src/lib/Plumed.cmake.runtime)
endif() endif()
set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_LINK_LIBRARIES "${PLUMED_LOAD}") set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_LINK_LIBRARIES "${PLUMED_LOAD}")
set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_INCLUDE_DIRS}") set_target_properties(LAMMPS::PLUMED PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${PLUMED_INCLUDE_DIRS}")

View File

@ -94,9 +94,10 @@ OPT.
* :doc:`coul/wolf (ko) <pair_coul>` * :doc:`coul/wolf (ko) <pair_coul>`
* :doc:`coul/wolf/cs <pair_cs>` * :doc:`coul/wolf/cs <pair_cs>`
* :doc:`dpd (giko) <pair_dpd>` * :doc:`dpd (giko) <pair_dpd>`
* :doc:`dpd/fdt <pair_dpd_fdt>` * :doc:`dpd/coul/slater/long (g) <pair_dpd_coul_slater_long>`
* :doc:`dpd/ext (ko) <pair_dpd_ext>` * :doc:`dpd/ext (ko) <pair_dpd_ext>`
* :doc:`dpd/ext/tstat (ko) <pair_dpd_ext>` * :doc:`dpd/ext/tstat (ko) <pair_dpd_ext>`
* :doc:`dpd/fdt <pair_dpd_fdt>`
* :doc:`dpd/fdt/energy (k) <pair_dpd_fdt>` * :doc:`dpd/fdt/energy (k) <pair_dpd_fdt>`
* :doc:`dpd/tstat (gko) <pair_dpd>` * :doc:`dpd/tstat (gko) <pair_dpd>`
* :doc:`dsmc <pair_dsmc>` * :doc:`dsmc <pair_dsmc>`

View File

@ -677,7 +677,12 @@ DPD-BASIC package
Pair styles for the basic dissipative particle dynamics (DPD) method Pair styles for the basic dissipative particle dynamics (DPD) method
and DPD thermostatting. and DPD thermostatting.
**Author:** Kurt Smith (U Pittsburgh), Martin Svoboda, Martin Lisal (ICPF and UJEP) Pair style :doc:`dpd/coul/slater/long <pair_dpd_coul_slater_long>` also
includes smeared charges for coulomb interactions and thus requires the
:ref:`KSPACE <PKG-KSPACE>` package to be installed to handle the long-range
Coulomb part of the interactions.
**Authors:** Kurt Smith (U Pittsburgh), Martin Svoboda, Martin Lisal (ICPF and UJEP), Eddy Barraud (IFPEN)
**Supporting info:** **Supporting info:**
@ -686,6 +691,7 @@ and DPD thermostatting.
* :doc:`pair_style dpd/tstat <pair_dpd>` * :doc:`pair_style dpd/tstat <pair_dpd>`
* :doc:`pair_style dpd/ext <pair_dpd_ext>` * :doc:`pair_style dpd/ext <pair_dpd_ext>`
* :doc:`pair_style dpd/ext/tstat <pair_dpd_ext>` * :doc:`pair_style dpd/ext/tstat <pair_dpd_ext>`
* :doc:`pair_style dpd/coul/slater/long <pair_dpd_coul_slater_long>`
* examples/PACKAGES/dpd-basic * examples/PACKAGES/dpd-basic
---------- ----------

View File

@ -0,0 +1,177 @@
.. index:: pair_style dpd/coul/slater/long
.. index:: pair_style dpd/coul/slater/long/gpu
pair_style dpd/coul/slater/long command
=======================================
Accelerator Variants: *dpd/coul/slater/long/gpu*
Syntax
""""""
.. code-block:: LAMMPS
pair_style dpd/coul/slater/long T cutoff_DPD seed lambda cutoff_coul
pair_coeff I J a_IJ Gamma is_charged
* T = temperature (temperature units) (dpd only)
* cutoff_DPD = global cutoff for DPD interactions (distance units)
* seed = random # seed (positive integer)
* lambda = decay length of the charge (distance units)
* cutoff_coul = real part cutoff for Coulombic interactions (distance units)
* I,J = numeric atom types, or type labels
* Gamma = DPD Gamma coefficient
* is_charged (boolean) set to yes if I and J are charged beads
Examples
""""""""
.. code-block:: LAMMPS
pair_style dpd/coul/slater/long 1.0 2.5 34387 0.25 3.0
pair_coeff 1 1 78.0 4.5 # not charged by default
pair_coeff 2 2 78.0 4.5 yes
Description
"""""""""""
Style *dpd/coul/slater/long* computes a force field for dissipative particle dynamics
(DPD) following the exposition in :ref:`(Groot) <Groot5>` with the addition of
electrostatic interactions. The coulombic forces in mesoscopic models
employ potentials without explicit excluded-volume interactions.
The goal is to prevent artificial ionic pair formation by including a charge
distribution in the Coulomb potential, following the formulation of
:ref:`(Melchor) <Melchor>`:
The force on bead I due to bead J is given as a sum
of 4 terms
.. math::
\vec{f} = & (F^C + F^D + F^R + F^E) \hat{r_{ij}} \\
F^C = & A w(r) \qquad \qquad \qquad \qquad \qquad r < r_c \\
F^D = & - \gamma w^2(r) (\hat{r_{ij}} \bullet \vec{v}_{ij}) \qquad \qquad r < r_c \\
F^R = & \sigma w(r) \alpha (\Delta t)^{-1/2} \qquad \qquad \qquad r < r_c \\
w(r) = & 1 - \frac{r}{r_c} \\
F^E = & \frac{Cq_iq_j}{\epsilon r^2} \left( 1- exp\left( \frac{2r_{ij}}{\lambda} \right) \left( 1 + \frac{2r_{ij}}{\lambda} \left( 1 + \frac{r_{ij}}{\lambda} \right)\right) \right)
where :math:`F^C` is a conservative force, :math:`F^D` is a dissipative
force, :math:`F^R` is a random force, and :math:`F^E` is an electrostatic 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.
C is the same Coulomb conversion factor as in the pair_styles
coul/cut and coul/long. In this way the Coulomb
interaction between ions is corrected at small distances r, and
the long-range interactions are computed either by the Ewald or the PPPM technique.
The following parameters must be defined for each
pair of atoms types via the :doc:`pair_coeff <pair_coeff>` command as in
the examples above, or in the data file or restart files read by the
:doc:`read_data <read_data>` or :doc:`read_restart <read_restart>`
commands:
* A (force units)
* :math:`\gamma` (force/velocity units)
* is_charged (boolean)
.. note::
This style is the combination of :doc:`pair_style dpd <pair_dpd>` and :doc:`pair_style coul/slater/long <pair_coul_slater>`.
----------
.. include:: accel_styles.rst
----------
Mixing, shift, table, tail correction, restart, rRESPA info
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
This pair style does not support mixing. Thus, coefficients for all
I,J pairs must be specified explicitly.
This pair style does not support the :doc:`pair_modify <pair_modify>`
shift option for the energy of the pair interaction.
The :doc:`pair_modify <pair_modify>` table option is not relevant
for this pair style.
This pair style does not support the :doc:`pair_modify <pair_modify>`
tail option for adding long-range tail corrections to energy and
pressure.
This pair style writes its information to :doc:`binary restart files
<restart>`, so pair_style and pair_coeff commands do not need to be
specified in an input script that reads a restart file. Note that the
user-specified random number seed is stored in the restart file, so when
a simulation is restarted, each processor will re-initialize its random
number generator the same way it did initially. This means the random
forces will be random, but will not be the same as they would have been
if the original simulation had continued past the restart time.
This pair style can only be used via the *pair* keyword of the
:doc:`run_style respa <run_style>` command. They do not support the
*inner*, *middle*, *outer* keywords.
----------
Restrictions
""""""""""""
This style is part of the DPD-BASIC package. It is only enabled if
LAMMPS was built with that package. See the :doc:`Build package
<Build_package>` page for more info.
The default frequency for rebuilding neighbor lists is every 10 steps
(see the :doc:`neigh_modify <neigh_modify>` command). This may be too
infrequent since particles move rapidly and
can overlap by large amounts. If this setting yields a non-zero number
of "dangerous" reneighborings (printed at the end of a simulation), you
should experiment with forcing reneighboring more often and see if
system energies/trajectories change.
This pair style requires you to use the :doc:`comm_modify vel yes
<comm_modify>` command so that velocities are stored by ghost atoms.
This pair style also requires the long-range solvers included in the KSPACE package.
This pair style will not restart exactly when using the
:doc:`read_restart <read_restart>` command, though they should provide
statistically similar results. This is because the forces they compute
depend on atom velocities. See the :doc:`read_restart <read_restart>`
command for more details.
Related commands
""""""""""""""""
:doc:`pair_style dpd <pair_dpd>`, :doc:`pair_style coul/slater/long <pair_coul_slater>`,
:doc:`pair_coeff <pair_coeff>`, :doc:`fix nvt <fix_nh>`, :doc:`fix langevin <fix_langevin>`,
:doc:`pair_style srp <pair_srp>`, :doc:`fix mvv/dpd <fix_mvv_dpd>`.
Default
"""""""
is_charged = no
----------
.. _Groot5:
**(Groot)** Groot and Warren, J Chem Phys, 107, 4423-35 (1997).
.. _Melchor:
**(Melchor)** Gonzalez-Melchor, Mayoral, Velazquez, and Alejandre, J Chem Phys, 125, 224107 (2006).

View File

@ -172,6 +172,7 @@ accelerated styles exist.
* :doc:`coul/wolf <pair_coul>` - Coulomb via Wolf potential * :doc:`coul/wolf <pair_coul>` - Coulomb via Wolf potential
* :doc:`coul/wolf/cs <pair_cs>` - Coulomb via Wolf potential with core/shell adjustments * :doc:`coul/wolf/cs <pair_cs>` - Coulomb via Wolf potential with core/shell adjustments
* :doc:`dpd <pair_dpd>` - dissipative particle dynamics (DPD) * :doc:`dpd <pair_dpd>` - dissipative particle dynamics (DPD)
* :doc:`dpd/coul/slater/long <pair_dpd_coul_slater_long>` - dissipative particle dynamics (DPD) with electrostatic interactions
* :doc:`dpd/ext <pair_dpd_ext>` - generalized force field for DPD * :doc:`dpd/ext <pair_dpd_ext>` - generalized force field for DPD
* :doc:`dpd/ext/tstat <pair_dpd_ext>` - pairwise DPD thermostatting with generalized force field * :doc:`dpd/ext/tstat <pair_dpd_ext>` - pairwise DPD thermostatting with generalized force field
* :doc:`dpd/fdt <pair_dpd_fdt>` - DPD for constant temperature and pressure * :doc:`dpd/fdt <pair_dpd_fdt>` - DPD for constant temperature and pressure

View File

@ -14,3 +14,5 @@ pair styles from the DPD-BASIC package.
4) 'dpdext_tstat' - coarse-grained SPC/E water example for 'dpd/ext/tstat' pair style 4) 'dpdext_tstat' - coarse-grained SPC/E water example for 'dpd/ext/tstat' pair style
(in.dpdext_tstat), an initial configuration (dpdext.data) and tabulated potential (in.dpdext_tstat), an initial configuration (dpdext.data) and tabulated potential
(cg_spce_table.pot) obtained by bottom-up coarse-graining of the atomistic SPC/E water. (cg_spce_table.pot) obtained by bottom-up coarse-graining of the atomistic SPC/E water.
5) 'dpd_coul_slater_long' - simple example (DPD ionic fluid) for 'dpd/coul/slater/long' pair style (in.dpd_coul_slater_long).

View File

@ -0,0 +1,779 @@
LAMMPS data file via write_data, version 17 Apr 2024, timestep = 1394, units = lj
375 atoms
3 atom types
0 5 xlo xhi
0 5 ylo yhi
0 5 zlo zhi
Masses
1 1
2 1
3 1
PairIJ Coeffs # dpd/coul/slater/long
1 1 78 4.5 yes 1
1 2 78 4.5 yes 1
1 3 78 4.5 yes 1
2 2 78 4.5 no 1
2 3 78 4.5 no 1
3 3 78 4.5 no 1
Atoms # full
189 0 1 0 0.8621554018960034 1.5213257556560191 0.4064444607843129 0 1 0
107 0 1 0 2.040249318291146 0.3862591116608294 1.8661957131854634 0 0 0
253 0 1 0 3.511834308089607 0.7338273870464224 0.801173549802059 0 1 1
163 0 1 0 2.303289649738226 0.6809493239075631 0.7383435796468727 0 1 0
26 0 1 0 0.03534770106704549 1.4889933012536283 1.4815498922617432 0 0 0
27 0 1 0 4.170525658289272 1.8438490221677797 2.1918634082517614 -1 0 0
56 0 1 0 2.9501314702448633 2.322938987390429 0.6158870411938201 0 0 0
167 0 1 0 1.948558457807243 0.1261294591496785 0.039492485708843984 0 1 0
364 0 3 -1 4.538825953029656 0.2655458359259118 2.131668601530241 0 1 0
61 0 1 0 4.645784299395809 0.3574274125207269 1.7056474795918568 -1 0 0
222 0 1 0 4.41481966340897 2.262979887349817 1.1679075968940398 0 0 0
332 0 2 1 3.853874714249102 0.1758912358513287 0.8799773810713412 0 1 0
1 0 1 0 4.608301143657016 1.4090100132224024 1.218887039455649 -1 0 0
319 0 2 1 3.732213186171727 0.981827023519373 2.3857377768158727 -1 0 0
53 0 1 0 2.380311878254328 0.953677113042391 1.8268738776443192 0 0 0
68 0 1 0 0.33279009298924916 1.0106375746131884 0.7038515854567269 0 0 0
220 0 1 0 1.1094848303775686 2.378414106514282 1.4793246435196352 1 0 0
44 0 1 0 0.12449238274832848 1.7475396894040345 0.5495194876290164 0 0 0
55 0 1 0 0.1451415441609303 2.337329820574407 0.940744164662616 0 0 0
362 0 3 -1 1.2987762452744613 1.8352325797868587 1.1809674941775483 0 0 0
165 0 1 0 0.6610209400465688 2.22554349560855 1.971912177574677 0 0 0
60 0 1 0 1.8643313870571518 0.6352678895179578 1.4416996493100478 0 0 0
202 0 1 0 0.007896731087640774 1.5385720917803027 0.18965671583085075 0 1 0
85 0 1 0 1.5630176980330266 1.1482985441214197 2.019916217302335 1 0 0
73 0 1 0 0.5556133646182337 1.6170466333456652 2.101792903006452 0 0 0
96 0 1 0 1.6611967219346682 0.07688637034882238 0.46572063062814617 0 0 1
30 0 1 0 0.46644353751713447 1.8254820637852556 1.2380479793915407 1 0 0
67 0 1 0 3.4270812515248483 2.350996339385886 1.77527952461483 0 0 0
349 0 3 -1 1.7935506583370944 1.7235931740659332 0.4478371869612185 1 0 0
132 0 1 0 4.951074988035153 1.5039089286454406 2.4219801232797398 -1 0 0
328 0 2 1 0.8958492991096989 1.2809413147557527 1.0440931858570435 0 0 1
161 0 1 0 4.798276598985588 0.9882558902185279 2.462987088497934 0 1 0
185 0 1 0 0.6126520391294695 0.04940161418784647 0.6135262263024062 0 1 0
219 0 1 0 1.647872968759676 2.305100092833184 2.0217182617222096 0 0 0
8 0 1 0 2.8077478718165207 0.7661158156519451 1.3602857540877684 0 0 0
69 0 1 0 2.8568644931819835 0.13340029053585767 2.106212637519767 0 0 0
3 0 1 0 1.908450187819087 2.298808713848062 0.4221817812562634 0 0 0
7 0 1 0 1.8799145446976495 0.9814789886011673 0.955308672406064 0 0 0
329 0 2 1 0.9727877144189607 0.8906662949552561 1.4472553696387669 0 1 0
174 0 1 0 3.9905681672951636 0.6401683928312465 1.0284041192891435 -1 1 0
20 0 1 0 3.392515194191721 2.0774851454870427 0.8812446323305514 0 0 0
57 0 1 0 4.874212056539195 0.13899230379169403 0.7199140773346149 0 0 0
325 0 2 1 1.362093021934204 2.3422237404192465 0.6655225660551776 0 0 1
40 0 1 0 4.306473534903154 1.7047871476017826 0.8560715024613603 0 0 0
51 0 1 0 2.297377802384159 0.11499650506694176 1.4731005354419167 0 0 0
54 0 1 0 2.971300335884777 1.8792385205105047 1.3973014092900102 0 0 0
186 0 1 0 3.583414064904102 1.7542346893771112 0.35130247738019466 0 0 0
289 0 1 0 2.5651653875350906 1.4858962835620086 0.6587351599193196 0 0 1
75 0 1 0 3.132107705055228 0.19794042232605677 0.44488993973642094 0 0 1
48 0 1 0 3.4384178020381717 0.7217742755424055 1.7304812232062636 0 0 0
66 0 1 0 3.191389133037332 1.1674191637093172 1.7413707516914332 0 0 0
52 0 1 0 1.856006413772654 1.871405713016935 1.5164995404363106 0 0 0
158 0 1 0 3.725559226243618 1.2320067990055215 0.4240371305587515 -1 1 0
330 0 2 1 0.4226192821951129 0.22648053650193767 0.04025715930862768 1 1 0
359 0 3 -1 4.4476116877707925 0.8271711042623823 1.1688054720798116 0 1 0
366 0 3 -1 0.13989896192253948 0.6502137062351493 0.845841913773404 1 1 0
196 0 1 0 0.21878194805964699 2.4139077401885523 1.602735237996178 1 0 0
128 0 1 0 2.474112780481313 1.5036993910540244 1.234391076605564 0 0 1
118 0 1 0 0.1703454662324439 0.9401878407982331 0.17224714060344348 0 0 1
43 0 1 0 3.708324777814944 2.4767443359210524 0.5791362456922102 0 0 0
184 0 1 0 0.4061592126934206 0.22209165285150972 1.3598048859115588 0 1 0
360 0 3 -1 1.225690366400486 0.4472136514952278 1.0864811555493794 0 1 0
64 0 1 0 2.6116937036965266 1.793563094424563 2.091822223631947 0 0 0
285 0 1 0 0.7747031518566616 0.24118573693540882 2.1434463705260494 0 1 0
58 0 1 0 1.598997109049339 1.2355543729347458 1.1437352681100093 0 0 0
257 0 1 0 0.02882436640692898 0.8179392413775496 1.6880006059524528 1 1 0
356 0 3 -1 2.0441963785801733 1.236982129976697 2.2147135788798726 0 0 0
100 0 1 0 3.653446945164378 0.3462603812889145 1.6428480228892703 0 0 0
121 0 1 0 3.3427026587713 1.3818800793465942 1.0715223415915789 0 0 1
130 0 1 0 3.3647959804349648 1.6468424783155522 2.142743574286686 0 0 1
238 0 1 0 1.3459228411155364 0.633596613028775 2.1301210835283637 0 1 0
211 0 1 0 0.6615598402766512 2.33271179551025 0.47581804017205676 1 0 0
208 0 1 0 2.962020456626749 0.2159270527386094 1.30534135402314 0 1 0
63 0 1 0 1.3612122125160733 0.010635376740000254 1.5982897032081793 0 0 0
22 0 1 0 4.210300352056279 0.36529901441609736 0.22595511161653342 0 0 0
355 0 3 -1 1.2042503283777344 1.597276477439138 1.9589099368399292 0 0 0
70 0 1 0 4.378695647703822 2.2211752925991073 0.5054248018357668 0 0 0
65 0 1 0 4.730200694542147 1.8860651406962996 1.9541188923646609 0 0 0
182 0 1 0 0.6006579892093956 1.0766698682185656 1.8982320873119558 0 1 0
188 0 1 0 3.968278800401347 2.2778420975676017 1.5855956915283134 -1 0 0
35 0 1 0 2.223480574739111 2.044750380955685 1.1501174861326973 0 0 0
6 0 1 0 4.393818207857278 0.9691596735067866 0.4973738964333318 0 0 0
346 0 3 -1 1.799292171051204 0.9378491451956622 0.32819450450408366 0 0 0
14 0 1 0 4.116276227278533 0.9144868046413738 1.9001996318293624 0 0 0
15 0 1 0 4.057083687324151 1.5512296337030849 1.8388944544921122 0 0 0
16 0 1 0 3.82411370026405 1.5506478336832812 1.2725337401183239 0 0 0
287 0 1 0 2.6387027215894454 1.893079917045916 0.49300315071401646 0 0 1
81 0 1 0 0.23374890251430025 0.34479122000015083 2.377074044522331 1 0 0
114 0 1 0 2.97788308248854 0.8029642133737654 0.43679357743492564 0 0 1
232 0 1 0 1.1637120121074183 0.7914170906883582 0.5169414304881136 1 1 1
50 0 1 0 1.3582030484899448 1.733969902734067 2.475757370252963 0 0 -1
79 0 1 0 4.002398001699839 2.453310546669259 2.3569732163529196 0 0 0
74 0 1 0 2.5693171940612936 0.3236751012125613 0.052755933881527994 0 0 1
194 0 1 0 2.8970695996535842 1.3203227830648074 2.4866087995688972 0 0 0
133 0 1 0 2.6178632265286743 1.0115830273791913 0.19081692003348572 0 0 1
311 0 1 0 3.3683313684704523 1.1471203834722834 0.04523595785096113 0 1 1
115 0 1 0 0.43505007353257874 2.385803272207332 0.02841287624716582 0 0 1
4 0 1 0 4.3073950086925725 2.400627067573385 4.56127636601268 -1 0 -1
151 0 1 0 0.6919123879927325 2.1849820555988084 3.5078472275384267 0 0 0
306 0 1 0 0.5589151617318056 0.058029533314856774 4.427085995859885 0 1 0
138 0 1 0 1.7147207261520883 1.4323880737092538 3.757478681577442 0 0 0
110 0 1 0 1.3876397037618702 1.3714565550984217 4.5219172301432895 0 0 0
251 0 1 0 2.788428291071368 2.3409448558940977 3.4381375025566263 0 0 0
331 0 2 1 2.838525921735314 0.09442598845901452 3.3146265769160324 0 1 0
243 0 1 0 4.489290143790526 2.26853729359999 3.7839844553823094 0 0 0
156 0 1 0 0.23302160032454478 1.3603287603692662 4.342729568698205 1 1 -1
32 0 1 0 2.081389395149717 0.4938421510915584 2.707994013583073 0 0 0
205 0 1 0 0.09940021857353744 2.408012210772126 3.2074615425616426 0 0 0
41 0 1 0 4.323708181823033 0.4958928465474822 2.525689303250374 0 0 0
28 0 1 0 4.717322170568759 1.0215969335342936 3.32138298357052 -1 0 -1
322 0 2 1 2.2029274368349303 2.0230576314539634 3.254975041225457 0 0 0
103 0 1 0 3.4039994449255992 0.5284405133705601 4.809880920488395 0 0 0
353 0 3 -1 1.1636351711418296 1.6849823280188108 3.628904996363181 0 0 0
295 0 1 0 2.015582444660267 2.152457218882018 4.802270482662931 0 0 0
365 0 3 -1 0.1355221924615853 0.6843479265638512 3.832358314244189 0 0 0
98 0 1 0 2.5146420394624114 1.4050031824562241 2.965312255745623 0 0 0
33 0 1 0 2.3626541269063335 0.301607887792709 4.126675184172655 0 0 0
39 0 1 0 1.0864796756700101 0.14884263883618853 3.538403788545902 0 0 -1
343 0 2 1 1.4514575528852092 0.7274022675751877 4.022000140293159 0 1 0
259 0 1 0 3.655779855306037 1.3576945405765304 3.834017837247726 0 0 0
77 0 1 0 0.8784812240014032 1.3079405939838267 3.865082861143354 1 0 0
140 0 1 0 0.8162940643502995 1.1305386542609035 4.8092097458556715 0 0 0
111 0 1 0 4.795245146003238 1.9956723305718642 3.9129401250192046 0 0 0
129 0 1 0 0.34843108982968385 0.5298485948666217 2.8292148084141364 0 0 0
317 0 2 1 4.124560425539725 0.9992026808502931 4.821938521772994 0 0 -1
25 0 1 0 2.8922318837378698 0.9335539802277806 4.287158919025898 -1 0 -1
21 0 1 0 4.585171090824654 1.3705322366558885 4.19496485298651 0 0 -1
276 0 1 0 2.403137350597824 1.5009012449757657 3.808385508050605 0 0 0
160 0 1 0 2.937633869764959 0.00248285164262807 4.155863012635541 0 1 -1
308 0 1 0 2.007117640798801 0.07533937286437335 3.949461187876648 0 1 0
313 0 1 0 3.138628385914381 0.06932121228333508 4.61254641181726 0 1 0
71 0 1 0 0.7604830442534299 1.8783527414570997 4.529066129071014 0 0 -1
42 0 1 0 0.8786351691021071 1.5220089570408293 2.909825736835378 0 0 0
83 0 1 0 2.268823589694475 0.8105925806076607 3.3728322715236114 0 0 0
123 0 1 0 1.7884920869805707 1.339956019375266 2.861286357841185 0 0 0
29 0 1 0 4.460413120634612 1.661186434187469 2.731131826280074 0 0 0
291 0 1 0 0.0035749317593865015 0.21166749654426853 3.275077495308186 1 1 0
299 0 1 0 0.6601895850752213 0.7060682406274252 3.722602054061811 0 1 0
87 0 1 0 3.635932620062484 1.4708618427874118 4.477899978536171 0 0 0
78 0 1 0 1.5540100281849198 2.289959113070306 3.8245622090496108 0 0 0
5 0 1 0 2.937548438619819 2.211877405174181 2.85571535820357 0 0 0
95 0 1 0 3.105981604150784 2.188298914603185 4.094702761761116 0 0 0
352 0 3 -1 0.11773003147587424 1.9458234584845089 4.811739126011424 0 0 0
281 0 1 0 1.1502488869841234 0.20873030537461357 4.295523149721441 1 1 0
206 0 1 0 3.330001486381421 1.53529174323865 3.1417824971878447 0 0 0
241 0 1 0 3.878317992103332 2.023909280872213 4.783549131197242 0 0 0
109 0 1 0 2.580544454574246 2.2025316047831676 4.264813345165653 0 0 0
126 0 1 0 2.6463397268489866 0.7745950386723881 3.699331340328284 0 0 0
62 0 1 0 0.10088965537315422 1.464964032622401 3.4200098453857786 0 0 -1
145 0 1 0 4.7108240170803874 2.1614660538205466 3.070399886653731 -1 0 0
354 0 3 -1 1.610893620580725 0.7512309895438358 3.571881076052697 0 0 0
248 0 1 0 2.3260578668858516 2.409053529199307 3.878500098271755 0 0 0
278 0 1 0 1.0565916295142963 0.21636101668521504 2.9280061580151355 1 1 0
334 0 2 1 3.3217760513533556 0.20221074730138347 3.857259461716569 0 0 0
344 0 2 1 2.145759202198284 0.8646312386735645 4.34482845102358 0 0 0
84 0 1 0 3.310133712882211 0.8325063678401754 3.1928917336760043 0 0 0
135 0 1 0 0.5746060669769325 0.007152134736939431 3.7081262585514363 1 0 0
124 0 1 0 1.5924837125088054 2.3295502621690507 3.1555629363203055 0 0 0
301 0 1 0 1.3559071869586012 2.104676990793624 4.2855408539569995 0 0 0
221 0 1 0 4.025760501970453 0.12181323773082332 4.427152392469986 0 1 -1
149 0 1 0 1.288517578213514 1.1078634671167045 3.0983488547366833 -1 1 -1
235 0 1 0 3.722079255584157 0.731147796276342 4.106075812812072 0 1 0
268 0 1 0 4.725777687386199 0.0696714424235374 3.965580233489741 -1 1 0
229 0 1 0 4.9205143154909035 0.5378937212478773 4.686090920391123 0 1 -1
144 0 1 0 4.391887063016131 1.3427912572926557 3.770425380327373 0 0 0
142 0 1 0 1.8346060623646443 0.7517320991384026 4.677813188511546 0 0 0
119 0 1 0 3.2188591291035764 1.8480317120563596 4.70754013191232 0 0 0
218 0 1 0 4.590989187547614 0.7832518807186819 4.248448878177557 -1 1 -1
269 0 1 0 3.83528197952535 2.2671443874151396 3.9458234070905074 0 0 0
171 0 1 0 1.1367690782529518 0.30653599490724565 4.981237832751898 0 1 -1
347 0 3 -1 2.730105013349213 1.5732651978450825 4.737616332834529 0 0 -1
117 0 1 0 2.893231454879688 1.6327429583278301 3.809375824669355 0 0 0
244 0 1 0 1.903054222598179 1.4266071609686257 4.248317450667845 1 0 0
46 0 1 0 0.6110511992687845 0.9392825733011035 4.4718586456826115 1 0 -1
97 0 1 0 3.9786678543088594 1.7659872954929934 3.352752402727882 0 0 0
155 0 1 0 3.5064237015545134 2.2748461716495725 3.3907408576276095 0 0 0
190 0 1 0 3.6257913177213887 1.8596172005909988 2.624582193387495 0 0 0
141 0 1 0 4.133819851057611 1.125460792510254 2.8214638820568316 0 0 0
261 0 1 0 0.48116423022710325 1.98166727716818 4.003063462271802 1 1 0
92 0 1 0 3.749162681150054 0.5480152103582329 3.44882074629632 0 0 0
327 0 2 1 4.261412399401647 0.5826170932678485 3.573292268629846 0 0 0
337 0 2 1 1.6827282642347854 0.2789473832751784 2.9589468652224666 0 1 0
45 0 1 0 0.31403607701825803 1.3800214560597042 2.9837533879244087 1 0 0
200 0 1 0 1.995256276504289 1.4516800278315318 4.898899074068972 0 1 -1
19 0 1 0 1.2925196386926214 2.321053353209675 4.936516373289165 0 0 -1
137 0 1 0 0.8617630289962365 2.28834525235633 2.787630960107895 0 0 0
127 0 1 0 0.19137038400231676 2.1505994041298755 2.5584316139464898 1 0 0
9 0 1 0 4.475150825165361 1.5978909296640629 4.832730899627523 -1 0 -1
122 0 1 0 0.6525439970988997 0.9547926616198447 2.731781719219051 0 0 1
213 0 1 0 4.260400034205448 0.19910770741166325 2.9310219053551076 0 1 0
136 0 1 0 2.2005511013729873 1.8455801462092951 2.556685426816697 0 0 0
37 0 1 0 3.4251867503322573 0.6527991402153643 2.527078438582748 0 0 0
34 0 1 0 2.9175944797670583 0.13654347040781536 2.8820983415866803 0 0 0
217 0 1 0 2.6954995241935262 0.7710325900782893 2.5236360609937285 0 0 0
250 0 1 0 3.6726666633431457 4.6018232175750455 1.320473043522378 0 0 1
166 0 1 0 4.7009740947187035 3.7966019637038317 2.3031579729427096 0 0 0
150 0 1 0 0.04748930775599636 4.455597613980116 1.8427292493854273 0 0 0
368 0 3 -1 2.4584991330272654 3.7591217299647854 0.426379021376866 0 0 1
339 0 2 1 4.156459282343587 3.061985537069849 1.9932515879322967 0 0 0
340 0 2 1 1.9850368150824245 4.230758829154677 0.5294221302127794 0 0 1
338 0 2 1 0.9865267877252728 4.5330122869142055 1.0314881718061573 0 0 0
201 0 1 0 3.4754534022764494 3.0217470705506297 1.6935508350107573 0 0 0
101 0 1 0 2.4842203411723074 4.89685402639858 2.0242798213421707 0 -1 0
209 0 1 0 0.013989467358051372 4.330201393745349 0.7846247571577325 0 0 0
168 0 1 0 3.6350006680732463 4.754122434939927 0.3223377232438807 0 0 0
216 0 1 0 2.9114246475391328 3.433945937453107 1.8710068661397548 0 0 0
203 0 1 0 1.3574269717949698 4.456732218277533 1.5387489126454328 0 0 0
179 0 1 0 0.522179118267259 2.8689808625572804 0.9077030710981577 0 0 0
181 0 1 0 3.6672727729190364 3.878549463830204 1.3381224951621222 0 0 0
236 0 1 0 4.185529129045369 4.161219716693221 2.3595808103262947 0 0 0
18 0 1 0 1.9980056628841183 4.320068243150856 1.6822915445402666 0 -1 0
363 0 3 -1 2.235554720706489 2.906908244875693 1.036143254738836 0 0 0
198 0 1 0 0.5887731317025171 3.6812050133593415 0.29825916210104214 1 0 0
146 0 1 0 4.960647912886466 3.5092208739797943 1.7004652621516252 0 -1 0
284 0 1 0 0.7836145638659848 4.548012471030345 0.34455457204719553 0 0 1
207 0 1 0 0.7814740880134713 3.3714021164537535 1.118310228903454 0 0 0
183 0 1 0 1.7161486342210968 3.5481236466130888 1.4041933001601494 0 0 0
90 0 1 0 3.016201247291213 2.9587290353837226 0.5684151813116627 0 0 1
159 0 1 0 2.232365423522552 2.6465053064946784 0.3759996466051841 0 0 0
274 0 1 0 0.5881709093591322 4.080889794199071 2.280264861574092 0 0 0
303 0 1 0 3.246061664307446 4.37314477200102 0.7856213092562913 0 0 1
315 0 1 0 0.35327667038742755 3.029146608728807 0.0791450986650732 0 0 1
11 0 1 0 1.8285612986193809 3.353968071719668 0.5643737651851671 0 0 0
176 0 1 0 0.2508944492255997 3.000972330471306 2.0071913487423076 0 0 0
304 0 1 0 3.0726902044877265 4.647914126011872 0.9996827940171641 0 0 1
143 0 1 0 3.9352261868949907 3.898490778762382 0.7840306203684324 -1 0 1
275 0 1 0 3.0573248045448427 3.8840876505181687 1.5573196095677335 0 0 0
242 0 1 0 0.4226727582609528 4.737822957131883 1.387223661593226 1 0 0
169 0 1 0 0.620846920150785 3.1839828246731394 2.426601824718326 0 0 0
86 0 1 0 1.5665987066447504 4.978509835006031 2.1415023910919806 0 -1 0
333 0 2 1 2.445920926535492 4.47766917410732 1.1358754296155358 0 0 0
294 0 1 0 1.1981531521673625 2.8049885346916006 2.111987077826676 1 0 0
310 0 1 0 1.9298476539189637 4.937913932158907 1.030730042471827 0 0 1
192 0 1 0 4.108736026656326 4.6378045277922135 1.671217346737129 0 0 0
280 0 1 0 1.8281315737488533 2.7749825164949944 1.6554178103691615 0 0 0
164 0 1 0 1.3010575917308485 4.494402162669739 0.041752472824225825 0 0 0
170 0 1 0 3.650388228932189 2.9899308003889966 1.067251647123858 0 0 0
256 0 1 0 0.3339581189133178 3.843411762565409 0.9273636798830823 1 0 1
305 0 1 0 1.025180078056553 3.006380787860488 0.2873424831400842 0 0 1
321 0 2 1 1.3189364418815286 3.4276539374299775 2.089591655927524 0 0 0
147 0 1 0 1.1461014570579835 3.8511084209677513 0.7525062047220421 0 0 0
204 0 1 0 1.5112706244387488 2.8188173134434136 0.974908694884752 0 0 0
215 0 1 0 2.343066001179666 3.1978495580526083 1.8659131264876065 0 0 0
307 0 1 0 0.6571664267721125 3.1829219496620875 1.6123833084425085 0 0 0
230 0 1 0 1.691826706532908 4.328533707881519 0.9338934645265112 0 0 0
357 0 3 -1 0.9424908379877175 4.354374546920949 1.9334517447934154 1 -1 0
273 0 1 0 2.7367589344269287 4.456539476093516 0.09405577094510116 0 0 1
104 0 1 0 4.8224729965828805 2.532966442497679 2.359616149253149 -1 -1 0
326 0 2 1 3.205170108738211 3.657764190269539 0.6059860569327459 0 0 1
153 0 1 0 2.492658010069284 2.5549338497141174 2.359226108751561 0 0 0
10 0 1 0 3.8691461518549306 3.358206982770836 0.5857517185532839 0 0 0
17 0 1 0 1.4938724652414974 3.6267684500076256 0.6528239210562307 0 0 0
172 0 1 0 2.222730505934896 3.9294618789141045 1.857472216603435 0 0 0
187 0 1 0 4.12882439435804 4.373709089764649 0.7735950113473502 0 0 0
246 0 1 0 2.819371376884619 2.580827865657106 1.2982493640886932 0 0 0
175 0 1 0 3.6037043838950598 3.9741874494279883 2.1537260234843565 0 0 0
233 0 1 0 2.4936360109190447 3.7461714899270047 1.0175156445748128 0 0 1
197 0 1 0 4.513537428106752 3.877838158564245 0.23454380025260257 0 0 0
36 0 1 0 4.75739982448861 2.993089291142829 1.2955298606828172 0 0 0
157 0 1 0 4.577486719825762 2.5548383034837867 0.24912616922292966 -1 0 0
212 0 1 0 3.0478551135031786 3.2498317267851125 1.1259910025155964 0 0 0
369 0 3 -1 1.3808431418191394 3.7792710503646454 1.4792791648287753 0 0 0
225 0 1 0 0.5765924415162327 3.9233350563958895 1.5040765765770432 0 0 0
88 0 1 0 1.7263407212681612 4.0160590932504725 2.4625624343301684 0 -1 0
180 0 1 0 2.957032676177556 4.366369702631684 1.8084697653437938 0 0 0
228 0 1 0 4.007414662615488 3.641531116903689 1.6104136392925874 0 0 0
296 0 1 0 4.449577191326246 2.7185852714293324 1.5770958226540965 0 0 1
309 0 1 0 4.193664393097815 3.195309236798277 0.013138071944119596 0 0 1
316 0 2 1 4.8850975785077875 3.1181643275208497 0.4988834454683537 0 0 0
282 0 1 0 4.547534798722087 4.098196657638136 1.3514482711905391 -1 0 0
223 0 1 0 4.070573701500224 3.0161107941779735 1.0525783618149982 0 0 0
112 0 1 0 0.40619378501741044 4.581496953329872 2.4303817659862164 1 -1 0
89 0 1 0 1.1309601445791022 2.8935782083274892 1.0807782088379005 0 0 0
191 0 1 0 3.307024885373677 4.7782882192530485 2.015572284198738 0 0 0
237 0 1 0 4.748120043170084 3.725460808317568 0.9522577175239182 0 0 0
226 0 1 0 3.818166049029603 4.848449417426425 2.3600959505179793 0 0 0
231 0 1 0 3.0678050795347436 2.5699968710786734 2.0631097277316033 0 0 0
49 0 1 0 2.4740584898343307 4.766019947430475 0.6261200658844492 0 -1 0
375 0 3 -1 3.3298272958028243 2.9611113328638377 0.026915061404104934 0 0 1
265 0 1 0 1.84918915840028 3.334712440161601 2.324387380119898 0 0 0
193 0 1 0 0.2324107132082972 4.337276389235211 0.15737812733136072 0 0 0
318 0 2 1 4.741026775461015 4.950744240431997 0.09991000779517484 0 -1 0
38 0 1 0 4.567313389179671 4.564683120735231 2.2383375090123745 0 -1 0
195 0 1 0 4.276432197666434 4.550778719775141 0.01705180460738089 -1 0 0
224 0 1 0 4.512998770219293 4.930686914076221 1.3263777979979738 0 0 0
139 0 1 0 2.3611855680314053 2.5238664431540845 1.7400861072101907 0 0 0
102 0 1 0 1.3179823049817583 4.634953041690075 2.4318467808197792 0 -1 0
263 0 1 0 1.7520030887065592 2.504606951431736 2.4950818538423345 0 0 0
361 0 3 -1 4.0568544056493225 3.3144731773008287 2.4514614954683602 -1 0 0
298 0 1 0 2.2362905839125626 4.407255609537625 2.480448696532583 0 0 0
106 0 1 0 0.017457347778004895 4.764685683823287 3.185502158549636 1 -1 0
288 0 1 0 1.4779816621680442 4.314571361320767 3.1205014313954074 0 0 0
320 0 2 1 0.07352439249274566 2.7314754874268874 4.438222837395544 0 0 0
12 0 1 0 0.8318394760130385 3.0151110605041334 4.63155060662692 0 0 -1
350 0 3 -1 3.745719265020869 3.633969589456328 4.863558280777614 0 0 -1
255 0 1 0 3.7208321476425765 2.5430981712665512 4.92336590272389 0 0 0
264 0 1 0 0.6187322774863372 4.591988430718435 2.99409822364528 0 0 0
131 0 1 0 1.2363781535890241 3.269322268996143 2.994313299793769 0 -1 0
271 0 1 0 1.547729125698992 3.0254742510247556 3.7969510998815252 0 0 0
239 0 1 0 2.9727140078350547 4.458728462772902 2.589816182926471 0 0 0
247 0 1 0 4.723447954180547 4.559587825067703 4.2844794465287395 -1 0 0
336 0 2 1 4.30377897745755 3.6083219532870245 3.0751026181087915 -1 0 0
80 0 1 0 3.9139985069210037 4.2026902501983585 3.687780496901057 0 -1 0
351 0 3 -1 2.3310951879832125 4.1532874672431905 3.1481350248436812 0 -1 0
345 0 2 1 2.1434754823364397 3.630858480566402 4.76111427884395 0 0 0
23 0 1 0 0.1116865464821783 3.425858998459883 3.8315121362406237 1 0 -1
372 0 3 -1 0.2013553605339663 4.542002104842189 4.709301425799447 0 0 0
374 0 3 -1 4.681869085817003 3.6012197326454385 3.5343842160338768 -1 0 0
99 0 1 0 2.0103450534211995 4.916636042614968 2.7722290840703248 0 -1 0
134 0 1 0 1.2868072532982127 3.6027664980659657 4.834686879117821 0 0 0
94 0 1 0 3.4969553288958197 4.191479164754045 3.257611668733077 0 -1 0
108 0 1 0 1.069116967523645 3.8915098801681096 3.4741345909171617 0 -1 0
116 0 1 0 1.7110071948939123 3.003308695307758 4.880957418376936 0 0 0
47 0 1 0 0.6144957209089892 4.086034990124086 3.6421216730599935 0 -1 0
177 0 1 0 1.9967818019099437 4.223293250522419 4.123286584622672 0 0 -1
154 0 1 0 2.9241663178555766 3.006235461853767 2.736488872218668 0 0 0
272 0 1 0 3.6421402582975864 3.397998711089007 3.420005877158591 0 0 0
292 0 1 0 0.9456777627899714 2.854242407065964 3.6713102734015375 0 0 0
348 0 3 -1 3.602827568682842 4.841299797785864 3.0727220886411226 0 -1 0
113 0 1 0 4.09715162476059 4.796283984467532 3.6675472388615478 0 -1 0
76 0 1 0 3.0081758606102404 4.473089701483304 3.4619137215698026 0 -1 0
178 0 1 0 0.1695480127810721 4.181202627391224 3.659798577645965 1 0 -1
82 0 1 0 4.308822049710188 2.5505905907422872 2.8631988472742047 0 -1 0
358 0 3 -1 3.000038253202886 3.679700145601949 3.1009139360007207 0 -1 0
302 0 1 0 0.8272609584103479 4.003958148100786 4.445729848848656 0 0 0
13 0 1 0 3.9722298533039946 4.5610720224823025 4.234031447999139 -1 -1 -1
72 0 1 0 4.772965920074378 3.1606932108115786 2.6365859592135936 -1 -1 0
245 0 1 0 2.197144845045862 4.9556893549684515 3.4030216646163236 0 0 0
234 0 1 0 1.6678259516197003 2.9505643678051627 4.390951365364965 0 0 0
300 0 1 0 1.6328211445692586 4.819932075478693 4.586452176846693 0 0 0
105 0 1 0 1.892439317939264 4.041167636776589 4.848755937425436 0 -1 0
254 0 1 0 1.9694419982366302 2.9792140111735144 3.3447749736668477 0 0 0
371 0 3 -1 0.7643208588903881 2.802514146046753 4.3289561641866845 1 0 0
262 0 1 0 3.7153807374055208 2.9342246849719764 3.2753284900477935 0 0 0
266 0 1 0 1.0036319050407299 3.924029109027026 2.765363860481497 0 0 0
31 0 1 0 3.2842646038163683 3.4104333522804806 4.272304684998637 -1 0 -1
267 0 1 0 0.3478333275641798 3.7705819143047163 4.485021488086793 1 0 0
290 0 1 0 3.1115982282440853 2.9295831819273586 3.5626146396041767 0 0 0
324 0 2 1 2.771587476254712 3.9414271647783257 4.230821042895357 0 -1 0
293 0 1 0 4.214234541195906 3.262981149206049 4.090936501706094 0 0 0
323 0 2 1 2.8122245885603756 2.580830565080179 4.80431964625616 0 0 0
335 0 2 1 1.4810951840990771 4.639126972487052 3.6567291514204365 0 0 0
270 0 1 0 4.9358344334018485 3.549094534023696 4.864412320210946 0 0 0
173 0 1 0 3.117530919934732 3.684181958243471 4.8516982526619845 0 0 -1
2 0 1 0 0.3021690885489914 2.659446894836416 4.0367641920770465 1 0 0
210 0 1 0 1.1142397715035879 4.4046148625915365 4.3150622960514795 0 0 -1
125 0 1 0 2.7530308932307075 2.8955411122664563 4.086365750770761 0 0 0
214 0 1 0 2.447949785773993 3.4411883728706667 3.42533264878368 0 0 0
258 0 1 0 2.4686303390297684 4.538868481224538 4.639944166832721 0 0 0
93 0 1 0 3.788036472073458 2.8805091146305495 4.207262328768323 0 0 0
24 0 1 0 1.1758426635439467 2.95987521811849 2.7491364787864434 0 -1 -1
152 0 1 0 2.4635622448768637 3.071194152656136 4.899091259343484 0 0 -1
367 0 3 -1 3.1644043863749083 3.8654934982056908 3.8521845414359994 0 0 -1
249 0 1 0 0.8478947214959758 3.5141550038968123 4.043189817151755 1 0 0
252 0 1 0 3.6043032286195786 2.7211428234421744 2.6278508560867944 0 0 0
227 0 1 0 2.617074822292329 4.356852917720359 3.706994190844186 0 0 0
120 0 1 0 4.569034188524726 2.9098756991392434 3.6702905357629025 -1 0 0
342 0 2 1 0.04291508283574702 3.9189332996339656 3.0034347187387493 1 0 0
370 0 3 -1 2.5035109101131465 3.367965526536857 4.050360185006087 0 0 0
283 0 1 0 4.572823838429256 4.030918642578753 4.393803855463066 0 0 0
279 0 1 0 4.173810766411638 3.812475242565163 4.301379932392817 0 0 0
314 0 1 0 4.4933290428810615 4.490246675016839 3.151051409399978 0 0 0
297 0 1 0 4.726982536341496 3.1414792583129945 4.429739330385717 0 0 0
341 0 2 1 1.8003373130876947 3.4781354307892713 2.899858395353646 0 0 0
312 0 1 0 2.303209904055366 2.9656095134210108 2.8204198689888864 0 0 0
373 0 3 -1 3.565365933175215 4.286825401805136 4.955585318174815 0 0 0
91 0 1 0 1.9018724274489394 3.9228474975062673 3.538137694177671 1 0 0
260 0 1 0 3.349946104166285 4.305285613626282 4.371436905009239 0 0 0
286 0 1 0 3.4730325337603043 3.45134046911952 2.570996040716748 0 0 0
277 0 1 0 3.893007381012101 4.253386877442837 2.9065935101973173 0 0 0
162 0 1 0 1.6103352066101007 3.6182097268745603 4.028619192357339 0 0 -1
148 0 1 0 0.47140654288437406 3.361602614222439 3.2833125638624368 0 0 0
199 0 1 0 0.45641137753428773 2.8928189398052093 3.055011726454653 0 0 0
59 0 1 0 2.603235557919487 3.7590996377530255 2.60080520480327 0 -1 0
240 0 1 0 0.03755253175857831 3.8996655727813736 2.694428316121082 0 0 0
Velocities
189 -0.32037987935911505 -1.8545793275796412 -0.3389478887810303
107 0.3468735347167663 -0.2955882500703209 0.7493971092549213
253 -0.48452738488616026 0.9567078415781696 -0.25617231541775964
163 0.05392635484651058 1.4098736248940131 -0.9551003900232069
26 -1.617929859419785 -1.7202842142734436 0.11135553428439426
27 -0.29551994504699913 1.1370741945626326 0.41194386832776464
56 0.16870751745665893 0.5465328233065259 -1.6661100877128618
167 -0.697267953141008 -1.9033337525745169 -0.31395781199009537
364 -1.400949260052127 0.7984877976989593 1.9724238551125475
61 -0.07154629291712847 0.7516744652931485 1.9678922707455193
222 0.23902932306419583 0.792970583016431 0.1021330637484922
332 2.0928445946235548 0.5309926353418448 1.5604773439112944
1 -0.28287953739229227 -0.029534368909520013 1.0355343887239448
319 -1.0849228432051101 -0.23080330071554434 1.1791104359270128
53 0.9157229929216929 -2.3903991179046433 -1.5736773702897364
68 0.17385350731976662 -0.30161653041932146 -0.39368426363389786
220 2.5382960064880953 0.2591819621699902 -0.624753681550235
44 -1.6451203378616364 -0.9239543258332603 1.132412983542016
55 -0.08195646053083308 0.37533078137864123 -0.36860166560573604
362 -0.4446005218467803 -0.13521669762509536 -0.3021189485210508
165 -0.3037978228853421 0.48479699556498196 -0.14302405851335173
60 -0.544505644947158 0.17484779434446918 0.5635832746819489
202 0.40080169998085574 0.6655121110868133 0.4354226901236873
85 -0.08059699858936498 -0.02186022407318814 -1.2385638610310603
73 1.183399433007768 -0.5106063831888463 1.1937543804310102
96 1.2595243589106713 -0.013906208472664688 0.4458849845729422
30 0.5511059698244886 -0.6732784212785152 -1.0116331060036698
67 -1.9023068008435087 1.0951572746798406 -2.0479882413103634
349 1.4237209300898004 0.30323664052562727 0.19232435921291324
132 -0.48867767658730155 0.09532364712318463 -0.42068909019073003
328 -0.5663127928136679 0.37616782849718877 0.4297794152083855
161 0.7703317540205181 0.6774326958924123 -0.3026855763654866
185 -0.023401903290328513 0.2511657303041649 -1.3088367457780965
219 1.2737339284351616 1.028957623073161 -1.0554246534519245
8 -0.06863366403807239 -1.6556315386699292 -0.23974376153400073
69 0.1565812662607089 -1.2971845847251846 2.613897358932758
3 0.8019572100951472 0.849648794229192 0.11213159968547601
7 0.25284839489562 1.491377162402211 -0.0841367270980815
329 0.6351810405065701 0.25238586135592256 0.8556983715790075
174 -0.5484640782672199 -0.14739645457730516 -0.17643270798617747
20 -0.7181391568279812 -0.22546080581710778 -0.48698419533440007
57 -1.6318504400975429 1.5493172313080645 0.4266085421953033
325 0.061765643056371416 -0.0060236030310999444 -1.8483177209317203
40 -0.6621905409370356 -1.2253334788867594 -1.2773646990414835
51 -1.1432987328508335 -0.3034502864840843 -0.09847735528475197
54 -0.8020221565243566 -0.0015208681811410135 -0.6007775452455262
186 -0.33099994137011096 -1.131278148973123 -0.7879194313488349
289 -0.9130924589993602 -2.639634662624726 0.09890031992023729
75 -0.8396764454636105 0.15798357570063332 -0.8477685915025622
48 -1.154914948896169 0.8466957349051685 0.8313924234437813
66 0.654607723623097 -0.41464584514495073 0.3609107252534362
52 -1.0586581647402704 0.5087601698575234 0.021025900110182197
158 1.3322996283718878 0.9345320009185999 -1.0328661925117097
330 2.4383540085998128 0.9866744795842981 -0.275795472471459
359 -1.057214010787649 -0.4364851954003303 0.2310265064750756
366 2.636570585206883 -0.3884825767632163 -0.7217671918096393
196 0.657853761584953 2.3775812813720982 -0.5436441623798505
128 1.7541843513017408 0.7453187167218113 1.2179212772328478
118 -1.59209911141696 -0.07364502396325014 0.7936184535797746
43 0.6237868379926791 -0.5784415822689247 -0.5803521937322204
184 -0.05277645327535091 0.45761568472864167 1.6427093411481584
360 -0.5648148491925004 0.5433424409581341 -0.49847380874912023
64 -1.8023545518136344 1.2913349276666013 0.12717943337914392
285 0.5736914459809833 0.5401354659943393 -0.28034343867615685
58 -0.36569579675665037 0.07239846277520536 -1.1013654261669847
257 1.552014566999722 -0.27948696231751907 -0.19503371520168367
356 0.7682896155635832 0.8280820699807006 1.3752233131249456
100 -1.0184796009907435 0.4605961843295614 -0.704442145669238
121 -0.38173838277886674 0.1959729194377248 -0.339617988229434
130 0.22178015355919917 -0.8675864036237741 1.1703244653493718
238 0.8237981930471431 -1.5493771904591997 -0.24060309819018327
211 -0.9664235140040581 1.0444826618189473 -0.7001322318514289
208 -1.1981085340301125 -0.7027352973576034 0.5185067521926653
63 0.08370101334493428 0.12218456306348915 0.049185735912721115
22 0.30188358915891 -1.3418299707096835 1.1148332854869305
355 -1.6654429777296822 -0.6945382472719116 -3.1744183147606044
70 -0.08375793026685956 0.8125324795960583 0.6134941598297233
65 -1.1244245803291022 -0.9361082187681131 1.1324057744996805
182 2.412056789726208 1.2486258334638396 0.20473073207056972
188 -0.37468794463000277 -1.2934293589793593 0.9691264102882897
35 0.6406020314671873 0.49864731329733636 -1.7724168624616223
6 -1.3537464971191604 -0.20927181650199864 -1.5167116889460597
346 0.30631209820842736 -0.7471003495751499 -1.6323676491850723
14 -0.7975238331233878 -0.2181017429474187 -0.632027008590476
15 -0.32436974395845447 0.3065062429708726 0.4060390267782001
16 0.07956951912756546 -1.0048987407630834 -0.36004318524122436
287 -0.5959260893373665 -0.1854042515514421 1.0130704394383132
81 0.9472416915759921 -0.6006345374524827 -0.24694710732081407
114 1.525743657374327 0.04312008580379893 -0.7588343858546425
232 -2.2017540835769154 -0.886310786043688 0.20387430412267815
50 0.8784604270190535 0.0011080801156705886 0.5856470163400485
79 -1.071058278656874 -0.006257268621159592 -1.4196804350916041
74 -0.7639977049209028 -2.6659874189534594 1.1890689974611952
194 0.865474812438892 -0.5155997613354885 -1.9207758859429034
133 0.38706903000333437 -0.9520916056321852 0.8541781745856745
311 0.5008213609458084 -0.07623241918788479 0.5610893061215554
115 0.15935870900356716 -0.882694140477557 0.6905790810816846
4 -0.9205904536679229 -0.7764649294266535 1.1104783428010845
151 0.6813124939707291 2.326468648189791 2.249632338275329
306 -0.18710153508281002 -0.3863205254514582 0.5475210927789089
138 -1.6956647006569652 -1.151952653064399 -0.554024796221634
110 -0.39629567812811123 -0.4259264444322932 0.44254068082874265
251 1.5245566481568409 -0.04190307638919144 1.0804352846040617
331 -0.9795637705792982 -0.02610365622846786 2.5830426945375367
243 0.45087912305781325 -1.355797680211566 0.4004209604371337
156 0.651222966601892 0.4174674307414501 -1.1666370354607374
32 -0.5950276948154204 -0.8393986824943023 -0.7189711727165591
205 0.3776877212460598 2.3109152071487427 0.6245197680183613
41 -0.9842633414094011 -0.8809111823971685 -1.2837012228899978
28 0.18078855219728557 -0.13909035935407538 -0.19886968753018486
322 1.1176391816577027 -0.8011078770573403 0.21746550449618066
103 1.2549030850211156 -0.8081818878065185 -0.27748891746378196
353 -1.5194865665198567 -0.5579729356084093 -2.0775398105335463
295 0.22655387403623733 2.9916385717293763 -0.43349783976321543
365 0.16554102729886308 -0.4745928131492317 -0.03803439542786842
98 -0.4618022678057757 -0.6029234473896345 0.6725224603911311
33 -1.7236841295071144 -0.3068526804764886 -0.20580599603270883
39 1.2772591923409662 2.1497013660971303 -2.56219215061276
343 -0.2927424336003138 0.9775658544657785 0.2011269771824622
259 0.24216001573068768 1.8155597582018805 -1.0537870123381061
77 -0.1324758963152601 0.38342267896154975 -0.04929261328552273
140 0.38183354460675634 0.6132141691538076 0.442562890919203
111 -0.8964279708048736 -0.8793266310917598 0.00861098502364186
129 -1.1765926408865686 -1.0237122510048935 -0.27213291220171076
317 0.8853758404732577 -1.1912915511525315 -0.2565808529702654
25 -0.41258107389034077 1.5982277861548693 1.2605935861477815
21 -0.9069821227261771 -0.4677412632169774 0.6873716589735867
276 0.25907509449423294 -0.11278777358289174 -1.2598969980105488
160 1.1310609970707983 -0.7180501046994335 -0.5753626368090448
308 -0.5407967057189286 0.6940578777081593 -0.37557998557357736
313 -0.7130409942586629 -1.681937934547073 0.1358119949043896
71 0.667183519460017 0.3282177658608256 -2.7413950424049682
42 1.1047543258650714 -0.8068929160871195 -1.2899950214337368
83 1.7828282628616605 -2.004816043371422 1.2952692225001963
123 -2.9004360498301707 0.9646317600839549 0.18131057792974167
29 -1.3652408424575189 -1.009704628734932 0.43892722829821035
291 1.0627401897900626 0.43489566519198664 -0.18784491971683132
299 -0.26688361561559937 -1.6102635970374153 0.5079799986210346
87 1.4011023956088358 0.32714083881834366 -0.7531211236916443
78 0.1425369548627805 2.6493781694133145 -2.22950555437911
5 1.3052777281483532 -0.9535145036740771 0.2654363506534612
95 0.30567181776721686 1.1163897147224524 -0.5532613677186452
352 0.8465877298612667 2.2107064094824453 -0.17116328451251087
281 -0.07871622308682222 1.0856250342504348 1.1051209599756335
206 1.0416994819210157 0.5672831409877002 1.6724372809390164
241 -2.2941651916087253 1.9444171652571998 -1.2578222836508794
109 -0.050748691911046466 1.0000918986528329 0.2015940504869988
126 -0.8786798841416771 0.8497095311402493 1.3946275611382846
62 -0.2164244387038406 0.8723775902261287 0.26553621918966663
145 0.46930481759942066 0.7693145659657128 -0.037339037750325446
354 -0.2098961088460406 -0.953758291681559 -0.403997005612617
248 0.8565801706475304 0.8235709205269733 0.2955326303618714
278 2.048784561206607 0.9072129491727593 -0.7581517712639704
334 0.456898611136665 -0.02509977329095233 -0.9459879096811896
344 0.8456571762985342 0.4633497822367495 0.8285234460659753
84 0.40873630171375086 -0.18526388419408432 -0.06542872798585272
135 2.013756885383165 -0.15612654092659334 0.5349019283627415
124 -0.5212908614174182 0.7685855427870887 -0.12228979391994671
301 0.48855352634840166 -1.2406754622002991 -0.08431072249939792
221 -1.2260526209132598 0.7697110508869727 -0.5542459265345273
149 -0.2107348825202514 0.22490448892353535 -0.5734046758064464
235 -1.4630566299287793 0.5127970335856704 -0.6004850345593133
268 0.5661524540264498 0.8991784804895261 -0.005988273242503317
229 -0.8584020647535824 -0.25056183768697937 0.6902063254564769
144 -0.46291169716408886 0.5111551390891086 1.1711664705383293
142 -0.41757592752156836 0.21324275041440427 -1.2569024662297255
119 0.5340652441413375 0.3164807148267359 -1.4743337919796309
218 -1.0392995481658593 0.26241789884459166 0.7357941801129729
269 0.7678562785093035 -1.9170146057209667 0.7772238925448399
171 -0.4969590584187104 -0.596095006981118 -0.10809390580507182
347 0.8436056567675704 -0.5476600028413069 -1.3395269452969696
117 0.8095357513993098 0.14859594003753698 0.9460359145433276
244 0.09898637700604154 1.9714533954146634 -1.2087777946497995
46 -0.3820366350713078 0.32336042217403327 -0.9227515950377472
97 -1.7189935642347989 -1.5765158910467392 0.8063603306333886
155 0.36326503759730183 0.6548052876982512 1.620348248115881
190 0.7808450444577382 0.6656743687730368 0.7660461630595695
141 0.8693957537631642 1.3523683215558047 1.2211970208170133
261 0.28442666039427394 -0.32073173144758543 1.583985092925248
92 -0.7345577665025577 0.016229401856888797 0.3571609110744681
327 1.500595660011905 2.328516151626208 -1.0480316997941985
337 -2.026559556886336 -1.0216544907269516 -1.6983898702416695
45 0.7296312803407121 -1.3823715012836595 -0.001888700820258285
200 -1.5125957105846846 0.21807330099838138 1.0211540585201806
19 0.20095464395150656 0.876426388172185 1.1335083283234622
137 -0.6544379260019478 0.3996572012861071 1.5228974656760543
127 -1.1436027430113194 0.5730519130732912 0.008333961575108378
9 -0.42750265926865316 -0.5165855700703796 -1.0737944161142243
122 -0.3470793076769018 -0.34708198826094805 1.1255388427785304
213 1.835703281018243 0.8847420691344063 1.6530535667302775
136 0.43589519224927076 -0.020299972081583365 0.747684835626366
37 -1.148425632972328 -0.00642821348241146 0.9184878168029185
34 -1.4186726525732596 0.4531027449345908 3.0048537054226916
217 1.915040996479654 -1.732542284842007 0.44651597348176714
250 0.5621559470017148 0.4079874575005626 1.303044522453095
166 0.7893755845011986 0.43466399248524873 1.160997706352551
150 -0.37696033158301806 1.0863822179294413 -2.078278052131126
368 2.210878478411088 0.38296799766548134 1.0444089386311377
339 1.4973183477847594 -0.7580085092724449 0.11364576051168895
340 -0.3257916484956234 0.0813898939784988 -1.1040698774178863
338 -1.0699596370620241 -1.0120808096694316 1.833778928251108
201 -0.23917814210651525 -0.03394921352802534 -0.9718396302546122
101 0.02844691201485288 -0.6506751616189366 -0.03984644326365714
209 -0.9153220207336246 -1.5186563759968537 -1.0205115163511242
168 0.8206949111387913 -0.4245501681797143 -0.7447438734980448
216 -0.43707878972381015 -0.5291981706606685 1.1132283784486239
203 -0.8017105024810447 0.33314329697566913 -0.5162714638483775
179 -1.8007654528739871 -0.4670778758036332 0.23458485261416823
181 0.5555468330191876 0.25910041403756756 -0.3316347961383419
236 -0.8012681820545456 -0.5344531291884258 -0.08163768189012148
18 1.9065170422999271 1.3540018286545739 1.1100685009732258
363 0.2827677278721721 -0.3503610814118505 -1.1797786001961337
198 -0.41882935960212925 0.8056124759016018 1.8622528356092367
146 0.1474073717281029 1.699648861146042 1.0589630664233587
284 -0.407232387684036 -0.11824885032252892 1.360138277573833
207 -0.3298855435595792 -0.006765921450541862 0.2769759320227882
183 0.06337061105143588 -0.48367890148177073 0.5050176946201105
90 0.3184428577661019 0.9432678954749032 0.8928827031242041
159 -0.5105050211567479 1.9463424976868646 0.32689317369973153
274 1.3982542011798467 -0.27549013447341186 0.8666525994391387
303 0.4978908819019676 1.2437279316470162 -0.10162615038846663
315 -1.0164590430058362 -0.03269995674634833 0.6833370972687541
11 0.3622774648719034 1.2005608993134556 -0.7399401748200916
176 0.12717484954669636 -0.1874453653833894 -0.5308623715664049
304 0.06155270894330727 0.03603614146908593 0.1329179976636057
143 0.26847678011717396 -0.3583390732477076 1.7051362686528129
275 0.33838601766084075 0.2950617938645766 -0.09418120915803613
242 0.3073988441018431 -1.8086100776648917 -0.42916540436389544
169 0.14874973578643622 -1.3199432376066533 0.7087936697125053
86 -0.5239538553467294 1.3403598560019885 -0.2254748591815899
333 -0.21788548307133926 -0.7324156012520107 0.1425582466646254
294 0.6218138152225486 0.21868791299154444 0.8803681463521291
310 -0.5282668664359558 -0.46220541267842175 -1.0627944759334662
192 0.8557275799833504 1.4638168802662663 -0.6584377242390569
280 -0.09918465909102868 -1.0727882372767648 0.1410570176454262
164 -0.008014496582185324 0.5157698128135756 0.46160123613104664
170 1.4950197089701442 3.424612541884591 -1.314342167688277
256 0.06221965545636296 -0.8559730346941176 1.8154628407737485
305 0.30469481973038853 -0.03817030163277567 -1.2365844444400544
321 -0.3202998744384521 1.2283112281779653 1.823191101425018
147 0.5820565680991441 0.36342122556604795 -0.2612619382618049
204 -0.008409550806661968 1.171175221811852 -0.2917927123166712
215 0.46773636429619847 -0.41233509768776383 -0.3263056272548713
307 -0.07908782350310187 2.164168859748066 -0.9789469165714956
230 0.8852323551048787 1.3865626751983875 0.5628005219581595
357 -1.2576148747792928 0.03308240972261274 -1.5084612011551441
273 0.5606862174415299 0.5124906231131765 -1.3826770688817982
104 -0.10795450062494798 -2.791328634167407 1.1620113801205978
326 0.2071603034556735 -0.40909146487793213 -0.896060232043604
153 -0.45260595455551345 -0.3277317537659357 -0.13439736779275077
10 2.7196279602592033 0.48777338008418347 0.18107892198434122
17 -0.8413852713221374 -1.1275004082730866 -1.4487171872195708
172 1.2930259795119698 0.14131239886642913 0.5257996818615889
187 -1.8173970648752318 -0.28759466349432383 -1.7755081990758885
246 -1.0149452724155728 -1.300181341724771 -0.976220324472834
175 1.0435736653798136 -0.6355996329080813 -0.6337776368224881
233 1.2293937984927237 -0.905059289715439 0.8454304677995911
197 -0.22773405357421111 -0.7410347767485816 1.126629391166937
36 -0.9705558369369324 0.33702279037561017 -1.064377132550976
157 -0.05834073541273116 1.2094227269795201 1.0222926092654627
212 0.013232248632983099 0.9236140505707409 1.261304943429413
369 0.3957125732954573 -0.5984876528890495 -0.6144811927659548
225 0.6396689699095744 -0.38272720995061654 -0.691909782028554
88 -0.4143004926247838 -1.2942068299775036 -0.546740943598064
180 0.04523325776155317 -0.05945543703566272 0.47333576015888584
228 0.8374889207264015 -0.5976967042166498 0.026290439671542307
296 0.7603590023814826 1.798573173748085 0.09638254026567694
309 0.26044897388340504 -0.6796155915915322 -0.5500226485278027
316 0.7809829226880511 -0.9911482041657326 -0.5982510531417577
282 2.813391256963532 -0.7389301719245412 -1.317705839191937
223 0.42512280312483486 0.39540872471182203 0.1359105288746332
112 0.3204862890962222 -0.5808767554272332 -0.7511556946241044
89 0.30853654184225165 1.4220670510027051 -2.1642949762748867
191 0.20906754014854564 0.026904283363689382 0.39272994979179504
237 0.8114113274128864 -1.2134195876500447 -1.2542604312044792
226 0.05086738376609842 1.9155895254467763 0.5909889856323195
231 0.12002855122048815 0.02004736909508279 0.11081960871345642
49 0.03966621608393742 -0.8770492944397817 0.8690111691798925
375 0.9491508595606913 0.58883338187899 -0.3157968091718698
265 -1.202404469596496 -1.5086124324682335 0.25807518315254696
193 0.4146818842856516 0.2647601963673656 0.730972113530503
318 -1.8694737066425302 -0.761959044368273 -0.7096835210855107
38 1.4229802153283508 -1.36140802862721 -0.8467736118278119
195 -0.8905011743693773 0.7285788649892662 -1.1668737157134021
224 0.27425001045805447 -1.4123472657200646 -1.3276958804580687
139 0.17701044314199935 1.2384991288614933 0.707649077312958
102 -0.49170524562266826 0.9342585115109375 0.4160956308860243
263 -0.7682667946507794 0.5411620297128601 -0.14243425461628567
361 0.4874350807265555 -1.118941056651683 0.4602449779293269
298 0.04321754250044474 -0.15386666534573679 -1.0460367336946477
106 -0.3645858676063196 -0.008671871254614383 -1.0359720474498813
288 -1.275865518017513 -1.0371041509619956 2.212604082967035
320 -0.377092487120416 -0.5974519455300853 -0.22840203412473642
12 -0.24251540706937524 -0.1402656612039157 0.2434885714233267
350 1.1678886543574276 -0.45657425471012764 -0.2662438133234255
255 0.5964565878330671 -1.3463852257768025 1.2786356338266742
264 1.6104915551559742 1.8273229008351088 -0.9803231882687425
131 -0.8634566501958852 -0.3775110787982123 -0.4297068950811986
271 0.022978578950211624 0.1537857816854949 0.41326352661226756
239 1.1101812509452746 -1.0996094771595475 -0.5405483522697302
247 0.366683557977341 -0.40591154743605157 0.3199408653703203
336 -0.4204708954513029 1.1245949705896916 0.14059678344621293
80 0.7468471903560799 0.16912425014962304 0.9566573830732898
351 0.07048942766011615 -1.3084119272893855 -1.2549170044600249
345 0.7055909005169286 1.5707280888607302 2.170499205441559
23 -1.331563904677986 0.7554001948296128 0.6695113635015243
372 -1.4331361061806305 -0.7926393821400735 0.5238882724688806
374 -0.825494743089428 1.5035094266963547 1.4373542115371403
99 0.27578368704586625 -0.6711803184635016 0.5730720207589178
134 -1.1904489259413122 1.5650039062713583 -0.4846706283407857
94 0.9633444927305759 0.47059281614148496 0.1502870940642896
108 0.26924336654778097 -0.21911864351862886 0.3263366196031549
116 0.6191352094412962 -0.7085456797691245 -0.2795453344586494
47 -0.81507518857967 0.5002361185490026 0.1633824556071923
177 0.9242227597235199 -0.9239301127385003 -0.6516754024576575
154 0.36428957391605954 1.0522574437068934 0.47589301799726774
272 -1.0875391115124131 -0.5442742977183277 0.6272696858994802
292 -2.3018786976959547 -0.719034234609397 -0.3976068240680647
348 -0.7074103387842228 -0.0767390137549914 -0.963801034994381
113 0.0030054733602942266 -1.3950743743038958 1.867999225141668
76 1.5225615991122337 -0.6220818112064357 -0.15128024907071225
178 -0.9036534708064256 0.27189024225898883 -1.310213331624685
82 -0.42289693438412584 -0.022877233686993723 0.16757191063647395
358 -1.084491323240786 0.309617438081422 0.19221704824216043
302 -1.0553000696338095 -0.7753368184729383 -1.6522442141368283
13 0.845507404222631 -1.1655430839109384 1.5339500987877546
72 0.41215075448394733 -1.3387634915542448 -1.701720507581037
245 -0.34884333851309834 -1.599607748547356 -0.08374549876035683
234 -1.8167563819027162 -1.1826697278339255 1.1323923705559067
300 -1.1492146391765459 0.2483076272654141 -0.7388669957162219
105 1.860014533900312 0.7148855192575438 0.950732381457607
254 -0.6941521238655652 1.3286658685743733 -0.09912945530019143
371 -0.03007825734775041 0.17488055593531995 -0.5660994145015367
262 1.1816791457721831 -0.2527818393194355 0.49550489641014006
266 0.7025922230527104 -1.3294406800025553 -0.610134301603067
31 -1.015719812353546 0.699060801172419 0.9860089149766915
267 0.38654355926704703 -0.1264135931208901 0.1337359898717711
290 1.0106897270034887 -0.6174340186836875 0.17719301929654596
324 1.5906920275906873 -1.4359983538965082 -0.8582706716695392
293 0.9982234808302441 0.543717193528767 -2.062895773562878
323 0.17420566156018166 -0.8499393438675438 -0.22821645799213797
335 -1.4047556653990858 0.2558049214304259 -0.20559797586706147
270 -0.6321821769779428 -0.4192527616747393 -0.8336466516152516
173 -1.454149943391539 -0.7091620301715705 0.1032726804162123
2 -0.13160744352132697 -0.8530661810441926 -1.4081064081887786
210 0.005780708280217166 -0.1314037001754253 -0.2650271980684433
125 -0.09249384396894937 -1.1079543363063478 0.5855224371258938
214 0.5201018860617912 1.5761782081656692 0.035238788848664875
258 0.029258855657727026 0.9978609610551674 -0.14936661862149073
93 1.3599706012850858 0.5138196159795498 -0.5479657931310508
24 -0.36848780789234786 0.5502667846431184 -0.8219909931831206
152 1.443106679308555 -1.5881504830897177 0.5251248932583428
367 -0.8318296913109121 -1.0659118655536617 1.4652035277005255
249 -0.7272493937720567 -1.0554246074355031 1.9106526180491246
252 0.15824074140715003 1.3574893627297528 0.849299710142209
227 -1.8919742394027095 0.35022746838873914 -0.8716265785931281
120 -0.571575152303992 -1.2924338935753592 1.6398975078681308
342 0.04170661506757478 -0.2554943852733288 1.2031995777997446
370 -0.3474083481747786 -0.8268210706239789 0.11710668216712806
283 0.34259631654561 -0.638600994930959 0.021713727624721322
279 -2.1091380649692364 0.5683510572154551 -0.9091778578938636
314 -0.43834173946024524 -1.6956466398316619 -1.741986521654538
297 0.9805330343066516 1.9653989039948883 -0.06267823210622318
341 0.6436707559323198 0.17740641651830055 0.7923601196148916
312 -1.4662653378890305 0.8912504951091632 -3.2848373130153616
373 -0.3818721621040007 1.1303100555115857 1.117083484179991
91 -1.0354512700928402 0.7952901789933705 -1.3376868649958413
260 -0.7142984506137289 0.4503083150384257 0.7493938136595016
286 0.12497815933423412 -1.4185031297528174 -0.7147963619923647
277 -0.04273979718334558 0.6681668442079539 -1.627755052910915
162 0.6571166297602984 0.4444526727563672 1.4878784469904562
148 0.3177520883327088 1.0855120103126268 -0.6584725796441712
199 -1.2545559409413416 -0.5694770345954823 0.33932040400166985
59 -0.6235113592986508 -0.2086994539745325 1.6873018374682558
240 0.705376364763962 -0.6227531276788822 1.6071635134558022

View File

@ -0,0 +1,58 @@
# DPD Ionic Fluid
variable T equal 1.0
variable cut_DPD equal 1.0
variable seed equal 165412
variable lambda equal 0.25
variable cut_coul equal 2.0
#-------------------------------------------------------------------------------
# Initialize LAMMPS run for 3-d periodic
#-------------------------------------------------------------------------------
units lj
boundary p p p # periodic at all axes
atom_style full
dimension 3
bond_style none
angle_style none
dihedral_style none
improper_style none
newton on
comm_modify vel yes # store info of ghost atoms btw processors
#-------------------------------------------------------------------------------
# Box creation and configuration
#-------------------------------------------------------------------------------
# Define pair style and coefficients
pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul}
read_data data.dpd_coul_slater_long
# Enable long range electrostatics solver
kspace_style pppm 1e-04
# Construct neighbors every steps
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
#-------------------------------------------------------------------------------
# Run the simulation
#-------------------------------------------------------------------------------
thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax
thermo_modify norm no
thermo 100
timestep 0.01
run_style verlet
fix 1 all nve
run 1000
unfix 1

View File

@ -0,0 +1,147 @@
LAMMPS (17 Apr 2024 - Development - patch_17Apr2024-262-g0aff26705c-modified)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# DPD Ionic Fluid
variable T equal 1.0
variable cut_DPD equal 1.0
variable seed equal 165412
variable lambda equal 0.25
variable cut_coul equal 2.0
#-------------------------------------------------------------------------------
# Initialize LAMMPS run for 3-d periodic
#-------------------------------------------------------------------------------
units lj
boundary p p p # periodic at all axes
atom_style full
dimension 3
bond_style none
angle_style none
dihedral_style none
improper_style none
newton on
comm_modify vel yes # store info of ghost atoms btw processors
#-------------------------------------------------------------------------------
# Box creation and configuration
#-------------------------------------------------------------------------------
# Define pair style and coefficients
pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 0.25 2
read_data data.dpd_coul_slater_long
Reading data file ...
orthogonal box = (0 0 0) to (5 5 5)
1 by 1 by 1 MPI processor grid
reading atoms ...
375 atoms
reading velocities ...
375 velocities
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
# Enable long range electrostatics solver
kspace_style pppm 1e-04
# Construct neighbors every steps
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
#-------------------------------------------------------------------------------
# Run the simulation
#-------------------------------------------------------------------------------
thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax
thermo_modify norm no
thermo 100
timestep 0.01
run_style verlet
fix 1 all nve
run 1000
PPPM initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:342)
G vector (1/distance) = 1.4828454
grid = 20 20 20
stencil order = 5
estimated absolute RMS force accuracy = 7.7240141e-05
estimated relative force accuracy = 7.7240141e-05
using double precision FFTW3
3d grid and FFT values/proc = 24389 8000
Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 3
ghost atom cutoff = 3
binsize = 1.5, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair dpd/coul/slater/long, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 8.359 | 8.359 | 8.359 Mbytes
Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax
0 0.9849949 69.271905 125 4673.0443 0 -30.365103 4642.6792 552.58214 646.76798 65.851035
100 1.0614027 69.794624 125 4659.0139 0 -31.906319 4627.1075 595.44692 612.94396 60.338653
200 0.9422517 68.721098 125 4687.8862 0 -33.81531 4654.0709 528.6032 620.25627 62.726994
300 0.8956649 69.323482 125 4721.0824 0 -33.854275 4687.2281 502.46801 670.22699 73.087908
400 0.99584547 69.670416 125 4713.9086 0 -30.783633 4683.125 558.66931 607.65881 59.224652
500 1.0565931 69.497816 125 4701.2584 0 -26.80545 4674.4529 592.74873 646.18907 71.398122
600 1.0071523 70.26222 125 4659.2061 0 -29.98909 4629.217 565.01243 630.00244 58.264115
700 1.0507355 67.920078 125 4695.255 0 -32.649209 4662.6058 589.46259 651.80459 70.573524
800 0.98561942 68.279591 125 4745.7603 0 -28.98491 4716.7754 552.9325 627.14371 67.196483
900 0.96470105 70.742864 125 4706.3605 0 -30.271633 4676.0889 541.19729 644.43036 79.474998
1000 1.0204819 70.164419 125 4654.6077 0 -27.797433 4626.8103 572.49035 624.19728 71.825307
Loop time of 2.10153 on 1 procs for 1000 steps with 375 atoms
Performance: 411128.483 tau/day, 475.843 timesteps/s, 178.441 katom-step/s
99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 1.1779 | 1.1779 | 1.1779 | 0.0 | 56.05
Bond | 6.507e-05 | 6.507e-05 | 6.507e-05 | 0.0 | 0.00
Kspace | 0.74636 | 0.74636 | 0.74636 | 0.0 | 35.51
Neigh | 0.12903 | 0.12903 | 0.12903 | 0.0 | 6.14
Comm | 0.039726 | 0.039726 | 0.039726 | 0.0 | 1.89
Output | 0.00027587 | 0.00027587 | 0.00027587 | 0.0 | 0.01
Modify | 0.0037596 | 0.0037596 | 0.0037596 | 0.0 | 0.18
Other | | 0.004451 | | | 0.21
Nlocal: 375 ave 375 max 375 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 3613 ave 3613 max 3613 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 62354 ave 62354 max 62354 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 62354
Ave neighs/atom = 166.27733
Ave special neighs/atom = 0
Neighbor list builds = 65
Dangerous builds = 0
unfix 1
Total wall time: 0:00:02

View File

@ -0,0 +1,147 @@
LAMMPS (17 Apr 2024 - Development - patch_17Apr2024-262-g0aff26705c-modified)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98)
using 1 OpenMP thread(s) per MPI task
# DPD Ionic Fluid
variable T equal 1.0
variable cut_DPD equal 1.0
variable seed equal 165412
variable lambda equal 0.25
variable cut_coul equal 2.0
#-------------------------------------------------------------------------------
# Initialize LAMMPS run for 3-d periodic
#-------------------------------------------------------------------------------
units lj
boundary p p p # periodic at all axes
atom_style full
dimension 3
bond_style none
angle_style none
dihedral_style none
improper_style none
newton on
comm_modify vel yes # store info of ghost atoms btw processors
#-------------------------------------------------------------------------------
# Box creation and configuration
#-------------------------------------------------------------------------------
# Define pair style and coefficients
pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul}
pair_style dpd/coul/slater/long 1 1 165412 0.25 2
read_data data.dpd_coul_slater_long
Reading data file ...
orthogonal box = (0 0 0) to (5 5 5)
1 by 2 by 2 MPI processor grid
reading atoms ...
375 atoms
reading velocities ...
375 velocities
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
0 = max # of 1-2 neighbors
0 = max # of 1-3 neighbors
0 = max # of 1-4 neighbors
1 = max # of special neighbors
special bonds CPU = 0.000 seconds
read_data CPU = 0.003 seconds
# Enable long range electrostatics solver
kspace_style pppm 1e-04
# Construct neighbors every steps
neighbor 1.0 bin
neigh_modify every 1 delay 0 check yes
#-------------------------------------------------------------------------------
# Run the simulation
#-------------------------------------------------------------------------------
thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax
thermo_modify norm no
thermo 100
timestep 0.01
run_style verlet
fix 1 all nve
run 1000
PPPM initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:342)
G vector (1/distance) = 1.4828454
grid = 20 20 20
stencil order = 5
estimated absolute RMS force accuracy = 7.7240141e-05
estimated relative force accuracy = 7.7240141e-05
using double precision FFTW3
3d grid and FFT values/proc = 10469 2000
Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule
Neighbor list info ...
update: every = 1 steps, delay = 0 steps, check = yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 3
ghost atom cutoff = 3
binsize = 1.5, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair dpd/coul/slater/long, perpetual
attributes: half, newton on
pair build: half/bin/newton
stencil: half/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 7.208 | 7.208 | 7.209 Mbytes
Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax
0 0.9849949 69.076433 125 4673.0443 0 -30.365103 4642.6792 552.58214 613.18374 70.700582
100 0.95374867 69.110009 125 4681.1097 0 -31.260804 4649.8489 535.053 629.95109 62.05418
200 1.0076152 69.824904 125 4670.7458 0 -28.382203 4642.3636 565.27213 656.8501 72.049813
300 1.0014752 69.666331 125 4696.454 0 -26.943577 4669.5105 561.8276 631.49861 74.737274
400 0.98863876 69.731774 125 4700.7552 0 -23.816077 4676.9391 554.62634 637.74742 68.928573
500 0.95782852 68.588075 125 4698.588 0 -29.249543 4669.3385 537.3418 646.31897 68.800569
600 0.97443232 70.864079 125 4674.8821 0 -26.415644 4648.4664 546.65653 606.50755 78.664429
700 0.98783988 68.908299 125 4692.5536 0 -28.092022 4664.4616 554.17817 638.98401 69.691814
800 0.98000145 69.83977 125 4706.6365 0 -29.648365 4676.9881 549.78082 626.84362 73.133934
900 1.0526251 69.466078 125 4671.9648 0 -30.941117 4641.0237 590.52269 618.1049 62.333546
1000 0.98340746 69.527121 125 4728.2894 0 -31.869907 4696.4195 551.69159 630.14208 61.392611
Loop time of 0.928543 on 4 procs for 1000 steps with 375 atoms
Performance: 930490.137 tau/day, 1076.956 timesteps/s, 403.859 katom-step/s
98.9% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.30761 | 0.34974 | 0.38864 | 4.9 | 37.67
Bond | 8.4633e-05 | 9.0539e-05 | 9.9184e-05 | 0.0 | 0.01
Kspace | 0.39038 | 0.42976 | 0.47215 | 4.4 | 46.28
Neigh | 0.033986 | 0.035576 | 0.036791 | 0.5 | 3.83
Comm | 0.10247 | 0.10324 | 0.10481 | 0.3 | 11.12
Output | 0.00024145 | 0.00027404 | 0.00036867 | 0.0 | 0.03
Modify | 0.0022402 | 0.0025068 | 0.0026343 | 0.3 | 0.27
Other | | 0.007356 | | | 0.79
Nlocal: 93.75 ave 96 max 93 min
Histogram: 3 0 0 0 0 0 0 0 0 1
Nghost: 2289.75 ave 2317 max 2271 min
Histogram: 1 1 0 0 1 0 0 0 0 1
Neighs: 15590.2 ave 16765 max 14540 min
Histogram: 1 0 1 0 0 1 0 0 0 1
Total # of neighbors = 62361
Ave neighs/atom = 166.296
Ave special neighs/atom = 0
Neighbor list builds = 64
Dangerous builds = 0
unfix 1
Total wall time: 0:00:00

View File

@ -57,7 +57,7 @@ int BaseDPDT::init_atomic(const int nlocal, const int nall,
const double cell_size, const double gpu_split, const double cell_size, const double gpu_split,
FILE *_screen, const void *pair_program, FILE *_screen, const void *pair_program,
const char *k_name, const int onetype, const char *k_name, const int onetype,
const int extra_fields) { const int extra_fields, bool need_charges) {
screen=_screen; screen=_screen;
int gpu_nbor=0; int gpu_nbor=0;
@ -73,7 +73,7 @@ int BaseDPDT::init_atomic(const int nlocal, const int nall,
_threads_per_atom=device->threads_per_atom(); _threads_per_atom=device->threads_per_atom();
bool charge = false; bool charge = need_charges;
bool rot = false; bool rot = false;
bool vel = true; bool vel = true;
_extra_fields = extra_fields; _extra_fields = extra_fields;

View File

@ -53,7 +53,8 @@ class BaseDPD {
const int maxspecial, const double cell_size, const int maxspecial, const double cell_size,
const double gpu_split, FILE *screen, const double gpu_split, FILE *screen,
const void *pair_program, const char *k_name, const void *pair_program, const char *k_name,
const int onetype=0, const int extra_fields=0); const int onetype=0, const int extra_fields=0,
bool need_charges=false);
/// Estimate the overhead for GPU context changes and CPU driver /// Estimate the overhead for GPU context changes and CPU driver
void estimate_gpu_overhead(); void estimate_gpu_overhead();

View File

@ -0,0 +1,238 @@
/***************************************************************************
lal_dpd_coul_slater_long.cpp
-------------------
Eddy BARRAUD (IFPEN/Sorbonne)
Class for acceleration of the dpd/coul/slater/long pair style.
__________________________________________________________________________
This file is part of the LAMMPS Accelerator Library (LAMMPS_AL)
__________________________________________________________________________
begin : May 28, 2024
email : eddy.barraud@outlook.fr
***************************************************************************/
#if defined(USE_OPENCL)
#include "dpd_coul_slater_long_cl.h"
#elif defined(USE_CUDART)
const char *dpd_coul_slater_long=0;
#else
#include "dpd_coul_slater_long_cubin.h"
#endif
#include "lal_dpd_coul_slater_long.h"
#include <cassert>
namespace LAMMPS_AL {
#define DPDCoulSlaterLongT DPDCoulSlaterLong<numtyp, acctyp>
extern Device<PRECISION,ACC_PRECISION> device;
template <class numtyp, class acctyp>
DPDCoulSlaterLongT::DPDCoulSlaterLong() : BaseDPD<numtyp,acctyp>(), _allocated(false) {
}
template <class numtyp, class acctyp>
DPDCoulSlaterLongT::~DPDCoulSlaterLong() {
clear();
}
template <class numtyp, class acctyp>
int DPDCoulSlaterLongT::bytes_per_atom(const int max_nbors) const {
return this->bytes_per_atom_atomic(max_nbors);
}
template <class numtyp, class acctyp>
int DPDCoulSlaterLongT::init(const int ntypes,
double **host_cutsq, double **host_a0,
double **host_gamma, double **host_sigma,
double **host_cut_dpd, double **host_cut_dpdsq,
double **host_cut_slatersq, double *host_special_lj,
const bool tstat_only,
const int nlocal, const int nall,
const int max_nbors, const int maxspecial,
const double cell_size,
const double gpu_split, FILE *_screen, double *host_special_coul,
const double qqrd2e, const double g_ewald, double lamda) {
const int max_shared_types=this->device->max_shared_types();
int onetype=0;
#ifdef USE_OPENCL
if (maxspecial==0)
for (int i=1; i<ntypes; i++)
for (int j=i; j<ntypes; j++)
if (host_cutsq[i][j]>0) {
if (onetype>0)
onetype=-1;
else if (onetype==0)
onetype=i*max_shared_types+j;
}
if (onetype<0) onetype=0;
#endif
int extra_fields = 4; // round up to accomodate quadruples of numtyp values
// q
int success;
bool need_charges = true;
success=this->init_atomic(nlocal,nall,max_nbors,maxspecial,cell_size,
gpu_split,_screen,dpd_coul_slater_long,"k_dpd_coul_slater_long",onetype, extra_fields, need_charges);
if (success!=0)
return success;
// If atom type constants fit in shared memory use fast kernel
int lj_types=ntypes;
shared_types=false;
if (lj_types<=max_shared_types && this->_block_size>=max_shared_types) {
lj_types=max_shared_types;
shared_types=true;
}
// Allocate a host write buffer for data initialization
UCL_H_Vec<numtyp> host_write_coul(lj_types*lj_types*32,*(this->ucl_device),
UCL_WRITE_ONLY);
sp_cl.alloc(4,*(this->ucl_device),UCL_READ_ONLY);
for (int i=0; i<4; i++) {
host_write_coul[i]=host_special_coul[i];
}
ucl_copy(sp_cl,host_write_coul,4,false);
_lj_types=lj_types;
_qqrd2e=qqrd2e;
_g_ewald=g_ewald;
_lamda=lamda;
// Allocate a host write buffer for data initialization
UCL_H_Vec<numtyp> host_write(lj_types*lj_types*32,*(this->ucl_device),
UCL_WRITE_ONLY);
for (int i=0; i<lj_types*lj_types; i++)
host_write[i]=0.0;
coeff.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY);
this->atom->type_pack4(ntypes,lj_types,coeff,host_write,host_a0,host_gamma,
host_sigma,host_cut_dpd);
cutsq.alloc(lj_types*lj_types,*(this->ucl_device),UCL_READ_ONLY);
this->atom->type_pack4(ntypes,lj_types,cutsq,host_write,host_cutsq,
host_cut_dpdsq,host_cut_slatersq);
double special_sqrt[4];
special_sqrt[0] = sqrt(host_special_lj[0]);
special_sqrt[1] = sqrt(host_special_lj[1]);
special_sqrt[2] = sqrt(host_special_lj[2]);
special_sqrt[3] = sqrt(host_special_lj[3]);
UCL_H_Vec<double> dview;
sp_lj.alloc(4,*(this->ucl_device),UCL_READ_ONLY);
dview.view(host_special_lj,4,*(this->ucl_device));
ucl_copy(sp_lj,dview,false);
sp_sqrt.alloc(4,*(this->ucl_device),UCL_READ_ONLY);
dview.view(special_sqrt,4,*(this->ucl_device));
ucl_copy(sp_sqrt,dview,false);
_tstat_only = 0;
if (tstat_only) _tstat_only=1;
_allocated=true;
this->_max_bytes=coeff.row_bytes()+cutsq.row_bytes()+sp_lj.row_bytes()+sp_sqrt.row_bytes();
return 0;
}
template <class numtyp, class acctyp>
void DPDCoulSlaterLongT::clear() {
if (!_allocated)
return;
_allocated=false;
coeff.clear();
cutsq.clear();
sp_lj.clear();
sp_sqrt.clear();
this->clear_atomic();
}
template <class numtyp, class acctyp>
double DPDCoulSlaterLongT::host_memory_usage() const {
return this->host_memory_usage_atomic()+sizeof(DPDCoulSlaterLong<numtyp,acctyp>);
}
// ---------------------------------------------------------------------------
// Calculate energies, forces, and torques
// ---------------------------------------------------------------------------
template <class numtyp, class acctyp>
int DPDCoulSlaterLongT::loop(const int eflag, const int vflag) {
int nall = this->atom->nall();
// signal that we need to transfer extra data from the host
this->atom->extra_data_unavail();
numtyp4 *pextra=reinterpret_cast<numtyp4*>(&(this->atom->extra[0]));
int n = 0;
int nstride = 1;
for (int i = 0; i < nall; i++) {
int idx = n+i*nstride;
numtyp4 v;
v.x = q[i];
v.y = 0;
v.z = 0;
v.w = 0;
pextra[idx] = v;
}
this->atom->add_extra_data();
// Compute the block size and grid size to keep all cores busy
const int BX=this->block_size();
int GX=static_cast<int>(ceil(static_cast<double>(this->ans->inum())/
(BX/this->_threads_per_atom)));
int ainum=this->ans->inum();
int nbor_pitch=this->nbor->nbor_pitch();
this->time_pair.start();
if (shared_types) {
this->k_pair_sel->set_size(GX,BX);
this->k_pair_sel->run(&this->atom->x, &this->atom->extra, &coeff, &sp_lj, &sp_cl, &sp_sqrt,
&this->nbor->dev_nbor, &this->_nbor_data->begin(),
&this->ans->force, &this->ans->engv, &eflag,
&vflag, &ainum, &nbor_pitch, &this->atom->v, &cutsq,
&this->_dtinvsqrt, &this->_seed, &this->_timestep,
&_qqrd2e, &_g_ewald, &_lamda,
&this->_tstat_only, &this->_threads_per_atom);
} else {
this->k_pair.set_size(GX,BX);
this->k_pair.run(&this->atom->x, &this->atom->extra, &coeff, &_lj_types, &sp_lj, &sp_cl, &sp_sqrt,
&this->nbor->dev_nbor, &this->_nbor_data->begin(),
&this->ans->force, &this->ans->engv, &eflag, &vflag,
&ainum, &nbor_pitch, &this->atom->v, &cutsq, &this->_dtinvsqrt,
&this->_seed, &this->_timestep,
&_qqrd2e, &_g_ewald, &_lamda,
&this->_tstat_only, &this->_threads_per_atom);
}
this->time_pair.stop();
return GX;
}
template <class numtyp, class acctyp>
void DPDCoulSlaterLongT::update_coeff(int ntypes, double **host_a0, double **host_gamma,
double **host_sigma, double **host_cut_dpd)
{
UCL_H_Vec<numtyp> host_write(_lj_types*_lj_types*32,*(this->ucl_device),
UCL_WRITE_ONLY);
this->atom->type_pack4(ntypes,_lj_types,coeff,host_write,host_a0,host_gamma,
host_sigma,host_cut_dpd);
}
// ---------------------------------------------------------------------------
// Get the extra data pointers from host
// ---------------------------------------------------------------------------
template <class numtyp, class acctyp>
void DPDCoulSlaterLongT::get_extra_data(double *host_q) {
q = host_q;
}
template class DPDCoulSlaterLong<PRECISION,ACC_PRECISION>;
}

View File

@ -0,0 +1,523 @@
// **************************************************************************
// dpd.cu
// -------------------
// Eddy BARRAUD (IFPEN/Sorbonne)
// Trung Dac Nguyen (U Chicago)
//
// Device code for acceleration of the dpd/coul/slater/long pair style
//
// __________________________________________________________________________
// This file is part of the LAMMPS Accelerator Library (LAMMPS_AL)
// __________________________________________________________________________
//
// begin : May 28, 2024
// email : eddy.barraud@outlook.fr
// ***************************************************************************
#if defined(NV_KERNEL) || defined(USE_HIP)
#include "lal_aux_fun1.h"
#ifndef _DOUBLE_DOUBLE
_texture( pos_tex,float4);
_texture( vel_tex,float4);
#else
_texture_2d( pos_tex,int4);
_texture_2d( vel_tex,int4);
#endif
#else
#define pos_tex x_
#define vel_tex v_
#endif
#define EPSILON (numtyp)1.0e-10
//#define _USE_UNIFORM_SARU_LCG
//#define _USE_UNIFORM_SARU_TEA8
//#define _USE_GAUSSIAN_SARU_LCG
#if !defined(_USE_UNIFORM_SARU_LCG) && !defined(_USE_UNIFORM_SARU_TEA8) && !defined(_USE_GAUSSIAN_SARU_LCG)
#define _USE_UNIFORM_SARU_LCG
#endif
// References:
// 1. Y. Afshar, F. Schmid, A. Pishevar, S. Worley, Comput. Phys. Comm. 184 (2013), 11191128.
// 2. C. L. Phillips, J. A. Anderson, S. C. Glotzer, Comput. Phys. Comm. 230 (2011), 7191-7201.
// PRNG period = 3666320093*2^32 ~ 2^64 ~ 10^19
#define LCGA 0x4beb5d59 /* Full period 32 bit LCG */
#define LCGC 0x2600e1f7
#define oWeylPeriod 0xda879add /* Prime period 3666320093 */
#define oWeylOffset 0x8009d14b
#define TWO_N32 0.232830643653869628906250e-9f /* 2^-32 */
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns uniformly distributed random numbers u in [-1.0;1.0]
// using the inherent LCG, then multiply u with sqrt(3) to "match"
// with a normal random distribution.
// Afshar et al. mutlplies u in [-0.5;0.5] with sqrt(12)
// Curly brackets to make variables local to the scope.
#ifdef _USE_UNIFORM_SARU_LCG
#define SQRT3 (numtyp)1.7320508075688772935274463
#define saru(seed1, seed2, seed, timestep, randnum) { \
unsigned int seed3 = seed + timestep; \
seed3^=(seed1<<7)^(seed2>>6); \
seed2+=(seed1>>4)^(seed3>>15); \
seed1^=(seed2<<9)+(seed3<<8); \
seed3^=0xA5366B4D*((seed2>>11) ^ (seed1<<1)); \
seed2+=0x72BE1579*((seed1<<4) ^ (seed3>>16)); \
seed1^=0x3F38A6ED*((seed3>>5) ^ (((signed int)seed2)>>22)); \
seed2+=seed1*seed3; \
seed1+=seed3 ^ (seed2>>2); \
seed2^=((signed int)seed2)>>17; \
unsigned int state = 0x79dedea3*(seed1^(((signed int)seed1)>>14)); \
unsigned int wstate = (state + seed2) ^ (((signed int)state)>>8); \
state = state + (wstate*(wstate^0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate>>1); \
state = LCGA*state + LCGC; \
wstate = wstate + oWeylOffset+((((signed int)wstate)>>31) & oWeylPeriod); \
unsigned int v = (state ^ (state>>26)) + wstate; \
unsigned int s = (signed int)((v^(v>>20))*0x6957f5a7); \
randnum = SQRT3*(s*TWO_N32*(numtyp)2.0-(numtyp)1.0); \
}
#endif
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns uniformly distributed random numbers u in [-1.0;1.0] using TEA8
// then multiply u with sqrt(3) to "match" with a normal random distribution
// Afshar et al. mutlplies u in [-0.5;0.5] with sqrt(12)
#ifdef _USE_UNIFORM_SARU_TEA8
#define SQRT3 (numtyp)1.7320508075688772935274463
#define k0 0xA341316C
#define k1 0xC8013EA4
#define k2 0xAD90777D
#define k3 0x7E95761E
#define delta 0x9e3779b9
#define rounds 8
#define saru(seed1, seed2, seed, timestep, randnum) { \
unsigned int seed3 = seed + timestep; \
seed3^=(seed1<<7)^(seed2>>6); \
seed2+=(seed1>>4)^(seed3>>15); \
seed1^=(seed2<<9)+(seed3<<8); \
seed3^=0xA5366B4D*((seed2>>11) ^ (seed1<<1)); \
seed2+=0x72BE1579*((seed1<<4) ^ (seed3>>16)); \
seed1^=0x3F38A6ED*((seed3>>5) ^ (((signed int)seed2)>>22)); \
seed2+=seed1*seed3; \
seed1+=seed3 ^ (seed2>>2); \
seed2^=((signed int)seed2)>>17; \
unsigned int state = 0x79dedea3*(seed1^(((signed int)seed1)>>14)); \
unsigned int wstate = (state + seed2) ^ (((signed int)state)>>8); \
state = state + (wstate*(wstate^0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate>>1); \
unsigned int sum = 0; \
for (int i=0; i < rounds; i++) { \
sum += delta; \
state += ((wstate<<4) + k0)^(wstate + sum)^((wstate>>5) + k1); \
wstate += ((state<<4) + k2)^(state + sum)^((state>>5) + k3); \
} \
unsigned int v = (state ^ (state>>26)) + wstate; \
unsigned int s = (signed int)((v^(v>>20))*0x6957f5a7); \
randnum = SQRT3*(s*TWO_N32*(numtyp)2.0-(numtyp)1.0); \
}
#endif
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns two uniformly distributed random numbers r1 and r2 in [-1.0;1.0],
// and uses the polar method (Marsaglia's) to transform to a normal random value
// This is used to compared with CPU DPD using RandMars::gaussian()
#ifdef _USE_GAUSSIAN_SARU_LCG
#define saru(seed1, seed2, seed, timestep, randnum) { \
unsigned int seed3 = seed + timestep; \
seed3^=(seed1<<7)^(seed2>>6); \
seed2+=(seed1>>4)^(seed3>>15); \
seed1^=(seed2<<9)+(seed3<<8); \
seed3^=0xA5366B4D*((seed2>>11) ^ (seed1<<1)); \
seed2+=0x72BE1579*((seed1<<4) ^ (seed3>>16)); \
seed1^=0x3F38A6ED*((seed3>>5) ^ (((signed int)seed2)>>22)); \
seed2+=seed1*seed3; \
seed1+=seed3 ^ (seed2>>2); \
seed2^=((signed int)seed2)>>17; \
unsigned int state=0x12345678; \
unsigned int wstate=12345678; \
state = 0x79dedea3*(seed1^(((signed int)seed1)>>14)); \
wstate = (state + seed2) ^ (((signed int)state)>>8); \
state = state + (wstate*(wstate^0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate>>1); \
unsigned int v, s; \
numtyp r1, r2, rsq; \
while (1) { \
state = LCGA*state + LCGC; \
wstate = wstate + oWeylOffset+((((signed int)wstate)>>31) & oWeylPeriod); \
v = (state ^ (state>>26)) + wstate; \
s = (signed int)((v^(v>>20))*0x6957f5a7); \
r1 = s*TWO_N32*(numtyp)2.0-(numtyp)1.0; \
state = LCGA*state + LCGC; \
wstate = wstate + oWeylOffset+((((signed int)wstate)>>31) & oWeylPeriod); \
v = (state ^ (state>>26)) + wstate; \
s = (signed int)((v^(v>>20))*0x6957f5a7); \
r2 = s*TWO_N32*(numtyp)2.0-(numtyp)1.0; \
rsq = r1 * r1 + r2 * r2; \
if (rsq < (numtyp)1.0) break; \
} \
numtyp fac = ucl_sqrt((numtyp)-2.0*log(rsq)/rsq); \
randnum = r2*fac; \
}
#endif
__kernel void k_dpd_coul_slater_long(const __global numtyp4 *restrict x_,
const __global numtyp4 *restrict extra,
const __global numtyp4 *restrict coeff,
const int lj_types,
const __global numtyp *restrict sp_lj,
const __global numtyp *restrict sp_cl_in,
const __global numtyp *restrict sp_sqrt,
const __global int * dev_nbor,
const __global int * dev_packed,
__global acctyp3 *restrict ans,
__global acctyp *restrict engv,
const int eflag, const int vflag, const int inum,
const int nbor_pitch,
const __global numtyp4 *restrict v_,
const __global numtyp4 *restrict cutsq,
const numtyp dtinvsqrt, const int seed,
const int timestep, const numtyp qqrd2e,
const numtyp g_ewald, const numtyp lamda,
const int tstat_only,
const int t_per_atom) {
int tid, ii, offset;
atom_info(t_per_atom,ii,tid,offset);
__local numtyp sp_cl[4];
///local_allocate_store_charge();
sp_cl[0]=sp_cl_in[0];
sp_cl[1]=sp_cl_in[1];
sp_cl[2]=sp_cl_in[2];
sp_cl[3]=sp_cl_in[3];
int n_stride;
local_allocate_store_pair();
acctyp3 f;
f.x=(acctyp)0; f.y=(acctyp)0; f.z=(acctyp)0;
acctyp e_coul, energy, virial[6];
if (EVFLAG) {
energy=(acctyp)0;
e_coul=(acctyp)0;
for (int i=0; i<6; i++) virial[i]=(acctyp)0;
}
if (ii<inum) {
int i, numj, nbor, nbor_end;
nbor_info(dev_nbor,dev_packed,nbor_pitch,t_per_atom,ii,offset,i,numj,
n_stride,nbor_end,nbor);
numtyp4 ix; fetch4(ix,i,pos_tex); //x_[i];
int itype=ix.w;
numtyp4 iv; fetch4(iv,i,vel_tex); //v_[i];
int itag=iv.w;
numtyp qtmp = extra[i].x; // q[i]
numtyp lamdainv = ucl_recip(lamda);
numtyp factor_dpd, factor_sqrt;
for ( ; nbor<nbor_end; nbor+=n_stride) {
ucl_prefetch(dev_packed+nbor+n_stride);
int j=dev_packed[nbor];
factor_dpd = sp_lj[sbmask(j)];
factor_sqrt = sp_sqrt[sbmask(j)];
numtyp factor_coul;
factor_coul = (numtyp)1.0-sp_cl[sbmask(j)];
j &= NEIGHMASK;
numtyp4 jx; fetch4(jx,j,pos_tex); //x_[j];
int jtype=jx.w;
numtyp4 jv; fetch4(jv,j,vel_tex); //v_[j];
int jtag=jv.w;
// Compute r12
numtyp delx = ix.x-jx.x;
numtyp dely = ix.y-jx.y;
numtyp delz = ix.z-jx.z;
numtyp rsq = delx*delx+dely*dely+delz*delz;
int mtype=itype*lj_types+jtype;
// cutsq[mtype].x -> global squared cutoff
if (rsq<cutsq[mtype].x) {
numtyp r=ucl_sqrt(rsq);
numtyp force_dpd = (numtyp)0.0;
numtyp force_coul = (numtyp)0.0;
// apply DPD force if distance below DPD cutoff
// cutsq[mtype].y -> DPD squared cutoff
if (rsq < cutsq[mtype].y && r > EPSILON) {
numtyp rinv=ucl_recip(r);
numtyp delvx = iv.x - jv.x;
numtyp delvy = iv.y - jv.y;
numtyp delvz = iv.z - jv.z;
numtyp dot = delx*delvx + dely*delvy + delz*delvz;
numtyp wd = (numtyp)1.0 - r/coeff[mtype].w;
unsigned int tag1=itag, tag2=jtag;
if (tag1 > tag2) {
tag1 = jtag; tag2 = itag;
}
numtyp randnum = (numtyp)0.0;
saru(tag1, tag2, seed, timestep, randnum);
// conservative force = a0 * wd, or 0 if tstat only
// drag force = -gamma * wd^2 * (delx dot delv) / r
// random force = sigma * wd * rnd * dtinvsqrt;
if (!tstat_only) force_dpd = coeff[mtype].x*wd;
force_dpd -= coeff[mtype].y*wd*wd*dot*rinv;
force_dpd *= factor_dpd;
force_dpd += factor_sqrt*coeff[mtype].z*wd*randnum*dtinvsqrt;
force_dpd *=rinv;
if (EVFLAG && eflag) {
// unshifted eng of conservative term:
// evdwl = -a0[itype][jtype]*r * (1.0-0.5*r/cut[itype][jtype]);
// eng shifted to 0.0 at cutoff
numtyp e = (numtyp)0.5*coeff[mtype].x*coeff[mtype].w * wd*wd;
energy += factor_dpd*e;
}
}// if cut_dpdsq
// apply Slater electrostatic force if distance below Slater cutoff
// and the two species have a slater coeff
// cutsq[mtype].z -> Coulombic squared cutoff
if ( cutsq[mtype].z != 0.0 && rsq < cutsq[mtype].z){
numtyp r2inv=ucl_recip(rsq);
numtyp _erfc;
numtyp grij = g_ewald * r;
numtyp expm2 = ucl_exp(-grij*grij);
numtyp t = ucl_recip((numtyp)1.0 + EWALD_P*grij);
_erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
numtyp prefactor = extra[j].x;
prefactor *= qqrd2e * cutsq[mtype].z * qtmp/r;
numtyp rlamdainv = r * lamdainv;
numtyp exprlmdainv = ucl_exp((numtyp)-2.0*rlamdainv);
numtyp slater_term = exprlmdainv*((numtyp)1.0 + ((numtyp)2.0*rlamdainv*((numtyp)1.0+rlamdainv)));
force_coul = prefactor*(_erfc + EWALD_F*grij*expm2-slater_term);
if (factor_coul > (numtyp)0) force_coul -= factor_coul*prefactor*((numtyp)1.0-slater_term);
force_coul *= r2inv;
if (EVFLAG && eflag) {
numtyp e_slater = ((numtyp)1.0 + rlamdainv)*exprlmdainv;
numtyp e = prefactor*(_erfc-e_slater);
if (factor_coul > (numtyp)0) e -= factor_coul*prefactor*((numtyp)1.0 - e_slater);
e_coul += e;
}
} // if cut_coulsq
numtyp force = force_coul + force_dpd;
f.x += delx*force;
f.y += dely*force;
f.z += delz*force;
if (EVFLAG && vflag) {
virial[0] += delx*delx*force;
virial[1] += dely*dely*force;
virial[2] += delz*delz*force;
virial[3] += delx*dely*force;
virial[4] += delx*delz*force;
virial[5] += dely*delz*force;
}
} // if cutsq
} // for nbor
} // if ii
store_answers_q(f,energy,e_coul,virial,ii,inum,tid,t_per_atom,offset,eflag,vflag,
ans,engv);
}
__kernel void k_dpd_coul_slater_long_fast(const __global numtyp4 *restrict x_,
const __global numtyp4 *restrict extra,
const __global numtyp4 *restrict coeff_in,
const __global numtyp *restrict sp_lj_in,
const __global numtyp *restrict sp_cl_in,
const __global numtyp *restrict sp_sqrt_in,
const __global int * dev_nbor,
const __global int * dev_packed,
__global acctyp3 *restrict ans,
__global acctyp *restrict engv,
const int eflag, const int vflag, const int inum,
const int nbor_pitch,
const __global numtyp4 *restrict v_,
const __global numtyp4 *restrict cutsq_in,
const numtyp dtinvsqrt, const int seed,
const int timestep, const numtyp qqrd2e,
const numtyp g_ewald, const numtyp lamda,
const int tstat_only,
const int t_per_atom) {
int tid, ii, offset;
atom_info(t_per_atom,ii,tid,offset);
__local numtyp4 coeff[MAX_SHARED_TYPES*MAX_SHARED_TYPES];
__local numtyp4 cutsq[MAX_SHARED_TYPES*MAX_SHARED_TYPES];
__local numtyp sp_lj[4];
__local numtyp sp_sqrt[4];
/// COUL Init
__local numtyp sp_cl[4];
if (tid<4) {
sp_lj[tid]=sp_lj_in[tid];
sp_sqrt[tid]=sp_sqrt_in[tid];
sp_cl[tid]=sp_cl_in[tid];
}
if (tid<MAX_SHARED_TYPES*MAX_SHARED_TYPES) {
coeff[tid]=coeff_in[tid];
cutsq[tid]=cutsq_in[tid];
}
__syncthreads();
int n_stride;
local_allocate_store_pair();
acctyp3 f;
f.x=(acctyp)0; f.y=(acctyp)0; f.z=(acctyp)0;
acctyp e_coul, energy, virial[6];
if (EVFLAG) {
energy=(acctyp)0;
e_coul=(acctyp)0;
for (int i=0; i<6; i++) virial[i]=(acctyp)0;
}
if (ii<inum) {
int i, numj, nbor, nbor_end;
nbor_info(dev_nbor,dev_packed,nbor_pitch,t_per_atom,ii,offset,i,numj,
n_stride,nbor_end,nbor);
numtyp4 ix; fetch4(ix,i,pos_tex); //x_[i];
int iw=ix.w;
int itype=fast_mul((int)MAX_SHARED_TYPES,iw);
numtyp4 iv; fetch4(iv,i,vel_tex); //v_[i];
int itag=iv.w;
numtyp qtmp = extra[i].x; // q[i]
numtyp lamdainv = ucl_recip(lamda);
numtyp factor_dpd, factor_sqrt;
for ( ; nbor<nbor_end; nbor+=n_stride) {
ucl_prefetch(dev_packed+nbor+n_stride);
int j=dev_packed[nbor];
factor_dpd = sp_lj[sbmask(j)];
factor_sqrt = sp_sqrt[sbmask(j)];
numtyp factor_coul;
factor_coul = (numtyp)1.0-sp_cl[sbmask(j)];
j &= NEIGHMASK;
numtyp4 jx; fetch4(jx,j,pos_tex); //x_[j];
numtyp4 jv; fetch4(jv,j,vel_tex); //v_[j];
int jtag=jv.w;
// Compute r12
numtyp delx = ix.x-jx.x;
numtyp dely = ix.y-jx.y;
numtyp delz = ix.z-jx.z;
numtyp rsq = delx*delx+dely*dely+delz*delz;
int mtype=itype+jx.w;
/// cutsq.x = cutsq, cutsq.y = cut_dpdsq, cutsq.z = cut_slatersq
if (rsq<cutsq[mtype].x) {
numtyp r=ucl_sqrt(rsq);
numtyp force_dpd = (numtyp)0.0;
numtyp force_coul = (numtyp)0.0;
// apply DPD force if distance below DPD cutoff
// cutsq[mtype].y -> DPD squared cutoff
if (rsq < cutsq[mtype].y && r > EPSILON) {
numtyp rinv=ucl_recip(r);
numtyp delvx = iv.x - jv.x;
numtyp delvy = iv.y - jv.y;
numtyp delvz = iv.z - jv.z;
numtyp dot = delx*delvx + dely*delvy + delz*delvz;
numtyp wd = (numtyp)1.0 - r/coeff[mtype].w;
unsigned int tag1=itag, tag2=jtag;
if (tag1 > tag2) {
tag1 = jtag; tag2 = itag;
}
numtyp randnum = (numtyp)0.0;
saru(tag1, tag2, seed, timestep, randnum);
// conservative force = a0 * wd, or 0 if tstat only
// drag force = -gamma * wd^2 * (delx dot delv) / r
// random force = sigma * wd * rnd * dtinvsqrt;
/// coeff.x = a0, coeff.y = gamma, coeff.z = sigma, coeff.w = cut_dpd
if (!tstat_only) force_dpd = coeff[mtype].x*wd;
force_dpd -= coeff[mtype].y*wd*wd*dot*rinv;
force_dpd *= factor_dpd;
force_dpd += factor_sqrt*coeff[mtype].z*wd*randnum*dtinvsqrt;
force_dpd *=rinv;
if (EVFLAG && eflag) {
// unshifted eng of conservative term:
// evdwl = -a0[itype][jtype]*r * (1.0-0.5*r/cut[itype][jtype]);
// eng shifted to 0.0 at cutoff
numtyp e = (numtyp)0.5*coeff[mtype].x*coeff[mtype].w * wd*wd;
energy += factor_dpd*e;
}
}// if cut_dpdsq
// apply Slater electrostatic force if distance below Slater cutoff
// and the two species have a slater coeff
// cutsq[mtype].z -> Coulombic squared cutoff
if ( cutsq[mtype].z != 0.0 && rsq < cutsq[mtype].z){
numtyp r2inv=ucl_recip(rsq);
numtyp _erfc;
numtyp grij = g_ewald * r;
numtyp expm2 = ucl_exp(-grij*grij);
numtyp t = ucl_recip((numtyp)1.0 + EWALD_P*grij);
_erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
numtyp prefactor = extra[j].x;
prefactor *= qqrd2e * cutsq[mtype].z * qtmp/r;
numtyp rlamdainv = r * lamdainv;
numtyp exprlmdainv = ucl_exp((numtyp)-2.0*rlamdainv);
numtyp slater_term = exprlmdainv*((numtyp)1.0 + ((numtyp)2.0*rlamdainv*((numtyp)1.0+rlamdainv)));
force_coul = prefactor*(_erfc + EWALD_F*grij*expm2-slater_term);
if (factor_coul > (numtyp)0) force_coul -= factor_coul*prefactor*((numtyp)1.0-slater_term);
force_coul *= r2inv;
if (EVFLAG && eflag) {
numtyp e_slater = ((numtyp)1.0 + rlamdainv)*exprlmdainv;
numtyp e_sf = prefactor*(_erfc-e_slater);
if (factor_coul > (numtyp)0) e_sf -= factor_coul*prefactor*((numtyp)1.0 - e_slater);
e_coul += e_sf;
}
} // if cut_coulsq
numtyp force = force_coul + force_dpd;
f.x += delx*force;
f.y += dely*force;
f.z += delz*force;
if (EVFLAG && vflag) {
virial[0] += delx*delx*force;
virial[1] += dely*dely*force;
virial[2] += delz*delz*force;
virial[3] += delx*dely*force;
virial[4] += delx*delz*force;
virial[5] += dely*delz*force;
}
} // if cutsq
} // for nbor
} // if ii
store_answers_q(f,energy,e_coul,virial,ii,inum,tid,t_per_atom,offset,eflag,vflag,
ans,engv);
}

View File

@ -0,0 +1,100 @@
/***************************************************************************
lal_dpd_coul_slater_long.h
-------------------
Eddy BARRAUD (IFPEN/Sorbonne)
Class for acceleration of the dpd/coul/slater/long pair style.
__________________________________________________________________________
This file is part of the LAMMPS Accelerator Library (LAMMPS_AL)
__________________________________________________________________________
begin : May 28, 2024
email : eddy.barraud@outlook.fr
***************************************************************************/
#ifndef LAL_DPD_CHARGED_H
#define LAL_DPD_CHARGED_H
#include "lal_base_dpd.h"
namespace LAMMPS_AL {
template <class numtyp, class acctyp>
class DPDCoulSlaterLong : public BaseDPD<numtyp, acctyp> {
public:
DPDCoulSlaterLong();
~DPDCoulSlaterLong();
/// Clear any previous data and set up for a new LAMMPS run
/** \param max_nbors initial number of rows in the neighbor matrix
* \param cell_size cutoff + skin
* \param gpu_split fraction of particles handled by device
*
* Returns:
* - 0 if successful
* - -1 if fix gpu not found
* - -3 if there is an out of memory error
* - -4 if the GPU library was not compiled for GPU
* - -5 Double precision is not supported on card **/
int init(const int ntypes, double **host_cutsq, double **host_a0, double **host_gamma,
double **host_sigma, double **host_cut_dpd, double **host_cut_dpdsq,
double **host_cut_slatersq, double *host_special_lj, bool tstat_only, const int nlocal,
const int nall, const int max_nbors, const int maxspecial, const double cell_size,
const double gpu_split, FILE *screen, double *host_special_coul, const double qqrd2e,
const double g_ewald, const double lamda);
/// Clear all host and device data
/** \note This is called at the beginning of the init() routine **/
void clear();
/// Returns memory usage on device per atom
int bytes_per_atom(const int max_nbors) const;
/// Total host memory used by library for pair style
double host_memory_usage() const;
/// Update coeff if needed (tstat only)
void update_coeff(int ntypes, double **host_a0, double **host_gamma,
double **host_sigma, double **host_cut_dpd );
void get_extra_data(double *host_q);
// --------------------------- TYPE DATA --------------------------
/// coeff.x = a0, coeff.y = gamma, coeff.z = sigma, coeff.w = cut_dpd
UCL_D_Vec<numtyp4> coeff;
/// cutsq.x = cutsq, cutsq.y = cut_dpdsq, cutsq.w = cut_slatersq
UCL_D_Vec<numtyp4> cutsq;
/// Special LJ values
UCL_D_Vec<numtyp> sp_lj, sp_sqrt;
/// Special Coul values [0-3]
UCL_D_Vec<numtyp> sp_cl;
/// If atom type constants fit in shared memory, use fast kernels
bool shared_types;
/// Number of atom types
int _lj_types;
/// Only used for thermostat
int _tstat_only;
/// Coulombic terms
numtyp _qqrd2e, _g_ewald, _lamda;
/// pointer to host data for atom charge
double *q;
private:
bool _allocated;
int loop(const int eflag, const int vflag);
};
}
#endif

View File

@ -0,0 +1,142 @@
/***************************************************************************
lal_dpd_coul_slater_long_ext.cpp
-------------------
Eddy BARRAUD (IFPEN/Sorbonne)
Functions for LAMMPS access to dpd/coul/slater/long acceleration routines.
__________________________________________________________________________
This file is part of the LAMMPS Accelerator Library (LAMMPS_AL)
__________________________________________________________________________
begin : May 28, 2024
email : eddy.barraud@outlook.fr
***************************************************************************/
#include <iostream>
#include <cassert>
#include <cmath>
#include "lal_dpd_coul_slater_long.h"
using namespace std;
using namespace LAMMPS_AL;
static DPDCoulSlaterLong<PRECISION,ACC_PRECISION> DPDCMF;
// ---------------------------------------------------------------------------
// Allocate memory on host and device and copy constants to device
// ---------------------------------------------------------------------------
int dpd_coul_slater_long_gpu_init(const int ntypes, double **host_cutsq, double **host_a0,
double **host_gamma, double **host_sigma, double **host_cut_dpd,
double **host_cut_dpdsq, double **host_cut_slatersq,
double *special_lj, const int inum, const int nall,
const int max_nbors, const int maxspecial,
const double cell_size, int &gpu_mode, FILE *screen,
double *host_special_coul, const double qqrd2e,
const double g_ewald, const double lamda) {
DPDCMF.clear();
gpu_mode=DPDCMF.device->gpu_mode();
double gpu_split=DPDCMF.device->particle_split();
int first_gpu=DPDCMF.device->first_device();
int last_gpu=DPDCMF.device->last_device();
int world_me=DPDCMF.device->world_me();
int gpu_rank=DPDCMF.device->gpu_rank();
int procs_per_gpu=DPDCMF.device->procs_per_gpu();
DPDCMF.device->init_message(screen,"dpd",first_gpu,last_gpu);
bool message=false;
if (DPDCMF.device->replica_me()==0 && screen)
message=true;
if (message) {
fprintf(screen,"Initializing Device and compiling on process 0...");
fflush(screen);
}
int init_ok=0;
if (world_me==0)
init_ok=DPDCMF.init(ntypes, host_cutsq, host_a0, host_gamma, host_sigma, host_cut_dpd,
host_cut_dpdsq, host_cut_slatersq, special_lj, false, inum, nall,
max_nbors, maxspecial, cell_size, gpu_split, screen, host_special_coul,
qqrd2e, g_ewald, lamda);
DPDCMF.device->world_barrier();
if (message)
fprintf(screen,"Done.\n");
for (int i=0; i<procs_per_gpu; i++) {
if (message) {
if (last_gpu-first_gpu==0)
fprintf(screen,"Initializing Device %d on core %d...",first_gpu,i);
else
fprintf(screen,"Initializing Devices %d-%d on core %d...",first_gpu,
last_gpu,i);
fflush(screen);
}
if (gpu_rank==i && world_me!=0)
init_ok=DPDCMF.init(ntypes, host_cutsq, host_a0, host_gamma, host_sigma, host_cut_dpd,
host_cut_dpdsq, host_cut_slatersq, special_lj, false, inum, nall,
max_nbors, maxspecial, cell_size, gpu_split, screen, host_special_coul,
qqrd2e, g_ewald, lamda);
DPDCMF.device->serialize_init();
if (message)
fprintf(screen,"Done.\n");
}
if (message)
fprintf(screen,"\n");
if (init_ok==0)
DPDCMF.estimate_gpu_overhead();
return init_ok;
}
void dpd_coul_slater_long_gpu_clear() {
DPDCMF.clear();
}
int ** dpd_coul_slater_long_gpu_compute_n(const int ago, const int inum_full, const int nall,
double **host_x, int *host_type, double *sublo,
double *subhi, tagint *tag, int **nspecial,
tagint **special, const bool eflag, const bool vflag,
const bool eatom, const bool vatom, int &host_start,
int **ilist, int **jnum, const double cpu_time, bool &success,
double **host_v, const double dtinvsqrt,
const int seed, const int timestep,
double *boxlo, double *prd) {
return DPDCMF.compute(ago, inum_full, nall, host_x, host_type, sublo,
subhi, tag, nspecial, special, eflag, vflag, eatom,
vatom, host_start, ilist, jnum, cpu_time, success,
host_v, dtinvsqrt, seed, timestep, boxlo, prd);
}
void dpd_coul_slater_long_gpu_compute(const int ago, const int inum_full, const int nall,
double **host_x, int *host_type, int *ilist, int *numj,
int **firstneigh, const bool eflag, const bool vflag,
const bool eatom, const bool vatom, int &host_start,
const double cpu_time, bool &success, tagint *tag,
double **host_v, const double dtinvsqrt,
const int seed, const int timestep,
const int nlocal, double *boxlo, double *prd) {
DPDCMF.compute(ago, inum_full, nall, host_x, host_type, ilist, numj,
firstneigh, eflag, vflag, eatom, vatom, host_start, cpu_time, success,
tag, host_v, dtinvsqrt, seed, timestep, nlocal, boxlo, prd);
}
void dpd_coul_slater_long_gpu_update_coeff(int ntypes, double **host_a0, double **host_gamma,
double **host_sigma, double **host_cut_dpd)
{
DPDCMF.update_coeff(ntypes,host_a0,host_gamma,host_sigma, host_cut_dpd);
}
void dpd_coul_slater_long_gpu_get_extra_data(double *host_q) {
DPDCMF.get_extra_data(host_q);
}
double dpd_coul_slater_long_gpu_bytes() {
return DPDCMF.host_memory_usage();
}

View File

@ -891,7 +891,7 @@ class lammps(object):
# set length of vector for items that are not a scalar # set length of vector for items that are not a scalar
vec_dict = { 'boxlo':3, 'boxhi':3, 'sublo':3, 'subhi':3, vec_dict = { 'boxlo':3, 'boxhi':3, 'sublo':3, 'subhi':3,
'sublo_lambda':3, 'subhi_lambda':3, 'periodicity':3, 'sublo_lambda':3, 'subhi_lambda':3, 'periodicity':3,
'special_lj':4, 'special_coul':4 } 'special_lj':4, 'special_coul':4, 'procgrid':3 }
if name in vec_dict: if name in vec_dict:
veclen = vec_dict[name] veclen = vec_dict[name]
elif name == 'respa_dt': elif name == 'respa_dt':

View File

@ -796,18 +796,16 @@ class PyLammps(object):
comm = {} comm = {}
comm['nprocs'] = self.lmp.extract_setting("world_size") comm['nprocs'] = self.lmp.extract_setting("world_size")
comm['nthreads'] = self.lmp.extract_setting("nthreads") comm['nthreads'] = self.lmp.extract_setting("nthreads")
comm['proc_grid'] = comm['procgrid'] = self.lmp.extract_global("procgrid")
idx = self.lmp.extract_setting("comm_style")
comm['comm_style'] = ('brick', 'tiled')[idx]
idx = self.lmp.extract_setting("comm_style")
comm['comm_layout'] = ('uniform', 'nonuniform', 'irregular')[idx]
comm['ghost_velocity'] = self.lmp.extract_setting("ghost_velocity") == 1
for line in output: for line in output:
if line.startswith("MPI library"): if line.startswith("MPI library"):
comm['mpi_version'] = line.split(':')[1].strip() comm['mpi_version'] = line.split(':')[1].strip()
elif line.startswith("Comm style"):
parts = self._split_values(line)
comm['comm_style'] = self._get_pair(parts[0])[1]
comm['comm_layout'] = self._get_pair(parts[1])[1]
elif line.startswith("Processor grid"):
comm['proc_grid'] = [int(x) for x in self._get_pair(line)[1].split('x')]
elif line.startswith("Communicate velocities for ghost atoms"):
comm['ghost_velocity'] = (self._get_pair(line)[1] == "yes")
return comm return comm
def _parse_element_list(self, output): def _parse_element_list(self, output):

2
src/.gitignore vendored
View File

@ -1715,6 +1715,8 @@
/pair_dpd.h /pair_dpd.h
/pair_dpd_tstat.cpp /pair_dpd_tstat.cpp
/pair_dpd_tstat.h /pair_dpd_tstat.h
/pair_dpd_coul_slater_long.cpp
/pair_dpd_coul_slater_long.h
/pair_dpd_ext.cpp /pair_dpd_ext.cpp
/pair_dpd_ext.h /pair_dpd_ext.h
/pair_dpd_ext_tstat.cpp /pair_dpd_ext_tstat.cpp

39
src/DPD-BASIC/Install.sh Executable file
View File

@ -0,0 +1,39 @@
# Install/unInstall package files in LAMMPS
# mode = 0/1/2 for uninstall/install/update
mode=$1
# enforce using portable C locale
LC_ALL=C
export LC_ALL
# arg1 = file, arg2 = file it depends on
action () {
if (test $mode = 0) then
rm -f ../$1
elif (! cmp -s $1 ../$1) then
if (test -z "$2" || test -e ../$2) then
cp $1 ..
if (test $mode = 2) then
echo " updating src/$1"
fi
fi
elif (test -n "$2") then
if (test ! -e ../$2) then
rm -f ../$1
fi
fi
}
# list of files with optional dependcies
action pair_dpd_coul_slater_long.cpp pppm.cpp
action pair_dpd_coul_slater_long.h pppm.h
action pair_dpd.cpp
action pair_dpd_ext.cpp
action pair_dpd_ext.h
action pair_dpd_ext_tstat.cpp
action pair_dpd_ext_tstat.h
action pair_dpd.h
action pair_dpd_tstat.cpp
action pair_dpd_tstat.h

View File

@ -0,0 +1,544 @@
// clang-format off
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Eddy BARRAUD (IFPEN/Sorbonne)
------------------------------------------------------------------------- */
#include "pair_dpd_coul_slater_long.h"
#include "atom.h"
#include "comm.h"
#include "error.h"
#include "force.h"
#include "memory.h"
#include "neigh_list.h"
#include "neighbor.h"
#include "random_mars.h"
#include "update.h"
#include "ewald_const.h"
#include "kspace.h"
#include <cmath>
#include <cstring>
using namespace LAMMPS_NS;
using namespace EwaldConst;
static constexpr double EPSILON = 1.0e-10;
/* ---------------------------------------------------------------------- */
PairDPDCoulSlaterLong::PairDPDCoulSlaterLong(LAMMPS *lmp) :
Pair(lmp), cut_dpd(nullptr), cut_dpdsq(nullptr), cut_slatersq(nullptr),
a0(nullptr), gamma(nullptr), sigma(nullptr), random(nullptr)
{
writedata = 1;
ewaldflag = pppmflag = 1;
respa_enable = 0;
}
/* ---------------------------------------------------------------------- */
PairDPDCoulSlaterLong::~PairDPDCoulSlaterLong()
{
if (copymode) return;
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);
memory->destroy(cut_dpd);
memory->destroy(cut_dpdsq);
memory->destroy(cut_slatersq);
memory->destroy(cut);
memory->destroy(a0);
memory->destroy(gamma);
memory->destroy(sigma);
}
if (random) delete random;
}
/* ---------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::compute(int eflag, int vflag)
{
int i,j,ii,jj,inum,jnum,itype,jtype;
double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul,fpair;
double vxtmp,vytmp,vztmp,delvx,delvy,delvz;
double r2inv,forcedpd,forcecoul,factor_coul;
double grij,expm2,prefactor,t,erfc;
double rsq,r,rinv,dot,wd,randnum,factor_dpd,factor_sqrt;
int *ilist,*jlist,*numneigh,**firstneigh;
double slater_term;
evdwl = ecoul = 0.0;
ev_init(eflag,vflag);
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
int *type = atom->type;
int nlocal = atom->nlocal;
double *special_lj = force->special_lj;
int newton_pair = force->newton_pair;
double dtinvsqrt = 1.0/sqrt(update->dt);
double *q = atom->q;
double *special_coul = force->special_coul;
double qqrd2e = force->qqrd2e;
inum = list->inum;
ilist = list->ilist;
numneigh = list->numneigh;
firstneigh = list->firstneigh;
// loop over neighbors of my atoms
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
qtmp = q[i];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
vxtmp = v[i][0];
vytmp = v[i][1];
vztmp = v[i][2];
itype = type[i];
jlist = firstneigh[i];
jnum = numneigh[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
factor_dpd = special_lj[sbmask(j)];
factor_sqrt = special_sqrt[sbmask(j)];
factor_coul = special_coul[sbmask(j)];
j &= NEIGHMASK;
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx*delx + dely*dely + delz*delz;
jtype = type[j];
// forces if below maximum cutoff
if (rsq < cutsq[itype][jtype]) {
r = sqrt(rsq);
if (evflag) evdwl = ecoul = 0.0;
// apply DPD force if distance below DPD cutoff
if (rsq < cut_dpdsq[itype][jtype] && r > EPSILON) {
rinv = 1.0/r;
delvx = vxtmp - v[j][0];
delvy = vytmp - v[j][1];
delvz = vztmp - v[j][2];
dot = delx*delvx + dely*delvy + delz*delvz;
wd = 1.0 - r/cut_dpd[itype][jtype];
randnum = random->gaussian();
// conservative force = a0 * wd
// drag force = -gamma * wd^2 * (delx dot delv) / r
// random force = sigma * wd * rnd * dtinvsqrt;
// random force must be scaled by sqrt(factor_dpd)
forcedpd = a0[itype][jtype]*wd;
forcedpd -= gamma[itype][jtype]*wd*wd*dot*rinv;
forcedpd *= factor_dpd;
forcedpd += factor_sqrt*sigma[itype][jtype]*wd*randnum*dtinvsqrt;
forcedpd *= rinv;
if (eflag) {
// eng shifted to 0.0 at cutoff
evdwl = 0.5*a0[itype][jtype]*cut_dpd[itype][jtype] * wd*wd;
evdwl *= factor_dpd;
}
} else forcedpd = 0.0;
// apply Slater electrostatic force if distance below Slater cutoff
// and the two species are charged
if (rsq < cut_slatersq[itype][jtype]){
r2inv = 1.0/rsq;
grij = g_ewald * r;
expm2 = exp(-grij*grij);
t = 1.0 / (1.0 + EWALD_P*grij);
erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
slater_term = exp(-2*r/lamda)*(1 + (2*r/lamda*(1+r/lamda)));
prefactor = qqrd2e * qtmp*q[j]/r;
forcecoul = prefactor * (erfc + EWALD_F*grij*expm2 - slater_term);
if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor*(1-slater_term);
forcecoul *= r2inv;
if (eflag) {
ecoul = prefactor*(erfc - (1 + r/lamda)*exp(-2*r/lamda));
if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor*(1.0-(1 + r/lamda)*exp(-2*r/lamda));
}
} else forcecoul = 0.0;
fpair = forcedpd + forcecoul;
f[i][0] += delx*fpair;
f[i][1] += dely*fpair;
f[i][2] += delz*fpair;
if (newton_pair || j < nlocal) {
f[j][0] -= delx*fpair;
f[j][1] -= dely*fpair;
f[j][2] -= delz*fpair;
}
if (evflag) ev_tally(i,j,nlocal,newton_pair,
evdwl,ecoul,fpair,delx,dely,delz);
}
}
}
if (vflag_fdotr) virial_fdotr_compute();
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::allocate()
{
int i,j;
allocated = 1;
int n = atom->ntypes;
memory->create(setflag,n+1,n+1,"pair:setflag");
for (i = 1; i <= n; i++)
for (j = i; j <= n; j++)
setflag[i][j] = 0;
memory->create(cutsq,n+1,n+1,"pair:cutsq");
memory->create(cut,n+1,n+1,"pair:cut");
memory->create(cut_dpd,n+1,n+1,"pair:cut_dpd");
memory->create(cut_dpdsq,n+1,n+1,"pair:cut_dpdsq");
memory->create(cut_slatersq,n+1,n+1,"pair:cut_slatersq");
memory->create(a0,n+1,n+1,"pair:a0");
memory->create(gamma,n+1,n+1,"pair:gamma");
memory->create(sigma,n+1,n+1,"pair:sigma");
for (i = 0; i <= atom->ntypes; i++)
for (j = 0; j <= atom->ntypes; j++)
sigma[i][j] = gamma[i][j] = 0.0;
}
/* ----------------------------------------------------------------------
global settings
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::settings(int narg, char **arg)
{
// params : T cut_dpd seed lambda cut_coul
if (narg != 5) error->all(FLERR,"Illegal pair_style command");
temperature = utils::numeric(FLERR,arg[0],false,lmp);
cut_global = utils::numeric(FLERR,arg[1],false,lmp);
seed = utils::inumeric(FLERR,arg[2],false,lmp);
lamda = utils::numeric(FLERR,arg[3],false,lmp);
cut_coul = utils::numeric(FLERR,arg[4],false,lmp);
// initialize Marsaglia RNG with processor-unique seed
if (seed <= 0)
error->all(FLERR,"Invalid random seed {} for pair_style dpd/coul/slater/long command", seed);
delete random;
random = new RanMars(lmp,seed + comm->me);
// reset cutoffs that have been explicitly set
if (allocated) {
int i,j;
for (i = 1; i <= atom->ntypes; i++)
for (j = i; j <= atom->ntypes; j++)
if (setflag[i][j]) cut_dpd[i][j] = MAX(cut_global,cut_coul);
}
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::coeff(int narg, char **arg)
{
if (narg < 4 || narg > 6)
error->all(FLERR,"Incorrect args for pair coefficients");
if (!allocated) allocate();
int ilo,ihi,jlo,jhi;
utils::bounds(FLERR,arg[0],1,atom->ntypes,ilo,ihi,error);
utils::bounds(FLERR,arg[1],1,atom->ntypes,jlo,jhi,error);
double a0_one = utils::numeric(FLERR,arg[2],false,lmp);
double gamma_one = utils::numeric(FLERR,arg[3],false,lmp);
double cut_one = cut_global;
double cut_two = 0.0;
if (narg > 4) {
bool do_slater = utils::logical(FLERR,arg[4],false,lmp);
if (do_slater) cut_two = cut_coul;
}
if (narg > 5) cut_one = utils::numeric(FLERR,arg[5],false,lmp);
int count = 0;
for (int i = ilo; i <= ihi; i++) {
for (int j = MAX(jlo,i); j <= jhi; j++) {
a0[i][j] = a0_one;
gamma[i][j] = gamma_one;
cut_dpd[i][j] = cut_one;
cut_slatersq[i][j] = cut_two * cut_two;
cut[i][j] = MAX(cut_one, cut_two);
setflag[i][j] = 1;
count++;
}
}
if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients");
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::init_style()
{
if (comm->ghost_velocity == 0)
error->all(FLERR,"Pair dpd requires ghost atoms store velocity");
if (!atom->q_flag)
error->all(FLERR,"Pair style coul/slater/long requires atom attribute q");
// if newton off, forces between atoms ij will be double computed
// using different random numbers
if (force->newton_pair == 0 && comm->me == 0)
error->warning(FLERR, "Pair dpd needs newton pair on for momentum conservation");
neighbor->add_request(this);
// precompute random force scaling factors
for (int i = 0; i < 4; ++i) special_sqrt[i] = sqrt(force->special_lj[i]);
// ensure use of KSpace long-range solver, set g_ewald
if (force->kspace == nullptr)
error->all(FLERR,"Pair style requires a KSpace style");
g_ewald = force->kspace->g_ewald;
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
return the maximum cutoff between Slater or DPD cutoff if charged
return the DPD cutoff for uncharged
------------------------------------------------------------------------- */
double PairDPDCoulSlaterLong::init_one(int i, int j)
{
if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set");
sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]);
cut_dpdsq[i][j] = cut_dpd[i][j] * cut_dpd[i][j];
a0[j][i] = a0[i][j];
gamma[j][i] = gamma[i][j];
sigma[j][i] = sigma[i][j];
cut_dpd[j][i] = cut_dpd[i][j];
cut[j][i] = cut[i][j];
cut_dpdsq[j][i] = cut_dpdsq[i][j];
cut_slatersq[j][i] = cut_slatersq[i][j];
return MAX(cut_dpd[i][j], sqrt(cut_slatersq[i][j]));
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::write_restart(FILE *fp)
{
write_restart_settings(fp);
int i,j;
for (i = 1; i <= atom->ntypes; i++) {
for (j = i; j <= atom->ntypes; j++) {
fwrite(&setflag[i][j],sizeof(int),1,fp);
if (setflag[i][j]) {
fwrite(&a0[i][j],sizeof(double),1,fp);
fwrite(&gamma[i][j],sizeof(double),1,fp);
fwrite(&cut[i][j],sizeof(double),1,fp);
fwrite(&cut_dpd[i][j],sizeof(double),1,fp);
fwrite(&cut_slatersq[i][j],sizeof(double),1,fp);
}
}
}
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::read_restart(FILE *fp)
{
read_restart_settings(fp);
allocate();
int i,j;
int me = comm->me;
for (i = 1; i <= atom->ntypes; i++) {
for (j = i; j <= atom->ntypes; j++) {
if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error);
MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
if (setflag[i][j]) {
if (me == 0) {
utils::sfread(FLERR,&a0[i][j],sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&gamma[i][j],sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&cut[i][j],sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&cut_dpd[i][j],sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&cut_slatersq[i][j],sizeof(double),1,fp,nullptr,error);
}
MPI_Bcast(&a0[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&gamma[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_dpd[i][j],1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_slatersq[i][j],1,MPI_DOUBLE,0,world);
}
}
}
}
/* ----------------------------------------------------------------------
proc 0 writes to restart file
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::write_restart_settings(FILE *fp)
{
fwrite(&temperature,sizeof(double),1,fp);
fwrite(&cut_global,sizeof(double),1,fp);
fwrite(&seed,sizeof(int),1,fp);
fwrite(&lamda,sizeof(double),1,fp);
fwrite(&cut_coul,sizeof(double),1,fp);
}
/* ----------------------------------------------------------------------
proc 0 reads from restart file, bcasts
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::read_restart_settings(FILE *fp)
{
if (comm->me == 0) {
utils::sfread(FLERR,&temperature,sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&seed,sizeof(int),1,fp,nullptr,error);
utils::sfread(FLERR,&lamda,sizeof(double),1,fp,nullptr,error);
utils::sfread(FLERR,&cut_coul,sizeof(double),1,fp,nullptr,error);
}
MPI_Bcast(&temperature,1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world);
MPI_Bcast(&seed,1,MPI_INT,0,world);
MPI_Bcast(&lamda,1,MPI_DOUBLE,0,world);
MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world);
// initialize Marsaglia RNG with processor-unique seed
// same seed that pair_style command initially specified
if (random) delete random;
random = new RanMars(lmp,seed + comm->me);
}
/* ----------------------------------------------------------------------
proc 0 writes to data file
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::write_data(FILE *fp)
{
for (int i = 1; i <= atom->ntypes; i++)
fprintf(fp,"%d %g %g\n",i,a0[i][i],gamma[i][i]);
}
/* ----------------------------------------------------------------------
proc 0 writes all pairs to data file
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLong::write_data_all(FILE *fp)
{
for (int i = 1; i <= atom->ntypes; i++)
for (int j = i; j <= atom->ntypes; j++)
fprintf(fp,"%d %d %g %g %s %g\n",i,j,a0[i][j],gamma[i][j],
(cut_slatersq[i][j] == 0.0) ? "yes" : "no", cut_dpd[i][j]);
}
/* ---------------------------------------------------------------------- */
double PairDPDCoulSlaterLong::single(int i, int j, int itype, int jtype, double rsq,
double factor_coul, double factor_dpd, double &fforce)
{
double r,rinv,wd,phi;
double r2inv,grij,expm2,t,erfc,prefactor;
double slater_term;
double forcecoul,phicoul;
double energy = 0.0;
fforce = 0.0;
r = sqrt(rsq);
// compute DPD force and energy
if (rsq < cut_dpdsq[itype][jtype] && r > EPSILON) {
rinv = 1.0/r;
wd = 1.0 - r/cut_dpd[itype][jtype];
fforce += a0[itype][jtype]*wd * factor_dpd*rinv;
phi = 0.5*a0[itype][jtype]*cut_dpd[itype][jtype] * wd*wd;
energy += factor_dpd*phi;
}
// compute Slater coulombic force and energy
if (atom->q[i]*atom->q[j] != 0.0 && rsq < cut_slatersq[itype][jtype]) {
r2inv = 1.0/rsq;
grij = g_ewald * r;
expm2 = exp(-grij*grij);
t = 1.0 / (1.0 + EWALD_P*grij);
erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
slater_term = exp(-2*r/lamda)*(1 + (2*r/lamda*(1+r/lamda)));
prefactor = force->qqrd2e * atom->q[i]*atom->q[j]/r;
forcecoul = prefactor * (erfc + EWALD_F*grij*expm2 - slater_term);
if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor;
fforce += forcecoul * r2inv;
phicoul = prefactor*(erfc - (1 + r/lamda)*exp(-2*r/lamda));
if (factor_coul < 1.0) phicoul -= (1.0-factor_coul)*prefactor;
energy += phicoul;
}
return energy;
}
void *PairDPDCoulSlaterLong::extract(const char *str, int &dim)
{
dim = 0;
if (strcmp(str,"cut_coul") == 0) return (void *) &cut_coul;
if (strcmp(str,"lamda") == 0) return (void *) &lamda;
dim = 2;
if (strcmp(str,"a0") == 0) return (void *) a0;
if (strcmp(str,"gamma") == 0) return (void *) gamma;
return nullptr;
}

View File

@ -0,0 +1,64 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef PAIR_CLASS
// clang-format off
PairStyle(dpd/coul/slater/long,PairDPDCoulSlaterLong);
// clang-format on
#else
#ifndef LMP_PAIR_DPD_COUL_SLATER_LONG_H
#define LMP_PAIR_DPD_COUL_SLATER_LONG_H
#include "pair.h"
namespace LAMMPS_NS {
class PairDPDCoulSlaterLong : public Pair {
public:
PairDPDCoulSlaterLong(class LAMMPS *);
~PairDPDCoulSlaterLong() 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 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;
void write_data_all(FILE *) override;
double single(int, int, int, int, double, double, double, double &) override;
void *extract(const char *, int &) override;
protected:
double cut_global, temperature;
double special_sqrt[4];
int seed;
double **cut;
double **cut_dpd, **cut_dpdsq, **cut_slatersq;
double **a0, **gamma;
double **sigma;
class RanMars *random;
double cut_coul, qdist;
double lamda;
double g_ewald;
virtual void allocate();
};
} // namespace LAMMPS_NS
#endif
#endif

View File

@ -116,6 +116,7 @@ if (test $1 = "KSPACE") then
depend CG-SPICA depend CG-SPICA
depend CORESHELL depend CORESHELL
depend DIELECTRIC depend DIELECTRIC
depend DPD-BASIC
depend GPU depend GPU
depend KOKKOS depend KOKKOS
depend OPT depend OPT

View File

@ -0,0 +1,474 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Eddy BARRAUD (IFPEN/Sorbonne)
------------------------------------------------------------------------- */
#include "pair_dpd_coul_slater_long_gpu.h"
#include "atom.h"
#include "comm.h"
#include "domain.h"
#include "error.h"
#include "force.h"
#include "gpu_extra.h"
#include "neigh_list.h"
#include "neighbor.h"
#include "suffix.h"
#include "update.h"
#include "ewald_const.h"
#include "kspace.h"
#include <cmath>
#include <cstring>
using namespace LAMMPS_NS;
using namespace EwaldConst;
// External functions from cuda library for atom decomposition
int dpd_coul_slater_long_gpu_init(const int ntypes, double **cutsq, double **host_a0,
double **host_gamma, double **host_sigma, double **host_cut_dpd,
double **host_cut_dpdsq, double **host_cut_slatersq,
double *special_lj, const int inum, const int nall,
const int max_nbors, const int maxspecial,
const double cell_size, int &gpu_mode, FILE *screen,
double *host_special_coul, const double qqrd2e,
const double g_ewald, const double lamda);
void dpd_coul_slater_long_gpu_clear();
int **dpd_coul_slater_long_gpu_compute_n(const int ago, const int inum_full, const int nall,
double **host_x, int *host_type, double *sublo,
double *subhi, tagint *tag, int **nspecial,
tagint **special, const bool eflag, const bool vflag,
const bool eatom, const bool vatom, int &host_start,
int **ilist, int **jnum, const double cpu_time,
bool &success, double **host_v, const double dtinvsqrt,
const int seed, const int timestep, double *boxlo,
double *prd);
void dpd_coul_slater_long_gpu_compute(const int ago, const int inum_full, const int nall,
double **host_x, int *host_type, int *ilist, int *numj,
int **firstneigh, const bool eflag, const bool vflag,
const bool eatom, const bool vatom, int &host_start,
const double cpu_time, bool &success, tagint *tag,
double **host_v, const double dtinvsqrt, const int seed,
const int timestep, const int nlocal, double *boxlo,
double *prd);
void dpd_coul_slater_long_gpu_get_extra_data(double *host_q);
double dpd_coul_slater_long_gpu_bytes();
static constexpr double EPSILON = 1.0e-10;
//#define _USE_UNIFORM_SARU_LCG
//#define _USE_UNIFORM_SARU_TEA8
//#define _USE_GAUSSIAN_SARU_LCG
#if !defined(_USE_UNIFORM_SARU_LCG) && !defined(_USE_UNIFORM_SARU_TEA8) && \
!defined(_USE_GAUSSIAN_SARU_LCG)
#define _USE_UNIFORM_SARU_LCG
#endif
// References:
// 1. Y. Afshar, F. Schmid, A. Pishevar, S. Worley, Comput. Phys. Comm. 184 (2013), 11191128.
// 2. C. L. Phillips, J. A. Anderson, S. C. Glotzer, Comput. Phys. Comm. 230 (2011), 7191-7201.
// PRNG period = 3666320093*2^32 ~ 2^64 ~ 10^19
#define LCGA 0x4beb5d59 // Full period 32 bit LCG
#define LCGC 0x2600e1f7
#define oWeylPeriod 0xda879add // Prime period 3666320093
#define oWeylOffset 0x8009d14b
#define TWO_N32 0.232830643653869628906250e-9f /* 2^-32 */
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns uniformly distributed random numbers u in [-1.0;1.0]
// using the inherent LCG, then multiply u with sqrt(3) to "match"
// with a normal random distribution.
// Afshar et al. mutlplies u in [-0.5;0.5] with sqrt(12)
// Curly brackets to make variables local to the scope.
#ifdef _USE_UNIFORM_SARU_LCG
#define numtyp double
#define SQRT3 (numtyp) 1.7320508075688772935274463
#define saru(seed1, seed2, seed, timestep, randnum) \
{ \
unsigned int seed3 = seed + timestep; \
seed3 ^= (seed1 << 7) ^ (seed2 >> 6); \
seed2 += (seed1 >> 4) ^ (seed3 >> 15); \
seed1 ^= (seed2 << 9) + (seed3 << 8); \
seed3 ^= 0xA5366B4D * ((seed2 >> 11) ^ (seed1 << 1)); \
seed2 += 0x72BE1579 * ((seed1 << 4) ^ (seed3 >> 16)); \
seed1 ^= 0x3F38A6ED * ((seed3 >> 5) ^ (((signed int) seed2) >> 22)); \
seed2 += seed1 * seed3; \
seed1 += seed3 ^ (seed2 >> 2); \
seed2 ^= ((signed int) seed2) >> 17; \
unsigned int state = 0x79dedea3 * (seed1 ^ (((signed int) seed1) >> 14)); \
unsigned int wstate = (state + seed2) ^ (((signed int) state) >> 8); \
state = state + (wstate * (wstate ^ 0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate >> 1); \
state = LCGA * state + LCGC; \
wstate = wstate + oWeylOffset + ((((signed int) wstate) >> 31) & oWeylPeriod); \
unsigned int v = (state ^ (state >> 26)) + wstate; \
unsigned int s = (signed int) ((v ^ (v >> 20)) * 0x6957f5a7); \
randnum = SQRT3 * (s * TWO_N32 * (numtyp) 2.0 - (numtyp) 1.0); \
}
#endif
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns uniformly distributed random numbers u in [-1.0;1.0] using TEA8
// then multiply u with sqrt(3) to "match" with a normal random distribution
// Afshar et al. mutlplies u in [-0.5;0.5] with sqrt(12)
#ifdef _USE_UNIFORM_SARU_TEA8
#define numtyp double
#define SQRT3 (numtyp) 1.7320508075688772935274463
#define k0 0xA341316C
#define k1 0xC8013EA4
#define k2 0xAD90777D
#define k3 0x7E95761E
#define delta 0x9e3779b9
#define rounds 8
#define saru(seed1, seed2, seed, timestep, randnum) \
{ \
unsigned int seed3 = seed + timestep; \
seed3 ^= (seed1 << 7) ^ (seed2 >> 6); \
seed2 += (seed1 >> 4) ^ (seed3 >> 15); \
seed1 ^= (seed2 << 9) + (seed3 << 8); \
seed3 ^= 0xA5366B4D * ((seed2 >> 11) ^ (seed1 << 1)); \
seed2 += 0x72BE1579 * ((seed1 << 4) ^ (seed3 >> 16)); \
seed1 ^= 0x3F38A6ED * ((seed3 >> 5) ^ (((signed int) seed2) >> 22)); \
seed2 += seed1 * seed3; \
seed1 += seed3 ^ (seed2 >> 2); \
seed2 ^= ((signed int) seed2) >> 17; \
unsigned int state = 0x79dedea3 * (seed1 ^ (((signed int) seed1) >> 14)); \
unsigned int wstate = (state + seed2) ^ (((signed int) state) >> 8); \
state = state + (wstate * (wstate ^ 0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate >> 1); \
unsigned int sum = 0; \
for (int i = 0; i < rounds; i++) { \
sum += delta; \
state += ((wstate << 4) + k0) ^ (wstate + sum) ^ ((wstate >> 5) + k1); \
wstate += ((state << 4) + k2) ^ (state + sum) ^ ((state >> 5) + k3); \
} \
unsigned int v = (state ^ (state >> 26)) + wstate; \
unsigned int s = (signed int) ((v ^ (v >> 20)) * 0x6957f5a7); \
randnum = SQRT3 * (s * TWO_N32 * (numtyp) 2.0 - (numtyp) 1.0); \
}
#endif
// specifically implemented for steps = 1; high = 1.0; low = -1.0
// returns two uniformly distributed random numbers r1 and r2 in [-1.0;1.0],
// and uses the polar method (Marsaglia's) to transform to a normal random value
// This is used to compared with CPU DPD using RandMars::gaussian()
#ifdef _USE_GAUSSIAN_SARU_LCG
#define numtyp double
#define saru(seed1, seed2, seed, timestep, randnum) \
{ \
unsigned int seed3 = seed + timestep; \
seed3 ^= (seed1 << 7) ^ (seed2 >> 6); \
seed2 += (seed1 >> 4) ^ (seed3 >> 15); \
seed1 ^= (seed2 << 9) + (seed3 << 8); \
seed3 ^= 0xA5366B4D * ((seed2 >> 11) ^ (seed1 << 1)); \
seed2 += 0x72BE1579 * ((seed1 << 4) ^ (seed3 >> 16)); \
seed1 ^= 0x3F38A6ED * ((seed3 >> 5) ^ (((signed int) seed2) >> 22)); \
seed2 += seed1 * seed3; \
seed1 += seed3 ^ (seed2 >> 2); \
seed2 ^= ((signed int) seed2) >> 17; \
unsigned int state = 0x12345678; \
unsigned int wstate = 12345678; \
state = 0x79dedea3 * (seed1 ^ (((signed int) seed1) >> 14)); \
wstate = (state + seed2) ^ (((signed int) state) >> 8); \
state = state + (wstate * (wstate ^ 0xdddf97f5)); \
wstate = 0xABCB96F7 + (wstate >> 1); \
unsigned int v, s; \
numtyp r1, r2, rsq; \
while (1) { \
state = LCGA * state + LCGC; \
wstate = wstate + oWeylOffset + ((((signed int) wstate) >> 31) & oWeylPeriod); \
v = (state ^ (state >> 26)) + wstate; \
s = (signed int) ((v ^ (v >> 20)) * 0x6957f5a7); \
r1 = s * TWO_N32 * (numtyp) 2.0 - (numtyp) 1.0; \
state = LCGA * state + LCGC; \
wstate = wstate + oWeylOffset + ((((signed int) wstate) >> 31) & oWeylPeriod); \
v = (state ^ (state >> 26)) + wstate; \
s = (signed int) ((v ^ (v >> 20)) * 0x6957f5a7); \
r2 = s * TWO_N32 * (numtyp) 2.0 - (numtyp) 1.0; \
rsq = r1 * r1 + r2 * r2; \
if (rsq < (numtyp) 1.0) break; \
} \
numtyp fac = sqrt((numtyp) -2.0 * log(rsq) / rsq); \
randnum = r2 * fac; \
}
#endif
/* ---------------------------------------------------------------------- */
PairDPDCoulSlaterLongGPU::PairDPDCoulSlaterLongGPU(LAMMPS *lmp) : PairDPDCoulSlaterLong(lmp), gpu_mode(GPU_FORCE)
{
respa_enable = 0;
reinitflag = 0;
cpu_time = 0.0;
suffix_flag |= Suffix::GPU;
GPU_EXTRA::gpu_ready(lmp->modify, lmp->error);
}
/* ----------------------------------------------------------------------
free all arrays
------------------------------------------------------------------------- */
PairDPDCoulSlaterLongGPU::~PairDPDCoulSlaterLongGPU()
{
dpd_coul_slater_long_gpu_clear();
}
/* ---------------------------------------------------------------------- */
void PairDPDCoulSlaterLongGPU::compute(int eflag, int vflag)
{
ev_init(eflag, vflag);
int nall = atom->nlocal + atom->nghost;
int inum, host_start;
double dtinvsqrt = 1.0 / sqrt(update->dt);
bool success = true;
int *ilist, *numneigh, **firstneigh;
double *q = atom->q;
dpd_coul_slater_long_gpu_get_extra_data(q);
if (gpu_mode != GPU_FORCE) {
double sublo[3], subhi[3];
if (domain->triclinic == 0) {
sublo[0] = domain->sublo[0];
sublo[1] = domain->sublo[1];
sublo[2] = domain->sublo[2];
subhi[0] = domain->subhi[0];
subhi[1] = domain->subhi[1];
subhi[2] = domain->subhi[2];
} else {
domain->bbox(domain->sublo_lamda, domain->subhi_lamda, sublo, subhi);
}
inum = atom->nlocal;
firstneigh = dpd_coul_slater_long_gpu_compute_n(
neighbor->ago, inum, nall, atom->x, atom->type, sublo, subhi, atom->tag, atom->nspecial,
atom->special, eflag, vflag, eflag_atom, vflag_atom, host_start, &ilist, &numneigh,
cpu_time, success, atom->v, dtinvsqrt, seed, update->ntimestep, domain->boxlo, domain->prd);
} else {
inum = list->inum;
ilist = list->ilist;
numneigh = list->numneigh;
firstneigh = list->firstneigh;
dpd_coul_slater_long_gpu_compute(neighbor->ago, inum, nall, atom->x, atom->type, ilist, numneigh, firstneigh,
eflag, vflag, eflag_atom, vflag_atom, host_start, cpu_time, success, atom->tag,
atom->v, dtinvsqrt, seed, update->ntimestep, atom->nlocal, domain->boxlo,
domain->prd);
}
if (!success) error->one(FLERR, "Insufficient memory on accelerator");
if (atom->molecular != Atom::ATOMIC && neighbor->ago == 0)
neighbor->build_topology();
if (host_start < inum) {
cpu_time = platform::walltime();
cpu_compute(host_start, inum, eflag, vflag, ilist, numneigh, firstneigh);
cpu_time = platform::walltime() - cpu_time;
}
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
void PairDPDCoulSlaterLongGPU::init_style()
{
if (comm->ghost_velocity == 0)
error->all(FLERR,"Pair dpd requires ghost atoms store velocity");
if (!atom->q_flag)
error->all(FLERR,"Pair style coul/slater/long requires atom attribute q");
// ensure use of KSpace long-range solver, set g_ewald
if (force->kspace == nullptr) error->all(FLERR, "Pair style requires a KSpace style");
g_ewald = force->kspace->g_ewald;
// Repeat cutsq calculation because done after call to init_style
double maxcut = -1.0;
double mcut;
for (int i = 1; i <= atom->ntypes; i++) {
for (int j = i; j <= atom->ntypes; j++) {
if (setflag[i][j] != 0 || (setflag[i][i] != 0 && setflag[j][j] != 0)) {
mcut = init_one(i, j);
mcut *= mcut;
if (mcut > maxcut) maxcut = mcut;
cutsq[i][j] = cutsq[j][i] = mcut;
} else
cutsq[i][j] = cutsq[j][i] = 0.0;
}
}
double cell_size = sqrt(maxcut) + neighbor->skin;
int maxspecial = 0;
if (atom->molecular != Atom::ATOMIC) maxspecial = atom->maxspecial;
int mnf = 5e-2 * neighbor->oneatom;
int success =
dpd_coul_slater_long_gpu_init(atom->ntypes + 1, cutsq, a0, gamma, sigma,
cut_dpd, cut_dpdsq, cut_slatersq, force->special_lj, atom->nlocal,
atom->nlocal + atom->nghost, mnf, maxspecial, cell_size, gpu_mode, screen,
force->special_coul, force->qqrd2e, g_ewald, lamda);
GPU_EXTRA::check_flag(success, error, world);
if (gpu_mode == GPU_FORCE) neighbor->add_request(this, NeighConst::REQ_FULL);
}
/* ---------------------------------------------------------------------- */
double PairDPDCoulSlaterLongGPU::memory_usage()
{
double bytes = Pair::memory_usage();
return bytes + dpd_coul_slater_long_gpu_bytes();
}
/* ---------------------------------------------------------------------- */
void PairDPDCoulSlaterLongGPU::cpu_compute(int start, int inum, int eflag, int /* vflag */, int *ilist,
int *numneigh, int **firstneigh)
{
int i, j, ii, jj, jnum, itype, jtype;
double qtmp, xtmp, ytmp, ztmp, delx, dely, delz, evdwl, ecoul, fpair;
double vxtmp, vytmp, vztmp, delvx, delvy, delvz;
double r2inv,forcedpd,forcecoul,factor_coul;
double grij,expm2,prefactor,t,erfc;
double rsq,r,rinv,dot,wd,randnum,factor_dpd,factor_sqrt;
int *jlist;
double slater_term;
tagint itag, jtag;
double *q = atom->q;
double *special_coul = force->special_coul;
double qqrd2e = force->qqrd2e;
evdwl = 0.0;
ecoul = 0.0;
double **x = atom->x;
double **v = atom->v;
double **f = atom->f;
int *type = atom->type;
tagint *tag = atom->tag;
double *special_lj = force->special_lj;
double dtinvsqrt = 1.0 / sqrt(update->dt);
int timestep = (int) update->ntimestep;
// loop over neighbors of my atoms
for (ii = start; ii < inum; ii++) {
i = ilist[ii];
qtmp = q[i];
xtmp = x[i][0];
ytmp = x[i][1];
ztmp = x[i][2];
vxtmp = v[i][0];
vytmp = v[i][1];
vztmp = v[i][2];
itype = type[i];
itag = tag[i];
jlist = firstneigh[i];
jnum = numneigh[i];
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
factor_dpd = special_lj[sbmask(j)];
factor_sqrt = special_sqrt[sbmask(j)];
factor_coul = special_coul[sbmask(j)];
j &= NEIGHMASK;
delx = xtmp - x[j][0];
dely = ytmp - x[j][1];
delz = ztmp - x[j][2];
rsq = delx * delx + dely * dely + delz * delz;
jtype = type[j];
jtag = tag[j];
// forces if below maximum cutoff
if (rsq < cutsq[itype][jtype]) {
r = sqrt(rsq);
if (evflag) evdwl = ecoul = 0.0;
// apply DPD force if distance below DPD cutoff
if (rsq < cut_dpdsq[itype][jtype] && r > EPSILON ) {
rinv = 1.0 / r;
delvx = vxtmp - v[j][0];
delvy = vytmp - v[j][1];
delvz = vztmp - v[j][2];
dot = delx * delvx + dely * delvy + delz * delvz;
wd = 1.0 - r / cut[itype][jtype];
unsigned int tag1 = itag, tag2 = jtag;
if (tag1 > tag2) {
tag1 = jtag;
tag2 = itag;
}
randnum = 0.0;
saru(tag1, tag2, seed, timestep, randnum);
// conservative force = a0 * wd
// drag force = -gamma * wd^2 * (delx dot delv) / r
// random force = sigma * wd * rnd * dtinvsqrt;
forcedpd = a0[itype][jtype]*wd;
forcedpd -= gamma[itype][jtype]*wd*wd*dot*rinv;
forcedpd *= factor_dpd;
forcedpd += factor_sqrt*sigma[itype][jtype]*wd*randnum*dtinvsqrt;
forcedpd *= rinv;
if (eflag) {
// eng shifted to 0.0 at cutoff
evdwl = 0.5*a0[itype][jtype]*cut_dpd[itype][jtype] * wd*wd;
evdwl *= factor_dpd;
}
} else forcedpd = 0.0;
// apply Slater electrostatic force if distance below Slater cutoff
// and the two species are charged
if (rsq < cut_slatersq[itype][jtype]){
r2inv = 1.0/rsq;
grij = g_ewald * r;
expm2 = exp(-grij*grij);
t = 1.0 / (1.0 + EWALD_P*grij);
erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
slater_term = exp(-2*r/lamda)*(1 + (2*r/lamda*(1+r/lamda)));
prefactor = qqrd2e * qtmp*q[j]/r;
forcecoul = prefactor * (erfc + EWALD_F*grij*expm2 - slater_term);
if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor*(1-slater_term);
forcecoul *= r2inv;
if (eflag) {
ecoul = prefactor*(erfc - (1 + r/lamda)*exp(-2*r/lamda));
if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor*(1.0-(1 + r/lamda)*exp(-2*r/lamda));
}
} else forcecoul = 0.0;
fpair = forcedpd + forcecoul;
f[i][0] += delx * fpair;
f[i][1] += dely * fpair;
f[i][2] += delz * fpair;
if (evflag) ev_tally_full(i, evdwl, ecoul, fpair, delx, dely, delz);
}
}
}
}

View File

@ -0,0 +1,45 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef PAIR_CLASS
// clang-format off
PairStyle(dpd/coul/slater/long/gpu,PairDPDCoulSlaterLongGPU);
// clang-format on
#else
#ifndef LMP_PAIR_DPD_COUL_SLATER_LONG_GPU_H
#define LMP_PAIR_DPD_COUL_SLATER_LONG_GPU_H
#include "pair_dpd_coul_slater_long.h"
namespace LAMMPS_NS {
class PairDPDCoulSlaterLongGPU : public PairDPDCoulSlaterLong {
public:
PairDPDCoulSlaterLongGPU(LAMMPS *lmp);
~PairDPDCoulSlaterLongGPU() override;
void cpu_compute(int, int, int, int, int *, int *, int **);
void compute(int, int) override;
void init_style() override;
double memory_usage() override;
enum { GPU_FORCE, GPU_NEIGH, GPU_HYB_NEIGH };
private:
int gpu_mode;
double cpu_time;
};
} // namespace LAMMPS_NS
#endif
#endif

View File

@ -205,6 +205,7 @@ FixPlumed::FixPlumed(LAMMPS *lmp, int narg, char **arg) :
double dt=update->dt; double dt=update->dt;
p->cmd("setTimestep",&dt); p->cmd("setTimestep",&dt);
extscalar = 1;
scalar_flag = 1; scalar_flag = 1;
energy_global_flag = virial_global_flag = 1; energy_global_flag = virial_global_flag = 1;
thermo_energy = thermo_virial = 1; thermo_energy = thermo_virial = 1;

View File

@ -1198,14 +1198,31 @@ internally by the :doc:`Fortran interface <Fortran>` and are not likely to be us
* - triclinic * - triclinic
- 1 if the the simulation box is triclinic, 0 if orthogonal. - 1 if the the simulation box is triclinic, 0 if orthogonal.
See :doc:`change_box`. See :doc:`change_box`.
**Communication status**
.. list-table::
:header-rows: 1
:widths: auto
* - Keyword
- Description / Return value
* - universe_rank * - universe_rank
- MPI rank on LAMMPS' universe communicator (0 <= universe_rank < universe_size) - MPI rank on LAMMPS' universe communicator (0 <= universe_rank < universe_size)
* - universe_size * - universe_size
- Number of ranks on LAMMPS' universe communicator (world_size <= universe_size) - Number of ranks on LAMMPS' universe communicator (world_size <= universe_size)
* - world_rank * - world_rank
- MPI rank on LAMMPS' world communicator (0 <= world_rank < world_size) - MPI rank on LAMMPS' world communicator (0 <= world_rank < world_size, aka comm->me)
* - world_size * - world_size
- Number of ranks on LAMMPS' world communicator - Number of ranks on LAMMPS' world communicator (aka comm->nprocs)
* - comm_style
- communication style (0 = BRICK, 1 = TILED)
* - comm_layout
- communication layout (0 = LAYOUT_UNIFORM, 1 = LAYOUT_NONUNIFORM, 2 = LAYOUT_TILED)
* - comm_mode
- communication mode (0 = SINGLE, 1 = MULTI, 2 = MULTIOLD)
* - ghost_velocity
- whether velocities are communicated for ghost atoms (0 = no, 1 = yes)
.. _extract_system_sizes: .. _extract_system_sizes:
@ -1310,6 +1327,10 @@ int lammps_extract_setting(void *handle, const char *keyword)
if (strcmp(keyword,"world_rank") == 0) return lmp->comm->me; if (strcmp(keyword,"world_rank") == 0) return lmp->comm->me;
if (strcmp(keyword,"world_size") == 0) return lmp->comm->nprocs; if (strcmp(keyword,"world_size") == 0) return lmp->comm->nprocs;
if (strcmp(keyword,"nthreads") == 0) return lmp->comm->nthreads; if (strcmp(keyword,"nthreads") == 0) return lmp->comm->nthreads;
if (strcmp(keyword,"comm_style") == 0) return lmp->comm->style;
if (strcmp(keyword,"comm_layout") == 0) return lmp->comm->layout;
if (strcmp(keyword,"comm_mode") == 0) return lmp->comm->mode;
if (strcmp(keyword,"ghost_velocity") == 0) return lmp->comm->ghost_velocity;
if (strcmp(keyword,"nlocal") == 0) return lmp->atom->nlocal; if (strcmp(keyword,"nlocal") == 0) return lmp->atom->nlocal;
if (strcmp(keyword,"nghost") == 0) return lmp->atom->nghost; if (strcmp(keyword,"nghost") == 0) return lmp->atom->nghost;
@ -1386,6 +1407,7 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name)
if (strcmp(name,"xy") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"xy") == 0) return LAMMPS_DOUBLE;
if (strcmp(name,"xz") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"xz") == 0) return LAMMPS_DOUBLE;
if (strcmp(name,"yz") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"yz") == 0) return LAMMPS_DOUBLE;
if (strcmp(name,"procgrid") == 0) return LAMMPS_INT;
if (strcmp(name,"natoms") == 0) return LAMMPS_BIGINT; if (strcmp(name,"natoms") == 0) return LAMMPS_BIGINT;
if (strcmp(name,"nbonds") == 0) return LAMMPS_BIGINT; if (strcmp(name,"nbonds") == 0) return LAMMPS_BIGINT;
@ -1604,6 +1626,10 @@ report the "native" data type. The following tables are provided:
- double - double
- 1 - 1
- triclinic tilt factor. See :doc:`Howto_triclinic`. - triclinic tilt factor. See :doc:`Howto_triclinic`.
* - procgrid
- int
- 3
- processor count assigned to each dimension of 3d grid. See :doc:`processors`.
.. _extract_system_settings: .. _extract_system_settings:
@ -1861,6 +1887,9 @@ void *lammps_extract_global(void *handle, const char *name)
if (strcmp(name,"xy") == 0) return (void *) &lmp->domain->xy; if (strcmp(name,"xy") == 0) return (void *) &lmp->domain->xy;
if (strcmp(name,"xz") == 0) return (void *) &lmp->domain->xz; if (strcmp(name,"xz") == 0) return (void *) &lmp->domain->xz;
if (strcmp(name,"yz") == 0) return (void *) &lmp->domain->yz; if (strcmp(name,"yz") == 0) return (void *) &lmp->domain->yz;
if (((lmp->comm->layout == Comm::LAYOUT_UNIFORM) ||
(lmp->comm->layout == Comm::LAYOUT_NONUNIFORM)) && (strcmp(name,"procgrid") == 0))
return (void *) &lmp->comm->procgrid;
if (strcmp(name,"natoms") == 0) return (void *) &lmp->atom->natoms; if (strcmp(name,"natoms") == 0) return (void *) &lmp->atom->natoms;
if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes;

View File

@ -0,0 +1,103 @@
---
lammps_version: 17 Apr 2024
tags:
date_generated: Tue Jun 18 21:32:14 2024
epsilon: 5e-13
skip_tests: gpu intel kokkos_omp single
prerequisites: ! |
atom full
pair dpd/coul/slater/long
kspace ewald
pre_commands: ! |
variable newton_pair delete
variable newton_pair index on
comm_modify vel yes
post_commands: ! |
kspace_style ewald 1.0e-6
kspace_modify gewald 0.3
kspace_modify compute no
input_file: in.fourmol
pair_style: dpd/coul/slater/long 100.0 8.0 11223344 1.0 8.0
pair_coeff: ! |
* * 0.4 4.0 yes
1 1 0.4 4.0 yes
2 2 0.1 2.0 no
2 4 0.1 1.0
3 3 0.4 3.2 yes
4 4 0.3 3.1 yes
5 5 0.3 3.1 yes
extract: ! |
cut_coul 0
lamda 0
a0 2
gamma 2
natoms: 29
init_vdwl: 50.81607024833933
init_coul: 246.30486150616926
init_stress: ! |2-
3.8847917252197334e+01 6.0909421169945198e+01 1.3177337627459440e+01 -2.5125674673037557e-01 -2.6831071031318483e+01 -1.5576430133730318e+01
init_forces: ! |2
1 1.7431218673076398e+00 -3.3508607597652662e-01 -2.4777022847678101e+00
2 4.3303449895107429e+00 -4.7270196423904629e+00 8.9179383719117788e-01
3 -3.0026241136767506e-01 1.4898682537669559e+00 -2.9373470062765152e+00
4 5.2673340332969785e+00 -4.7092409943919726e+00 -1.4235077704192447e+00
5 -6.8022719083087080e-01 5.7354131392205714e+00 -3.4748110565769061e+00
6 -3.8215670358728731e+00 2.7445299161598462e+00 -2.7043379570240411e+00
7 -3.3428118289029851e+00 2.6368994495618775e-01 4.1564102694578011e+00
8 -7.7861329310896457e+00 8.2082649420572917e-01 4.8567883896169803e+00
9 3.1057899939121918e+00 -3.9223414133714560e+00 8.4873882988538636e+00
10 -4.1521241974355734e+00 2.6307631121111197e-01 3.4593985187994503e+00
11 1.8308032335061764e+00 2.2688626790466668e+00 2.1488881927591183e-01
12 -3.8361154861853802e-01 9.7381188622448867e-01 -2.9002001998530074e+00
13 3.7110360694271507e+00 -6.0293319508894081e+00 -3.2353735026836565e+00
14 -7.1298424060686427e-01 2.4558730338472174e+00 -1.4114476204389881e+00
15 6.4421713828496296e-01 2.6560445474171779e+00 4.1805189129601663e+00
16 2.4609814411173456e+00 1.0005691236622609e+00 -1.3310794681660751e+00
17 4.3419008357709892e+00 3.5242769399360668e-01 -3.0595452598808506e+00
18 -8.6307586369950978e-02 8.2040370677288337e+00 -5.3929118878835798e+00
19 6.1879926571299937e-01 2.5540397129551908e+00 1.5642703712618800e+00
20 -3.0582098014826045e+00 -4.2726657137759743e+00 3.7804333126216734e+00
21 3.4138725239637657e+00 -2.8998556794986174e+00 -3.3216284249543198e+00
22 8.3753401659388671e-01 6.0848461632864803e-01 5.5206263511303710e-01
23 1.6137939864950199e+00 -1.9075657957633927e+00 -1.1740851854919403e+00
24 -9.2620994683392499e-01 -3.2450229700911435e+00 -8.0867271168075465e+00
25 -1.3940090389654722e+00 5.2843663545938764e+00 3.5772359574449069e+00
26 3.9218467465706744e-02 1.1015801783435457e+00 1.8824821245496248e+00
27 -2.4611420161719555e+00 -1.9453626284928394e+00 -3.3205056628962853e-01
28 1.4062959703817013e+00 -1.5914533664642678e+00 2.6909036096293515e+00
29 -6.2594440581983282e+00 -3.1925547225558533e+00 2.9681802507382837e+00
run_vdwl: 50.80969849155796
run_coul: 246.30257595743123
run_stress: ! |2-
2.5169432057277767e+01 1.3291837479686518e+02 7.8314082956801457e+01 1.4188397409481186e+00 4.7717966551748061e+00 -6.3215212489343497e-01
run_forces: ! |2
1 -6.3863580151106092e-01 6.6929475226486339e+00 3.7704563748664892e+00
2 -4.3037556793948211e+00 9.5723509028532272e-02 -2.0030241717125286e+00
3 -1.2783833512172147e+00 1.7381921345191331e+00 -6.4662583653508925e+00
4 2.4827815076802873e+00 1.3730024199636431e-01 -2.0006851631917272e-01
5 4.7603332815631365e+00 -2.2528146831857900e+00 -3.4274535000597357e+00
6 -1.2817868583433294e+00 -5.9968609698691075e+00 -3.2762169423954415e+00
7 -6.6867815106826880e+00 -7.6943923258643654e-01 -2.6780134761760793e-01
8 -3.3343023480304996e+00 6.4339698400391008e+00 -6.4172530505932164e+00
9 -3.8353029345585190e+00 9.8394636146294001e+00 1.9174283216744969e+00
10 -2.7100348949081012e+00 1.4548533898989857e-01 -7.4888242419930628e-01
11 -3.5716272980494614e+00 -5.6333424874513238e-01 -1.7669409895579073e+00
12 8.7749889216756269e+00 -3.0182112894280873e+00 2.3328096163511405e+00
13 -7.1201394227081138e+00 8.5405234502858711e+00 4.5843737570467056e+00
14 -8.7413969567458588e-02 -3.7153733247848848e+00 -3.2874441379609167e+00
15 4.3120572612995609e+00 1.7256832039357071e+00 3.3428599179267393e-01
16 3.8021838909677803e+00 -1.3766365519719326e+01 2.2813835507927651e+00
17 4.9734505785815566e+00 -2.4146919042613795e+00 1.8287742974940246e+00
18 -1.7572559387593672e-03 3.8187261679342619e+00 -1.0584087358440382e+00
19 1.0838708527692988e+00 -6.6703633150528441e-01 -4.6973954164255893e-01
20 1.1923743451913014e+00 1.7419734493475330e+00 -3.6369159702300224e-01
21 2.3316248125417141e+00 -1.0849270685777668e+00 -3.2073997386907678e+00
22 2.6135216134985972e+00 -1.1025272637629011e+00 4.8873485142461329e-02
23 -1.2854577922712009e+00 -2.9253148869589518e+00 -4.6563146954583601e-01
24 -1.4021980080098731e-01 1.9672435672875048e+00 3.1379645935988041e+00
25 1.9085702323304496e+00 5.2270676739892066e+00 7.3556254244703823e+00
26 8.7357677171207004e-01 -1.1308292622526788e+00 -8.0741590972110988e-01
27 -1.1543680887940906e+00 -9.4513879574846338e-01 1.0062759048570287e+00
28 2.3730888896530073e+00 -1.9664779055036602e-01 1.0051483653476245e+00
29 -4.0524559526880868e+00 -7.5547871426945932e+00 4.6302307547994435e+00
...

View File

@ -580,6 +580,37 @@ create_atoms 1 single &
"Press" : 0.0} "Press" : 0.0}
self.assertDictEqual(self.lmp.last_thermo(), ref) self.assertDictEqual(self.lmp.last_thermo(), ref)
def test_extract_setting(self):
self.assertEqual(self.lmp.extract_setting("dimension"), 3)
self.assertEqual(self.lmp.extract_setting("box_exist"), 0)
self.assertEqual(self.lmp.extract_setting("kokkos_active"), 0)
self.assertEqual(self.lmp.extract_setting("kokkos_nthreads"), 0)
self.assertEqual(self.lmp.extract_setting("kokkos_ngpus"), 0)
self.lmp.command("region box block -1 1 -2 2 -3 3")
self.lmp.command("create_box 1 box")
self.lmp.command("special_bonds lj 0.0 0.5 0.8 coul 0.1 0.5 1.0")
self.assertEqual(self.lmp.extract_setting("newton_bond"), 1)
self.assertEqual(self.lmp.extract_setting("newton_pair"), 1)
self.assertEqual(self.lmp.extract_setting("triclinic"), 0)
self.assertEqual(self.lmp.extract_setting("universe_rank"), 0)
self.assertEqual(self.lmp.extract_setting("universe_size"), 1)
self.assertEqual(self.lmp.extract_setting("world_rank"), 0)
self.assertEqual(self.lmp.extract_setting("world_size"), 1)
self.assertEqual(self.lmp.extract_setting("triclinic"), 0)
self.assertEqual(self.lmp.extract_setting("comm_style"), 0)
self.assertEqual(self.lmp.extract_setting("comm_layout"), 0)
self.assertEqual(self.lmp.extract_setting("comm_mode"), 0)
self.assertEqual(self.lmp.extract_setting("ghost_velocity"), 0)
self.lmp.command("comm_style tiled")
self.lmp.command("comm_modify vel yes")
self.lmp.command("mass 1 1.0")
self.lmp.command("run 0 post no")
self.lmp.command("balance 0.1 rcb")
self.assertEqual(self.lmp.extract_setting("comm_style"), 1)
self.assertEqual(self.lmp.extract_setting("comm_layout"), 2)
self.assertEqual(self.lmp.extract_setting("comm_mode"), 0)
self.assertEqual(self.lmp.extract_setting("ghost_velocity"), 1)
def test_extract_global(self): def test_extract_global(self):
self.lmp.command("region box block -1 1 -2 2 -3 3") self.lmp.command("region box block -1 1 -2 2 -3 3")
self.lmp.command("create_box 1 box") self.lmp.command("create_box 1 box")
@ -628,6 +659,13 @@ create_atoms 1 single &
self.assertEqual(self.lmp.extract_global("sublo_lambda"), [0.0, 0.0, 0.0]) self.assertEqual(self.lmp.extract_global("sublo_lambda"), [0.0, 0.0, 0.0])
self.assertEqual(self.lmp.extract_global("subhi_lambda"), [1.0, 1.0, 1.0]) self.assertEqual(self.lmp.extract_global("subhi_lambda"), [1.0, 1.0, 1.0])
# processor grid
self.assertEqual(self.lmp.extract_global("procgrid"), [1,1,1])
self.lmp.command("comm_style tiled")
self.lmp.command("run 0 post no")
self.lmp.command("balance 0.1 rcb")
self.assertEqual(self.lmp.extract_global("procgrid"), None)
def test_create_atoms(self): def test_create_atoms(self):
self.lmp.command("boundary f p m") self.lmp.command("boundary f p m")
self.lmp.command("region box block 0 10 0 10 0 10") self.lmp.command("region box block 0 10 0 10 0 10")

View File

@ -119,6 +119,10 @@ class PythonPyLammps(unittest.TestCase):
self.assertEqual(self.pylmp.communication.comm_style,'brick') self.assertEqual(self.pylmp.communication.comm_style,'brick')
self.assertEqual(self.pylmp.communication.comm_layout,'uniform') self.assertEqual(self.pylmp.communication.comm_layout,'uniform')
self.assertEqual(self.pylmp.communication.nprocs,1) self.assertEqual(self.pylmp.communication.nprocs,1)
self.assertEqual(self.pylmp.communication.nthreads,1)
self.assertEqual(self.pylmp.communication.procgrid,[1,1,1])
self.assertEqual(self.pylmp.communication.proc_grid,[1,1,1])
self.assertEqual(self.pylmp.communication.ghost_velocity,0)
self.assertEqual(len(self.pylmp.computes),3) self.assertEqual(len(self.pylmp.computes),3)
self.assertEqual(self.pylmp.computes[0]['name'], 'thermo_temp') self.assertEqual(self.pylmp.computes[0]['name'], 'thermo_temp')
self.assertEqual(self.pylmp.computes[0]['style'], 'temp') self.assertEqual(self.pylmp.computes[0]['style'], 'temp')
@ -137,6 +141,11 @@ class PythonPyLammps(unittest.TestCase):
self.assertEqual(self.pylmp.fixes[0]['group'], 'all') self.assertEqual(self.pylmp.fixes[0]['group'], 'all')
self.pylmp.group('none','empty') self.pylmp.group('none','empty')
self.assertEqual(len(self.pylmp.groups),2) self.assertEqual(len(self.pylmp.groups),2)
self.pylmp.comm_style('tiled')
self.pylmp.mass('*',1.0)
self.pylmp.run('0','post','no')
self.pylmp.balance(0.1,'rcb')
self.assertEqual(self.pylmp.communication.procgrid,None)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()