Merge remote-tracking branch 'lammps-origin/master' into lammps-tools-doxygen

This commit is contained in:
Dr. Nandor Tamaskovics
2018-01-16 18:38:12 +01:00
55 changed files with 4869 additions and 279 deletions

View File

@ -198,14 +198,13 @@ if(ENABLE_PYTHON)
add_definitions(-DLMP_PYTHON)
include_directories(${PYTHON_INCLUDE_DIR})
list(APPEND LAMMPS_LINK_LIBS ${PYTHON_LIBRARY})
if(NOT PYTHON_INSTDIR)
execute_process(COMMAND ${PYTHON_EXECUTABLE}
-c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))"
OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR})
if(NOT BUILD_SHARED_LIBS)
message(FATAL_ERROR "Python package need lammps to be build shared, use -DBUILD_SHARED_LIBS=ON")
if(BUILD_SHARED_LIBS)
if(NOT PYTHON_INSTDIR)
execute_process(COMMAND ${PYTHON_EXECUTABLE}
-c "import distutils.sysconfig as cg; print(cg.get_python_lib(1,0,prefix='${CMAKE_INSTALL_PREFIX}'))"
OUTPUT_VARIABLE PYTHON_INSTDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR})
endif()
endif()
@ -401,6 +400,10 @@ foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD
target_include_directories(awpmd PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/awpmd/systems/interact ${LAMMPS_LIB_SOURCE_DIR}/awpmd/ivutils/include)
elseif(PKG_LIB STREQUAL h5md)
target_include_directories(h5md PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/h5md/include)
elseif(PKG_LIB STREQUAL colvars)
target_compile_options(colvars PRIVATE -DLEPTON)
target_include_directories(colvars PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/colvars/lepton/include)
target_include_directories(colvars PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/colvars)
else()
target_include_directories(${PKG_LIB} PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/${PKG_LIB})
endif()

View File

@ -619,7 +619,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT.
"pour"_fix_pour.html,
"press/berendsen"_fix_press_berendsen.html,
"print"_fix_print.html,
"property/atom"_fix_property_atom.html,
"property/atom (k)"_fix_property_atom.html,
"python/invoke"_fix_python_invoke.html,
"python/move"_fix_python_move.html,
"qeq/comb (o)"_fix_qeq_comb.html,
@ -669,7 +669,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT.
"wall/harmonic"_fix_wall.html,
"wall/lj1043"_fix_wall.html,
"wall/lj126"_fix_wall.html,
"wall/lj93"_fix_wall.html,
"wall/lj93 (k)"_fix_wall.html,
"wall/piston"_fix_wall_piston.html,
"wall/reflect (k)"_fix_wall_reflect.html,
"wall/region"_fix_wall_region.html,
@ -684,14 +684,14 @@ package"_Section_start.html#start_3.
"atc"_fix_atc.html,
"ave/correlate/long"_fix_ave_correlate_long.html,
"colvars"_fix_colvars.html,
"dpd/energy"_fix_dpd_energy.html,
"dpd/energy (k)"_fix_dpd_energy.html,
"drude"_fix_drude.html,
"drude/transform/direct"_fix_drude_transform.html,
"drude/transform/reverse"_fix_drude_transform.html,
"edpd/source"_fix_dpd_source.html,
"eos/cv"_fix_eos_cv.html,
"eos/table"_fix_eos_table.html,
"eos/table/rx"_fix_eos_table_rx.html,
"eos/table/rx (k)"_fix_eos_table_rx.html,
"filter/corotate"_fix_filter_corotate.html,
"flow/gauss"_fix_flow_gauss.html,
"gle"_fix_gle.html,
@ -729,12 +729,12 @@ package"_Section_start.html#start_3.
"qeq/reax (ko)"_fix_qeq_reax.html,
"qmmm"_fix_qmmm.html,
"qtb"_fix_qtb.html,
"reax/c/bonds"_fix_reax_bonds.html,
"reax/c/species"_fix_reaxc_species.html,
"reax/c/bonds (k)"_fix_reax_bonds.html,
"reax/c/species (k)"_fix_reaxc_species.html,
"rhok"_fix_rhok.html,
"rx"_fix_rx.html,
"rx (k)"_fix_rx.html,
"saed/vtk"_fix_saed_vtk.html,
"shardlow"_fix_shardlow.html,
"shardlow (k)"_fix_shardlow.html,
"smd"_fix_smd.html,
"smd/adjust/dt"_fix_smd_adjust_dt.html,
"smd/integrate/tlsph"_fix_smd_integrate_tlsph.html,
@ -907,7 +907,7 @@ KOKKOS, o = USER-OMP, t = OPT.
"none"_pair_none.html,
"zero"_pair_zero.html,
"hybrid"_pair_hybrid.html,
"hybrid/overlay"_pair_hybrid.html,
"hybrid/overlay (k)"_pair_hybrid.html,
"adp (o)"_pair_adp.html,
"airebo (oi)"_pair_airebo.html,
"airebo/morse (oi)"_pair_airebo.html,
@ -1026,7 +1026,7 @@ KOKKOS, o = USER-OMP, t = OPT.
"vashishta/table (o)"_pair_vashishta.html,
"yukawa (gok)"_pair_yukawa.html,
"yukawa/colloid (go)"_pair_yukawa_colloid.html,
"zbl (go)"_pair_zbl.html :tb(c=4,ea=c)
"zbl (gok)"_pair_zbl.html :tb(c=4,ea=c)
These are additional pair styles in USER packages, which can be used
if "LAMMPS is built with the appropriate
@ -1039,13 +1039,13 @@ package"_Section_start.html#start_3.
"coul/diel (o)"_pair_coul_diel.html,
"coul/long/soft (o)"_pair_lj_soft.html,
"dpd/fdt"_pair_dpd_fdt.html,
"dpd/fdt/energy"_pair_dpd_fdt.html,
"dpd/fdt/energy (k)"_pair_dpd_fdt.html,
"eam/cd (o)"_pair_eam.html,
"edip (o)"_pair_edip.html,
"edip/multi"_pair_edip.html,
"edpd"_pair_meso.html,
"eff/cut"_pair_eff.html,
"exp6/rx"_pair_exp6_rx.html,
"exp6/rx (k)"_pair_exp6_rx.html,
"extep"_pair_extep.html,
"gauss/cut"_pair_gauss.html,
"kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html,
@ -1072,7 +1072,7 @@ package"_Section_start.html#start_3.
"morse/smooth/linear"_pair_morse.html,
"morse/soft"_pair_morse.html,
"multi/lucy"_pair_multi_lucy.html,
"multi/lucy/rx"_pair_multi_lucy_rx.html,
"multi/lucy/rx (k)"_pair_multi_lucy_rx.html,
"oxdna/coaxstk"_pair_oxdna.html,
"oxdna/excv"_pair_oxdna.html,
"oxdna/hbond"_pair_oxdna.html,
@ -1089,6 +1089,7 @@ package"_Section_start.html#start_3.
"smd/triangulated/surface"_pair_smd_triangulated_surface.html,
"smd/ulsph"_pair_smd_ulsph.html,
"smtbq"_pair_smtbq.html,
"snap (k)"_pair_sap.html,
"sph/heatconduction"_pair_sph_heatconduction.html,
"sph/idealgas"_pair_sph_idealgas.html,
"sph/lj"_pair_sph_lj.html,
@ -1096,7 +1097,7 @@ package"_Section_start.html#start_3.
"sph/taitwater"_pair_sph_taitwater.html,
"sph/taitwater/morris"_pair_sph_taitwater_morris.html,
"srp"_pair_srp.html,
"table/rx"_pair_table_rx.html,
"table/rx (k)"_pair_table_rx.html,
"tdpd"_pair_meso.html,
"tersoff/table (o)"_pair_tersoff.html,
"thole"_pair_thole.html,
@ -1251,7 +1252,7 @@ USER-OMP, t = OPT.
"ewald/disp"_kspace_style.html,
"msm (o)"_kspace_style.html,
"msm/cg (o)"_kspace_style.html,
"pppm (go)"_kspace_style.html,
"pppm (gok)"_kspace_style.html,
"pppm/cg (o)"_kspace_style.html,
"pppm/disp (i)"_kspace_style.html,
"pppm/disp/tip4p"_kspace_style.html,

View File

@ -326,9 +326,9 @@ include both "Cuda" and "OpenMP", as is the case for /src/MAKE/OPTIONS/Makefile.
KOKKOS_DEVICES=Cuda,OpenMP :pre
The suffix <EFBFBD>/kk<EFBFBD> is equivalent to <EFBFBD>/kk/device<EFBFBD>, and for Kokkos CUDA,
using the <EFBFBD>-sf kk<EFBFBD> in the command line gives the default CUDA version everywhere.
However, if the <EFBFBD>/kk/host<EFBFBD> suffix is added to a specific style in the input
The suffix "/kk" is equivalent to "/kk/device", and for Kokkos CUDA,
using the "-sf kk" in the command line gives the default CUDA version everywhere.
However, if the "/kk/host" suffix is added to a specific style in the input
script, the Kokkos OpenMP (CPU) version of that specific style will be used instead.
Set the number of OpenMP threads as "t Nt" and the number of GPUs as "g Ng"
@ -338,16 +338,16 @@ For example, the command to run with 1 GPU and 8 OpenMP threads is then:
mpiexec -np 1 lmp_kokkos_cuda_openmpi -in in.lj -k on g 1 t 8 -sf kk :pre
Conversely, if the <EFBFBD>-sf kk/host<EFBFBD> is used in the command line and then the
<EFBFBD>/kk<EFBFBD> or <EFBFBD>/kk/device<EFBFBD> suffix is added to a specific style in your input script,
Conversely, if the "-sf kk/host" is used in the command line and then the
"/kk" or "/kk/device" suffix is added to a specific style in your input script,
then only that specific style will run on the GPU while everything else will
run on the CPU in OpenMP mode. Note that the execution of the CPU and GPU
styles will NOT overlap, except for a special case:
A kspace style and/or molecular topology (bonds, angles, etc.) running on
the host CPU can overlap with a pair style running on the GPU. First compile
with <EFBFBD>--default-stream per-thread<EFBFBD> added to CCFLAGS in the Kokkos CUDA Makefile.
Then explicitly use the <EFBFBD>/kk/host<EFBFBD> suffix for kspace and bonds, angles, etc.
with "--default-stream per-thread" added to CCFLAGS in the Kokkos CUDA Makefile.
Then explicitly use the "/kk/host" suffix for kspace and bonds, angles, etc.
in the input file and the "kk" suffix (equal to "kk/device") on the command line.
Also make sure the environment variable CUDA_LAUNCH_BLOCKING is not set to "1"
so CPU/GPU overlap can occur.

View File

@ -261,7 +261,7 @@ For images created by the "dump image"_dump_image.html command, if the
polygon consisting of N line segments. Note that the line segments
are drawn between the N vertices, which does not correspond exactly to
the physical extent of the body (because the "pair_style
rounded/polygon"_pair_body_rounded_polygon.cpp defines finite-size
rounded/polygon"_pair_body_rounded_polygon.html defines finite-size
spheres at those point and the line segments between the spheres are
tangent to the spheres). The drawn diameter of each line segment is
determined by the {bflag1} parameter for the {body} keyword. The

View File

@ -67,7 +67,7 @@ parameters. This is followed by that number of integers giving the
degree of each order parameter. Because {Q}2 and all odd-degree order
parameters are zero for atoms in cubic crystals (see
"Steinhardt"_#Steinhardt), the default order parameters are {Q}4,
{Q}6, {Q}8, {Q}10, and {Q}12. For the FCC crystal with {nnn}=12, {Q}4
{Q}6, {Q}8, {Q}10, and {Q}12. For the FCC crystal with {nnn} =12, {Q}4
= sqrt(7/3)/8 = 0.19094.... The numerical values of all order
parameters up to {Q}12 for a range of commonly encountered
high-symmetry structures are given in Table I of "Mickel et

View File

@ -224,7 +224,7 @@ block contains six sub-blocks corresponding to the {xx}, {yy}, {zz},
notation. Each of these sub-blocks contains one column for each
bispectrum component, the same as for compute {sna/atom}
For example, if {K}=30 and ntypes=1, the number of columns in the per-atom
For example, if {K} =30 and ntypes=1, the number of columns in the per-atom
arrays generated by {sna/atom}, {snad/atom}, and {snav/atom}
are 30, 90, and 180, respectively. With {quadratic} value=1,
the numbers of columns are 930, 2790, and 5580, respectively.

View File

@ -83,7 +83,7 @@ the following dynamic equation:
:c,image(Eqs/fix_controller1.jpg)
where {c} is the continuous time analog of the control variable,
{e}={pvar}-{setpoint} is the error in the process variable, and
{e} ={pvar}-{setpoint} is the error in the process variable, and
{alpha}, {Kp}, {Ki}, and {Kd} are constants set by the corresponding
keywords described above. The discretized version of this equation is:
@ -106,10 +106,10 @@ the value of {alpha} to reflect this, while leaving {Kp}, {Ki}, and
When choosing the values of the four constants, it is best to first
pick a value and sign for {alpha} that is consistent with the
magnitudes and signs of {pvar} and {cvar}. The magnitude of {Kp}
should then be tested over a large positive range keeping {Ki}={Kd}=0.
should then be tested over a large positive range keeping {Ki} = {Kd} =0.
A good value for {Kp} will produce a fast response in {pvar}, without
overshooting the {setpoint}. For many applications, proportional
feedback is sufficient, and so {Ki}={Kd}=0 can be used. In cases where
feedback is sufficient, and so {Ki} = {Kd} =0 can be used. In cases where
there is a substantial lag time in the response of {pvar} to a change
in {cvar}, this can be counteracted by increasing {Kd}. In situations
where {pvar} plateaus without reaching {setpoint}, this can be

View File

@ -58,7 +58,7 @@ required in order to eliminate velocity components along the bonds
In order to formulate individual constraints for SHAKE and RATTLE,
focus on a single molecule whose bonds are constrained. Let Ri and Vi
be the position and velocity of atom {i} at time {n}, for
{i}=1,...,{N}, where {N} is the number of sites of our reference
{i} =1,...,{N}, where {N} is the number of sites of our reference
molecule. The distance vector between sites {i} and {j} is given by
:c,image(Eqs/fix_rattle_rij.jpg)

View File

@ -14,15 +14,12 @@ fix ID group-ID smd/integrate_tlsph keyword values :pre
ID, group-ID are documented in "fix"_fix.html command
smd/integrate_tlsph = style name of this fix command
zero or more keyword/value pairs may be appended :ul
keyword = {limit_velocity} :l
zero or more keyword/value pairs may be appended
keyword = {limit_velocity} :ul
{limit_velocity} value = max_vel
max_vel = maximum allowed velocity :pre
:ule
[Examples:]
fix 1 all smd/integrate_tlsph

View File

@ -14,9 +14,8 @@ fix ID group-ID smd/integrate_ulsph keyword :pre
ID, group-ID are documented in "fix"_fix.html command
smd/integrate_ulsph = style name of this fix command
zero or more keyword/value pairs may be appended :ul
keyword = adjust_radius or limit_velocity
zero or more keyword/value pairs may be appended
keyword = adjust_radius or limit_velocity :ul
adjust_radius values = adjust_radius_factor min_nn max_nn
adjust_radius_factor = factor which scale the smooth/kernel radius
@ -28,7 +27,7 @@ limit_velocity values = max_velocity
[Examples:]
fix 1 all smd/integrate_ulsph adjust_radius 1.02 25 50 :pre
fix 1 all smd/integrate_ulsph adjust_radius 1.02 25 50
fix 1 all smd/integrate_ulsph limit_velocity 1000 :pre
[Description:]
@ -38,7 +37,7 @@ See "this PDF guide"_PDF/SMD_LAMMPS_userguide.pdf to using Smooth Mach Dynamics
The {adjust_radius} keyword activates dynamic adjustment of the per-particle SPH smoothing kernel radius such that the number of neighbors per particles remains
within the interval {min_nn} to {max_nn}. The parameter {adjust_radius_factor} determines the amount of adjustment per timestep. Typical values are
{adjust_radius_factor}=1.02, {min_nn}=15, and {max_nn}=20.
{adjust_radius_factor} =1.02, {min_nn} =15, and {max_nn} =20.
The {limit_velocity} keyword will control the velocity, scaling the norm of
the velocity vector to max_vel in case it exceeds this velocity limit.

View File

@ -0,0 +1,19 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
fix wall/surface/globale command :h3
[Description:]
This feature is not yet implemented.
[Related commands:]
"dump image"_dump_image.html

View File

@ -148,6 +148,7 @@ Fixes :h1
fix_srd
fix_store_force
fix_store_state
fix_surface_global
fix_temp_berendsen
fix_temp_csvr
fix_temp_rescale

View File

@ -12,7 +12,7 @@ info command :h3
info args :pre
args = one or more of the following keywords: {out}, {all}, {system}, {memory}, {communication}, {computes}, {dumps}, {fixes}, {groups}, {regions}, {variables}, {styles}, {time}, or {configuration}
args = one or more of the following keywords: {out}, {all}, {system}, {memory}, {communication}, {computes}, {dumps}, {fixes}, {groups}, {regions}, {variables}, {coeffs}, {styles}, {time}, or {configuration}
{out} values = {screen}, {log}, {append} filename, {overwrite} filename
{styles} values = {all}, {angle}, {atom}, {bond}, {compute}, {command}, {dump}, {dihedral}, {fix}, {improper}, {integrate}, {kspace}, {minimize}, {pair}, {region} :ul
@ -81,6 +81,11 @@ The {variables} category prints a list of all currently defined
variables, their names, styles, definition and last computed value, if
available.
The {coeffs} category prints a list for each defined force style
(pair, bond, angle, dihedral, improper) indicating which of the
corresponding coefficients have been set. This can be very helpful
to debug error messages like "All pair coeffs are not set".
The {styles} category prints the list of styles available in the
current LAMMPS binary. It supports one of the following options
to control which category of styles is printed out:

View File

@ -1,6 +1,5 @@
#HTMLDOC 1.8.27
-t pdf14 -f "../Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont helvetica --bodyfont times --headfootsize 11.0 --headfootfont helvetica --charset iso-8859-1 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow
#HTMLDOC 1.8.28
-t pdf14 -f "../Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont Sans --bodyfont Serif --headfootsize 11.0 --headfootfont Sans-Bold --charset iso-8859-15 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow
Manual.html
Section_intro.html
Section_start.html

View File

@ -0,0 +1,19 @@
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
:link(ld,Manual.html)
:link(lc,Section_commands.html#comm)
:line
pair_style body/rounded/polygon command :h3
[Description:]
Note: This feature is not yet implemented.
[Related commands:]
"pair_style body"_pair_body.html
[Default:] none

View File

@ -28,7 +28,7 @@ The parameter <contact_stiffness> has units of pressure and should equal roughly
of the Young's modulus (or bulk modulus in the case of fluids) of the material model associated with the SPH particles.
The parameter {scale_factor} can be used to scale the particles' contact radii. This can be useful to control how close
particles can approach each other. Usually, {scale_factor}=1.0.
particles can approach each other. Usually, {scale_factor} =1.0.
:line

View File

@ -29,7 +29,7 @@ The parameter <contact_stiffness> has units of pressure and should equal roughly
of the Young's modulus (or bulk modulus in the case of fluids) of the material model associated with the SPH particle
The parameter {scale_factor} can be used to scale the particles' contact radii. This can be useful to control how close
particles can approach the triangulated surface. Usually, {scale_factor}=1.0.
particles can approach the triangulated surface. Usually, {scale_factor} =1.0.
:line

View File

@ -12,8 +12,8 @@ pair_style smd/ulsph command :h3
pair_style smd/ulsph args :pre
these keywords must be given :l
keyword = {*DENSITY_SUMMATION} or {*DENSITY_CONTINUITY} and {*VELOCITY_GRADIENT} or {*NO_VELOCITY_GRADIENT} and {*GRADIENT_CORRECTION} or {*NO_GRADIENT_CORRECTION}
these keywords must be given :ul
keyword = {*DENSITY_SUMMATION} or {*DENSITY_CONTINUITY} and {*VELOCITY_GRADIENT} or {*NO_VELOCITY_GRADIENT} and {*GRADIENT_CORRECTION} or {*NO_GRADIENT_CORRECTION} :pre
[Examples:]

View File

@ -7,6 +7,7 @@
:line
pair_style snap command :h3
pair_style snap/kk command :h3
[Syntax:]
@ -171,6 +172,29 @@ This pair style can only be used via the {pair} keyword of the
:line
Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are
functionally the same as the corresponding style without the suffix.
They have been optimized to run faster, depending on your available
hardware, as discussed in "Section 5"_Section_accelerate.html
of the manual. The accelerated styles take the same arguments and
should produce the same results, except for round-off and precision
issues.
These accelerated styles are part of the GPU, USER-INTEL, KOKKOS,
USER-OMP and OPT packages, respectively. They are only enabled if
LAMMPS was built with those packages. See the "Making
LAMMPS"_Section_start.html#start_3 section for more info.
You can specify the accelerated styles explicitly in your input script
by including their suffix, or you can use the "-suffix command-line
switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can
use the "suffix"_suffix.html command in your input script.
See "Section 5"_Section_accelerate.html of the manual for
more instructions on how to use the accelerated styles effectively.
:line
[Restrictions:]
This style is part of the SNAP package. It is only enabled if

View File

@ -8,6 +8,7 @@
pair_style zbl command :h3
pair_style zbl/gpu command :h3
pair_style zbl/kk command :h3
pair_style zbl/omp command :h3
[Syntax:]

View File

@ -11,6 +11,7 @@ Pair Styles :h1
pair_awpmd
pair_beck
pair_body
pair_body_rounded_polygon
pair_bop
pair_born
pair_brownian

View File

@ -67,7 +67,8 @@ class RSTMarkup(Markup):
text = text.replace('*', '\\*')
text = text.replace('^', '\\^')
text = text.replace('|', '\\|')
text = re.sub(r'([^"])_', r'\1\\_', text)
text = re.sub(r'([^"])_([ \t\n\r\f])', r'\1\\\\_\2', text)
text = re.sub(r'([^"])_([^ \t\n\r\f])', r'\1\\_\2', text)
return text
def unescape_rst_chars(self, text):

View File

@ -0,0 +1,49 @@
# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS
Authors: Mitchell Wood, Stan Moore, and Aidan Thompson, Sandia National Labs
Date: 2017-10-17
Questions: Mitchell Wood, mitwood@sandia.gov
---------ReaxFF Benchmark Files---------
1) in.reaxc.hns
2) data.hns-equil
3) ffield.reax.hns
---------File Description---------
1) LAMMPS input file for this test.
The file is read line by line looking for keywords to set up this run.
It will read in the configuration given by the argument of the read_data command, which is supplied in this distribution.
The type of simulation is set by the 'fix' commands, dynamic charges are controlled with 'fix qeq' and the integration style is given as 'fix nve' here.
More information about each of the individual commands can be found online at lammps.sandia.gov in the user manual section.
*There are four free varaibles in this file, three of which control the size of the simulation and the last will dictate how many MD time steps are taken.
*The size of the system is controlled by the 'replicate' command given the values of $x, $y and $z.
*The number of timesteps taken is controlled by the 'run' command given the value of $t
It is worth noting that these four free variables can be set at the command line when the simulation is invoked rather than editing the file by hand prior to each run.
Example syntax:
lmp_serial -in in.reaxc.hns -v x 2 -v y 2 -v z 2 -v t 100
2) LAMMPS Data file for crystalline HNS
This file matches the LAMMPS data format, more information about this data structure can be found at lammps.sandia.gov
This particular data file is of the energetic material Hexanitrostilbene (HNS) with atom_style charge (id type q x y z).
The file contains eight molecules (2 unit cells).
Chemical Name: Hexanitrostilbene
Molecule Composition: C14H6N6O12
IUPAC Name: 1,3,5-Trinitro-2-[2-(2,4,6-trinitrophenyl)ethenyl]benzene
Phyical Properties (Gerard F., Hardy A. Acta Cryst. (1988) 1283-1287)
Density: 1.741 g/cc
Crystal Structure: Monoclinic P2(1)/c
Molecules per Unit Cell: 4
Lattice Constants: a=22.326
b=5.5706
c=14.667
beta=110.04 deg
3) ReaxFF force field file.
Details about this particular parameterization can be found in T.-R. Shan, R. R. Wixom, A. P. Thompson, "Atomistic Simulation of Nanoscale Void-Enhanced Initiation in Hexanitrostilbene", Proc. 15th International Detonation Symposium, pp. 962-969, SAND Number: SAND2014-15518J

View File

@ -0,0 +1,631 @@
# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS
# See README for more info
304 atoms
4 atom types
0.0000000000000000e+00 2.2326000000000001e+01 xlo xhi
0.0000000000000000e+00 1.1141200000000000e+01 ylo yhi
0.0000000000000000e+00 1.3778966000000000e+01 zlo zhi
0.0000000000000000e+00 -5.0260300000000004e+00 0.0000000000000000e+00 xy xz yz
Masses
1 12
2 1.008
3 15.999
4 14
Atoms
30 1 -1.5978703752096285e-03 1.2032863869865822e+00 2.8256400602546141e+00 1.6550970119417108e+00 0 0 0
34 1 1.4609342964817035e-01 1.9907567656339498e+00 4.0380967812225812e+00 1.6037009557414807e+00 0 0 0
38 1 -1.1313442904350110e-01 2.3735208752501014e+00 4.6358508212064597e+00 2.8207166456035706e+00 0 0 0
42 1 1.6137623866269668e-01 2.2068159183466545e+00 3.9155626912486312e+00 4.0393199600260017e+00 0 0 0
46 1 -1.3231732350799086e-01 1.6723546283637456e+00 2.6490843099361769e+00 4.0718695650174555e+00 0 0 0
50 1 1.3924326618460361e-01 1.0432796609680879e+00 2.1377763017045028e+00 2.8779760001142254e+00 0 0 0
2 1 1.0355454307915037e-02 9.2365304282304432e+00 3.0315922757175588e+00 5.8645178945136656e-01 0 0 0
83 3 -1.1387168269097275e-01 -2.8903688091767799e-01 4.4353520665316273e+00 5.8542082062284990e+00 0 0 0
151 2 2.4137857976817839e-01 -1.2098303319415862e+00 6.2642360580370904e-01 6.3751534971040620e+00 0 0 0
90 3 -1.4867175259103951e-01 2.7301832997028690e+00 4.2208910046400874e+00 6.4748944299312052e+00 0 0 0
62 3 -1.4102407432432201e-01 9.4127387076516271e+00 5.0642928548941315e+00 3.6732353442096048e+00 0 0 0
98 3 -1.4663622654196759e-01 -3.6147625406370998e-01 6.2032706772140034e-01 4.2927916563248019e+00 0 0 0
54 1 -4.5611437629532792e-02 4.5789128567777315e-01 2.3037414864278984e+00 4.4853180490390432e-01 0 0 0
87 3 -1.8118678506945068e-01 3.4239328769587729e-01 2.4978291763591067e+00 6.8433313861644862e+00 0 0 0
122 4 -1.3816556601478763e-03 2.7347000852858909e+00 4.7780564701856187e+00 5.2860122928435764e+00 0 0 0
126 4 3.6742909094152829e-03 2.4236147574090339e-01 8.2881803614262350e-01 3.1300069722778523e+00 0 0 0
106 4 5.0380311643663904e-03 9.5333959154754595e+00 4.9409481826854691e+00 2.4063719536640074e+00 0 0 0
146 2 2.5678858551879979e-01 1.6690771913639459e+00 2.1486485750781656e+00 4.9718402573987817e+00 0 0 0
110 4 1.6289496724444380e-03 5.3102382664427816e+00 1.9205393567101749e+00 2.1572449075775788e+00 0 0 0
150 2 2.1173170721002404e-01 7.5386951474057873e-01 1.3549807632892001e+00 9.3638420990104679e-02 0 0 1
6 1 1.1953236006118220e-01 8.7624714685569316e+00 3.7188181320106537e+00 1.7053122151642655e+00 0 0 0
10 1 -1.2241319991927709e-01 7.5639831402718549e+00 3.2619209383245216e+00 2.2783314043500087e+00 0 0 0
14 1 1.6332523038636718e-01 6.7064629894786840e+00 2.3225374933384266e+00 1.5993053103840011e+00 0 0 0
18 1 -1.2740222789777322e-01 7.1960583589051836e+00 1.7158122662355066e+00 4.4569871516692844e-01 0 0 0
27 1 -5.3470339611564929e-02 8.2035551240691014e+00 5.2145834528427404e+00 6.7535330772512978e+00 0 0 0
130 2 2.6175533983311156e-01 7.2291088343383372e+00 3.7463444170136344e+00 3.1894666598585886e+00 0 0 0
115 4 -1.0266178820511205e-02 6.5003245602926247e+00 1.9837100341352589e+00 5.4205438257015626e+00 0 0 0
70 3 -1.9659495203039720e-01 4.8736785299263445e+00 6.8433015433575883e-01 2.0399570769464188e+00 0 0 0
66 3 -1.4139946566263059e-01 4.6669037558628865e+00 2.7410416721294739e+00 2.9336061027665226e+00 0 0 0
79 3 -1.4677703049809945e-01 7.3812392124196062e+00 1.4179852894043470e+00 4.6640710482179113e+00 0 0 0
75 3 -1.6908670824429517e-01 6.1211322589023460e+00 3.2420945874253642e+00 5.3132771020098115e+00 0 0 0
139 2 2.5448108175084960e-01 8.4566882159339229e+00 4.3172025545808355e+00 6.2369390618225014e+00 0 0 0
23 1 1.3477422750843063e-01 6.0540050656644713e+00 1.1700924054581945e+00 6.6706585187016119e+00 0 0 0
118 4 -1.5835790692106114e-02 2.4504894190711446e+00 4.5478624528845764e+00 2.3408689744414402e-01 0 0 0
26 1 -5.8799784794887205e-02 1.0677497585216404e+01 3.3270395487987150e+00 2.1937163062090195e-01 0 0 1
135 2 2.2667543991902223e-01 4.2303516292691130e+00 2.3680991399220881e+00 6.7600909900965371e+00 0 0 0
134 2 2.6603700384712170e-01 1.5553791693879147e+00 9.2759126357203769e-01 1.3751336880718977e+01 0 0 -1
35 1 1.3619576950915824e-01 -6.1123259368930594e-01 4.2744050950379879e+00 8.2689176641591953e+00 0 0 0
39 1 -1.3619776752057167e-01 2.1174961291658523e-02 3.7911192964937714e+00 9.4031145771372433e+00 0 0 0
43 1 1.7616533882120664e-01 -2.4082821430091039e-01 4.3921540571785220e+00 1.0667961368752986e+01 0 0 0
55 1 -4.7675633308455131e-02 -1.8255087561703223e+00 2.3531147144749784e-02 7.0185294659074930e+00 0 0 0
51 1 1.4229302277810482e-01 -1.4696286889225143e+00 2.4331344403165978e-01 9.4912358273027095e+00 0 0 0
67 3 -1.3320855668594128e-01 2.2563624634551185e+00 6.4796712999277428e-01 9.7945933875844204e+00 0 0 0
82 3 -1.2277895342641043e-01 -2.4283488967409923e+00 3.7198642287090697e+00 1.2995930949473768e+01 0 0 0
111 4 -1.5140995980939403e-03 3.0250993995224067e+00 1.4943316767321402e+00 9.1744364446145408e+00 0 0 0
91 3 -1.4025506634127735e-01 1.7753588712423607e-01 4.4153781344920002e+00 1.3115706743542738e+01 0 0 0
95 3 -1.3868856763412177e-01 1.2309740323323872e+00 2.8163901938840534e+00 1.1864853104907548e+01 0 0 0
99 3 -1.3250332187377967e-01 -2.4235387111074864e+00 2.2927169952708413e+00 1.0531038226936827e+01 0 0 0
103 3 -1.5214067005316109e-01 -2.5943266041046478e+00 2.0130134130925272e+00 8.2928000156291564e+00 0 0 0
11 1 -1.2064832278125080e-01 4.9238352739840066e+00 5.1583157878512989e+00 8.7390613510373552e+00 0 0 0
123 4 -1.8374834914142782e-03 4.6335581596415221e-01 3.8350456476487684e+00 1.1969089243285413e+01 0 0 0
127 4 -4.5958705273757214e-03 -2.3340640092443685e+00 1.5285367626179718e+00 9.4882316286490980e+00 0 0 0
143 2 2.8164020999934403e-01 8.1801006001560150e-01 3.0833734683476477e+00 9.2359390877007783e+00 0 0 0
226 3 -1.3797612921025582e-01 3.0686575977270270e+00 5.3454897967899155e+00 1.2182598966837521e+01 0 0 0
74 3 -1.4848161091470552e-01 3.6465792627245133e+00 4.2615086181930439e-02 1.2180659758160441e+01 0 0 0
107 4 -1.4162558249806764e-02 6.9041986670066819e+00 3.4945477378354388e+00 8.8118463563242155e+00 0 0 0
7 1 1.3874647498773149e-01 6.1777705393650866e+00 4.7275638247590814e+00 8.2546633769247251e+00 0 0 0
59 3 -1.4867036170029541e-01 7.9924230788486739e+00 3.0224192820538822e+00 8.2251400208652061e+00 0 0 0
15 1 1.5783636416316224e-01 4.3575954701770536e+00 9.7856621771074259e-01 8.4167269066637989e+00 0 0 0
19 1 -1.2015824785960097e-01 4.8284895573299593e+00 1.5629079717902468e+00 7.2532253050378577e+00 0 0 0
147 2 2.8239828117589366e-01 -9.3165419330122523e-01 4.2118942787062214e-01 1.1512337330019069e+01 0 0 0
114 4 -1.4785079641223244e-02 3.8503739478102448e+00 1.3491416192259467e+00 1.2373804865591053e+01 0 0 0
3 1 1.3350861714137560e-02 6.8114774504878302e+00 5.5447953386683206e+00 7.2580722690515636e+00 0 0 0
63 3 -1.2277076639947315e-01 6.4897117194665608e+00 2.8986172068480283e+00 9.9060820538034609e+00 0 0 0
78 3 -1.1723116541459006e-01 4.4127311301931043e+00 2.1084084419897180e+00 1.1535065556985785e+01 0 0 0
71 3 -1.7152044820786300e-01 2.8873531342706946e+00 2.7797489684906393e+00 9.3163860457066789e+00 0 0 0
131 2 2.7834313014819689e-01 4.3817210322557489e+00 4.5528948096328836e+00 9.5379421136925018e+00 0 0 0
31 1 9.4935956929876678e-03 -1.4954352092350376e+00 5.3645298943245292e+00 8.3142675828162034e+00 0 0 0
86 3 -1.6350292182104242e-01 -1.8311649351050598e+00 2.0802600512349903e-01 1.3629050043036029e+01 0 0 -1
60 3 -1.7749808073059342e-01 6.6696465438141646e+00 1.5936122406953454e-01 1.1815497920409818e+01 0 0 0
155 1 7.9312977244249613e-03 6.8120544939431360e+00 1.0199834144196412e-01 7.2127972853813258e+00 0 1 0
22 1 1.4407031044516649e-01 3.4096950234688004e+00 2.0679954049404619e+00 1.3690619069119307e+01 0 0 -1
140 2 2.5769600911651236e-01 6.0687404141669434e+00 1.3241144290919518e+00 1.3462978005934200e+01 0 0 -1
199 1 -1.3944547646247771e-01 -1.1362038789337188e+00 5.4530148366485571e+00 1.0742524104946057e+01 0 0 0
119 4 -1.2299043862974497e-02 -2.3446859456688562e-01 3.6495764565964248e+00 6.8964694682143248e+00 0 0 0
182 1 6.7658225708544725e-03 1.4169424463071361e+00 8.3763330460636727e+00 1.4012109232974952e+00 0 0 0
186 1 1.2980507892816731e-01 2.2797704925844604e+00 9.5291291369621636e+00 1.3666006980904655e+00 0 0 0
190 1 -1.5071175365705503e-01 2.7699144439458436e+00 1.0081261276817276e+01 2.5544135724485146e+00 0 0 0
194 1 1.7547903565045994e-01 2.3921031079123969e+00 9.5103250107764765e+00 3.8009524053675627e+00 0 0 0
198 1 -1.3144018623170101e-01 1.4977753357515831e+00 8.3987685531196199e+00 3.8549410858411388e+00 0 0 0
202 1 1.3849820878754834e-01 1.0150476921735834e+00 7.8483962991977574e+00 2.6673948664405547e+00 0 0 0
206 1 -6.3927688649410647e-02 6.6270841666167679e-01 7.9494021125481424e+00 1.4197887405827284e-01 0 0 0
235 3 -1.3761341595728172e-01 -2.8837295421316522e-01 9.2189872838153608e+00 5.8372696110592788e+00 0 0 0
142 2 2.6479443554012794e-01 2.9320229108693479e+00 5.5858386406215974e+00 2.8822394959582591e+00 0 0 0
242 3 -1.4112562564538583e-01 2.5388308202795757e+00 9.7663385818562389e+00 6.3230546934248055e+00 0 0 0
291 2 2.3831756420052311e-01 8.3394602256848422e+00 1.0597218595134976e+01 5.6327293542472532e+00 0 0 0
250 3 -1.0987475178029475e-01 -5.0622879855012592e-01 6.2591257947415606e+00 3.8940086364947737e+00 0 0 0
258 4 6.9512359773382104e-03 9.4664816115561496e+00 1.0405510702076073e+01 1.9702849156142326e+00 0 0 0
262 4 -8.0100924398892291e-03 5.3017951547661228e+00 7.1947421307917523e+00 2.2008872174147442e+00 0 0 0
274 4 -2.8801715867946998e-02 2.8217805545648877e+00 1.0198911718869871e+01 5.0989203211129208e+00 0 0 0
278 4 -8.3382269572114982e-03 1.9022473073729729e-01 6.5306916972236531e+00 2.7977581783283543e+00 0 0 0
222 3 -1.5735096896248177e-01 5.0460780570651043e+00 5.9652600638197084e+00 1.9688452086847921e+00 0 0 0
298 2 2.8845912568524801e-01 1.2259584803396069e+00 7.9975091793540463e+00 4.8377168239797355e+00 0 0 0
267 4 -8.1543222370399418e-04 6.7515502316853571e+00 7.3530236371224733e+00 5.3783512877798509e+00 0 0 0
154 1 7.1908069858682630e-03 9.1240531784682535e+00 8.3732699807014779e+00 4.1677219242496333e-01 0 0 0
158 1 1.3448308907124562e-01 8.6487938120238645e+00 9.1661211028768115e+00 1.5116534817235705e+00 0 0 0
162 1 -1.1355360785260224e-01 7.3973813587135364e+00 8.8118392837386903e+00 2.0442619468259688e+00 0 0 0
166 1 1.5711265427818599e-01 6.6193754339762592e+00 7.7216957118390352e+00 1.5125332287756803e+00 0 0 0
170 1 -1.2245433545215903e-01 7.2334953478137844e+00 6.9135079041535876e+00 5.1425051872838257e-01 0 0 0
175 1 1.3581278243177822e-01 6.1399576319422247e+00 6.6351336822606477e+00 6.6388959270812675e+00 0 0 0
282 2 2.3480529560852545e-01 6.8780657238569551e+00 9.4266263098711551e+00 2.8083989170176249e+00 0 0 0
179 1 -3.9098442124970913e-02 8.1921382670269995e+00 1.1015911501599872e+01 6.6154483416940151e+00 0 0 0
231 3 -1.2568742237480407e-01 7.4708728388631442e+00 6.7304833314035504e+00 4.5334798740490836e+00 0 0 0
218 3 -1.4344893238707335e-01 4.7091494226840656e+00 7.8204929202859752e+00 3.1719768839537057e+00 0 0 0
294 2 2.9175211722940220e-01 3.4302436656544328e+00 1.0911761593148093e+01 2.4580124801797307e+00 0 0 0
227 3 -1.5716251537215054e-01 6.3710113945660511e+00 8.6140075062272228e+00 5.1189294887372707e+00 0 0 0
254 3 -1.6304878692327615e-01 1.1369152465923738e-02 5.8040125934093432e+00 1.7344736606349882e+00 0 0 0
94 3 -1.6001482691396210e-01 3.4226797144178276e+00 5.8324891118411557e+00 5.0673816802761040e+00 0 0 0
214 3 -1.3095404512866216e-01 9.2822478837309497e+00 1.0944567563926054e+01 3.1520938926115289e+00 0 0 0
210 3 -1.6656061802004779e-01 1.0125927049661630e+01 1.0968553134904163e+01 1.0306564425404838e+00 0 0 0
58 3 -1.8302344471552118e-01 1.0213161644629823e+01 5.8090021306247959e+00 1.7225024677054026e+00 0 0 0
246 3 -1.6180800736237624e-01 3.7271744208235593e+00 1.1136471158690993e+01 4.9690967792530811e+00 0 0 0
102 3 -1.6531840940386305e-01 3.3511101143416933e-01 1.1054539855366549e+01 2.2157686745942939e+00 0 -1 0
238 3 -1.6856155817812890e-01 2.9083086152708901e+00 5.7681194020610480e+00 1.7191101722965371e-01 0 0 0
287 2 2.4377790046642306e-01 4.4026866149631791e+00 7.9897646117591492e+00 6.8189677819979027e+00 0 0 0
286 2 2.6154505839152942e-01 6.7181127902312507e+00 5.9804318863208010e+00 2.1530836987465235e-01 0 0 0
171 1 -1.1187852832153318e-01 4.9158733746689869e+00 7.0613244573777925e+00 7.1285394473597972e+00 0 0 0
187 1 1.3804049779409072e-01 -4.7081814568988589e-01 9.4447023070407337e+00 8.2867903808074814e+00 0 0 0
191 1 -1.2971955344725286e-01 1.0532858911262055e-01 9.0301089070007023e+00 9.5194948333957843e+00 0 0 0
195 1 1.7237826722593086e-01 -3.2979026063385319e-02 9.7887682538998035e+00 1.0706940452275044e+01 0 0 0
270 4 -1.3464043531568919e-02 -2.2543639852501798e+00 1.0142966260197174e+01 1.3730567035196929e+01 0 0 -1
203 1 1.3427963268281090e-01 -1.8024111493992248e+00 5.9588781753908151e+00 9.5912321727716829e+00 0 0 0
302 2 2.4793795803104607e-01 -4.0813465149326733e+00 7.0098028171254363e+00 1.3582140525668459e+01 0 0 0
234 3 -1.2298530438399083e-01 -2.0999175503602907e+00 9.3334349911585850e+00 1.2713070387329807e+01 0 0 0
183 1 -1.3480580351704630e-03 -1.2524425039534379e+00 1.0603399634220155e+01 8.3052270038890796e+00 0 0 0
243 3 -1.6074098714307544e-01 1.0092944188786444e+00 1.0218279224693790e+01 1.2861379846486365e+01 0 0 0
247 3 -1.5387578069009830e-01 8.5439915136228706e-01 8.0170106581812881e+00 1.2211169111299865e+01 0 0 0
251 3 -1.3983948146137931e-01 -2.9738796938163725e+00 7.5122263482065499e+00 1.1030823813483353e+01 0 0 0
255 3 -1.6423936253041480e-01 -3.0284913258585524e+00 7.9088522479385679e+00 8.7407850365314399e+00 0 0 0
259 4 8.0410558983729646e-04 6.7961292001636444e+00 9.1867860735672711e+00 8.8636424740217947e+00 0 0 0
275 4 -4.3259974176743099e-05 6.9707283465202874e-01 9.3227186018980994e+00 1.1981108937286187e+01 0 0 0
279 4 -5.4226204814747658e-03 -2.7183814077004502e+00 7.1633679386102083e+00 9.7555594565405492e+00 0 0 0
295 2 2.6218133810847499e-01 6.0410847381122412e-01 8.0421997981783182e+00 9.5648500938018834e+00 0 0 0
230 3 -1.2018011636818954e-01 4.6317864784420824e+00 6.8176590020738042e+00 1.1516620570461674e+01 0 0 0
271 4 -2.8439562879540532e-02 -2.3352025232358109e-01 8.6009765210205842e+00 7.0174876202960812e+00 0 0 0
219 3 -1.4441576113611607e-01 2.1139860757598838e+00 5.9566809343395395e+00 9.2739736659519139e+00 0 0 0
159 1 1.3413754194495167e-01 6.2381774846970295e+00 1.0512869843000209e+01 8.2998411286674898e+00 0 0 0
207 1 -4.5275085907843307e-02 -2.2313374155847714e+00 5.9531808015124978e+00 7.1401084416064693e+00 0 0 0
167 1 1.7086332099009921e-01 4.3308992321162805e+00 6.2978761471859119e+00 8.1848912823747266e+00 0 0 0
299 2 2.8374116457714360e-01 -1.3476728927796344e+00 5.8584256959679699e+00 1.1723539811442672e+01 0 0 0
163 1 -1.2189457501468513e-01 5.0935078513079350e+00 1.1062258678023431e+01 9.0012683062525820e+00 0 0 0
263 4 -7.2701194644572698e-04 2.9434843653848728e+00 6.8044753722388700e+00 8.7310546416994494e+00 0 0 0
283 2 2.7264339681755889e-01 4.8359812206870174e+00 1.0640435156903745e+01 9.9608335270238513e+00 0 0 0
215 3 -1.4288902954841964e-01 6.2383981494412399e+00 8.7703889714141425e+00 9.9908196032513992e+00 0 0 0
266 4 -8.3036691590210043e-03 3.8552898694615410e+00 6.3532834866457213e+00 1.2405163389905894e+01 0 0 0
223 3 -1.5495221688355837e-01 2.7688702181241505e+00 8.0788864563930165e+00 8.7961622886575483e+00 0 0 0
47 1 -1.4240292392311604e-01 -8.0585282619207854e-01 1.1001203580909479e+01 1.0640184120123211e+01 0 -1 0
239 3 -1.5918937290882762e-01 1.2364626954722713e-01 7.3735979096052837e+00 7.1236548585242829e+00 0 0 0
211 3 -1.5314927771899267e-01 7.7651972221628771e+00 8.5829452424035306e+00 8.2735478967570266e+00 0 0 0
174 1 1.3567196175621835e-01 3.3561575756156685e+00 7.2839028683362592e+00 1.3611594287463081e+01 0 0 -1
178 1 -4.2521883951091258e-02 5.4615345784574156e+00 8.6476231458927373e+00 1.3600443195015076e+01 0 0 0
290 2 2.1442656366253354e-01 5.5274039219990954e+00 9.2255865950855895e+00 1.2687705291121766e+01 0 0 0
303 2 2.5353570250225943e-01 -2.2348717930687036e+00 7.0298204354936624e+00 6.9132532076613566e+00 0 0 0
24 1 1.2162850983145865e-01 1.3570458894241060e+01 3.7277652770944414e+00 9.8918074854908070e-02 0 0 1
5 1 1.3914102385590588e-01 1.1213395000571410e+01 8.0472724282855101e-01 5.7408880705229404e+00 0 0 0
197 1 -1.3041827238141993e-01 1.8473286069241315e+01 1.0985097812596707e-01 3.0075353107267451e+00 0 1 0
13 1 1.7283275995574809e-01 1.2875160453890059e+01 4.7996107330851263e+00 5.2087316096641079e+00 0 0 0
17 1 -1.1881087407702678e-01 1.2355470079281316e+01 4.1155201213165631e+00 6.3297886650294171e+00 0 0 0
125 4 3.7413972756181225e-03 1.9792607892607982e+01 3.8314384983826288e+00 3.7758070374204347e+00 0 0 0
65 3 -1.5036712947298864e-01 1.5121389160787066e+01 4.9829628898301168e+00 4.1493419461259045e+00 0 0 0
117 4 -2.8172670419954578e-02 1.7196064275775313e+01 2.0768392879531876e+00 6.6413862436815210e+00 0 0 0
61 3 -1.2308569749478299e-01 1.0809273741496686e+01 2.5226209794106560e+00 4.0850632510091458e+00 0 0 0
85 3 -1.6137869003688254e-01 1.6596173548046423e+01 3.2483998401081635e+00 6.6279770720028131e+00 0 0 0
69 3 -1.6211349992745419e-01 1.4316483787038429e+01 2.8679518868321781e+00 4.4855442842711772e+00 0 0 0
9 1 -1.3074969844225212e-01 1.2401631549383206e+01 3.6248247848246284e-01 5.0973483639088109e+00 0 0 0
80 3 -1.2136120739760561e-01 1.2414408244527392e+01 3.7798480870141100e+00 2.3049497332865676e+00 0 0 0
105 4 -8.7639699558985304e-03 1.0400914317139788e+01 1.9934211504476644e+00 5.2185528134499632e+00 0 0 0
109 4 3.6355423208319151e-03 1.4153445124920722e+01 4.1606747163691100e+00 4.5151554719853308e+00 0 0 0
116 4 -2.0040355754916923e-02 1.3085160543744017e+01 4.4594714321443236e+00 1.4538603237969565e+00 0 0 0
129 2 2.8405512757711698e-01 1.2820832866494431e+01 8.9357547891832556e-01 4.2332198666407352e+00 0 0 0
152 2 2.4669130813086726e-01 2.1677578157490025e+01 4.0323646146544609e+00 3.5638857460123857e-01 0 0 0
29 1 5.8620817499049974e-03 1.8561052170019028e+01 2.8191467769292960e-01 5.3975919601693825e+00 0 0 0
141 2 2.6074912497584113e-01 1.6683115099591326e+01 2.8811346832734976e+00 4.1932142387762292e+00 0 0 0
33 1 1.3809754803072044e-01 1.7700292673901394e+01 1.4462902229581946e+00 5.3613784374191082e+00 0 0 0
37 1 -1.2506428679034834e-01 1.7292724764729162e+01 1.9577791424971711e+00 4.1365222417858645e+00 0 0 0
41 1 1.5574606725144832e-01 1.7684017799240962e+01 1.2568437218671011e+00 2.9834398674586708e+00 0 0 0
121 4 3.1035256692961075e-03 1.7254091420272236e+01 1.9749573648856620e+00 1.5939503050368518e+00 0 0 0
49 1 1.3615547301261535e-01 1.8863927091248083e+01 5.0961048964131059e+00 3.9285863191137240e+00 0 0 0
149 2 2.2703718115742552e-01 1.9254758140895767e+01 4.0931544733063738e+00 6.6148594449325175e+00 0 0 0
84 3 -1.3924471002607569e-01 2.0413070700633931e+01 1.2047548927515181e+00 1.0936978108224675e+00 0 0 0
53 1 -4.8376182763242251e-02 1.9296848129360342e+01 5.1351935135474474e+00 6.3529637885031054e+00 0 0 0
89 3 -1.4492596391523513e-01 1.7151071776065425e+01 1.2918686591231159e+00 5.0291711308277665e-01 0 0 0
93 3 -1.7423814775149760e-01 1.6893419100350471e+01 3.2111750510659807e+00 1.6437292442546174e+00 0 0 0
97 3 -1.3408621635364737e-01 2.0252553978161927e+01 3.6033112624663475e+00 2.6319164884537698e+00 0 0 0
101 3 -1.5647560242362671e-01 1.9966818329962706e+01 2.9803252235704702e+00 4.7704681555938286e+00 0 0 0
145 2 2.9710717883828969e-01 1.8342396226420870e+01 5.0375210273389071e+00 1.8399466526232027e+00 0 0 0
228 3 -1.4751575154425844e-01 1.3620322518195461e+01 4.8592688087461144e-01 1.7071338271502052e+00 0 1 0
57 3 -1.6234942986621856e-01 9.5573034514145281e+00 2.5713316687631611e+00 6.0309294315367872e+00 0 0 0
133 2 2.5213413889296182e-01 1.2870471176495373e+01 3.1816472789094496e+00 6.6131200188746284e+00 0 0 0
136 2 2.5352888813788832e-01 1.5309707786810065e+01 4.9333975554866214e+00 8.8529787370636895e-02 0 0 1
138 2 2.4757969448062320e-01 1.1088418315051889e+01 4.2920333787949172e+00 3.0106028235732774e-01 0 0 1
1 1 1.4746669082761749e-02 1.0642281893540970e+01 6.8544269556010395e-02 6.8142401227780320e+00 0 0 0
88 3 -1.6483993868322799e-01 1.9581081903169775e+01 5.2703115059623826e+00 2.1488086883709036e-02 0 0 1
64 3 -1.5561028561723289e-01 8.1514538556249523e+00 3.6877081373514281e-01 1.0190861669963537e+01 0 0 0
8 1 1.2742104870686943e-01 8.4817612503248814e+00 1.9386649635257653e+00 1.2088673448348180e+01 0 0 0
12 1 -1.3287822675261260e-01 9.7374245849040690e+00 2.3614292305863063e+00 1.1668887530828931e+01 0 0 0
16 1 1.7038148918615603e-01 1.0385610834546672e+01 3.4830285077629948e+00 1.2258282947730743e+01 0 0 0
20 1 -1.2612831428267482e-01 9.7652115043624903e+00 4.1264217871858486e+00 1.3381826333553166e+01 0 0 0
25 1 -4.9580879905770883e-02 9.2720365942599763e+00 3.2092695107275732e-01 7.3585562419532167e+00 0 0 0
148 2 2.8255405335750933e-01 1.6024837696238595e+01 3.2479443163306607e+00 8.9410550895656549e+00 0 0 0
137 2 2.4211278788929905e-01 9.1875734209445099e+00 7.8297873360776893e-01 8.2956507179333450e+00 0 0 0
104 3 -1.6303797587445271e-01 1.7571928078007303e+01 5.3161697109543047e+00 1.2072204347282128e+01 0 0 0
68 3 -1.3950884940126265e-01 1.2726252049625897e+01 3.2949351425978031e+00 1.1414834763137264e+01 0 0 0
128 4 -1.1637074791112794e-02 1.7184554793649326e+01 4.6282393562250501e+00 1.1015460865140042e+01 0 0 0
73 3 -1.5872839596893912e-01 1.1181520064577594e+01 2.5784441672869147e+00 8.5109267793241798e+00 0 0 0
77 3 -1.2443355673803388e-01 1.0091806544554002e+01 4.3646337275773526e+00 9.2688186113011550e+00 0 0 0
108 4 -3.6175483988508603e-03 7.8242079841413910e+00 6.6722303677879913e-01 1.1399732511932291e+01 0 0 0
112 4 -1.1575150065119208e-03 1.1761455742350400e+01 4.0719181606614256e+00 1.1776879794815027e+01 0 0 0
113 4 2.4550599269124868e-04 1.0795250821397342e+01 3.7987066995239132e+00 8.3505753502250588e+00 0 0 0
132 2 2.4842899099174726e-01 1.0210124897784075e+01 1.8788605874908142e+00 1.0866322237260500e+01 0 0 0
56 1 -5.7548729418621672e-02 1.6817150692583052e+01 3.1182828489110217e+00 1.3647345422902928e+01 0 0 0
21 1 1.3924700036304882e-01 1.1320578571569595e+01 4.6135876874421253e+00 7.0983485573687055e+00 0 0 0
32 1 1.0844185182340992e-02 1.6170921360774656e+01 2.7042197293152741e+00 1.2379322306625614e+01 0 0 0
36 1 1.3503387619781887e-01 1.5341369407103103e+01 1.5518718147435990e+00 1.2428854940060008e+01 0 0 0
40 1 -1.3597771280707957e-01 1.4740075360614529e+01 1.0465774988630860e+00 1.1294731238516940e+01 0 0 0
44 1 1.6880045598426557e-01 1.5001353192585187e+01 1.6411551197426020e+00 1.0010620303523039e+01 0 0 0
48 1 -1.2558996845974929e-01 1.5808101597792366e+01 2.7755379813359049e+00 9.9372975636831917e+00 0 0 0
52 1 1.3281216321759565e-01 1.6322309187162340e+01 3.3644510045114564e+00 1.1112513564301416e+01 0 0 0
28 1 -6.5294980841562170e-02 6.4211323147196655e+00 2.3017586164015249e+00 1.3490316072051021e+01 0 0 -1
81 3 -1.2843492532541184e-01 1.7151825848192740e+01 1.3120341070283221e+00 7.7174295144219229e+00 0 0 0
124 4 -1.4764597579941991e-02 1.4185236897374100e+01 1.0228517938755142e+00 8.8729039133495515e+00 0 0 0
92 3 -1.4190415481562765e-01 1.4204698596670227e+01 1.5016257934556176e+00 7.6321699049346643e+00 0 0 0
248 3 -1.5638430087805932e-01 1.4020886714186110e+01 5.0947360067557721e+00 8.6627100663371710e+00 0 0 0
100 3 -1.3133130869891860e-01 1.7310522047850426e+01 5.1918304994019406e+00 9.8392866690657019e+00 0 0 0
4 1 1.5734719075794559e-02 7.8639113856106908e+00 2.6785305061792619e+00 1.3189765412864087e+01 0 0 0
72 3 -1.5426752144049144e-01 1.1969567014622319e+01 5.3270782247615420e+00 1.2064966387155430e+01 0 0 0
120 4 -2.0660475242344017e-02 1.5113088125709915e+01 6.8136976964891294e-01 1.3734925518848485e+01 0 0 0
144 2 2.8606673499984137e-01 1.4148562456194458e+01 1.2935293435874679e-01 1.1341925553730979e+01 0 0 0
169 1 -1.2507437749398062e-01 1.2589350193664469e+01 9.6660641865322336e+00 6.6820816309750768e+00 0 0 0
157 1 1.3101766309728599e-01 1.1145831453245778e+01 6.5322364284476038e+00 5.4897532104231015e+00 0 0 0
237 3 -1.8127406245080599e-01 1.6806111047670463e+01 8.6400093722835205e+00 6.6759262988075010e+00 0 0 0
165 1 1.6995487109137958e-01 1.3103500332034736e+01 1.0384335954455226e+01 5.5271785715298618e+00 0 0 0
176 1 1.2882442652127868e-01 1.3671797000328342e+01 9.6038663738548795e+00 2.6168928776903760e-01 0 0 1
205 1 -4.8207815225547582e-02 1.9224825955952788e+01 1.0874213403116096e+01 6.6574893131046124e+00 0 0 0
277 4 1.4930286360253821e-03 1.9651416561184572e+01 9.2489608770003588e+00 4.1784091141788453e+00 0 0 0
209 3 -1.6275120538245183e-01 9.5554489015501503e+00 8.3795120288952756e+00 5.8743003066822324e+00 0 0 0
213 3 -1.3485169792328811e-01 1.0943788927101483e+01 8.6431449393778390e+00 4.0928003727842803e+00 0 0 0
161 1 -1.3273743374911376e-01 1.2280736566108812e+01 6.0290419636079431e+00 4.8556228573471660e+00 0 0 0
221 3 -1.7679581574343128e-01 1.4393585749017504e+01 8.4899193891902520e+00 4.5825079042836760e+00 0 0 0
253 3 -1.6035745761620385e-01 1.9781445944064224e+01 8.6485767448586675e+00 5.3040041753399327e+00 0 0 0
232 3 -1.2799358810754613e-01 1.2364918612601592e+01 9.7758010551044840e+00 2.2401917199098085e+00 0 0 0
257 4 -1.9913799867289986e-04 1.0451479233722360e+01 7.9379519522033899e+00 5.0504514859089920e+00 0 0 0
261 4 -3.4555361126691019e-03 1.4320242842210837e+01 9.7749018361670981e+00 4.7062260598906827e+00 0 0 0
268 4 -1.5055288888581174e-02 1.3124484360209099e+01 1.0442001174009329e+01 1.4325865653416883e+00 0 0 0
281 2 2.5703834979854812e-01 1.2682557129077104e+01 6.5903281288690403e+00 4.0666020770935871e+00 0 0 0
76 3 -1.6586999266455632e-01 1.3327490136711706e+01 5.7131554828911719e+00 1.6697801246823667e+00 0 0 0
269 4 -2.1171000778044357e-02 1.7283160130632815e+01 7.4411692063792323e+00 6.6447469455156956e+00 0 0 0
293 2 2.7290480959393421e-01 1.6390117340052175e+01 8.1427871754464327e+00 4.1453778817030393e+00 0 0 0
185 1 1.4251888962968337e-01 1.7646301360095702e+01 6.8060051363141278e+00 5.2762360485359965e+00 0 0 0
189 1 -1.3737458776787198e-01 1.7106287939262291e+01 7.3151885688533937e+00 4.0829606247112133e+00 0 0 0
193 1 1.6541485059377861e-01 1.7474745511598268e+01 6.7395321126450396e+00 2.8386528663930264e+00 0 0 0
249 3 -1.1843584216878646e-01 2.0295681305936338e+01 8.9442689135060611e+00 3.0850044490980602e+00 0 0 0
201 1 1.3485899621277553e-01 1.8900452250802715e+01 1.0643913043619367e+01 4.2326691162612606e+00 0 0 0
273 4 -1.6714023259828865e-02 1.6938996933016462e+01 7.3387870122823786e+00 1.5363988784299578e+00 0 0 0
236 3 -1.2355410366085848e-01 2.0177433851291724e+01 7.3270773757376118e+00 8.0727851108673909e-01 0 0 0
297 2 2.7365008989235995e-01 1.8678094529668360e+01 1.0829042176024551e+01 2.0264646843938703e+00 0 0 0
241 3 -1.3242507487597038e-01 1.7150677421619047e+01 6.6859112973428427e+00 4.3318022894633185e-01 0 0 0
245 3 -1.5323252835912843e-01 1.6103166872797594e+01 8.3462901340103492e+00 1.5133752076252216e+00 0 0 0
217 3 -1.4629220392561476e-01 1.5067188206352801e+01 1.0618680859452411e+01 4.0492352246916967e+00 0 0 0
181 1 5.0965121162264149e-03 1.8587182516354687e+01 5.7170737089830137e+00 5.1565413815669334e+00 0 0 0
292 2 2.2874358541976608e-01 1.1552525108380831e+01 7.6259286510297697e+00 1.3384679985379644e+00 0 0 0
180 1 -5.1746461189359383e-02 1.1625165190185328e+01 8.1444186576450406e+00 4.0762536869394300e-01 0 0 0
153 1 8.8208209649980433e-03 1.0600258034032093e+01 5.7454307198841628e+00 6.5451775261429477e+00 0 0 0
288 2 2.4927582339981319e-01 1.5463637315305929e+01 1.0699099426447392e+01 1.0486275946296693e-01 0 0 1
45 1 -1.3517946310057191e-01 1.8301477956473473e+01 5.5717679472161583e+00 2.7664633054482839e+00 0 0 0
304 2 2.2486586845500126e-01 2.1617085806614373e+01 9.5310367098813202e+00 5.5239430577664519e-02 0 0 0
301 2 2.3470421113143294e-01 1.8703111761640312e+01 1.0141321746893691e+01 7.2037351056071399e+00 0 0 0
160 1 1.3364542254657649e-01 8.4346293600260474e+00 7.6851716017603682e+00 1.2467023336907147e+01 0 0 0
164 1 -1.2487089796822108e-01 9.6666468779246557e+00 8.0468240032658169e+00 1.1943669747243241e+01 0 0 0
168 1 1.6701349494391496e-01 1.0439803295885056e+01 9.1127840899256274e+00 1.2381177087258184e+01 0 0 0
172 1 -1.3020759405372742e-01 9.8932371684989029e+00 9.8913871779883049e+00 1.3447195727693076e+01 0 0 0
212 3 -1.5125403187103914e-01 6.9624281408518947e+00 5.6571610609985141e+00 1.2453261174476992e+01 0 0 0
300 2 2.7611769610997067e-01 1.6017471570020845e+01 8.6259558338967963e+00 8.7191276546742404e+00 0 0 0
173 1 1.3743470947361397e-01 1.1427208127509154e+01 1.0070249006720299e+01 7.3012666328220623e+00 0 0 0
252 3 -1.3985099857863706e-01 1.7703283623898365e+01 1.0471689159899555e+01 9.4960946630226921e+00 0 0 0
220 3 -1.3314684995454354e-01 1.2640391702818302e+01 8.7278098710881640e+00 1.1171691575716721e+01 0 0 0
224 3 -1.6236151179485753e-01 1.2195126308387401e+01 1.0782788030472828e+01 1.1930418819765878e+01 0 0 0
225 3 -1.6039635575996958e-01 1.1353998720161787e+01 8.0440397714963083e+00 8.6550334837763891e+00 0 0 0
229 3 -1.3323753060864349e-01 9.9301103297282758e+00 9.5821150336327268e+00 9.3285752178239303e+00 0 0 0
260 4 -7.2882218470804692e-03 7.7661613649657051e+00 6.4638379478392016e+00 1.1828846332357456e+01 0 0 0
264 4 -4.4812040282032721e-03 1.1811851783049329e+01 9.5492369552617848e+00 1.1798537690204709e+01 0 0 0
265 4 -1.1490593454960719e-02 1.0900624858965966e+01 9.2549569808961660e+00 8.5265278740098260e+00 0 0 0
284 2 2.6169361381127387e-01 1.0136530252720341e+01 7.4934987247178269e+00 1.1092226812526848e+01 0 0 0
156 1 3.7379196017244612e-03 7.9392347778451446e+00 8.4560411860777513e+00 1.3578276661002105e+01 0 0 0
296 2 2.6498019774798365e-01 1.4043644232829966e+01 5.7233288173678014e+00 1.1072881863137523e+01 0 0 0
184 1 6.4957634629475743e-03 1.6305180909519947e+01 8.0991512260634924e+00 1.2086442524820042e+01 0 0 0
188 1 1.4843357901885965e-01 1.5406855890108130e+01 7.0068766343707436e+00 1.2240334144353453e+01 0 0 0
192 1 -1.2516789083526150e-01 1.4818668347533144e+01 6.5268485695570471e+00 1.1067589711981087e+01 0 0 0
196 1 1.6508881872184145e-01 1.5069466191418311e+01 7.0262259913129794e+00 9.7805102402414406e+00 0 0 0
200 1 -1.3083913251494941e-01 1.5877770724233319e+01 8.1909563622810566e+00 9.6849283497158432e+00 0 0 0
204 1 1.4328415910864176e-01 1.6517454767413131e+01 8.7153370164695936e+00 1.0835341568135473e+01 0 0 0
208 1 -3.8003030991159703e-02 1.6991575004843000e+01 8.6944401555232247e+00 1.3313277441939094e+01 0 0 0
233 3 -1.2326769386570821e-01 1.7156065036742135e+01 6.6639053499866350e+00 7.7079787843959817e+00 0 0 0
276 4 -5.2986617880064930e-03 1.4413639513006760e+01 6.3307747767611460e+00 8.5405715830585791e+00 0 0 0
244 3 -1.5332334147379001e-01 1.4369625482518934e+01 6.9679841418869541e+00 7.4021901341817147e+00 0 0 0
280 4 -1.0402553151618275e-03 1.7407378472673361e+01 9.9643766158767004e+00 1.0667658376032438e+01 0 0 0
256 3 -1.5333876696855078e-01 1.7730538655474327e+01 1.0586091087689283e+01 1.1752671734713664e+01 0 0 0
216 3 -1.2878785467194953e-01 8.1639102845009042e+00 6.0881555837219636e+00 1.0601035151948000e+01 0 0 0
272 4 -1.1454730376138519e-02 1.5121809213972451e+01 6.4239863410326965e+00 1.3638484698105245e+01 0 0 0
240 3 -1.7440955102646941e-01 1.4541899399377094e+01 1.0692525508455294e+01 1.3580894402760997e+01 0 0 0
289 2 2.5518604784481402e-01 9.0866514971259225e+00 6.9566208908866489e+00 7.6825247899372453e+00 0 0 0
177 1 -5.5916134966486265e-02 9.2532862740598993e+00 6.0521578915699488e+00 7.1173031955497548e+00 0 0 0
96 3 -1.5202035991426149e-01 1.3493699232041106e+01 1.1085823288281921e+01 9.0487676573379119e+00 0 -1 0
285 2 2.4589286761119938e-01 1.3000363019268956e+01 8.7257850399635615e+00 7.0132894052156329e+00 0 0 0
Velocities
30 -2.4174866102998649e-05 -5.8400589693352791e-03 3.6955846688862632e-03
34 -1.3368307218153295e-03 7.0584278791678914e-04 -3.0271317908999555e-03
38 8.6171069789500506e-03 -1.0386254798008827e-02 -2.3314367537503582e-03
42 4.8899848626993876e-03 3.9658933682618922e-03 -1.3834629869053450e-03
46 -5.1759547107459820e-03 -1.6591730900438351e-03 1.3562788235339125e-03
50 3.2654372821856043e-04 -2.6116773352929845e-03 3.0838446698027021e-03
2 5.1894432194761312e-04 -3.6417701641676351e-03 -6.0338161946400983e-03
83 6.4151200155796147e-03 1.1229419196344197e-03 5.8686926636185061e-04
151 -2.8796970286988421e-02 -1.9548040511881571e-02 -6.7147938124706083e-03
90 6.2870412345627461e-04 -3.1855217036112515e-03 -2.4627865498249857e-03
62 -4.4936223386147171e-03 2.5073159143134635e-03 5.0810575404568363e-03
98 -2.6875273259438230e-03 -2.4115478804683705e-03 -4.4288138402231482e-03
54 -5.1467385322100587e-03 2.3510009029855091e-03 -5.7599904123623999e-03
87 -2.6684214311491952e-03 -2.8674576614179329e-03 -2.4648328610147843e-03
122 -1.1105639887986528e-04 3.7635425105536613e-03 6.5468310425097244e-03
126 1.7828516731701188e-03 2.8588181283881898e-03 -2.1514694876793162e-03
106 -7.7358290604802099e-03 -4.3326415268508372e-03 2.1962581331009981e-03
146 -1.9223843131665190e-02 -1.5532877349572517e-02 -1.1613923723158268e-02
110 -8.2566212285788074e-03 4.2234253378360346e-03 3.6785470951886073e-03
150 -1.2647024341794211e-02 1.8221509465505117e-02 -5.0128424122487351e-03
6 -6.8768919890731146e-03 9.6678308905083585e-03 -1.3917811305885867e-03
10 3.3168337478153122e-03 3.3619712471675725e-03 1.0650876474592522e-03
14 -1.6475678689132532e-03 -6.7698081292684271e-03 -7.9364870861734881e-04
18 1.0422096740317807e-04 -4.8696249119766313e-04 -4.3921928339088817e-03
27 -6.9682265925353234e-04 5.5558986359258728e-03 -2.7945120615473170e-03
130 7.3436853366040510e-03 -1.5615310112063635e-02 -9.7973567669173128e-03
115 -4.9493176729646319e-03 2.2805811912743512e-03 -4.9676425031934309e-03
70 4.0695789639428725e-03 2.2086802832277375e-03 3.2576668769327293e-03
66 -8.5702414719068636e-04 1.8464043867736203e-03 -9.9555929207937981e-04
79 1.1070783496162258e-03 6.1862400561743238e-03 -4.4051680685139050e-04
75 1.9178089415144753e-03 3.1463732884630131e-04 -1.7217916675468907e-03
139 2.8517079207620144e-02 -1.9905991206418231e-02 3.0264652754780935e-02
23 4.3797306852474890e-03 7.4086737657933421e-03 -2.8926828277232282e-03
118 -4.2147982046991687e-03 -8.2984567965974573e-03 -1.7977706716132648e-03
26 3.4699369555654721e-03 -5.3268668174097636e-03 1.8533436395768656e-03
135 5.0870099813551360e-03 2.0031409187880080e-02 2.2279936704878493e-02
134 -3.4718997783717287e-02 -2.9046322574695655e-02 -6.7290107414706181e-03
35 -1.2742938214048215e-03 -5.4677769759628484e-03 4.7166914319580477e-03
39 -3.5171031039312260e-05 -1.1036949335105606e-03 -1.7799449964092009e-03
43 4.8250906268874363e-04 -3.8354099752335269e-03 -5.0163266920790258e-03
55 3.9772466070045580e-03 -3.5583777510197752e-03 -2.7896235341660572e-04
51 1.5321458062959898e-03 -2.5209486954065438e-03 -2.9415253251844297e-03
67 5.2768727282876873e-03 3.3637779239677082e-04 -5.3077524292974064e-03
82 -4.6010418478961692e-03 2.1304975260813871e-03 1.1013307930023183e-03
111 -4.0141402813814028e-03 1.2793755351396241e-02 -1.1323015089853242e-03
91 -9.6347063458754171e-04 -3.5925228782824701e-03 3.7468788450416997e-03
95 5.2641923860850424e-03 -1.1996066942874387e-03 -3.8583046662080682e-03
99 2.3310479302716311e-03 2.2048601264337848e-03 1.9775025948164386e-03
103 6.3269083153676174e-03 6.1569760098524693e-03 -1.3850043247383714e-03
11 -8.2028729433133388e-04 8.2443337191164673e-03 6.9902706057217599e-03
123 2.8650904196624318e-03 -6.0257734224878484e-03 -1.2614564384462788e-02
127 -1.3550684527947047e-04 -2.6284774608511655e-03 2.8069949466735810e-04
143 -1.8419932991845429e-03 -2.6883069832929719e-03 -8.1392982989522298e-04
226 3.4261189824281555e-03 -3.2522996094829560e-03 2.8225670673923528e-03
74 -1.5628901433170131e-03 2.5608703622864438e-04 -1.3280001953940086e-04
107 1.5589530299060254e-03 -2.4852894833352420e-03 8.3108677637003976e-03
7 4.2438551230323320e-04 -5.7307909930981258e-03 -2.7893810245450206e-03
59 2.2690384886148115e-03 -9.0468087925548706e-03 -5.1781998228276976e-04
15 -3.9577231821540616e-03 -2.1847885018534147e-03 -8.4371976597557574e-03
19 7.1229587205270907e-03 -2.1206916186471624e-04 -5.8627889621317396e-03
147 1.6390240343441092e-02 -8.7176501390591708e-03 -2.8178922194092536e-03
114 4.7515421240825620e-03 6.7642492576560622e-03 1.7473395470475074e-03
3 4.2551631139686498e-03 1.9437904991404275e-03 1.7935525179072753e-03
63 3.8697842475399176e-03 -8.4765436511819187e-03 -2.0491881784184133e-03
78 -5.3846747219525202e-03 -6.8961963835257167e-03 -3.7349089410657235e-03
71 2.9873740104239097e-03 8.1549198198451985e-04 -1.2934279359320738e-03
131 -5.0390794739495932e-03 -4.6131525347064785e-03 -4.9175135351588175e-03
31 -5.2605889050595231e-03 5.7430101599048719e-04 -7.0682843661158861e-03
86 3.1844979209605865e-03 4.0950803059798075e-03 -3.0587604667680749e-03
60 8.1133523195327998e-04 -7.6704816714192525e-03 -2.2818047599636416e-03
155 -8.0144518574578917e-03 -5.1005256982490348e-03 6.2037281719425292e-03
22 4.1797836257974454e-03 1.6568806164942351e-03 8.7670139729851895e-05
140 -2.3324839515429668e-02 -1.2437810613019238e-02 3.6287188915814311e-02
199 -1.0790097311952464e-03 -2.9869062426129372e-03 -4.0112108465879112e-03
119 -1.1755627465417481e-03 -8.2100780073601515e-03 2.6479374681998786e-03
182 1.8734201874040408e-03 -2.6689908635035755e-03 1.0860930707006422e-02
186 -2.5675279605953606e-03 -2.4756375850000737e-03 1.0395482737196491e-03
190 2.2910971675434619e-03 -1.3145289380748972e-03 -5.2985364488092098e-03
194 6.8186760409634419e-03 8.3840465649670081e-04 5.3074104269872037e-03
198 -5.0859955599489521e-03 4.2087962673814959e-04 4.6023185972026296e-03
202 2.1012410907117738e-03 -6.7507745063792000e-03 -1.1128219310673163e-03
206 -6.5209450456218789e-03 -1.0339535444774403e-03 -1.4501279837400901e-03
235 3.3388911239315496e-03 2.1065220517720367e-03 7.9991895755700954e-03
142 9.8475835271551841e-03 -9.5028518218655076e-03 -1.8276565508549877e-03
242 1.0217457780939720e-03 -1.5197673217320828e-03 4.7406923875269085e-03
291 -3.0930387698493111e-02 7.8445304030849618e-03 1.6310030568432197e-02
250 -6.8489632875769993e-04 4.6565160745170404e-03 3.3886136702525487e-03
258 -1.4004182588445049e-03 2.2806177132263595e-03 -1.0347843260651223e-03
262 -1.2881324206774447e-03 6.9434393825884946e-04 -5.8956964621466827e-03
274 -1.8944352259530324e-03 3.2192357927930009e-04 -1.7082790058223906e-03
278 1.5288401707297728e-03 3.6217814543088645e-03 -2.0316883110052923e-04
222 7.7331045584829068e-03 1.2362023936040929e-03 8.2907874575483369e-03
298 2.5328078728893279e-03 -6.2165377525673126e-03 1.5784008908580539e-02
267 7.0018357704332811e-03 -4.5522884959513024e-03 7.6649882914402567e-03
154 -3.6287490712629171e-03 -1.2740874221828388e-02 3.8314063886802823e-03
158 -7.6208895283387092e-03 1.1878194435768373e-02 -3.5971056387286322e-03
162 -6.4746300934775817e-04 5.5506749212761494e-04 6.0756597279294430e-03
166 1.1989320501678076e-03 -5.0577544194060501e-03 6.3998146927604317e-03
170 -3.8035317060563859e-03 7.5841699707098983e-04 6.5780084783308920e-03
175 -3.8974609142492406e-04 6.1926230615375706e-04 -2.3335031290293434e-04
282 9.3600641903433621e-03 3.6118288335866035e-02 -6.6071709116293925e-03
179 3.4096307972593799e-03 -3.4658785452165147e-03 -3.1253185076433169e-03
231 -2.9608872194030354e-03 1.7079627030041283e-04 3.4641088880785907e-03
218 5.3586543913679188e-04 2.9233881729537371e-03 3.5123582767227724e-03
294 5.5955227959160669e-03 -1.0367898439140481e-02 2.0848408079255427e-02
227 5.9077764223686036e-03 -2.1490305761074865e-03 -1.1498913753977054e-03
254 1.0207662040460023e-03 -2.8373729468057305e-03 -4.2228149347897145e-03
94 7.0053050017033342e-04 -3.4205728973730012e-03 5.5901075709640308e-03
214 -2.1438652636591813e-03 -7.5896096294795689e-03 -8.6309429242904783e-03
210 -1.0137192662770177e-03 1.7866741192566335e-03 -2.8780339165619612e-03
58 3.6776824844257320e-03 5.0588406301632300e-03 -7.3087049943876834e-03
246 -4.7447451326206687e-03 2.9334768545539193e-03 -3.7175562945460888e-03
102 -7.7688822748834601e-03 -3.3809459073935026e-03 -1.9803049579750244e-03
238 -2.2703027353564169e-03 2.3821770671317356e-03 -2.3098026900021324e-03
287 6.1455392512188714e-03 -6.1103362577766343e-03 2.6693189746480363e-03
286 -1.3231867204732992e-02 9.6718744859041784e-03 5.2001428560543668e-03
171 -3.2795522829800667e-03 2.3198896576538167e-03 -8.7584561749707406e-03
187 -7.1723088512307930e-03 -1.4024816229882265e-03 2.4036881855671209e-03
191 -1.1265816553933752e-03 -1.6943105339333627e-03 2.1934152683983758e-03
195 -3.0355768625237203e-03 -1.4270597862987302e-03 -4.4764275782047036e-03
270 4.9452386193567094e-03 3.4248768308214380e-03 -2.7114518030588778e-03
203 -3.6586732242194263e-03 -6.3045607688845878e-03 1.2589365192845096e-02
302 -3.0967008143875647e-03 -1.4504530673619854e-02 -2.5558490469790678e-02
234 5.8312510510702895e-03 -2.7109492663016086e-03 2.7864231473259892e-03
183 1.9611113402573451e-03 -4.6399229602014196e-03 -4.5484397980495861e-03
243 -1.7989222282919558e-03 -8.3773945133634839e-04 -8.9721100811624658e-03
247 5.3124635291446163e-04 -6.0116601385645152e-03 5.1900240478296765e-03
251 -6.8565419117596312e-03 -1.1124755685907217e-03 5.6599142152711874e-03
255 -1.4205420643149062e-03 4.8031833242560776e-03 -3.4229862352147741e-03
259 -1.1678626131811894e-03 -7.6285944329823087e-03 4.4278412712106946e-03
275 4.1647945349179862e-04 -6.5900329798053903e-04 -5.8751124096330177e-03
279 1.3825195837119980e-03 -1.3491169538852154e-03 2.8955034735846019e-03
295 -2.7825193434958737e-02 3.7188963726747116e-03 1.4241395330423495e-02
230 3.9381149513646446e-03 -8.3657637033183324e-04 2.4205795188033744e-03
271 -5.5957344548436894e-03 4.3979467178565422e-03 2.6593393575132305e-03
219 1.8686514417658123e-03 -3.5626313146927386e-03 5.5554970146296989e-03
159 1.0526790106853650e-02 3.0132509030908776e-03 -5.9349539991849767e-03
207 7.6888508831103432e-03 1.9814068662144511e-03 5.8024603926956310e-03
167 7.3873940493462574e-03 5.0561160614476441e-03 -9.5138068359663409e-03
299 1.1389090343270231e-02 1.2335222052153004e-02 5.1854247830508448e-03
163 3.7514806422877323e-03 6.0021848224389458e-04 7.3984182635305855e-04
263 -1.3311416384275030e-03 -8.3947102292534256e-04 -1.6587363346947726e-03
283 -1.0620025504881845e-02 2.7452983956948855e-03 -8.6416056884697917e-03
215 -1.3673571899212099e-03 -4.9165406371302806e-06 -5.4353669866533106e-04
266 -1.5207241133139229e-03 -3.0455538066024301e-03 -4.9898142041270308e-03
223 7.5910823419502059e-03 2.1726507130216993e-03 2.7886767580300427e-03
47 1.7101589232864246e-03 6.5504844423619577e-04 -3.8918976101025146e-03
239 5.3972599702514796e-03 -3.2074197692656811e-03 -2.8617030304009731e-03
211 3.8857543898680621e-04 2.1756300867946709e-03 3.0390581737593124e-03
174 3.0622057715666486e-04 -3.5442317884825654e-03 6.8549731131780913e-03
178 1.0100086235516800e-02 -2.1135991151899139e-03 -3.9716759635449574e-03
290 4.6165685682473881e-03 1.1431875282555784e-02 -9.5929415658242510e-03
303 3.4375944882452270e-02 1.2663150202869896e-02 5.0191122447531662e-02
24 2.7722040270529322e-04 9.3045183484613270e-03 -5.4696809618402084e-03
5 1.4530732421377847e-03 8.4407096360853799e-03 6.9996566944709208e-03
197 1.2180196447747885e-04 1.9057884749376704e-03 2.5203716257742922e-03
13 2.9580325020781683e-03 -7.2598114036915157e-03 2.4953271033417565e-03
17 -2.5691329217609050e-03 9.4706315563068708e-06 1.9944514378249611e-03
125 6.0633500715407871e-04 6.0911401225465130e-03 2.0083752286464618e-03
65 -3.6413892234086150e-03 8.4183871082086866e-04 -9.5673812168976177e-03
117 -2.4135897728023823e-03 5.8854918825421406e-03 -9.7691183765619746e-04
61 4.6973997015394816e-03 1.1808478803322716e-02 -1.6550999664335026e-03
85 -8.2406395830183915e-03 -1.5500026972734928e-03 -3.1459961335715596e-04
69 -2.8622735200865383e-03 2.0014502794053028e-03 -5.7101986761900507e-03
9 -1.0407713436376988e-03 -5.4188685232808183e-03 9.7397563007423766e-04
80 4.1821094389522294e-03 -1.4661786050517277e-03 -6.6021963934954691e-03
105 -2.2592350958062024e-03 2.9575142392665385e-03 -3.4456168045163224e-03
109 -4.4630310484392944e-03 8.3843196556275083e-03 -1.7785718826200719e-03
116 -3.7261596410293608e-03 3.3180847030642203e-03 -3.6946196242010175e-04
129 9.0700019604887097e-04 -3.6265074779059637e-03 -4.4372949358870211e-03
152 1.1700981066970786e-02 -1.5474385127547048e-02 4.5469649055726834e-03
29 -7.6273392485150498e-04 -5.2638028956206217e-03 1.5055014077169275e-03
141 -3.7118829597102436e-02 6.5148473098852189e-03 4.3511847061281370e-03
33 -3.9470728901237319e-03 4.5498742407082057e-03 -5.5393392769089384e-03
37 8.8145907550448016e-03 -5.6012684363408336e-03 2.7301067646077464e-03
41 4.1486225497212514e-03 -1.8362733044464384e-03 -1.7013548165352639e-03
121 2.1700813079443522e-03 5.4557303436680955e-03 -4.4782699909277088e-03
49 4.6413606571955217e-03 -1.9124228477447340e-03 -2.3388241246549385e-03
149 -1.9995983634128758e-02 -5.0606377461450049e-03 2.0255946982863860e-02
84 3.3713805726191702e-03 -2.9297704191600440e-04 9.1670737511324657e-04
53 7.6804037541409907e-03 5.3546368402172320e-03 -3.2086851687728036e-03
89 -3.5239071966877531e-03 -1.0591472119567920e-03 -3.0112741584284752e-03
93 3.0220138249750666e-03 -1.7671027489704343e-03 3.3436379217387634e-03
97 2.9633387608442546e-03 2.1027128795329643e-03 -1.4424462438033939e-03
101 -1.7277449363560275e-03 -3.7883930305986006e-03 -1.2778141319349334e-03
145 1.3754301880493217e-02 -2.9464527569243112e-02 -1.8827157517875556e-02
228 2.4060656531958990e-03 -3.0156919087798470e-03 2.7324065007439283e-03
57 7.0375169402002663e-04 -2.8537039994158140e-03 -1.5277803933876235e-03
133 -7.1051720384830604e-03 -1.3677602407398261e-03 3.6026752123927572e-02
136 -2.5544385010401623e-02 -1.4078454458823419e-03 4.0579684781210344e-03
138 -4.0187647722179178e-02 -2.1571801243316192e-02 -7.1604231565876022e-03
1 -3.4095272641180428e-03 6.1537481095595712e-03 7.9045267349075663e-04
88 4.4116705299466841e-03 2.7993870615652876e-03 5.1164335644218956e-03
64 -1.8742297825381788e-03 2.6827591735599583e-03 -5.1722459872697744e-03
8 3.1885844258643008e-03 4.2903678434358713e-03 5.1786330955596359e-03
12 -5.2210336672334420e-03 3.9495414273393922e-03 2.2335713352698550e-03
16 9.9422742059577423e-04 1.7521404301466441e-03 8.7590953970051986e-04
20 6.0854312947614614e-03 5.4983631623741992e-03 5.4593745160439952e-03
25 -5.4309141612719491e-03 -1.7666866720226777e-03 4.7703338575602657e-03
148 1.1086815383338491e-02 2.6022863618603707e-02 2.0087587552315819e-02
137 1.5690832964233584e-02 -2.5293009109084732e-03 -1.1883375678028274e-02
104 -5.0640494124431987e-03 2.3370245336442447e-03 -2.2986534425586274e-04
68 -1.0867367865646591e-03 2.3623004024366013e-03 2.4942168922851425e-03
128 -8.2438351816644800e-03 1.0571196268724028e-03 -8.4815808051728534e-04
73 -5.7362573079004020e-03 -3.0043343214873099e-03 1.5237919791527093e-03
77 -3.4255948914421685e-03 5.4760208931593666e-03 6.6618412238336061e-04
108 5.2795029127425666e-03 6.5415836813069569e-04 6.1298969724376466e-04
112 -1.6078046478582991e-03 4.0606635002996610e-03 9.1026530262352373e-04
113 6.4915058150423399e-03 5.1629533163456854e-03 -6.3755775127421538e-03
132 -4.0774627249993917e-03 -1.5399070432691127e-02 -7.4691887109230096e-03
56 -5.2003817997179165e-03 -9.7620641513053094e-03 -4.3950880281533765e-03
21 -7.0691445197789441e-03 7.6955670100957842e-04 -5.4105853611055871e-03
32 -2.9169110825653880e-03 -1.1073349638571425e-03 -5.4851932971711724e-03
36 -2.4396685252407470e-03 1.4819068238334156e-03 -3.0805515593447705e-03
40 -7.0666779614816802e-03 -1.3430215710235145e-03 -4.4139313396336999e-03
44 -5.1539163988777083e-03 -1.9320778456829594e-03 2.9052648833327553e-03
48 -8.0370531818583901e-03 -4.9164082712983724e-03 1.0053385697820794e-02
52 4.6673277069024383e-03 2.4732486926647718e-03 -3.0437092822526947e-03
28 9.5059021626105167e-04 6.6703881368338760e-03 1.2183723942516731e-03
81 -1.7766957322548395e-03 -8.0571519569416382e-04 -4.2657655144627132e-03
124 -2.5737399426471086e-03 4.8932142374913043e-03 -3.0826221822277021e-04
92 -2.7210332800526667e-03 -4.3522625573974967e-06 5.0313762934084396e-03
248 -2.1428984033524610e-04 3.5920620300439283e-03 -1.2394812885684373e-03
100 6.9480047945285808e-03 -2.0720536878365910e-03 6.0976223682410527e-04
4 3.0533858921656435e-03 1.3749371297301436e-03 2.6879157400351203e-03
72 6.9563359253365785e-04 -3.3839307816438810e-03 -5.2966447925867051e-04
120 4.3628381698379657e-04 3.3989272988654736e-04 -4.7418586471331681e-03
144 -1.9399828512073235e-02 2.8784276306305957e-03 -4.9015707840947172e-03
169 3.6286101890929310e-04 1.3804030749833694e-03 3.8772039152943243e-03
157 -9.7104751271310137e-03 -2.5432779712195779e-03 4.9920473407863593e-04
237 -5.6836990991889925e-03 4.3828035612363779e-03 -4.9564216578871206e-03
165 6.9095280546444867e-03 1.0729454663071183e-04 -2.8377808824037773e-04
176 -3.5726796462146955e-03 -6.9803617017510314e-04 6.5737720026882414e-03
205 -4.7897558884080942e-03 -9.7012031638177235e-03 1.6149422322463858e-03
277 2.3932341723865618e-03 -1.2799481485681208e-03 -9.5088871626072000e-04
209 1.5940196133829015e-03 3.4125147840405141e-03 -1.9185849366575963e-04
213 5.0359888288056447e-03 -3.2459317567451623e-03 -6.0422204701546540e-03
161 3.1496494652942433e-03 -5.4032811877358826e-03 -1.8404083591310836e-03
221 -7.0837711227610673e-05 3.5642763354140797e-03 7.1267387665626429e-03
253 -1.1552964427254658e-03 8.1061938945047457e-03 6.8560275135920814e-04
232 7.1516069443152200e-04 6.9884991537049641e-03 1.9456377945585132e-03
257 9.7287812908641580e-03 5.6802362058564610e-04 -1.9896602364413026e-03
261 3.5641606450239399e-03 1.1263657016134332e-03 -4.9800485874682988e-03
268 -2.4182201566053767e-03 5.6517425572549286e-04 -4.7968007270599378e-03
281 1.8023451989382603e-02 -2.0011466408538753e-02 2.6788628047223523e-03
76 3.6833438514848591e-03 -7.5314593270302587e-03 2.3036184377253134e-03
269 5.4766103896972693e-04 1.0714454448212749e-04 -2.9150182080626727e-03
293 -1.5803838932239959e-02 4.4565921908284638e-03 6.0777345016507587e-03
185 -4.2480671256378598e-03 -7.4956530350122502e-04 8.8480321154379964e-03
189 -2.1548899566118220e-03 1.5465752986606573e-03 -1.2754684317658836e-03
193 -3.2970116016428075e-03 -5.5091314245397441e-03 4.6300273271534225e-03
249 2.0185063121804770e-03 -3.3503108367265821e-03 6.4889425299302387e-03
201 4.9894242342005612e-04 2.0554328851371461e-03 -2.2943565378546371e-03
273 7.2763997976980747e-04 -1.0896643067098042e-03 7.1256273183209901e-03
236 2.0690907685087471e-03 6.8363977716210979e-03 4.1459649884454768e-03
297 1.3621128083419113e-02 1.6046581101408330e-02 4.8457931367957398e-03
241 -2.5291016298909096e-03 1.4215869718728002e-03 -1.9884597198944918e-03
245 -5.2221318448004168e-03 -1.7800664058218062e-04 4.4010035123521704e-04
217 -1.7843053411821738e-03 -1.6528038759970564e-03 -2.3128643778518122e-04
181 1.2770006041816402e-03 9.0821236224940469e-03 -6.7109253232624253e-04
292 4.6641003179734592e-03 -1.5497869295909884e-02 9.9209229002761717e-03
180 -2.3945351490970031e-03 2.1740953931129073e-04 6.0240486612073230e-03
153 9.1376359130041884e-04 1.2619379366518707e-03 -1.1019889044123631e-03
288 9.1870458102437658e-03 1.2778922312094822e-02 -2.1072238127411075e-02
45 -7.7724575331532535e-04 -1.7141020628976028e-03 5.6759226356627775e-03
304 -2.5582451057078827e-02 -2.2645536121991501e-02 -1.4290517463409140e-02
301 -5.9841500766453981e-03 -1.5684175634367186e-03 -2.4956264538292219e-02
160 3.9339801689694557e-03 -3.6126921625193411e-03 -2.4443523541620845e-03
164 8.1230468881143946e-03 -9.3521431341237662e-03 -3.5308117479258393e-04
168 4.9446040375734903e-03 -8.2154773760103651e-04 -1.0492769229361480e-02
172 2.6148305794376089e-03 2.6504247099737371e-03 -2.7694367959707113e-03
212 4.4593645697807213e-03 -1.4573503711062438e-05 -1.3782207140241650e-03
300 -1.8679506789017677e-03 -2.0469993534843488e-02 -3.8301874388749933e-03
173 -1.6137581443588121e-03 2.0965695130792921e-03 -4.0201255392549005e-03
252 1.9637421273734318e-03 -4.1845350440895444e-04 9.1914352340609893e-04
220 4.8425364408329402e-03 4.1558131563977632e-03 -4.5732135892261249e-03
224 -5.0106731049793761e-03 6.3056084400456101e-03 -2.5402324427869867e-03
225 2.3074874398853491e-03 -8.2581204918229945e-03 5.7223482227764808e-03
229 -3.1949429657485212e-03 1.2470862731982931e-03 1.6206842413737377e-03
260 -1.7356077348708357e-03 -6.6380421726333931e-04 4.9344441008672127e-03
264 -1.4170245024577935e-03 2.5892297874871607e-03 6.1212726394288964e-04
265 -2.0491154530031591e-03 -4.6743453933109679e-03 2.6620072482574646e-03
284 1.0822583460626851e-02 1.1993987876701846e-02 3.7723405443682773e-02
156 3.2121442419044783e-03 7.5002892289370033e-03 1.9824119709575898e-03
296 -2.5491930009982500e-02 -2.3854508590914567e-02 -7.4606589514458746e-03
184 -1.9223239057771181e-03 -4.9053534641709537e-04 1.2211379250644705e-03
188 1.2636857357410621e-03 -4.9864683204641908e-03 -1.3531293825327969e-03
192 -7.7727559158047056e-03 3.7612632558858211e-03 4.7003948322159681e-03
196 -2.8825133856888118e-03 3.9250757025840674e-03 5.0909854172008495e-04
200 -7.4421531526066200e-03 -1.5108146428348063e-03 4.2441546002170358e-03
204 -4.5541880771186351e-03 2.2282891439829376e-03 9.6246255590907315e-03
208 5.5460189242739375e-04 -8.5643343980268936e-04 4.6961691086096109e-03
233 -9.7408104129497115e-04 2.0917875306183170e-03 1.6045486422407123e-03
276 -1.0986838142969923e-03 5.4315792533420901e-03 5.0077081054951244e-03
244 -1.2183665223623778e-03 -4.2193410981771198e-03 -2.7354288515525696e-03
280 1.3552010403368481e-03 6.3132429381080192e-04 1.7031901341229926e-04
256 -2.2077829342060304e-03 1.6772588023449473e-03 2.2350654447874461e-04
216 1.2254364422878230e-03 2.0994512158283556e-03 -2.0172376558553222e-03
272 2.1464441432257797e-03 -1.8486660410473694e-04 1.9014747511050384e-03
240 3.1573950446869229e-04 -3.7605367960744638e-04 2.3191303881599541e-04
289 -1.2039974662100633e-02 2.6395586163545951e-03 -2.8478645629107940e-02
177 6.1157082891864691e-03 6.9161818478923455e-04 -3.0081137643864736e-03
96 -3.1669072586457290e-03 -6.3737086224948253e-03 1.5172924185041878e-03
285 -1.2188701008670824e-02 -1.7123376677445068e-02 2.0830072814090890e-02

View File

@ -0,0 +1,168 @@
Reactive MD-force field: c/h/o/s/f/cl Jan30_2012
39 ! Number of general parameters
50.0000 !p(boc1)
9.5469 !p(boc2)
26.5405 !p(coa2)
1.5105 !p(trip4)
6.6630 !p(trip3)
70.0000 !kc2
1.0588 !p(ovun6)
4.6000 !p(trip2)
12.1176 !p(ovun7)
13.3056 !p(ovun8)
-60.1292 !p(trip1)
0.0000 !Lower Taper-radius (swa)
10.0000 !Upper Taper-radius (swb)
0.0000 !not used
33.8667 !p(val7)
6.0891 !p(lp1)
1.0563 !p(val9)
2.0384 !p(val10)
6.1431 !not used
6.9290 !p(pen2)
0.3989 !p(pen3)
3.9954 !p(pen4)
0.0000 !not used
5.7796 !p(tor2)
10.0000 !p(tor3)
1.9487 !p(tor4)
0.0000 !not used
2.1645 !p(cot2)
1.5591 !p(vdW1)
0.1000 !Cutoff for bond order*100 (cutoff)
2.1365 !p(coa4)
0.6991 !p(ovun4)
50.0000 !p(ovun3)
1.8512 !p(val8)
0.0000 !not used
0.0000 !not used
0.0000 !not used
0.0000 !not used
2.6962 !p(coa3)
4 ! Nr of atoms; atomID;ro(sigma); Val;atom mass;Rvdw;Dij;gamma
alfa;gamma(w);Val(angle);p(ovun5);n.u.;chiEEM;etaEEM;n.u.
ro(pipi);p(lp2);Heat increment;p(boc4);p(boc3);p(boc5),n.u.;n.u.
p(ovun2);p(val3);n.u.;Val(boc);p(val5);n.u.;n.u.;n.u.
C 1.3825 4.0000 12.0000 1.9133 0.1853 0.9000 1.1359 4.0000
9.7602 2.1346 4.0000 33.2433 79.5548 5.8678 7.0000 0.0000
1.2104 0.0000 199.0303 8.6991 34.7289 13.3894 0.8563 0.0000
-2.8983 2.5000 1.0564 4.0000 2.9663 0.0000 0.0000 0.0000
H 0.7853 1.0000 1.0080 1.5904 0.0419 1.0206 -0.1000 1.0000
9.3557 5.0518 1.0000 0.0000 121.1250 5.3200 7.4366 1.0000
-0.1000 0.0000 55.0000 1.9771 3.3517 0.7571 1.0698 0.0000
-15.7683 2.1488 1.0338 1.0000 2.8793 0.0000 0.0000 0.0000
O 1.2477 2.0000 15.9990 1.9236 0.0904 1.0503 1.0863 6.0000
10.2127 7.7719 4.0000 36.9573 116.0768 8.5000 8.9989 2.0000
0.9088 1.0003 60.8726 20.4140 3.3754 0.2702 0.9745 0.0000
-3.6141 2.7025 1.0493 4.0000 2.9225 0.0000 0.0000 0.0000
N 1.6157 3.0000 14.0000 1.9376 0.1203 1.0000 1.2558 5.0000
9.4267 26.8500 4.0000 8.6294 100.0000 7.6099 7.7500 2.0000
1.0439 0.1000 119.9837 1.7640 2.7409 2.3814 0.9745 0.0000
-6.5798 4.4843 1.0183 4.0000 2.8793 0.0000 0.0000 0.0000
10 ! Nr of bonds; at1;at2;De(sigma);De(pi);De(pipi);p(be1);p(b
p(be2);p(bo3);p(bo4);n.u.;p(bo1);p(bo2)
1 1 156.5953 100.0397 80.0000 -0.8157 -0.4591 1.0000 37.7369 0.4235
0.4527 -0.1000 9.2605 1.0000 -0.0750 6.8316 1.0000 0.0000
1 2 170.2316 0.0000 0.0000 -0.5931 0.0000 1.0000 6.0000 0.7140
5.2267 1.0000 0.0000 1.0000 -0.0500 6.8315 0.0000 0.0000
2 2 156.0973 0.0000 0.0000 -0.1377 0.0000 1.0000 6.0000 0.8240
2.9907 1.0000 0.0000 1.0000 -0.0593 4.8358 0.0000 0.0000
1 3 160.4802 105.1693 23.3059 -0.3873 -0.1613 1.0000 10.8851 1.0000
0.5341 -0.3174 7.0303 1.0000 -0.1463 5.2913 0.0000 0.0000
3 3 60.1463 176.6202 51.1430 -0.2802 -0.1244 1.0000 29.6439 0.9114
0.2441 -0.1239 7.6487 1.0000 -0.1302 6.2919 1.0000 0.0000
2 3 180.4373 0.0000 0.0000 -0.8074 0.0000 1.0000 6.0000 0.5514
1.2490 1.0000 0.0000 1.0000 -0.0657 5.0451 0.0000 0.0000
1 4 175.7446 131.3190 132.3859 -0.5827 -0.2709 1.0000 29.9009 0.8400
1.9511 -0.2103 7.4487 1.0000 -0.1150 5.8717 1.0000 0.0000
2 4 161.1063 0.0000 0.0000 -0.1387 0.0000 1.0000 6.0000 0.7276
0.6127 1.0000 0.0000 1.0000 -0.0395 7.2218 0.0000 0.0000
3 4 86.0536 180.5864 40.0000 1.0000 -0.4462 1.0000 34.9336 0.2000
0.8154 -0.2175 7.0255 1.0000 -0.1937 5.2140 1.0000 0.0000
4 4 134.6492 66.2329 149.2707 -0.7228 -0.1000 1.0000 19.0850 1.0000
0.6060 -0.2050 9.7308 1.0000 -0.1791 5.8008 1.0000 0.0000
6 ! Nr of off-diagonal terms. at1;at2;Dij;RvdW;alfa;ro(sigma);r
1 2 0.1219 1.4000 9.8442 1.1203 -1.0000 -1.0000
2 3 0.0344 1.6800 10.3247 0.9013 -1.0000 -1.0000
1 3 0.1131 1.8523 9.8442 1.2775 1.1342 1.0621
1 4 0.1398 1.9263 10.1847 1.4778 1.1446 1.1216
2 4 0.0480 2.3000 9.0050 1.0156 -1.0000 -1.0000
3 4 0.0942 1.9531 10.3265 1.3018 1.0984 1.0125
40 ! Nr of angles. at1;at2;at3;Thetao,o;p(val1);p(val2);p(coa1);
1 1 1 67.2326 22.0695 1.6286 0.0000 1.7959 15.4141 1.8089
1 1 2 65.2527 14.3185 6.2977 0.0000 0.5645 0.0000 1.1530
2 1 2 70.0840 25.3540 3.4508 0.0000 0.0050 0.0000 3.0000
1 2 2 0.0000 0.0000 6.0000 0.0000 0.0000 0.0000 1.0400
1 2 1 0.0000 3.4110 7.7350 0.0000 0.0000 0.0000 1.0400
2 2 2 0.0000 27.9213 5.8635 0.0000 0.0000 0.0000 1.0400
1 1 3 49.5561 7.3771 4.9568 0.0000 0.7533 15.9906 1.0010
3 1 3 77.1171 39.8746 2.5403 -24.3902 1.7740 -42.9758 2.1240
2 1 3 65.0000 14.2057 4.8649 0.0000 0.3504 0.0000 1.7185
1 3 1 74.3994 44.7500 0.7982 0.0000 3.0000 0.0000 1.0528
1 3 3 77.9854 36.6201 2.0201 0.0000 0.7434 67.0264 3.0000
3 3 3 80.7324 30.4554 0.9953 0.0000 1.6310 50.0000 1.0783
1 3 2 71.5018 21.7062 0.4735 0.0000 0.5186 0.0000 1.1793
2 3 3 84.9468 23.3540 1.5057 0.0000 2.6374 0.0000 1.3023
2 3 2 77.0645 10.4737 1.2895 0.0000 0.9924 0.0000 1.1043
1 2 3 0.0000 25.0000 3.0000 0.0000 1.0000 0.0000 1.0400
3 2 3 0.0000 0.0148 6.0000 0.0000 0.0000 0.0000 1.0400
2 2 3 0.0000 9.7025 6.0000 0.0000 0.0000 0.0000 1.0400
1 1 4 61.6894 9.9742 3.5920 0.0000 5.0000 50.0000 2.2098
3 1 4 67.5853 29.6915 1.8611 0.0000 3.0000 0.0000 1.5926
4 1 4 53.0437 35.9280 1.7824 0.0000 5.0000 0.0000 4.0000
2 1 4 66.9313 25.8025 3.5718 0.0000 0.0600 0.0000 1.0946
1 3 4 71.7246 38.5022 1.1738 0.0000 1.6310 0.0000 1.2782
3 3 4 83.0764 35.5413 1.4072 0.0000 1.6310 0.0000 1.1439
4 3 4 79.3317 40.0000 2.3424 0.0000 1.6310 0.0000 1.0061
2 3 4 81.0695 40.0000 2.0285 0.0000 0.1218 0.0000 1.4477
1 4 1 68.9764 14.3404 1.9702 0.0000 1.3606 0.0000 1.0000
1 4 3 76.1086 35.0355 1.0724 0.0000 1.6777 0.0000 1.6071
1 4 4 81.8917 25.7475 0.7287 0.0000 2.0100 0.0000 1.9350
3 4 3 80.1274 24.7547 1.7946 -10.0963 1.6777 0.0000 3.2815
3 4 4 83.6527 36.3627 1.0967 -0.9193 1.6777 0.0000 1.0000
4 4 4 90.0000 44.3028 1.6659 0.0000 0.7529 0.0000 1.2398
1 4 2 76.9847 29.2262 0.9407 0.0000 0.0300 0.0000 2.6196
2 4 3 85.4080 40.0000 1.7549 0.0000 0.0222 0.0000 1.0774
2 4 4 83.5658 40.0000 1.3540 0.0000 0.0222 0.0000 2.6397
2 4 2 58.0387 1.1862 3.9770 0.0000 0.0222 0.0000 1.0000
1 2 4 0.0000 0.0019 6.3000 0.0000 0.0000 0.0000 1.0400
2 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400
3 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400
4 2 4 0.0000 0.0019 6.0000 0.0000 0.0000 0.0000 1.0400
31 ! Nr of torsions. at1;at2;at3;at4;;V1;V2;V3;p(tor1);p(cot1);n
1 1 1 1 -0.2500 11.5822 0.1879 -4.7057 -2.2047 0.0000 0.0000
1 1 1 2 -0.2500 31.2596 0.1709 -4.6391 -1.9002 0.0000 0.0000
2 1 1 2 -0.1770 30.0252 0.4340 -5.0019 -2.0697 0.0000 0.0000
1 1 1 3 -0.7098 22.2951 0.0060 -2.5000 -2.1688 0.0000 0.0000
2 1 1 3 -0.3568 22.6472 0.6045 -4.0088 -1.0000 0.0000 0.0000
3 1 1 3 -0.0528 6.8150 0.7498 -5.0913 -1.0000 0.0000 0.0000
1 1 3 1 2.0007 25.5641 -0.0608 -2.6456 -1.1766 0.0000 0.0000
1 1 3 2 -1.1953 42.1545 -1.0000 -8.0821 -1.0000 0.0000 0.0000
2 1 3 1 -0.9284 34.3952 0.7285 -2.5440 -2.4641 0.0000 0.0000
2 1 3 2 -2.5000 79.6980 1.0000 -3.5697 -2.7501 0.0000 0.0000
1 1 3 3 -0.0179 5.0603 -0.1894 -2.5000 -2.0399 0.0000 0.0000
2 1 3 3 -0.5583 80.0000 1.0000 -4.4000 -3.0000 0.0000 0.0000
3 1 3 1 -2.5000 76.0427 -0.0141 -3.7586 -2.9000 0.0000 0.0000
3 1 3 2 0.0345 78.9586 -0.6810 -4.1777 -3.0000 0.0000 0.0000
3 1 3 3 -2.5000 66.3525 0.3986 -3.0293 -3.0000 0.0000 0.0000
1 3 3 1 2.5000 -0.5332 1.0000 -3.5096 -2.9000 0.0000 0.0000
1 3 3 2 -2.5000 3.3219 0.7180 -5.2021 -2.9330 0.0000 0.0000
2 3 3 2 2.2500 -6.2288 1.0000 -2.6189 -1.0000 0.0000 0.0000
1 3 3 3 0.0531 -17.3983 1.0000 -2.5000 -2.1584 0.0000 0.0000
2 3 3 3 0.4723 -12.4144 -1.0000 -2.5000 -1.0000 0.0000 0.0000
3 3 3 3 -2.5000 -25.0000 1.0000 -2.5000 -1.0000 0.0000 0.0000
0 1 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0 2 2 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0 2 3 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000
0 1 1 0 0.0000 50.0000 0.3000 -4.0000 -2.0000 0.0000 0.0000
0 3 3 0 0.5511 25.4150 1.1330 -5.1903 -1.0000 0.0000 0.0000
0 1 4 0 -0.5473 25.3808 0.9931 -4.3407 -3.0000 0.0000 0.0000
0 2 4 0 0.0000 0.1000 0.0200 -2.5415 0.0000 0.0000 0.0000
0 3 4 0 2.0000 71.9948 -0.8805 -6.1274 -2.7831 0.0000 0.0000
0 4 4 0 2.0000 90.0000 -0.7837 -9.0000 -2.0000 0.0000 0.0000
4 1 4 4 -2.0000 90.0000 -0.0279 -7.5866 -0.1000 0.0000 0.0000
4 ! Nr of hydrogen bonds. at1;at2;at3;r(hb);p(hb1);p(hb2);p(hb3
3 2 3 2.0000 -2.0000 1.5000 19.5000
3 2 4 1.9000 -2.0000 1.7976 19.0000
4 2 3 1.9000 -2.0000 1.7976 19.0000
4 2 4 1.9000 -2.0000 1.7976 19.0000

View File

@ -0,0 +1,34 @@
# Pure HNS crystal, ReaxFF tests for benchmarking LAMMPS
# See README for more info
units real
atom_style charge
atom_modify sort 100 0.0 # optional
dimension 3
boundary p p p
box tilt large
read_data data.hns-equil
replicate $x $y $z bbox
pair_style reax/c NULL
pair_coeff * * ffield.reax.hns C H O N
compute reax all pair reax/c
neighbor 1.0 bin
neigh_modify every 20 delay 0 check no
timestep 0.1
thermo_style custom step temp pe press evdwl ecoul vol
thermo_modify norm yes
thermo 100
velocity all create 300.0 41279 loop geom
fix 1 all nve
fix 2 all qeq/reax 1 0.0 10.0 1e-6 reax/c
run 100

1
src/.gitignore vendored
View File

@ -11,6 +11,7 @@
/*_intel.h
/*_intel.cpp
/*_kokkos.h
/*_kokkos_impl.h
/*_kokkos.cpp
/*_omp.h
/*_omp.cpp

View File

@ -109,6 +109,10 @@ if (test $1 = "RIGID") then
depend USER-OMP
fi
if (test $1 = "SNAP") then
depend KOKKOS
fi
if (test $1 = "USER-CGSDK") then
depend GPU
depend KOKKOS

View File

@ -151,6 +151,10 @@ action neighbor_kokkos.cpp
action neighbor_kokkos.h
action npair_copy_kokkos.cpp
action npair_copy_kokkos.h
action npair_halffull_kokkos.cpp
action npair_halffull_kokkos.h
action npair_skip_kokkos.cpp
action npair_skip_kokkos.h
action npair_kokkos.cpp
action npair_kokkos.h
action npair_ssa_kokkos.cpp npair_half_bin_newton_ssa.cpp
@ -228,6 +232,9 @@ action pair_multi_lucy_rx_kokkos.cpp pair_multi_lucy_rx.cpp
action pair_multi_lucy_rx_kokkos.h pair_multi_lucy_rx.h
action pair_reaxc_kokkos.cpp pair_reaxc.cpp
action pair_reaxc_kokkos.h pair_reaxc.h
action pair_snap_kokkos.cpp pair_snap.cpp
action pair_snap_kokkos.h pair_snap.h
action pair_snap_kokkos_impl.h pair_snap.cpp
action pair_sw_kokkos.cpp pair_sw.cpp
action pair_sw_kokkos.h pair_sw.h
action pair_vashishta_kokkos.cpp pair_vashishta.cpp
@ -244,12 +251,16 @@ action pair_tersoff_zbl_kokkos.cpp pair_tersoff_zbl.cpp
action pair_tersoff_zbl_kokkos.h pair_tersoff_zbl.h
action pair_yukawa_kokkos.cpp
action pair_yukawa_kokkos.h
action pair_zbl_kokkos.cpp
action pair_zbl_kokkos.h
action pppm_kokkos.cpp pppm.cpp
action pppm_kokkos.h pppm.h
action rand_pool_wrap_kokkos.cpp
action rand_pool_wrap_kokkos.h
action region_block_kokkos.cpp
action region_block_kokkos.h
action sna_kokkos.h sna.h
action sna_kokkos_impl.h sna.cpp
action verlet_kokkos.cpp
action verlet_kokkos.h

View File

@ -106,6 +106,71 @@ typedef double FFT_SCALAR;
}
};
template<class Scalar>
struct t_scalar3 {
Scalar x,y,z;
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3() {
x = 0; y = 0; z = 0;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3(const t_scalar3& rhs) {
x = rhs.x; y = rhs.y; z = rhs.z;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3(const Scalar& x_, const Scalar& y_, const Scalar& z_ ) {
x = x_; y = y_; z = z_;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3 operator= (const t_scalar3& rhs) {
x = rhs.x; y = rhs.y; z = rhs.z;
return *this;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3 operator= (const volatile t_scalar3& rhs) {
x = rhs.x; y = rhs.y; z = rhs.z;
return *this;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3 operator+= (const t_scalar3& rhs) {
x += rhs.x; y += rhs.y; z += rhs.z;
return *this;
}
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3 operator+= (const volatile t_scalar3& rhs) volatile {
x += rhs.x; y += rhs.y; z += rhs.z;
return *this;
}
};
template<class Scalar>
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3<Scalar> operator +
(const t_scalar3<Scalar>& a, const t_scalar3<Scalar>& b) {
return t_scalar3<Scalar>(a.x+b.x,a.y+b.y,a.z+b.z);
}
template<class Scalar>
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3<Scalar> operator *
(const t_scalar3<Scalar>& a, const Scalar& b) {
return t_scalar3<Scalar>(a.x*b,a.y*b,a.z*b);
}
template<class Scalar>
KOKKOS_FORCEINLINE_FUNCTION
t_scalar3<Scalar> operator *
(const Scalar& b, const t_scalar3<Scalar>& a) {
return t_scalar3<Scalar>(a.x*b,a.y*b,a.z*b);
}
#if !defined(__CUDACC__) && !defined(__VECTOR_TYPES_H__)
struct double2 {
double x, y;
@ -324,6 +389,8 @@ typedef double2 K_FLOAT2;
typedef double4 K_FLOAT4;
#endif
typedef int T_INT;
// ------------------------------------------------------------------------
// LAMMPS types

View File

@ -0,0 +1,128 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "npair_halffull_kokkos.h"
#include "neighbor.h"
#include "neigh_list_kokkos.h"
#include "atom_kokkos.h"
#include "atom_vec.h"
#include "molecule.h"
#include "domain.h"
#include "my_page.h"
#include "error.h"
#include "atom_masks.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
template<class DeviceType, int NEWTON>
NPairHalffullKokkos<DeviceType,NEWTON>::NPairHalffullKokkos(LAMMPS *lmp) : NPair(lmp) {
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
}
/* ----------------------------------------------------------------------
build half list from full list
pair stored once if i,j are both owned and i < j
pair stored by me if j is ghost (also stored by proc owning j)
works if full list is a skip list
works for owned (non-ghost) list, also for ghost list
if ghost, also store neighbors of ghost atoms & set inum,gnum correctly
------------------------------------------------------------------------- */
template<class DeviceType, int NEWTON>
void NPairHalffullKokkos<DeviceType,NEWTON>::build(NeighList *list)
{
if (NEWTON) {
x = atomKK->k_x.view<DeviceType>();
atomKK->sync(execution_space,X_MASK);
}
nlocal = atom->nlocal;
NeighListKokkos<DeviceType>* k_list_full = static_cast<NeighListKokkos<DeviceType>*>(list->listfull);
d_ilist_full = k_list_full->d_ilist;
d_numneigh_full = k_list_full->d_numneigh;
d_neighbors_full = k_list_full->d_neighbors;
int inum_full = list->listfull->inum;
if (list->ghost) inum_full += list->listfull->gnum;
NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list);
k_list->maxneighs = k_list_full->maxneighs; // simple, but could be made more memory efficient
k_list->grow(atom->nmax);
d_ilist = k_list->d_ilist;
d_numneigh = k_list->d_numneigh;
d_neighbors = k_list->d_neighbors;
// loop over parent full list
copymode = 1;
Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, TagNPairHalffullCompute>(0,inum_full),*this);
list->inum = k_list_full->inum;
list->gnum = k_list_full->gnum;
k_list->k_ilist.template modify<DeviceType>();
copymode = 0;
}
template<class DeviceType, int NEWTON>
KOKKOS_INLINE_FUNCTION
void NPairHalffullKokkos<DeviceType,NEWTON>::operator()(TagNPairHalffullCompute, const int &ii) const {
int n = 0;
const int i = d_ilist_full(ii);
F_FLOAT xtmp,ytmp,ztmp;
if (NEWTON) {
xtmp = x(i,0);
ytmp = x(i,1);
ztmp = x(i,2);
}
// loop over full neighbor list
const int jnum = d_numneigh_full(i);
const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i),
&d_neighbors(i,1)-&d_neighbors(i,0));
for (int jj = 0; jj < jnum; jj++) {
const int joriginal = d_neighbors_full(i,jj);
const int j = joriginal & NEIGHMASK;
if (NEWTON) {
if (j < nlocal) {
if (i > j) continue;
} else {
if (x(j,2) < ztmp) continue;
if (x(j,2) == ztmp) {
if (x(j,1) < ytmp) continue;
if (x(j,1) == ytmp && x(j,0) < xtmp) continue;
}
}
neighbors_i(n++) = joriginal;
} else {
if (j > i) neighbors_i(n++) = joriginal;
}
}
d_numneigh(i) = n;
d_ilist(ii) = i;
}
namespace LAMMPS_NS {
template class NPairHalffullKokkos<LMPDeviceType,0>;
template class NPairHalffullKokkos<LMPDeviceType,1>;
#ifdef KOKKOS_HAVE_CUDA
template class NPairHalffullKokkos<LMPHostType,0>;
template class NPairHalffullKokkos<LMPHostType,1>;
#endif
}

View File

@ -0,0 +1,168 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef NPAIR_CLASS
// Newton
typedef NPairHalffullKokkos<LMPDeviceType,1> NPairKokkosHalffullNewtonDevice;
NPairStyle(halffull/newton/kk/device,
NPairKokkosHalffullNewtonDevice,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,1> NPairKokkosHalffullNewtonHost;
NPairStyle(halffull/newton/kk/host,
NPairKokkosHalffullNewtonHost,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_KOKKOS_HOST)
typedef NPairHalffullKokkos<LMPDeviceType,1> NPairKokkosHalffullNewtonDevice;
NPairStyle(halffull/newton/skip/kk/device,
NPairKokkosHalffullNewtonDevice,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,1> NPairKokkosHalffullNewtonHost;
NPairStyle(halffull/newton/skip/kk/host,
NPairKokkosHalffullNewtonHost,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST)
// Newtoff
typedef NPairHalffullKokkos<LMPDeviceType,0> NPairKokkosHalffullNewtoffDevice;
NPairStyle(halffull/newtoff/kk/device,
NPairKokkosHalffullNewtoffDevice,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,0> NPairKokkosHalffullNewtoffHost;
NPairStyle(halffull/newtoff/kk/host,
NPairKokkosHalffullNewtoffHost,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_KOKKOS_HOST)
typedef NPairHalffullKokkos<LMPDeviceType,0> NPairKokkosHalffullNewtoffDevice;
NPairStyle(halffull/newtoff/skip/kk/device,
NPairKokkosHalffullNewtoffDevice,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,0> NPairKokkosHalffullNewtoffHost;
NPairStyle(halffull/newtoff/skip/kk/host,
NPairKokkosHalffullNewtoffHost,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_SKIP | NP_KOKKOS_HOST)
//************ Ghost **************
// Newton
typedef NPairHalffullKokkos<LMPDeviceType,1> NPairKokkosHalffullNewtonGhostDevice;
NPairStyle(halffull/newton/ghost/kk/device,
NPairKokkosHalffullNewtonGhostDevice,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,1> NPairKokkosHalffullNewtonHost;
NPairStyle(halffull/newton/ghost/kk/host,
NPairKokkosHalffullNewtonHost,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST)
typedef NPairHalffullKokkos<LMPDeviceType,1> NPairKokkosHalffullNewtonGhostDevice;
NPairStyle(halffull/newton/skip/ghost/kk/device,
NPairKokkosHalffullNewtonGhostDevice,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,1> NPairKokkosHalffullNewtonHost;
NPairStyle(halffull/newton/skip/ghost/kk/host,
NPairKokkosHalffullNewtonHost,
NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST)
// Newtoff
typedef NPairHalffullKokkos<LMPDeviceType,0> NPairKokkosHalffullNewtoffGhostDevice;
NPairStyle(halffull/newtoff/ghost/kk/device,
NPairKokkosHalffullNewtoffGhostDevice,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,0> NPairKokkosHalffullNewtoffHost;
NPairStyle(halffull/newtoff/ghost/kk/host,
NPairKokkosHalffullNewtoffHost,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST)
typedef NPairHalffullKokkos<LMPDeviceType,0> NPairKokkosHalffullNewtoffGhostDevice;
NPairStyle(halffull/newtoff/skip/ghost/kk/device,
NPairKokkosHalffullNewtoffGhostDevice,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_DEVICE)
typedef NPairHalffullKokkos<LMPHostType,0> NPairKokkosHalffullNewtoffHost;
NPairStyle(halffull/newtoff/skip/ghost/kk/host,
NPairKokkosHalffullNewtoffHost,
NP_HALF_FULL | NP_NEWTOFF | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI |
NP_ORTHO | NP_TRI | NP_GHOST | NP_SKIP | NP_KOKKOS_HOST)
#else
#ifndef LMP_NPAIR_HALFFULL_KOKKOS_H
#define LMP_NPAIR_HALFFULL_KOKKOS_H
#include "npair.h"
#include "kokkos_type.h"
namespace LAMMPS_NS {
struct TagNPairHalffullCompute{};
template<class DeviceType, int NEWTON>
class NPairHalffullKokkos : public NPair {
public:
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
NPairHalffullKokkos(class LAMMPS *);
~NPairHalffullKokkos() {}
void build(class NeighList *);
KOKKOS_INLINE_FUNCTION
void operator()(TagNPairHalffullCompute, const int&) const;
private:
int nlocal;
typename AT::t_x_array_randomread x;
typename AT::t_neighbors_2d_const d_neighbors_full;
typename AT::t_int_1d_const d_ilist_full;
typename AT::t_int_1d_const d_numneigh_full;
typename AT::t_neighbors_2d d_neighbors;
typename AT::t_int_1d d_ilist;
typename AT::t_int_1d d_numneigh;
};
}
#endif
#endif
/* ERROR/WARNING messages:
*/

View File

@ -0,0 +1,157 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "npair_skip_kokkos.h"
#include "neighbor.h"
#include "neigh_list_kokkos.h"
#include "atom_kokkos.h"
#include "atom_vec.h"
#include "molecule.h"
#include "domain.h"
#include "my_page.h"
#include "error.h"
#include "atom_masks.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
template<class DeviceType>
NPairSkipKokkos<DeviceType>::NPairSkipKokkos(LAMMPS *lmp) : NPair(lmp) {
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
d_inum = typename AT::t_int_scalar("npair_skip:inum");
}
/* ----------------------------------------------------------------------
build skip list for subset of types from parent list
works for half and full lists
works for owned (non-ghost) list, also for ghost list
iskip and ijskip flag which atom types and type pairs to skip
if ghost, also store neighbors of ghost atoms & set inum,gnum correctly
------------------------------------------------------------------------- */
template<class DeviceType>
void NPairSkipKokkos<DeviceType>::build(NeighList *list)
{
atomKK->sync(execution_space,TYPE_MASK);
type = atomKK->k_type.view<DeviceType>();
nlocal = atom->nlocal;
NeighListKokkos<DeviceType>* k_list_skip = static_cast<NeighListKokkos<DeviceType>*>(list->listskip);
d_ilist_skip = k_list_skip->d_ilist;
d_numneigh_skip = k_list_skip->d_numneigh;
d_neighbors_skip = k_list_skip->d_neighbors;
num_skip = list->listskip->inum;
if (list->ghost) num_skip += list->listskip->gnum;
NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list);
k_list->maxneighs = k_list_skip->maxneighs; // simple, but could be made more memory efficient
k_list->grow(atom->nmax);
d_ilist = k_list->d_ilist;
d_numneigh = k_list->d_numneigh;
d_neighbors = k_list->d_neighbors;
int ntypes = atom->ntypes;
k_iskip = DAT::tdual_int_1d("npair_skip:iskip",ntypes+1);
k_ijskip = DAT::tdual_int_2d("npair_skip:ijskip",ntypes+1,ntypes+1);
d_iskip = k_iskip.view<DeviceType>();
d_ijskip = k_ijskip.view<DeviceType>();
for (int itype = 1; itype <= ntypes; itype++) {
k_iskip.h_view(itype) = list->iskip[itype];
for (int jtype = 1; jtype <= ntypes; jtype++) {
k_ijskip.h_view(itype,jtype) = list->ijskip[itype][jtype];
}
}
k_iskip.modify<LMPHostType>();
k_ijskip.modify<LMPHostType>();
k_iskip.sync<DeviceType>();
k_ijskip.sync<DeviceType>();
// loop over atoms in other list
// skip I atom entirely if iskip is set for type[I]
// skip I,J pair if ijskip is set for type[I],type[J]
copymode = 1;
Kokkos::parallel_scan(Kokkos::RangePolicy<DeviceType, TagNPairSkipCompute>(0,num_skip),*this);
auto h_inum = Kokkos::create_mirror_view(d_inum);
Kokkos::deep_copy(h_inum,d_inum);
const int inum = h_inum();
list->inum = inum;
if (list->ghost) {
int num = 0;
Kokkos::parallel_reduce(Kokkos::RangePolicy<DeviceType, TagNPairSkipCountLocal>(0,inum),*this,num);
list->inum = num;
list->gnum = inum - num;
}
copymode = 0;
}
template<class DeviceType>
KOKKOS_INLINE_FUNCTION
void NPairSkipKokkos<DeviceType>::operator()(TagNPairSkipCompute, const int &ii, int &inum, const bool &final) const {
const int i = d_ilist_skip(ii);
const int itype = type(i);
if (!d_iskip(itype)) {
if (final) {
int n = 0;
// loop over parent non-skip list
const int jnum = d_numneigh_skip(i);
const AtomNeighbors neighbors_i = AtomNeighbors(&d_neighbors(i,0),d_numneigh(i),
&d_neighbors(i,1)-&d_neighbors(i,0));
for (int jj = 0; jj < jnum; jj++) {
const int joriginal = d_neighbors_skip(i,jj);
int j = joriginal & NEIGHMASK;
if (d_ijskip(itype,type(j))) continue;
neighbors_i(n++) = joriginal;
}
d_numneigh(i) = n;
d_ilist(inum) = i;
}
inum++;
}
if (final) {
if (ii == num_skip-1)
d_inum() = inum;
}
}
template<class DeviceType>
KOKKOS_INLINE_FUNCTION
void NPairSkipKokkos<DeviceType>::operator()(TagNPairSkipCountLocal, const int &i, int &num) const {
if (d_ilist[i] < nlocal) num++;
}
namespace LAMMPS_NS {
template class NPairSkipKokkos<LMPDeviceType>;
#ifdef KOKKOS_HAVE_CUDA
template class NPairSkipKokkos<LMPHostType>;
#endif
}

View File

@ -0,0 +1,102 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef NPAIR_CLASS
typedef NPairSkipKokkos<LMPDeviceType> NPairKokkosSkipDevice;
NPairStyle(skip/kk/device,
NPairKokkosSkipDevice,
NP_SKIP | NP_HALF | NP_FULL |
NP_NSQ | NP_BIN | NP_MULTI |
NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_DEVICE)
typedef NPairSkipKokkos<LMPDeviceType> NPairKokkosSkipGhostDevice;
NPairStyle(skip/ghost/kk/device,
NPairKokkosSkipGhostDevice,
NP_SKIP | NP_HALF | NP_FULL |
NP_NSQ | NP_BIN | NP_MULTI |
NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_DEVICE)
typedef NPairSkipKokkos<LMPHostType> NPairKokkosSkipHost;
NPairStyle(skip/kk/host,
NPairKokkosSkipHost,
NP_SKIP | NP_HALF | NP_FULL |
NP_NSQ | NP_BIN | NP_MULTI |
NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_KOKKOS_HOST)
typedef NPairSkipKokkos<LMPHostType> NPairKokkosSkipGhostHost;
NPairStyle(skip/ghost/kk/host,
NPairKokkosSkipGhostHost,
NP_SKIP | NP_HALF | NP_FULL |
NP_NSQ | NP_BIN | NP_MULTI |
NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_GHOST | NP_KOKKOS_HOST)
#else
#ifndef LMP_NPAIR_SKIP_KOKKOS_H
#define LMP_NPAIR_SKIP_KOKKOS_H
#include "npair.h"
#include "kokkos_type.h"
namespace LAMMPS_NS {
struct TagNPairSkipCompute{};
struct TagNPairSkipCountLocal{};
template<class DeviceType>
class NPairSkipKokkos : public NPair {
public:
typedef DeviceType device_type;
typedef int value_type;
typedef ArrayTypes<DeviceType> AT;
NPairSkipKokkos(class LAMMPS *);
~NPairSkipKokkos() {}
void build(class NeighList *);
KOKKOS_INLINE_FUNCTION
void operator()(TagNPairSkipCompute, const int&, int&, const bool&) const;
KOKKOS_INLINE_FUNCTION
void operator()(TagNPairSkipCountLocal, const int&, int&) const;
private:
int nlocal,num_skip;
typename AT::t_int_1d_randomread type;
typename AT::t_int_scalar d_inum;
typename AT::t_neighbors_2d_const d_neighbors_skip;
typename AT::t_int_1d_const d_ilist_skip;
typename AT::t_int_1d_const d_numneigh_skip;
typename AT::t_neighbors_2d d_neighbors;
typename AT::t_int_1d d_ilist;
typename AT::t_int_1d d_numneigh;
DAT::tdual_int_1d k_iskip;
DAT::tdual_int_2d k_ijskip;
typename AT::t_int_1d d_iskip;
typename AT::t_int_2d d_ijskip;
};
}
#endif
#endif
/* ERROR/WARNING messages:
*/

View File

@ -247,8 +247,8 @@ struct PairComputeFunctor {
if (EFLAG) {
if (c.eflag_atom) {
const E_FLOAT epairhalf = 0.5 * epair;
if (NEWTON_PAIR || i < c.nlocal) c.d_eatom[i] += epairhalf;
if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) c.d_eatom[j] += epairhalf;
if (NEWTON_PAIR || i < c.nlocal) eatom[i] += epairhalf;
if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) eatom[j] += epairhalf;
}
}
@ -299,20 +299,20 @@ struct PairComputeFunctor {
if (c.vflag_atom) {
if (NEWTON_PAIR || i < c.nlocal) {
c.d_vatom(i,0) += 0.5*v0;
c.d_vatom(i,1) += 0.5*v1;
c.d_vatom(i,2) += 0.5*v2;
c.d_vatom(i,3) += 0.5*v3;
c.d_vatom(i,4) += 0.5*v4;
c.d_vatom(i,5) += 0.5*v5;
vatom(i,0) += 0.5*v0;
vatom(i,1) += 0.5*v1;
vatom(i,2) += 0.5*v2;
vatom(i,3) += 0.5*v3;
vatom(i,4) += 0.5*v4;
vatom(i,5) += 0.5*v5;
}
if ((NEWTON_PAIR || j < c.nlocal) && NEIGHFLAG != FULL) {
c.d_vatom(j,0) += 0.5*v0;
c.d_vatom(j,1) += 0.5*v1;
c.d_vatom(j,2) += 0.5*v2;
c.d_vatom(j,3) += 0.5*v3;
c.d_vatom(j,4) += 0.5*v4;
c.d_vatom(j,5) += 0.5*v5;
vatom(j,0) += 0.5*v0;
vatom(j,1) += 0.5*v1;
vatom(j,2) += 0.5*v2;
vatom(j,3) += 0.5*v3;
vatom(j,4) += 0.5*v4;
vatom(j,5) += 0.5*v5;
}
}
}

View File

@ -0,0 +1,23 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "pair_snap_kokkos.h"
#include "pair_snap_kokkos_impl.h"
namespace LAMMPS_NS {
template class PairSNAPKokkos<LMPDeviceType>;
#ifdef KOKKOS_HAVE_CUDA
template class PairSNAPKokkos<LMPHostType>;
#endif
}

View File

@ -0,0 +1,139 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef PAIR_CLASS
PairStyle(snap/kk,PairSNAPKokkos<LMPDeviceType>)
PairStyle(snap/kk/device,PairSNAPKokkos<LMPDeviceType>)
PairStyle(snap/kk/host,PairSNAPKokkos<LMPHostType>)
#else
#ifndef LMP_PAIR_SNAP_KOKKOS_H
#define LMP_PAIR_SNAP_KOKKOS_H
#include "pair_snap.h"
#include "kokkos_type.h"
#include "neigh_list_kokkos.h"
#include "sna_kokkos.h"
#include "pair_kokkos.h"
namespace LAMMPS_NS {
template<int NEIGHFLAG, int EVFLAG>
struct TagPairSNAP{};
template<class DeviceType>
class PairSNAPKokkos : public PairSNAP {
public:
enum {EnabledNeighFlags=FULL|HALF|HALFTHREAD};
enum {COUL_FLAG=0};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
typedef EV_FLOAT value_type;
PairSNAPKokkos(class LAMMPS *);
~PairSNAPKokkos();
void coeff(int, char**);
void init_style();
double init_one(int, int);
void compute(int, int);
double memory_usage();
template<int NEIGHFLAG, int EVFLAG>
KOKKOS_INLINE_FUNCTION
void operator() (TagPairSNAP<NEIGHFLAG,EVFLAG>,const typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<NEIGHFLAG,EVFLAG> >::member_type& team) const;
template<int NEIGHFLAG, int EVFLAG>
KOKKOS_INLINE_FUNCTION
void operator() (TagPairSNAP<NEIGHFLAG,EVFLAG>,const typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<NEIGHFLAG,EVFLAG> >::member_type& team, EV_FLOAT&) const;
template<int NEIGHFLAG>
KOKKOS_INLINE_FUNCTION
void v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j,
const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz,
const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const;
protected:
typename AT::t_neighbors_2d d_neighbors;
typename AT::t_int_1d_randomread d_ilist;
typename AT::t_int_1d_randomread d_numneigh;
DAT::tdual_efloat_1d k_eatom;
DAT::tdual_virial_array k_vatom;
typename AT::t_efloat_1d d_eatom;
typename AT::t_virial_array d_vatom;
typedef Kokkos::View<F_FLOAT**> t_bvec;
t_bvec bvec;
typedef Kokkos::View<F_FLOAT***> t_dbvec;
t_dbvec dbvec;
SNAKokkos<DeviceType> snaKK;
// How much parallelism to use within an interaction
int vector_length;
int eflag,vflag;
void allocate();
//void read_files(char *, char *);
/*template<class DeviceType>
inline int equal(double* x,double* y);
template<class DeviceType>
inline double dist2(double* x,double* y);
double extra_cutoff();
void load_balance();
void set_sna_to_shared(int snaid,int i);
void build_per_atom_arrays();*/
int neighflag;
Kokkos::View<T_INT*, DeviceType> ilistmast;
Kokkos::View<T_INT*, DeviceType> ghostilist;
Kokkos::View<T_INT*, DeviceType> ghostnumneigh;
Kokkos::View<T_INT*, DeviceType> ghostneighs;
Kokkos::View<T_INT*, DeviceType> ghostfirstneigh;
Kokkos::View<T_INT**, Kokkos::LayoutRight, DeviceType> i_pairs;
Kokkos::View<T_INT***, Kokkos::LayoutRight, DeviceType> i_rij;
Kokkos::View<T_INT**, Kokkos::LayoutRight, DeviceType> i_inside;
Kokkos::View<F_FLOAT**, Kokkos::LayoutRight, DeviceType> i_wj;
Kokkos::View<F_FLOAT***, Kokkos::LayoutRight, DeviceType>i_rcutij;
Kokkos::View<T_INT*, DeviceType> i_ninside;
Kokkos::View<F_FLOAT****, Kokkos::LayoutRight, DeviceType> i_uarraytot_r, i_uarraytot_i;
Kokkos::View<F_FLOAT******, Kokkos::LayoutRight, DeviceType> i_zarray_r, i_zarray_i;
Kokkos::View<F_FLOAT*, DeviceType> d_radelem; // element radii
Kokkos::View<F_FLOAT*, DeviceType> d_wjelem; // elements weights
Kokkos::View<F_FLOAT**, Kokkos::LayoutRight, DeviceType> d_coeffelem; // element bispectrum coefficients
Kokkos::View<T_INT*, DeviceType> d_map; // mapping from atom types to elements
typedef Kokkos::DualView<F_FLOAT**, DeviceType> tdual_fparams;
tdual_fparams k_cutsq;
typedef Kokkos::View<const F_FLOAT**, DeviceType,
Kokkos::MemoryTraits<Kokkos::RandomAccess> > t_fparams_rnd;
t_fparams_rnd rnd_cutsq;
typename AT::t_x_array_randomread x;
typename AT::t_f_array f;
typename AT::t_int_1d_randomread type;
friend void pair_virial_fdotr_compute<PairSNAPKokkos>(PairSNAPKokkos*);
};
}
#endif
#endif

View File

@ -0,0 +1,646 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing authors: Christian Trott (SNL), Stan Moore (SNL)
------------------------------------------------------------------------- */
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "pair_snap_kokkos.h"
#include "atom_kokkos.h"
#include "error.h"
#include "force.h"
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "neigh_request.h"
#include "neighbor_kokkos.h"
#include "kokkos.h"
#include "sna.h"
#define MAXLINE 1024
#define MAXWORD 3
using namespace LAMMPS_NS;
// Outstanding issues with quadratic term
// 1. there seems to a problem with compute_optimized energy calc
// it does not match compute_regular, even when quadratic coeffs = 0
//static double t1 = 0.0;
//static double t2 = 0.0;
//static double t3 = 0.0;
//static double t4 = 0.0;
//static double t5 = 0.0;
//static double t6 = 0.0;
//static double t7 = 0.0;
/* ---------------------------------------------------------------------- */
template<class DeviceType>
PairSNAPKokkos<DeviceType>::PairSNAPKokkos(LAMMPS *lmp) : PairSNAP(lmp)
{
respa_enable = 0;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
datamask_read = EMPTY_MASK;
datamask_modify = EMPTY_MASK;
vector_length = 8;
k_cutsq = tdual_fparams("PairSNAPKokkos::cutsq",atom->ntypes+1,atom->ntypes+1);
auto d_cutsq = k_cutsq.template view<DeviceType>();
rnd_cutsq = d_cutsq;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
PairSNAPKokkos<DeviceType>::~PairSNAPKokkos()
{
if (copymode) return;
memoryKK->destroy_kokkos(k_eatom,eatom);
memoryKK->destroy_kokkos(k_vatom,vatom);
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
template<class DeviceType>
void PairSNAPKokkos<DeviceType>::init_style()
{
if (force->newton_pair == 0)
error->all(FLERR,"Pair style SNAP requires newton pair on");
if (diagonalstyle != 3)
error->all(FLERR,"Must use diagonal style = 3 with pair snap/kk");
// irequest = neigh request made by parent class
neighflag = lmp->kokkos->neighflag;
int irequest = neighbor->request(this,instance_me);
neighbor->requests[irequest]->
kokkos_host = Kokkos::Impl::is_same<DeviceType,LMPHostType>::value &&
!Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
neighbor->requests[irequest]->
kokkos_device = Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
if (neighflag == HALF || neighflag == HALFTHREAD) { // still need atomics, even though using a full neigh list
neighbor->requests[irequest]->full = 1;
neighbor->requests[irequest]->half = 0;
} else {
error->all(FLERR,"Must use half neighbor list style with pair snap/kk");
}
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
struct FindMaxNumNeighs {
typedef DeviceType device_type;
NeighListKokkos<DeviceType> k_list;
FindMaxNumNeighs(NeighListKokkos<DeviceType>* nl): k_list(*nl) {}
~FindMaxNumNeighs() {k_list.copymode = 1;}
KOKKOS_INLINE_FUNCTION
void operator() (const int& ii, int& max_neighs) const {
const int i = k_list.d_ilist[ii];
const int num_neighs = k_list.d_numneigh[i];
if (max_neighs<num_neighs) max_neighs = num_neighs;
}
};
/* ----------------------------------------------------------------------
This version is a straightforward implementation
---------------------------------------------------------------------- */
template<class DeviceType>
void PairSNAPKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
{
eflag = eflag_in;
vflag = vflag_in;
if (neighflag == FULL) no_virial_fdotr_compute = 1;
if (eflag || vflag) ev_setup(eflag,vflag,0);
else evflag = vflag_fdotr = 0;
// reallocate per-atom arrays if necessary
if (eflag_atom) {
memoryKK->destroy_kokkos(k_eatom,eatom);
memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
d_eatom = k_eatom.view<DeviceType>();
}
if (vflag_atom) {
memoryKK->destroy_kokkos(k_vatom,vatom);
memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
d_vatom = k_vatom.view<DeviceType>();
}
copymode = 1;
int newton_pair = force->newton_pair;
if (newton_pair == false)
error->all(FLERR,"PairSNAPKokkos requires 'newton on'");
atomKK->sync(execution_space,X_MASK|F_MASK|TYPE_MASK);
x = atomKK->k_x.view<DeviceType>();
f = atomKK->k_f.view<DeviceType>();
type = atomKK->k_type.view<DeviceType>();
k_cutsq.template sync<DeviceType>();
NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list);
d_numneigh = k_list->d_numneigh;
d_neighbors = k_list->d_neighbors;
d_ilist = k_list->d_ilist;
int inum = list->inum;
/*
for (int i = 0; i < nlocal; i++) {
typename t_neigh_list::t_neighs neighs_i = neigh_list.get_neighs(i);
const int num_neighs = neighs_i.get_num_neighs();
if (max_neighs<num_neighs) max_neighs = num_neighs;
}*/
int max_neighs = 0;
Kokkos::parallel_reduce("PairSNAPKokkos::find_max_neighs",inum, FindMaxNumNeighs<DeviceType>(k_list), Kokkos::Experimental::Max<int>(max_neighs));
snaKK.nmax = max_neighs;
T_INT team_scratch_size = snaKK.size_team_scratch_arrays();
T_INT thread_scratch_size = snaKK.size_thread_scratch_arrays();
//printf("Sizes: %i %i\n",team_scratch_size/1024,thread_scratch_size/1024);
int team_size_max = Kokkos::TeamPolicy<DeviceType>::team_size_max(*this);
int vector_length = 8;
#ifdef KOKKOS_ENABLE_CUDA
int team_size = 20;//max_neighs;
if (team_size*vector_length > team_size_max)
team_size = team_size_max/vector_length;
#else
int team_size = 1;
#endif
EV_FLOAT ev;
if (eflag) {
if (neighflag == HALF) {
typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<HALF,1> > policy(inum,team_size,vector_length);
Kokkos::parallel_reduce(policy
.set_scratch_size(1,Kokkos::PerThread(thread_scratch_size))
.set_scratch_size(1,Kokkos::PerTeam(team_scratch_size))
,*this,ev);
} else if (neighflag == HALFTHREAD) {
typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<HALFTHREAD,1> > policy(inum,team_size,vector_length);
Kokkos::parallel_reduce(policy
.set_scratch_size(1,Kokkos::PerThread(thread_scratch_size))
.set_scratch_size(1,Kokkos::PerTeam(team_scratch_size))
,*this,ev);
}
} else {
if (neighflag == HALF) {
typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<HALF,0> > policy(inum,team_size,vector_length);
Kokkos::parallel_for(policy
.set_scratch_size(1,Kokkos::PerThread(thread_scratch_size))
.set_scratch_size(1,Kokkos::PerTeam(team_scratch_size))
,*this);
} else if (neighflag == HALFTHREAD) {
typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<HALFTHREAD,0> > policy(inum,team_size,vector_length);
Kokkos::parallel_for(policy
.set_scratch_size(1,Kokkos::PerThread(thread_scratch_size))
.set_scratch_size(1,Kokkos::PerTeam(team_scratch_size))
,*this);
}
}
//static int step =0;
//step++;
//if (step%10==0)
// printf(" %e %e %e %e %e (%e %e): %e\n",t1,t2,t3,t4,t5,t6,t7,t1+t2+t3+t4+t5);
if (eflag_global) eng_vdwl += ev.evdwl;
if (vflag_global) {
virial[0] += ev.v[0];
virial[1] += ev.v[1];
virial[2] += ev.v[2];
virial[3] += ev.v[3];
virial[4] += ev.v[4];
virial[5] += ev.v[5];
}
if (vflag_fdotr) pair_virial_fdotr_compute(this);
if (eflag_atom) {
k_eatom.template modify<DeviceType>();
k_eatom.template sync<LMPHostType>();
}
if (vflag_atom) {
k_vatom.template modify<DeviceType>();
k_vatom.template sync<LMPHostType>();
}
atomKK->modified(execution_space,F_MASK);
copymode = 0;
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
template<class DeviceType>
void PairSNAPKokkos<DeviceType>::allocate()
{
PairSNAP::allocate();
int n = atom->ntypes;
d_map = Kokkos::View<T_INT*, DeviceType>("PairSNAPKokkos::map",n+1);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
template<class DeviceType>
double PairSNAPKokkos<DeviceType>::init_one(int i, int j)
{
double cutone = PairSNAP::init_one(i,j);
k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone;
k_cutsq.template modify<LMPHostType>();
return cutone;
}
/* ----------------------------------------------------------------------
set coeffs for one or more type pairs
------------------------------------------------------------------------- */
template<class DeviceType>
void PairSNAPKokkos<DeviceType>::coeff(int narg, char **arg)
{
PairSNAP::coeff(narg,arg);
// Set up element lists
d_radelem = Kokkos::View<F_FLOAT*, DeviceType>("pair:radelem",nelements);
d_wjelem = Kokkos::View<F_FLOAT*, DeviceType>("pair:wjelem",nelements);
d_coeffelem = Kokkos::View<F_FLOAT**, Kokkos::LayoutRight, DeviceType>("pair:coeffelem",nelements,ncoeffall);
auto h_radelem = Kokkos::create_mirror_view(d_radelem);
auto h_wjelem = Kokkos::create_mirror_view(d_wjelem);
auto h_coeffelem = Kokkos::create_mirror_view(d_coeffelem);
auto h_map = Kokkos::create_mirror_view(d_map);
for (int ielem = 0; ielem < nelements; ielem++) {
h_radelem(ielem) = radelem[ielem];
h_wjelem(ielem) = wjelem[ielem];
for (int jcoeff = 0; jcoeff < ncoeffall; jcoeff++) {
h_coeffelem(ielem,jcoeff) = coeffelem[ielem][jcoeff];
}
}
for (int i = 1; i <= atom->ntypes; i++) {
h_map(i) = map[i];
}
Kokkos::deep_copy(d_radelem,h_radelem);
Kokkos::deep_copy(d_wjelem,h_wjelem);
Kokkos::deep_copy(d_coeffelem,h_coeffelem);
Kokkos::deep_copy(d_map,h_map);
// deallocate non-kokkos sna
if (sna) {
for (int tid = 0; tid<nthreads; tid++)
delete sna[tid];
delete [] sna;
sna = NULL;
}
// allocate memory for per OpenMP thread data which
// is wrapped into the sna class
snaKK = SNAKokkos<DeviceType>(rfac0,twojmax,
diagonalstyle,use_shared_arrays,
rmin0,switchflag,bzeroflag);
//if (!use_shared_arrays)
snaKK.grow_rij(nmax);
snaKK.init();
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
template<int NEIGHFLAG, int EVFLAG>
KOKKOS_INLINE_FUNCTION
void PairSNAPKokkos<DeviceType>::operator() (TagPairSNAP<NEIGHFLAG,EVFLAG>,const typename Kokkos::TeamPolicy<DeviceType, TagPairSNAP<NEIGHFLAG,EVFLAG> >::member_type& team, EV_FLOAT& ev) const {
// The f array is atomic for Half/Thread neighbor style
Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_f = f;
const int ii = team.league_rank();
const int i = d_ilist[ii];
SNAKokkos<DeviceType> my_sna(snaKK,team);
const double x_i = x(i,0);
const double y_i = x(i,1);
const double z_i = x(i,2);
const int type_i = type[i];
const int elem_i = d_map[type_i];
const double radi = d_radelem[elem_i];
const int num_neighs = d_numneigh[i];
// rij[][3] = displacements between atom I and those neighbors
// inside = indices of neighbors of I within cutoff
// wj = weights for neighbors of I within cutoff
// rcutij = cutoffs for neighbors of I within cutoff
// note Rij sign convention => dU/dRij = dU/dRj = -dU/dRi
//Kokkos::Timer timer;
int ninside = 0;
Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team,num_neighs),
[&] (const int jj, int& count) {
Kokkos::single(Kokkos::PerThread(team), [&] (){
T_INT j = d_neighbors(i,jj);
const F_FLOAT dx = x(j,0) - x_i;
const F_FLOAT dy = x(j,1) - y_i;
const F_FLOAT dz = x(j,2) - z_i;
const int type_j = type(j);
const F_FLOAT rsq = dx*dx + dy*dy + dz*dz;
const int elem_j = d_map[type_j];
if ( rsq < rnd_cutsq(type_i,type_j) )
count++;
});
},ninside);
//t1 += timer.seconds(); timer.reset();
if (team.team_rank() == 0)
Kokkos::parallel_scan(Kokkos::ThreadVectorRange(team,num_neighs),
[&] (const int jj, int& offset, bool final){
//for (int jj = 0; jj < num_neighs; jj++) {
T_INT j = d_neighbors(i,jj);
const F_FLOAT dx = x(j,0) - x_i;
const F_FLOAT dy = x(j,1) - y_i;
const F_FLOAT dz = x(j,2) - z_i;
const int type_j = type(j);
const F_FLOAT rsq = dx*dx + dy*dy + dz*dz;
const int elem_j = d_map[type_j];
if ( rsq < rnd_cutsq(type_i,type_j) ) {
if (final) {
my_sna.rij(offset,0) = dx;
my_sna.rij(offset,1) = dy;
my_sna.rij(offset,2) = dz;
my_sna.inside[offset] = j;
my_sna.wj[offset] = d_wjelem[elem_j];
my_sna.rcutij[offset] = (radi + d_radelem[elem_j])*rcutfac;
}
offset++;
}
});
//t2 += timer.seconds(); timer.reset();
team.team_barrier();
// compute Ui, Zi, and Bi for atom I
my_sna.compute_ui(team,ninside);
//t3 += timer.seconds(); timer.reset();
team.team_barrier();
my_sna.compute_zi(team);
//t4 += timer.seconds(); timer.reset();
team.team_barrier();
// for neighbors of I within cutoff:
// compute dUi/drj and dBi/drj
// Fij = dEi/dRj = -dEi/dRi => add to Fi, subtract from Fj
Kokkos::View<double*,Kokkos::LayoutRight,DeviceType,Kokkos::MemoryTraits<Kokkos::Unmanaged>>
d_coeffi(d_coeffelem,elem_i,Kokkos::ALL);
Kokkos::parallel_for (Kokkos::TeamThreadRange(team,ninside),
[&] (const int jj) {
//for (int jj = 0; jj < ninside; jj++) {
int j = my_sna.inside[jj];
//Kokkos::Timer timer2;
my_sna.compute_duidrj(team,&my_sna.rij(jj,0),
my_sna.wj[jj],my_sna.rcutij[jj]);
//t6 += timer2.seconds(); timer2.reset();
my_sna.compute_dbidrj(team);
//t7 += timer2.seconds(); timer2.reset();
my_sna.copy_dbi2dbvec(team);
if (quadraticflag) {
my_sna.compute_bi(team);
my_sna.copy_bi2bvec(team);
}
Kokkos::single(Kokkos::PerThread(team), [&] (){
F_FLOAT fij[3];
fij[0] = 0.0;
fij[1] = 0.0;
fij[2] = 0.0;
// linear contributions
for (int k = 1; k <= ncoeff; k++) {
double bgb = d_coeffi[k];
fij[0] += bgb*my_sna.dbvec(k-1,0);
fij[1] += bgb*my_sna.dbvec(k-1,1);
fij[2] += bgb*my_sna.dbvec(k-1,2);
}
if (quadraticflag) {
int k = ncoeff+1;
for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
double bveci = my_sna.bvec[icoeff];
double fack = d_coeffi[k]*bveci;
double dbvecix = my_sna.dbvec(icoeff,0);
double dbveciy = my_sna.dbvec(icoeff,1);
double dbveciz = my_sna.dbvec(icoeff,2);
fij[0] += fack*dbvecix;
fij[1] += fack*dbveciy;
fij[2] += fack*dbveciz;
k++;
for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) {
double facki = d_coeffi[k]*bveci;
double fackj = d_coeffi[k]*my_sna.bvec[jcoeff];
fij[0] += facki*my_sna.dbvec(jcoeff,0)+fackj*dbvecix;
fij[1] += facki*my_sna.dbvec(jcoeff,1)+fackj*dbveciy;
fij[2] += facki*my_sna.dbvec(jcoeff,2)+fackj*dbveciz;
k++;
}
}
}
// Hard-coded ZBL potential
//const double dx = my_sna.rij(jj,0);
//const double dy = my_sna.rij(jj,1);
//const double dz = my_sna.rij(jj,2);
//const double fdivr = -1.5e6/pow(dx*dx + dy*dy + dz*dz,7.0);
//fij[0] += dx*fdivr;
//fij[1] += dy*fdivr;
//fij[2] += dz*fdivr;
//OK
//printf("%lf %lf %lf %lf %lf %lf %lf %lf %lf SNAP-COMPARE: FIJ\n"
// ,x(i,0),x(i,1),x(i,2),x(j,0),x(j,1),x(j,2),fij[0],fij[1],fij[2] );
a_f(i,0) += fij[0];
a_f(i,1) += fij[1];
a_f(i,2) += fij[2];
a_f(j,0) -= fij[0];
a_f(j,1) -= fij[1];
a_f(j,2) -= fij[2];
// tally per-atom virial contribution
if (EVFLAG) {
if (vflag) {
v_tally_xyz<NEIGHFLAG>(ev,i,j,
fij[0],fij[1],fij[2],
-my_sna.rij(jj,0),-my_sna.rij(jj,1),
-my_sna.rij(jj,2));
}
}
});
});
//t5 += timer.seconds(); timer.reset();
// tally energy contribution
if (EVFLAG) {
if (eflag) {
if (!quadraticflag) {
my_sna.compute_bi(team);
my_sna.copy_bi2bvec(team);
}
// E = beta.B + 0.5*B^t.alpha.B
// coeff[k] = beta[k-1] or
// coeff[k] = alpha_ii or
// coeff[k] = alpha_ij = alpha_ji, j != i
if (team.team_rank() == 0)
Kokkos::single(Kokkos::PerThread(team), [&] () {
// evdwl = energy of atom I, sum over coeffs_k * Bi_k
double evdwl = d_coeffi[0];
// linear contributions
for (int k = 1; k <= ncoeff; k++)
evdwl += d_coeffi[k]*my_sna.bvec[k-1];
// quadratic contributions
if (quadraticflag) {
int k = ncoeff+1;
for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
double bveci = my_sna.bvec[icoeff];
evdwl += 0.5*d_coeffi[k++]*bveci*bveci;
for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) {
evdwl += d_coeffi[k++]*bveci*my_sna.bvec[jcoeff];
}
}
}
// ev_tally_full(i,2.0*evdwl,0.0,0.0,0.0,0.0,0.0);
if (eflag_either) {
if (eflag_global) ev.evdwl += evdwl;
if (eflag_atom) d_eatom[i] += evdwl;
}
});
}
}
}
template<class DeviceType>
template<int NEIGHFLAG, int EVFLAG>
KOKKOS_INLINE_FUNCTION
void PairSNAPKokkos<DeviceType>::operator() (TagPairSNAP<NEIGHFLAG,EVFLAG>,const typename Kokkos::TeamPolicy<DeviceType,TagPairSNAP<NEIGHFLAG,EVFLAG> >::member_type& team) const {
EV_FLOAT ev;
this->template operator()<NEIGHFLAG,EVFLAG>(TagPairSNAP<NEIGHFLAG,EVFLAG>(), team, ev);
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
template<int NEIGHFLAG>
KOKKOS_INLINE_FUNCTION
void PairSNAPKokkos<DeviceType>::v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j,
const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz,
const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const
{
// The vatom array is atomic for Half/Thread neighbor style
Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,DeviceType,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > v_vatom = k_vatom.view<DeviceType>();
const E_FLOAT v0 = delx*fx;
const E_FLOAT v1 = dely*fy;
const E_FLOAT v2 = delz*fz;
const E_FLOAT v3 = delx*fy;
const E_FLOAT v4 = delx*fz;
const E_FLOAT v5 = dely*fz;
if (vflag_global) {
ev.v[0] += v0;
ev.v[1] += v1;
ev.v[2] += v2;
ev.v[3] += v3;
ev.v[4] += v4;
ev.v[5] += v5;
}
if (vflag_atom) {
v_vatom(i,0) += 0.5*v0;
v_vatom(i,1) += 0.5*v1;
v_vatom(i,2) += 0.5*v2;
v_vatom(i,3) += 0.5*v3;
v_vatom(i,4) += 0.5*v4;
v_vatom(i,5) += 0.5*v5;
v_vatom(j,0) += 0.5*v0;
v_vatom(j,1) += 0.5*v1;
v_vatom(j,2) += 0.5*v2;
v_vatom(j,3) += 0.5*v3;
v_vatom(j,4) += 0.5*v4;
v_vatom(j,5) += 0.5*v5;
}
}
/* ----------------------------------------------------------------------
memory usage
------------------------------------------------------------------------- */
template<class DeviceType>
double PairSNAPKokkos<DeviceType>::memory_usage()
{
double bytes = Pair::memory_usage();
int n = atom->ntypes+1;
bytes += n*n*sizeof(int);
bytes += n*n*sizeof(double);
bytes += 3*nmax*sizeof(double);
bytes += nmax*sizeof(int);
bytes += (2*ncoeffall)*sizeof(double);
bytes += (ncoeff*3)*sizeof(double);
bytes += snaKK.memory_usage();
return bytes;
}

View File

@ -141,8 +141,8 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
} else if (neighflag == N2) {
PairComputeFunctor<PairTableKokkos<DeviceType>,N2,false,S_TableCompute<DeviceType,TABSTYLE> >
f(this,(NeighListKokkos<DeviceType>*) list);
if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev);
else Kokkos::parallel_for(nlocal,f);
if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev);
else Kokkos::parallel_for(list->inum,f);
}
} else {
if (neighflag == FULL) {
@ -163,8 +163,8 @@ void PairTableKokkos<DeviceType>::compute_style(int eflag_in, int vflag_in)
} else if (neighflag == N2) {
PairComputeFunctor<PairTableKokkos<DeviceType>,N2,true,S_TableCompute<DeviceType,TABSTYLE> >
f(this,(NeighListKokkos<DeviceType>*) list);
if (eflag || vflag) Kokkos::parallel_reduce(nlocal,f,ev);
else Kokkos::parallel_for(nlocal,f);
if (eflag || vflag) Kokkos::parallel_reduce(list->inum,f,ev);
else Kokkos::parallel_for(list->inum,f);
}
}

View File

@ -0,0 +1,439 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing authors: Stan Moore (SNL)
------------------------------------------------------------------------- */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pair_zbl_kokkos.h"
#include "atom_kokkos.h"
#include "comm.h"
#include "force.h"
#include "neighbor.h"
#include "neigh_list.h"
#include "neigh_request.h"
#include "update.h"
#include "integrate.h"
#include "respa.h"
#include "math_const.h"
#include "memory_kokkos.h"
#include "error.h"
#include "atom_masks.h"
#include "kokkos.h"
// From J.F. Zeigler, J. P. Biersack and U. Littmark,
// "The Stopping and Range of Ions in Matter" volume 1, Pergamon, 1985.
using namespace LAMMPS_NS;
using namespace MathConst;
using namespace PairZBLConstants;
/* ---------------------------------------------------------------------- */
template<class DeviceType>
PairZBLKokkos<DeviceType>::PairZBLKokkos(LAMMPS *lmp) : PairZBL(lmp)
{
respa_enable = 0;
atomKK = (AtomKokkos *) atom;
execution_space = ExecutionSpaceFromDevice<DeviceType>::space;
datamask_read = X_MASK | F_MASK | TYPE_MASK | ENERGY_MASK | VIRIAL_MASK;
datamask_modify = F_MASK | ENERGY_MASK | VIRIAL_MASK;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
PairZBLKokkos<DeviceType>::~PairZBLKokkos()
{
if (copymode) return;
if (allocated) {
memoryKK->destroy_kokkos(k_eatom,eatom);
memoryKK->destroy_kokkos(k_vatom,vatom);
memory->sfree(cutsq);
eatom = NULL;
vatom = NULL;
cutsq = NULL;
}
}
/* ----------------------------------------------------------------------
init specific to this pair style
------------------------------------------------------------------------- */
template<class DeviceType>
void PairZBLKokkos<DeviceType>::init_style()
{
PairZBL::init_style();
// error if rRESPA with inner levels
if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) {
int respa = 0;
if (((Respa *) update->integrate)->level_inner >= 0) respa = 1;
if (((Respa *) update->integrate)->level_middle >= 0) respa = 2;
if (respa)
error->all(FLERR,"Cannot use Kokkos pair style with rRESPA inner/middle");
}
// irequest = neigh request made by parent class
neighflag = lmp->kokkos->neighflag;
int irequest = neighbor->nrequest - 1;
neighbor->requests[irequest]->
kokkos_host = Kokkos::Impl::is_same<DeviceType,LMPHostType>::value &&
!Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
neighbor->requests[irequest]->
kokkos_device = Kokkos::Impl::is_same<DeviceType,LMPDeviceType>::value;
if (neighflag == FULL) {
neighbor->requests[irequest]->full = 1;
neighbor->requests[irequest]->half = 0;
} else if (neighflag == HALF || neighflag == HALFTHREAD) {
neighbor->requests[irequest]->full = 0;
neighbor->requests[irequest]->half = 1;
} else if (neighflag == N2) {
neighbor->requests[irequest]->full = 0;
neighbor->requests[irequest]->half = 0;
} else {
error->all(FLERR,"Cannot use chosen neighbor list style with lj/cut/kk");
}
Kokkos::deep_copy(d_cutsq,cut_globalsq);
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
void PairZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
{
eflag = eflag_in;
vflag = vflag_in;
if (neighflag == FULL) no_virial_fdotr_compute = 1;
if (eflag || vflag) ev_setup(eflag,vflag,0);
else evflag = vflag_fdotr = 0;
// reallocate per-atom arrays if necessary
if (eflag_atom) {
memoryKK->destroy_kokkos(k_eatom,eatom);
memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
d_eatom = k_eatom.view<DeviceType>();
}
if (vflag_atom) {
memoryKK->destroy_kokkos(k_vatom,vatom);
memoryKK->create_kokkos(k_vatom,vatom,maxvatom,6,"pair:vatom");
d_vatom = k_vatom.view<DeviceType>();
}
atomKK->sync(execution_space,datamask_read);
if (eflag || vflag) atomKK->modified(execution_space,datamask_modify);
else atomKK->modified(execution_space,F_MASK);
x = atomKK->k_x.view<DeviceType>();
f = atomKK->k_f.view<DeviceType>();
type = atomKK->k_type.view<DeviceType>();
nlocal = atom->nlocal;
nall = atom->nlocal + atom->nghost;
newton_pair = force->newton_pair;
special_lj[0] = force->special_lj[0];
special_lj[1] = force->special_lj[1];
special_lj[2] = force->special_lj[2];
special_lj[3] = force->special_lj[3];
k_z.sync<DeviceType>();
k_d1a.sync<DeviceType>();
k_d2a.sync<DeviceType>();
k_d3a.sync<DeviceType>();
k_d4a.sync<DeviceType>();
k_zze.sync<DeviceType>();
k_sw1.sync<DeviceType>();
k_sw2.sync<DeviceType>();
k_sw3.sync<DeviceType>();
k_sw4.sync<DeviceType>();
k_sw5.sync<DeviceType>();
// loop over neighbors of my atoms
EV_FLOAT ev = pair_compute<PairZBLKokkos<DeviceType>,void >(this,(NeighListKokkos<DeviceType>*)list);
if (eflag_global) eng_vdwl += ev.evdwl;
if (vflag_global) {
virial[0] += ev.v[0];
virial[1] += ev.v[1];
virial[2] += ev.v[2];
virial[3] += ev.v[3];
virial[4] += ev.v[4];
virial[5] += ev.v[5];
}
if (eflag_atom) {
k_eatom.template modify<DeviceType>();
k_eatom.template sync<LMPHostType>();
}
if (vflag_atom) {
k_vatom.template modify<DeviceType>();
k_vatom.template sync<LMPHostType>();
}
if (vflag_fdotr) pair_virial_fdotr_compute(this);
}
template<class DeviceType>
template<bool STACKPARAMS, class Specialisation>
KOKKOS_INLINE_FUNCTION
F_FLOAT PairZBLKokkos<DeviceType>::
compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const {
(void) i;
(void) j;
const F_FLOAT r = sqrt(rsq);
F_FLOAT fpair = dzbldr(r, itype, jtype);
if (rsq > cut_innersq) {
const F_FLOAT t = r - cut_inner;
const F_FLOAT fswitch = t*t *
(d_sw1(itype,jtype) + d_sw2(itype,jtype)*t);
fpair += fswitch;
}
fpair *= -1.0/r;
return fpair;
}
template<class DeviceType>
template<bool STACKPARAMS, class Specialisation>
KOKKOS_INLINE_FUNCTION
F_FLOAT PairZBLKokkos<DeviceType>::
compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const {
(void) i;
(void) j;
const F_FLOAT r = sqrt(rsq);
F_FLOAT evdwl = e_zbl(r, itype, jtype);
evdwl += d_sw5(itype,jtype);
if (rsq > cut_innersq) {
const F_FLOAT t = r - cut_inner;
const F_FLOAT eswitch = t*t*t *
(d_sw3(itype,jtype) + d_sw4(itype,jtype)*t);
evdwl += eswitch;
}
return evdwl;
}
/* ----------------------------------------------------------------------
allocate all arrays
------------------------------------------------------------------------- */
template<class DeviceType>
void PairZBLKokkos<DeviceType>::allocate()
{
PairZBL::allocate();
int n = atom->ntypes;
k_z = DAT::tdual_ffloat_1d("pair_zbl:z ",n+1);
k_d1a = DAT::tdual_ffloat_2d_dl("pair_zbl:d1a",n+1,n+1);
k_d2a = DAT::tdual_ffloat_2d_dl("pair_zbl:d2a",n+1,n+1);
k_d3a = DAT::tdual_ffloat_2d_dl("pair_zbl:d3a",n+1,n+1);
k_d4a = DAT::tdual_ffloat_2d_dl("pair_zbl:d4a",n+1,n+1);
k_zze = DAT::tdual_ffloat_2d_dl("pair_zbl:zze",n+1,n+1);
k_sw1 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw1",n+1,n+1);
k_sw2 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw2",n+1,n+1);
k_sw3 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw3",n+1,n+1);
k_sw4 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw4",n+1,n+1);
k_sw5 = DAT::tdual_ffloat_2d_dl("pair_zbl:sw5",n+1,n+1);
d_z = k_z.view<DeviceType>();
d_d1a = k_d1a.view<DeviceType>();
d_d2a = k_d2a.view<DeviceType>();
d_d3a = k_d3a.view<DeviceType>();
d_d4a = k_d4a.view<DeviceType>();
d_zze = k_zze.view<DeviceType>();
d_sw1 = k_sw1.view<DeviceType>();
d_sw2 = k_sw2.view<DeviceType>();
d_sw3 = k_sw3.view<DeviceType>();
d_sw4 = k_sw4.view<DeviceType>();
d_sw5 = k_sw5.view<DeviceType>();
d_cutsq = typename AT::t_ffloat_2d_dl("pair_zbl:cutsq",n+1,n+1);
}
/* ----------------------------------------------------------------------
init for one type pair i,j and corresponding j,i
------------------------------------------------------------------------- */
template<class DeviceType>
double PairZBLKokkos<DeviceType>::init_one(int i, int j)
{
double cutone = PairZBL::init_one(i,j);
k_z.h_view(i) = z[i];
k_z.h_view(j) = z[j];
k_d1a.h_view(i,j) = k_d1a.h_view(j,i) = d1a[i][j];
k_d2a.h_view(i,j) = k_d2a.h_view(j,i) = d2a[i][j];
k_d3a.h_view(i,j) = k_d3a.h_view(j,i) = d3a[i][j];
k_d4a.h_view(i,j) = k_d4a.h_view(j,i) = d4a[i][j];
k_zze.h_view(i,j) = k_zze.h_view(j,i) = zze[i][j];
k_sw1.h_view(i,j) = k_sw1.h_view(j,i) = sw1[i][j];
k_sw2.h_view(i,j) = k_sw2.h_view(j,i) = sw2[i][j];
k_sw3.h_view(i,j) = k_sw3.h_view(j,i) = sw3[i][j];
k_sw4.h_view(i,j) = k_sw4.h_view(j,i) = sw4[i][j];
k_sw5.h_view(i,j) = k_sw5.h_view(j,i) = sw5[i][j];
k_z.modify<LMPHostType>();
k_d1a.modify<LMPHostType>();
k_d2a.modify<LMPHostType>();
k_d3a.modify<LMPHostType>();
k_d4a.modify<LMPHostType>();
k_zze.modify<LMPHostType>();
k_sw1.modify<LMPHostType>();
k_sw2.modify<LMPHostType>();
k_sw3.modify<LMPHostType>();
k_sw4.modify<LMPHostType>();
k_sw5.modify<LMPHostType>();
if(i<MAX_TYPES_STACKPARAMS+1 && j<MAX_TYPES_STACKPARAMS+1) {
m_cutsq[i][j] = m_cutsq[j][i] = cutone*cutone;
}
return cutone;
}
/* ----------------------------------------------------------------------
compute ZBL pair energy
------------------------------------------------------------------------- */
template<class DeviceType>
KOKKOS_INLINE_FUNCTION
F_FLOAT PairZBLKokkos<DeviceType>::e_zbl(F_FLOAT r, int i, int j) const {
const F_FLOAT d1aij = d_d1a(i,j);
const F_FLOAT d2aij = d_d2a(i,j);
const F_FLOAT d3aij = d_d3a(i,j);
const F_FLOAT d4aij = d_d4a(i,j);
const F_FLOAT zzeij = d_zze(i,j);
const F_FLOAT rinv = 1.0/r;
F_FLOAT sum = c1*exp(-d1aij*r);
sum += c2*exp(-d2aij*r);
sum += c3*exp(-d3aij*r);
sum += c4*exp(-d4aij*r);
F_FLOAT result = zzeij*sum*rinv;
return result;
}
/* ----------------------------------------------------------------------
compute ZBL first derivative
------------------------------------------------------------------------- */
template<class DeviceType>
KOKKOS_INLINE_FUNCTION
F_FLOAT PairZBLKokkos<DeviceType>::dzbldr(F_FLOAT r, int i, int j) const {
const F_FLOAT d1aij = d_d1a(i,j);
const F_FLOAT d2aij = d_d2a(i,j);
const F_FLOAT d3aij = d_d3a(i,j);
const F_FLOAT d4aij = d_d4a(i,j);
const F_FLOAT zzeij = d_zze(i,j);
const F_FLOAT rinv = 1.0/r;
const F_FLOAT e1 = exp(-d1aij*r);
const F_FLOAT e2 = exp(-d2aij*r);
const F_FLOAT e3 = exp(-d3aij*r);
const F_FLOAT e4 = exp(-d4aij*r);
F_FLOAT sum = c1*e1;
sum += c2*e2;
sum += c3*e3;
sum += c4*e4;
F_FLOAT sum_p = -c1*d1aij*e1;
sum_p -= c2*d2aij*e2;
sum_p -= c3*d3aij*e3;
sum_p -= c4*d4aij*e4;
F_FLOAT result = zzeij*(sum_p - sum*rinv)*rinv;
return result;
}
/* ----------------------------------------------------------------------
compute ZBL second derivative
------------------------------------------------------------------------- */
template<class DeviceType>
KOKKOS_INLINE_FUNCTION
F_FLOAT PairZBLKokkos<DeviceType>::d2zbldr2(F_FLOAT r, int i, int j) const {
const F_FLOAT d1aij = d_d1a(i,j);
const F_FLOAT d2aij = d_d2a(i,j);
const F_FLOAT d3aij = d_d3a(i,j);
const F_FLOAT d4aij = d_d4a(i,j);
const F_FLOAT zzeij = d_zze(i,j);
const F_FLOAT rinv = 1.0/r;
const F_FLOAT e1 = exp(-d1aij*r);
const F_FLOAT e2 = exp(-d2aij*r);
const F_FLOAT e3 = exp(-d3aij*r);
const F_FLOAT e4 = exp(-d4aij*r);
F_FLOAT sum = c1*e1;
sum += c2*e2;
sum += c3*e3;
sum += c4*e4;
F_FLOAT sum_p = c1*e1*d1aij;
sum_p += c2*e2*d2aij;
sum_p += c3*e3*d3aij;
sum_p += c4*e4*d4aij;
F_FLOAT sum_pp = c1*e1*d1aij*d1aij;
sum_pp += c2*e2*d2aij*d2aij;
sum_pp += c3*e3*d3aij*d3aij;
sum_pp += c4*e4*d4aij*d4aij;
F_FLOAT result = zzeij*(sum_pp + 2.0*sum_p*rinv +
2.0*sum*rinv*rinv)*rinv;
return result;
}
/* ---------------------------------------------------------------------- */
template<class DeviceType>
void PairZBLKokkos<DeviceType>::cleanup_copy() {
// WHY needed: this prevents parent copy from deallocating any arrays
allocated = 0;
cutsq = NULL;
eatom = NULL;
vatom = NULL;
}
namespace LAMMPS_NS {
template class PairZBLKokkos<LMPDeviceType>;
#ifdef KOKKOS_HAVE_CUDA
template class PairZBLKokkos<LMPHostType>;
#endif
}

View File

@ -0,0 +1,113 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef PAIR_CLASS
PairStyle(zbl/kk,PairZBLKokkos<LMPDeviceType>)
PairStyle(zbl/kk/device,PairZBLKokkos<LMPDeviceType>)
PairStyle(zbl/kk/host,PairZBLKokkos<LMPHostType>)
#else
#ifndef LMP_PAIR_ZBL_KOKKOS_H
#define LMP_PAIR_ZBL_KOKKOS_H
#include "pair_zbl.h"
#include "pair_kokkos.h"
#include "neigh_list_kokkos.h"
namespace LAMMPS_NS {
template<class DeviceType>
class PairZBLKokkos : public PairZBL {
public:
enum {EnabledNeighFlags=FULL|HALFTHREAD|HALF};
enum {COUL_FLAG=0};
typedef DeviceType device_type;
typedef ArrayTypes<DeviceType> AT;
PairZBLKokkos(class LAMMPS *);
virtual ~PairZBLKokkos();
void compute(int, int);
void init_style();
F_FLOAT init_one(int, int);
private:
DAT::tdual_ffloat_1d k_z;
DAT::tdual_ffloat_2d_dl k_d1a,k_d2a,k_d3a,k_d4a,k_zze,k_sw1,k_sw2,k_sw3,k_sw4,k_sw5;
typename AT::t_ffloat_1d d_z;
typename AT::t_ffloat_2d_dl d_d1a,d_d2a,d_d3a,d_d4a,d_zze,d_sw1,d_sw2,d_sw3,d_sw4,d_sw5;
typename AT::t_x_array_randomread x;
typename AT::t_f_array f;
typename AT::t_int_1d_randomread type;
DAT::tdual_efloat_1d k_eatom;
DAT::tdual_virial_array k_vatom;
typename AT::t_efloat_1d d_eatom;
typename AT::t_virial_array d_vatom;
F_FLOAT m_cutsq[MAX_TYPES_STACKPARAMS+1][MAX_TYPES_STACKPARAMS+1];
typename AT::t_ffloat_2d_dl d_cutsq;
int newton_pair;
int neighflag;
int nlocal,nall,eflag,vflag;
double special_lj[4];
KOKKOS_INLINE_FUNCTION
F_FLOAT e_zbl(F_FLOAT, int, int) const;
KOKKOS_INLINE_FUNCTION
F_FLOAT dzbldr(F_FLOAT, int, int) const;
KOKKOS_INLINE_FUNCTION
F_FLOAT d2zbldr2(F_FLOAT, int, int) const;
template<bool STACKPARAMS, class Specialisation>
KOKKOS_INLINE_FUNCTION
F_FLOAT compute_fpair(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const;
template<bool STACKPARAMS, class Specialisation>
KOKKOS_INLINE_FUNCTION
F_FLOAT compute_evdwl(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const;
template<bool STACKPARAMS, class Specialisation>
KOKKOS_INLINE_FUNCTION
F_FLOAT compute_ecoul(const F_FLOAT& rsq, const int& i, const int&j, const int& itype, const int& jtype) const {
return 0;
}
void cleanup_copy();
void allocate();
friend class PairComputeFunctor<PairZBLKokkos,FULL,true>;
friend class PairComputeFunctor<PairZBLKokkos,HALF,true>;
friend class PairComputeFunctor<PairZBLKokkos,HALFTHREAD,true>;
friend class PairComputeFunctor<PairZBLKokkos,FULL,false>;
friend class PairComputeFunctor<PairZBLKokkos,HALF,false>;
friend class PairComputeFunctor<PairZBLKokkos,HALFTHREAD,false>;
friend EV_FLOAT pair_compute_neighlist<PairZBLKokkos,FULL,void>(PairZBLKokkos*,NeighListKokkos<DeviceType>*);
friend EV_FLOAT pair_compute_neighlist<PairZBLKokkos,HALF,void>(PairZBLKokkos*,NeighListKokkos<DeviceType>*);
friend EV_FLOAT pair_compute_neighlist<PairZBLKokkos,HALFTHREAD,void>(PairZBLKokkos*,NeighListKokkos<DeviceType>*);
friend EV_FLOAT pair_compute<PairZBLKokkos,void>(PairZBLKokkos*,NeighListKokkos<DeviceType>*);
friend void pair_virial_fdotr_compute<PairZBLKokkos>(PairZBLKokkos*);
};
}
#endif
#endif
/* ERROR/WARNING messages:
*/

211
src/KOKKOS/sna_kokkos.h Normal file
View File

@ -0,0 +1,211 @@
/* -*- c++ -*- -------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing authors: Christian Trott (SNL), Stan Moore (SNL)
------------------------------------------------------------------------- */
#ifndef LMP_SNA_KOKKOS_H
#define LMP_SNA_KOKKOS_H
#include <complex>
#include <ctime>
#include <Kokkos_Core.hpp>
#include "kokkos_type.h"
namespace LAMMPS_NS {
struct SNAKK_LOOPINDICES {
int j1, j2, j;
};
template<class DeviceType>
class SNAKokkos {
public:
typedef Kokkos::View<int*, DeviceType> t_sna_1i;
typedef Kokkos::View<double*, DeviceType> t_sna_1d;
typedef Kokkos::View<double**, Kokkos::LayoutRight, DeviceType> t_sna_2d;
typedef Kokkos::View<double***, Kokkos::LayoutRight, DeviceType> t_sna_3d;
typedef Kokkos::View<double***, Kokkos::LayoutRight, DeviceType, Kokkos::MemoryTraits<Kokkos::Atomic> > t_sna_3d_atomic;
typedef Kokkos::View<double***[3], Kokkos::LayoutRight, DeviceType> t_sna_4d;
typedef Kokkos::View<double**[3], Kokkos::LayoutRight, DeviceType> t_sna_3d3;
typedef Kokkos::View<double*****, Kokkos::LayoutRight, DeviceType> t_sna_5d;
inline
SNAKokkos() {};
KOKKOS_INLINE_FUNCTION
SNAKokkos(const SNAKokkos<DeviceType>& sna, const typename Kokkos::TeamPolicy<DeviceType>::member_type& team);
inline
SNAKokkos(double, int, int, int, double, int, int);
KOKKOS_INLINE_FUNCTION
~SNAKokkos();
inline
void build_indexlist(); // SNAKokkos()
inline
void init(); //
inline
T_INT size_team_scratch_arrays();
inline
T_INT size_thread_scratch_arrays();
double memory_usage();
int ncoeff;
// functions for bispectrum coefficients
KOKKOS_INLINE_FUNCTION
void compute_ui(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team, int); // ForceSNAP
KOKKOS_INLINE_FUNCTION
void compute_zi(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); // ForceSNAP
KOKKOS_INLINE_FUNCTION
void compute_bi(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); // ForceSNAP
KOKKOS_INLINE_FUNCTION
void copy_bi2bvec(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); //ForceSNAP
// functions for derivatives
KOKKOS_INLINE_FUNCTION
void compute_duidrj(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team, double*, double, double); //ForceSNAP
KOKKOS_INLINE_FUNCTION
void compute_dbidrj(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); //ForceSNAP
KOKKOS_INLINE_FUNCTION
void copy_dbi2dbvec(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); //ForceSNAP
KOKKOS_INLINE_FUNCTION
double compute_sfac(double, double); // add_uarraytot, compute_duarray
KOKKOS_INLINE_FUNCTION
double compute_dsfac(double, double); // compute_duarray
#ifdef TIMING_INFO
double* timers;
timespec starttime, endtime;
int print;
int counter;
#endif
//per sna class instance for OMP use
// Per InFlight Particle
t_sna_2d rij;
t_sna_1i inside;
t_sna_1d wj;
t_sna_1d rcutij;
int nmax;
void grow_rij(int);
int twojmax, diagonalstyle;
// Per InFlight Particle
t_sna_3d barray;
t_sna_3d uarraytot_r, uarraytot_i;
t_sna_3d_atomic uarraytot_r_a, uarraytot_i_a;
t_sna_5d zarray_r, zarray_i;
// Per InFlight Interaction
t_sna_3d uarray_r, uarray_i;
Kokkos::View<double*, Kokkos::LayoutRight, DeviceType> bvec;
// derivatives of data
Kokkos::View<double*[3], Kokkos::LayoutRight, DeviceType> dbvec;
t_sna_4d duarray_r, duarray_i;
t_sna_4d dbarray;
private:
double rmin0, rfac0;
//use indexlist instead of loops, constructor generates these
// Same accross all SNAKokkos
Kokkos::View<SNAKK_LOOPINDICES*, DeviceType> idxj,idxj_full;
int idxj_max,idxj_full_max;
// data for bispectrum coefficients
// Same accross all SNAKokkos
t_sna_5d cgarray;
t_sna_2d rootpqarray;
static const int nmaxfactorial = 167;
KOKKOS_INLINE_FUNCTION
double factorial(int);
KOKKOS_INLINE_FUNCTION
void create_team_scratch_arrays(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); // SNAKokkos()
KOKKOS_INLINE_FUNCTION
void create_thread_scratch_arrays(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); // SNAKokkos()
inline
void init_clebsch_gordan(); // init()
inline
void init_rootpqarray(); // init()
KOKKOS_INLINE_FUNCTION
void zero_uarraytot(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team); // compute_ui
KOKKOS_INLINE_FUNCTION
void addself_uarraytot(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team, double); // compute_ui
KOKKOS_INLINE_FUNCTION
void add_uarraytot(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team, double, double, double); // compute_ui
KOKKOS_INLINE_FUNCTION
void compute_uarray(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team,
double, double, double,
double, double); // compute_ui
KOKKOS_INLINE_FUNCTION
double deltacg(int, int, int); // init_clebsch_gordan
inline
int compute_ncoeff(); // SNAKokkos()
KOKKOS_INLINE_FUNCTION
void compute_duarray(const typename Kokkos::TeamPolicy<DeviceType>::member_type& team,
double, double, double, // compute_duidrj
double, double, double, double, double);
// if number of atoms are small use per atom arrays
// for twojmax arrays, rij, inside, bvec
// this will increase the memory footprint considerably,
// but allows parallel filling and reuse of these arrays
int use_shared_arrays;
// Sets the style for the switching function
// 0 = none
// 1 = cosine
int switch_flag;
// Self-weight
double wself;
int bzero_flag; // 1 if bzero subtracted from barray
Kokkos::View<double*, Kokkos::LayoutRight, DeviceType> bzero; // array of B values for isolated atoms
};
}
#include "sna_kokkos_impl.h"
#endif
/* ERROR/WARNING messages:
E: Invalid argument to factorial %d
N must be >= 0 and <= 167, otherwise the factorial result is too
large.
*/

1289
src/KOKKOS/sna_kokkos_impl.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,7 @@ PairStyle(polymorphic,PairPolymorphic)
#define LMP_PAIR_POLYMORPHIC_H
#include "pair.h"
#include <math.h>
namespace LAMMPS_NS {

View File

@ -21,6 +21,7 @@ PairStyle(tersoff/mod,PairTersoffMOD)
#define LMP_PAIR_TERSOFF_MOD_H
#include "pair_tersoff.h"
#include <math.h>
namespace LAMMPS_NS {

View File

@ -107,6 +107,8 @@ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp)
PairSNAP::~PairSNAP()
{
if (copymode) return;
if (nelements) {
for (int i = 0; i < nelements; i++)
delete[] elements[i];
@ -236,6 +238,10 @@ void PairSNAP::compute_regular(int eflag, int vflag)
snaptr->compute_ui(ninside);
snaptr->compute_zi();
if (quadraticflag) {
snaptr->compute_bi();
snaptr->copy_bi2bvec();
}
// for neighbors of I within cutoff:
// compute dUi/drj and dBi/drj
@ -267,8 +273,6 @@ void PairSNAP::compute_regular(int eflag, int vflag)
// quadratic contributions
if (quadraticflag) {
snaptr->compute_bi();
snaptr->copy_bi2bvec();
int k = ncoeff+1;
for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
double bveci = snaptr->bvec[icoeff];
@ -592,6 +596,10 @@ void PairSNAP::compute_optimized(int eflag, int vflag)
sna[tid]->compute_zi();
}
}
if (quadraticflag) {
sna[tid]->compute_bi();
sna[tid]->copy_bi2bvec();
}
// for neighbors of I within cutoff:
// compute dUi/drj and dBi/drj
@ -626,8 +634,6 @@ void PairSNAP::compute_optimized(int eflag, int vflag)
// quadratic contributions
if (quadraticflag) {
sna[tid]->compute_bi();
sna[tid]->copy_bi2bvec();
int k = ncoeff+1;
for (int icoeff = 0; icoeff < ncoeff; icoeff++) {
double bveci = sna[tid]->bvec[icoeff];
@ -677,8 +683,10 @@ void PairSNAP::compute_optimized(int eflag, int vflag)
if (eflag&&pairs[iijj][1] == 0) {
evdwl = coeffi[0];
sna[tid]->compute_bi();
sna[tid]->copy_bi2bvec();
if (!quadraticflag) {
sna[tid]->compute_bi();
sna[tid]->copy_bi2bvec();
}
// E = beta.B + 0.5*B^t.alpha.B
// coeff[k] = beta[k-1] or
@ -1520,9 +1528,9 @@ void PairSNAP::coeff(int narg, char **arg)
sna[tid]->grow_rij(nmax);
}
printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff);
if (ncoeff != sna[0]->ncoeff) {
if (comm->me == 0)
printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff);
if (ncoeff != sna[0]->ncoeff) {
error->all(FLERR,"Incorrect SNAP parameter file");
}

View File

@ -28,14 +28,14 @@ class PairSNAP : public Pair {
public:
PairSNAP(class LAMMPS *);
~PairSNAP();
void compute(int, int);
virtual void compute(int, int);
void compute_regular(int, int);
void compute_optimized(int, int);
void settings(int, char **);
void coeff(int, char **);
void init_style();
double init_one(int, int);
double memory_usage();
virtual void coeff(int, char **);
virtual void init_style();
virtual double init_one(int, int);
virtual double memory_usage();
protected:
int ncoeff, ncoeffq, ncoeffall;
@ -43,7 +43,7 @@ protected:
class SNA** sna;
int nmax;
int nthreads;
void allocate();
virtual void allocate();
void read_files(char *, char *);
inline int equal(double* x,double* y);
inline double dist2(double* x,double* y);

View File

@ -28,6 +28,10 @@
#include "force.h"
#include "pair.h"
#include "pair_hybrid.h"
#include "bond.h"
#include "angle.h"
#include "dihedral.h"
#include "improper.h"
#include "group.h"
#include "input.h"
#include "modify.h"
@ -75,20 +79,21 @@ enum {COMPUTES=1<<0,
VARIABLES=1<<8,
SYSTEM=1<<9,
COMM=1<<10,
ATOM_STYLES=1<<11,
INTEGRATE_STYLES=1<<12,
MINIMIZE_STYLES=1<<13,
PAIR_STYLES=1<<14,
BOND_STYLES=1<<15,
ANGLE_STYLES=1<<16,
DIHEDRAL_STYLES=1<<17,
IMPROPER_STYLES=1<<18,
KSPACE_STYLES=1<<19,
FIX_STYLES=1<<20,
COMPUTE_STYLES=1<<21,
REGION_STYLES=1<<22,
DUMP_STYLES=1<<23,
COMMAND_STYLES=1<<24,
COEFFS=1<<11,
ATOM_STYLES=1<<12,
INTEGRATE_STYLES=1<<13,
MINIMIZE_STYLES=1<<14,
PAIR_STYLES=1<<15,
BOND_STYLES=1<<16,
ANGLE_STYLES=1<<17,
DIHEDRAL_STYLES=1<<18,
IMPROPER_STYLES=1<<19,
KSPACE_STYLES=1<<20,
FIX_STYLES=1<<21,
COMPUTE_STYLES=1<<22,
REGION_STYLES=1<<23,
DUMP_STYLES=1<<24,
COMMAND_STYLES=1<<25,
ALL=~0};
static const int STYLES = ATOM_STYLES | INTEGRATE_STYLES | MINIMIZE_STYLES
@ -183,6 +188,9 @@ void Info::command(int narg, char **arg)
} else if (strncmp(arg[idx],"system",3) == 0) {
flags |= SYSTEM;
++idx;
} else if (strncmp(arg[idx],"coeffs",3) == 0) {
flags |= COEFFS;
++idx;
} else if (strncmp(arg[idx],"styles",3) == 0) {
if (idx+1 < narg) {
++idx;
@ -440,6 +448,69 @@ void Info::command(int narg, char **arg)
}
}
if (domain->box_exist && (flags & COEFFS)) {
Pair *pair=force->pair;
fprintf(out,"\nCoeff information:\n");
if (pair) {
fprintf(out,"Pair Coeffs:\n");
for (int i=1; i <= atom->ntypes; ++i)
for (int j=i; j <= atom->ntypes; ++j) {
fprintf(out,"%3d %3d :",i,j);
if (pair->allocated && pair->setflag[i][j]) fputs(" is set\n",out);
else fputs (" is not set\n",out);
}
}
if (force->bond) {
Bond *bond=force->bond;
if (bond) {
fprintf(out,"Bond Coeffs:\n");
for (int i=1; i <= atom->nbondtypes; ++i) {
fprintf(out,"%3d :",i);
if (bond->allocated && bond->setflag[i]) fputs(" is set\n",out);
else fputs (" is not set\n",out);
}
}
}
if (force->angle) {
Angle *angle=force->angle;
if (angle) {
fprintf(out,"Angle Coeffs:\n");
for (int i=1; i <= atom->nangletypes; ++i) {
fprintf(out,"%3d :",i);
if (angle->allocated && angle->setflag[i]) fputs(" is set\n",out);
else fputs (" is not set\n",out);
}
}
}
if (force->dihedral) {
Dihedral *dihedral=force->dihedral;
if (dihedral) {
fprintf(out,"Dihedral Coeffs:\n");
for (int i=1; i <= atom->ndihedraltypes; ++i) {
fprintf(out,"%3d :",i);
if (dihedral->allocated && dihedral->setflag[i]) fputs(" is set\n",out);
else fputs (" is not set\n",out);
}
}
}
if (force->improper) {
Improper *b=force->improper;
if (b) {
fprintf(out,"Improper Coeffs:\n");
for (int i=1; i <= atom->nimpropertypes; ++i) {
fprintf(out,"%3d :",i);
if (b->allocated && b->setflag[i]) fputs(" is set\n",out);
else fputs (" is not set\n",out);
}
}
}
}
if (flags & GROUPS) {
int ngroup = group->ngroup;
char **names = group->names;

View File

@ -1107,11 +1107,6 @@ void Neighbor::morph_halffull()
if (!irq->half) continue;
// Kokkos doesn't yet support half from full
if (irq->kokkos_host) continue;
if (irq->kokkos_device) continue;
// these lists are created other ways, no need for halffull
// do want to process skip lists

View File

@ -32,12 +32,16 @@ NPair::NPair(LAMMPS *lmp)
last_build = -1;
mycutneighsq = NULL;
molecular = atom->molecular;
copymode = 0;
execution_space = Host;
}
/* ---------------------------------------------------------------------- */
NPair::~NPair()
{
if (copymode) return;
memory->destroy(mycutneighsq);
}

View File

@ -134,6 +134,9 @@ class NPair : protected Pointers {
}
return 0;
};
int copymode;
ExecutionSpace execution_space;
};
}

View File

@ -48,6 +48,8 @@ PairZBL::PairZBL(LAMMPS *lmp) : Pair(lmp) {}
PairZBL::~PairZBL()
{
if (copymode) return;
if (allocated) {
memory->destroy(setflag);
memory->destroy(cutsq);

View File

@ -31,8 +31,8 @@ class PairZBL : public Pair {
virtual void compute(int, int);
void settings(int, char **);
void coeff(int, char **);
void init_style();
double init_one(int, int);
virtual void init_style();
virtual double init_one(int, int);
double single(int, int, int, int, double, double, double, double &);
protected:
@ -42,7 +42,7 @@ class PairZBL : public Pair {
double **d1a,**d2a,**d3a,**d4a,**zze;
double **sw1,**sw2,**sw3,**sw4,**sw5;
void allocate();
virtual void allocate();
double e_zbl(double, int, int);
double dzbldr(double, int, int);
double d2zbldr2(double, int, int);

View File

@ -516,9 +516,12 @@ void Variable::set(int narg, char **arg)
strcpy(names[nvar],arg[0]);
for (int i = 0; i < n-1; i++)
if (!isalnum(names[nvar][i]) && names[nvar][i] != '_')
error->all(FLERR,"Variable name must be alphanumeric or "
"underscore characters");
if (!isalnum(names[nvar][i]) && names[nvar][i] != '_') {
char errmsg[128];
sprintf(errmsg,"Variable name '%s' must have only alphanumeric "
"characters or underscore",names[nvar]);
error->all(FLERR,errmsg);
}
nvar++;
}
@ -571,11 +574,15 @@ int Variable::next(int narg, char **arg)
for (int iarg = 0; iarg < narg; iarg++) {
ivar = find(arg[iarg]);
if (ivar < 0) error->all(FLERR,"Invalid variable in next command");
if (ivar < 0) {
char errmsg[128];
sprintf(errmsg,"Invalid variable '%s' in next command",arg[iarg]);
error->all(FLERR,errmsg);
}
if (style[ivar] == ULOOP && style[find(arg[0])] == UNIVERSE) continue;
else if (style[ivar] == UNIVERSE && style[find(arg[0])] == ULOOP) continue;
else if (style[ivar] != style[find(arg[0])])
error->all(FLERR,"All variables in next command must be same style");
error->all(FLERR,"All variables in next command must have same style");
}
// invalid styles: STRING, EQUAL, WORLD, ATOM, VECTOR, GETENV,
@ -822,7 +829,8 @@ char *Variable::retrieve(char *name)
if (which[ivar] >= num[ivar]) return NULL;
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
print_var_error(FLERR,"Variable has a circular dependency",ivar);
eval_in_progress[ivar] = 1;
char *str = NULL;
@ -844,7 +852,7 @@ char *Variable::retrieve(char *name)
strcpy(data[ivar][0],result);
str = data[ivar][0];
} else if (style[ivar] == EQUAL) {
double answer = evaluate(data[ivar][0],NULL);
double answer = evaluate(data[ivar][0],NULL,ivar);
sprintf(data[ivar][1],"%.15g",answer);
str = data[ivar][1];
} else if (style[ivar] == FORMAT) {
@ -865,9 +873,12 @@ char *Variable::retrieve(char *name)
strcpy(data[ivar][1],result);
str = data[ivar][1];
} else if (style[ivar] == PYTHON) {
int ifunc = python->variable_match(data[ivar][0],names[ivar],0);
if (ifunc < 0)
error->all(FLERR,"Python variable does not match Python function");
int ifunc = python->variable_match(data[ivar][0],name,0);
if (ifunc < 0) {
char errmsg[128];
sprintf(errmsg,"Python variable '%s' does not match Python function",name);
error->all(FLERR,errmsg);
}
python->invoke_function(ifunc,data[ivar][1]);
str = data[ivar][1];
// if Python func returns a string longer than VALUELENGTH
@ -895,15 +906,17 @@ char *Variable::retrieve(char *name)
double Variable::compute_equal(int ivar)
{
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
print_var_error(FLERR,"Variable has a circular dependency",ivar);
eval_in_progress[ivar] = 1;
double value = 0.0;
if (style[ivar] == EQUAL) value = evaluate(data[ivar][0],NULL);
if (style[ivar] == EQUAL) value = evaluate(data[ivar][0],NULL,ivar);
else if (style[ivar] == INTERNAL) value = dvalue[ivar];
else if (style[ivar] == PYTHON) {
int ifunc = python->find(data[ivar][0]);
if (ifunc < 0) error->all(FLERR,"Python variable has no function");
if (ifunc < 0)
print_var_error(FLERR,"Python variable has no function",ivar);
python->invoke_function(ifunc,data[ivar][1]);
value = atof(data[ivar][1]);
}
@ -937,7 +950,8 @@ void Variable::compute_atom(int ivar, int igroup,
double *vstore;
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
print_var_error(FLERR,"Variable has a circular dependency",ivar);
eval_in_progress[ivar] = 1;
if (style[ivar] == ATOM) {
@ -1011,16 +1025,19 @@ int Variable::compute_vector(int ivar, double **result)
}
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
print_var_error(FLERR,"Variable has a circular dependency",ivar);
eval_in_progress[ivar] = 1;
treetype = VECTOR;
evaluate(data[ivar][0],&tree);
collapse_tree(tree);
int nlen = size_tree_vector(tree);
if (nlen == 0) error->all(FLERR,"Vector-style variable has zero length");
if (nlen < 0) error->all(FLERR,
"Inconsistent lengths in vector-style variable");
if (nlen == 0)
print_var_error(FLERR,"Vector-style variable has zero length",ivar);
if (nlen < 0)
print_var_error(FLERR,"Inconsistent lengths in vector-style variable",ivar);
// (re)allocate space for results if necessary
@ -1148,7 +1165,7 @@ void Variable::copy(int narg, char **from, char **to)
create a parse tree and return it
------------------------------------------------------------------------- */
double Variable::evaluate(char *str, Tree **tree)
double Variable::evaluate(char *str, Tree **tree, int ivar)
{
int op,opprevious;
double value1,value2;
@ -1177,11 +1194,12 @@ double Variable::evaluate(char *str, Tree **tree)
// ----------------
else if (onechar == '(') {
if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula");
if (expect == OP)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
expect = OP;
char *contents;
i = find_matching_paren(str,i,contents);
i = find_matching_paren(str,i,contents,ivar);
i++;
// evaluate contents and push on stack
@ -1199,7 +1217,8 @@ double Variable::evaluate(char *str, Tree **tree)
// ----------------
} else if (isdigit(onechar) || onechar == '.') {
if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula");
if (expect == OP)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
expect = OP;
// istop = end of number, including scientific notation
@ -1235,7 +1254,8 @@ double Variable::evaluate(char *str, Tree **tree)
// ----------------
} else if (isalpha(onechar)) {
if (expect == OP) error->all(FLERR,"Invalid syntax in variable formula");
if (expect == OP)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
expect = OP;
// istop = end of word
@ -1256,8 +1276,8 @@ double Variable::evaluate(char *str, Tree **tree)
if (strncmp(word,"c_",2) == 0 || strncmp(word,"C_",2) == 0) {
if (domain->box_exist == 0)
error->all(FLERR,
"Variable evaluation before simulation box is defined");
print_var_error(FLERR,"Variable evaluation before "
"simulation box is defined",ivar);
// uppercase used to force access of
// global vector vs global scalar, and global array vs global vector
@ -1267,7 +1287,7 @@ double Variable::evaluate(char *str, Tree **tree)
int icompute = modify->find_compute(word+2);
if (icompute < 0)
error->all(FLERR,"Invalid compute ID in variable formula");
print_var_error(FLERR,"Invalid compute ID in variable formula",ivar);
Compute *compute = modify->compute[icompute];
// parse zero or one or two trailing brackets
@ -1297,8 +1317,8 @@ double Variable::evaluate(char *str, Tree **tree)
if (update->whichflag == 0) {
if (compute->invoked_scalar != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable between "
"runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_SCALAR)) {
compute->compute_scalar();
compute->invoked_flag |= INVOKED_SCALAR;
@ -1320,12 +1340,12 @@ double Variable::evaluate(char *str, Tree **tree)
if (index1 > compute->size_vector &&
compute->size_vector_variable == 0)
error->all(FLERR,"Variable formula compute vector "
"is accessed out-of-range");
print_var_error(FLERR,"Variable formula compute vector "
"is accessed out-of-range",ivar);
if (update->whichflag == 0) {
if (compute->invoked_vector != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable between runs "
"is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_VECTOR)) {
compute->compute_vector();
compute->invoked_flag |= INVOKED_VECTOR;
@ -1349,15 +1369,15 @@ double Variable::evaluate(char *str, Tree **tree)
if (index1 > compute->size_array_rows &&
compute->size_array_rows_variable == 0)
error->all(FLERR,"Variable formula compute array "
"is accessed out-of-range");
print_var_error(FLERR,"Variable formula compute array "
"is accessed out-of-range",ivar);
if (index2 > compute->size_array_cols)
error->all(FLERR,"Variable formula compute array "
"is accessed out-of-range");
print_var_error(FLERR,"Variable formula compute array "
"is accessed out-of-range",ivar);
if (update->whichflag == 0) {
if (compute->invoked_array != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable between runs "
"is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_ARRAY)) {
compute->compute_array();
compute->invoked_flag |= INVOKED_ARRAY;
@ -1380,17 +1400,18 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 0 && compute->vector_flag) {
if (tree == NULL)
error->all(FLERR,
"Compute global vector in equal-style variable formula");
print_var_error(FLERR,"Compute global vector in "
"equal-style variable formula",ivar);
if (treetype == ATOM)
error->all(FLERR,
"Compute global vector in atom-style variable formula");
if (compute->size_vector == 0)
error->all(FLERR,"Variable formula compute vector is zero length");
print_var_error(FLERR,"Compute global vector in "
"atom-style variable formula",ivar);
if (compute->size_vector == 0)
print_var_error(FLERR,"Variable formula compute "
"vector is zero length",ivar);
if (update->whichflag == 0) {
if (compute->invoked_vector != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable between "
"runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_VECTOR)) {
compute->compute_vector();
compute->invoked_flag |= INVOKED_VECTOR;
@ -1399,7 +1420,7 @@ double Variable::evaluate(char *str, Tree **tree)
Tree *newtree = new Tree();
newtree->type = VECTORARRAY;
newtree->array = compute->vector;
newtree->nvector = compute->size_vector;
newtree->nvector = compute->size_vector;
newtree->nstride = 1;
newtree->selfalloc = 0;
newtree->first = newtree->second = NULL;
@ -1411,17 +1432,18 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 1 && compute->array_flag) {
if (tree == NULL)
error->all(FLERR,
"Compute global vector in equal-style variable formula");
print_var_error(FLERR,"Compute global vector in "
"equal-style variable formula",ivar);
if (treetype == ATOM)
error->all(FLERR,
"Compute global vector in atom-style variable formula");
if (compute->size_array_rows == 0)
error->all(FLERR,"Variable formula compute array is zero length");
print_var_error(FLERR,"Compute global vector in "
"atom-style variable formula",ivar);
if (compute->size_array_rows == 0)
print_var_error(FLERR,"Variable formula compute array "
"is zero length",ivar);
if (update->whichflag == 0) {
if (compute->invoked_array != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable between "
"runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_ARRAY)) {
compute->compute_array();
compute->invoked_flag |= INVOKED_ARRAY;
@ -1430,7 +1452,7 @@ double Variable::evaluate(char *str, Tree **tree)
Tree *newtree = new Tree();
newtree->type = VECTORARRAY;
newtree->array = &compute->array[0][index1-1];
newtree->nvector = compute->size_array_rows;
newtree->nvector = compute->size_array_rows;
newtree->nstride = compute->size_array_cols;
newtree->selfalloc = 0;
newtree->first = newtree->second = NULL;
@ -1444,8 +1466,8 @@ double Variable::evaluate(char *str, Tree **tree)
if (update->whichflag == 0) {
if (compute->invoked_peratom != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable "
"between runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_PERATOM)) {
compute->compute_peratom();
compute->invoked_flag |= INVOKED_PERATOM;
@ -1460,12 +1482,12 @@ double Variable::evaluate(char *str, Tree **tree)
compute->size_peratom_cols > 0) {
if (index2 > compute->size_peratom_cols)
error->all(FLERR,"Variable formula compute array "
"is accessed out-of-range");
print_var_error(FLERR,"Variable formula compute "
"array is accessed out-of-range",ivar);
if (update->whichflag == 0) {
if (compute->invoked_peratom != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable "
"between runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_PERATOM)) {
compute->compute_peratom();
compute->invoked_flag |= INVOKED_PERATOM;
@ -1486,15 +1508,15 @@ double Variable::evaluate(char *str, Tree **tree)
compute->size_peratom_cols == 0) {
if (tree == NULL)
error->all(FLERR,
"Per-atom compute in equal-style variable formula");
print_var_error(FLERR,"Per-atom compute in "
"equal-style variable formula",ivar);
if (treetype == VECTOR)
error->all(FLERR,
"Per-atom compute in vector-style variable formula");
print_var_error(FLERR,"Per-atom compute in "
"vector-style variable formula",ivar);
if (update->whichflag == 0) {
if (compute->invoked_peratom != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable "
"between runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_PERATOM)) {
compute->compute_peratom();
compute->invoked_flag |= INVOKED_PERATOM;
@ -1515,18 +1537,18 @@ double Variable::evaluate(char *str, Tree **tree)
compute->size_peratom_cols > 0) {
if (tree == NULL)
error->all(FLERR,
"Per-atom compute in equal-style variable formula");
print_var_error(FLERR,"Per-atom compute in "
"equal-style variable formula",ivar);
if (treetype == VECTOR)
error->all(FLERR,
"Per-atom compute in vector-style variable formula");
print_var_error(FLERR,"Per-atom compute in "
"vector-style variable formula",ivar);
if (index1 > compute->size_peratom_cols)
error->all(FLERR,"Variable formula compute array "
"is accessed out-of-range");
print_var_error(FLERR,"Variable formula compute array "
"is accessed out-of-range",ivar);
if (update->whichflag == 0) {
if (compute->invoked_peratom != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs "
"is not current");
print_var_error(FLERR,"Compute used in variable "
"between runs is not current",ivar);
} else if (!(compute->invoked_flag & INVOKED_PERATOM)) {
compute->compute_peratom();
compute->invoked_flag |= INVOKED_PERATOM;
@ -1544,7 +1566,7 @@ double Variable::evaluate(char *str, Tree **tree)
newtree->nextra = 0;
treestack[ntreestack++] = newtree;
} else error->all(FLERR,"Mismatched compute in variable formula");
} else print_var_error(FLERR,"Mismatched compute in variable formula",ivar);
// ----------------
// fix
@ -1552,8 +1574,7 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (strncmp(word,"f_",2) == 0 || strncmp(word,"F_",2) == 0) {
if (domain->box_exist == 0)
error->all(FLERR,
"Variable evaluation before simulation box is defined");
print_var_error(FLERR,"Variable evaluation before simulation box is defined",ivar);
// uppercase used to force access of
// global vector vs global scalar, and global array vs global vector
@ -1562,7 +1583,11 @@ double Variable::evaluate(char *str, Tree **tree)
if (word[0] == 'F') lowercase = 0;
int ifix = modify->find_fix(word+2);
if (ifix < 0) error->all(FLERR,"Invalid fix ID in variable formula");
if (ifix < 0) {
char msg[128];
sprintf(msg,"Invalid fix ID '%s' in variable formula",word+2);
print_var_error(FLERR,msg,ivar);
}
Fix *fix = modify->fix[ifix];
// parse zero or one or two trailing brackets
@ -1591,7 +1616,8 @@ double Variable::evaluate(char *str, Tree **tree)
if (nbracket == 0 && fix->scalar_flag && lowercase) {
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed "
"at a compatible time",ivar);
value1 = fix->compute_scalar();
if (tree) {
@ -1609,10 +1635,11 @@ double Variable::evaluate(char *str, Tree **tree)
if (index1 > fix->size_vector &&
fix->size_vector_variable == 0)
error->all(FLERR,"Variable formula fix vector is "
"accessed out-of-range");
print_var_error(FLERR,"Variable formula fix vector is "
"accessed out-of-range",ivar);
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed "
"at a compatible time",ivar);
value1 = fix->compute_vector(index1-1);
if (tree) {
@ -1630,13 +1657,11 @@ double Variable::evaluate(char *str, Tree **tree)
if (index1 > fix->size_array_rows &&
fix->size_array_rows_variable == 0)
error->all(FLERR,
"Variable formula fix array is accessed out-of-range");
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar);
if (index2 > fix->size_array_cols)
error->all(FLERR,
"Variable formula fix array is accessed out-of-range");
print_var_error(FLERR,"Variable formula fix array is accessed out-of-range",ivar);
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar);
value1 = fix->compute_array(index1-1,index2-1);
if (tree) {
@ -1653,15 +1678,13 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 0 && fix->vector_flag) {
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar);
if (tree == NULL)
error->all(FLERR,"Fix global vector in "
"equal-style variable formula");
print_var_error(FLERR,"Fix global vector in ""equal-style variable formula",ivar);
if (treetype == ATOM)
error->all(FLERR,"Fix global vector in "
"atom-style variable formula");
if (fix->size_vector == 0)
error->all(FLERR,"Variable formula fix vector is zero length");
print_var_error(FLERR,"Fix global vector in ""atom-style variable formula",ivar);
if (fix->size_vector == 0)
print_var_error(FLERR,"Variable formula fix vector is zero length",ivar);
int nvec = fix->size_vector;
double *vec;
@ -1672,7 +1695,7 @@ double Variable::evaluate(char *str, Tree **tree)
Tree *newtree = new Tree();
newtree->type = VECTORARRAY;
newtree->array = vec;
newtree->nvector = nvec;
newtree->nvector = nvec;
newtree->nstride = 1;
newtree->selfalloc = 1;
newtree->first = newtree->second = NULL;
@ -1684,26 +1707,27 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 1 && fix->array_flag) {
if (update->whichflag > 0 && update->ntimestep % fix->global_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed "
"at a compatible time",ivar);
if (tree == NULL)
error->all(FLERR,"Fix global vector in "
"equal-style variable formula");
print_var_error(FLERR,"Fix global vector in "
"equal-style variable formula",ivar);
if (treetype == ATOM)
error->all(FLERR,"Fix global vector in "
"atom-style variable formula");
if (fix->size_array_rows == 0)
error->all(FLERR,"Variable formula fix array is zero length");
print_var_error(FLERR,"Fix global vector in "
"atom-style variable formula",ivar);
if (fix->size_array_rows == 0)
print_var_error(FLERR,"Variable formula fix array is zero length",ivar);
int nvec = fix->size_array_rows;
double *vec;
memory->create(vec,nvec,"variable:values");
for (int m = 0; m < nvec; m++)
vec[m] = fix->compute_array(m,index1-1);
int nvec = fix->size_array_rows;
double *vec;
memory->create(vec,nvec,"variable:values");
for (int m = 0; m < nvec; m++)
vec[m] = fix->compute_array(m,index1-1);
Tree *newtree = new Tree();
newtree->type = VECTORARRAY;
newtree->array = vec;
newtree->nvector = nvec;
newtree->nvector = nvec;
newtree->nstride = 1;
newtree->selfalloc = 1;
newtree->first = newtree->second = NULL;
@ -1717,8 +1741,8 @@ double Variable::evaluate(char *str, Tree **tree)
if (update->whichflag > 0 &&
update->ntimestep % fix->peratom_freq)
error->all(FLERR,
"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed "
"at a compatible time",ivar);
peratom2global(1,NULL,fix->vector_atom,1,index1,
tree,treestack,ntreestack,argstack,nargstack);
@ -1729,11 +1753,12 @@ double Variable::evaluate(char *str, Tree **tree)
fix->size_peratom_cols > 0) {
if (index2 > fix->size_peratom_cols)
error->all(FLERR,
"Variable formula fix array is accessed out-of-range");
print_var_error(FLERR,"Variable formula fix array is "
"accessed out-of-range",ivar);
if (update->whichflag > 0 &&
update->ntimestep % fix->peratom_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed "
"at a compatible time",ivar);
if (fix->array_atom)
peratom2global(1,NULL,&fix->array_atom[0][index2-1],
@ -1750,10 +1775,10 @@ double Variable::evaluate(char *str, Tree **tree)
fix->size_peratom_cols == 0) {
if (tree == NULL)
error->all(FLERR,"Per-atom fix in equal-style variable formula");
print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar);
if (update->whichflag > 0 &&
update->ntimestep % fix->peratom_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar);
Tree *newtree = new Tree();
newtree->type = ATOMARRAY;
@ -1770,13 +1795,13 @@ double Variable::evaluate(char *str, Tree **tree)
fix->size_peratom_cols > 0) {
if (tree == NULL)
error->all(FLERR,"Per-atom fix in equal-style variable formula");
print_var_error(FLERR,"Per-atom fix in equal-style variable formula",ivar);
if (index1 > fix->size_peratom_cols)
error->all(FLERR,
"Variable formula fix array is accessed out-of-range");
print_var_error(FLERR,"Variable formula fix array "
"is accessed out-of-range",ivar);
if (update->whichflag > 0 &&
update->ntimestep % fix->peratom_freq)
error->all(FLERR,"Fix in variable not computed at compatible time");
print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar);
Tree *newtree = new Tree();
newtree->type = ATOMARRAY;
@ -1790,7 +1815,7 @@ double Variable::evaluate(char *str, Tree **tree)
newtree->nextra = 0;
treestack[ntreestack++] = newtree;
} else error->all(FLERR,"Mismatched fix in variable formula");
} else print_var_error(FLERR,"Mismatched fix in variable formula",ivar);
// ----------------
// variable
@ -1800,9 +1825,10 @@ double Variable::evaluate(char *str, Tree **tree)
int ivar = find(word+2);
if (ivar < 0)
error->all(FLERR,"Invalid variable name in variable formula");
print_var_error(FLERR,"Invalid variable reference "
"in variable formula",ivar);
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
print_var_error(FLERR,"Variable has circular dependency",ivar);
// parse zero or one trailing brackets
// point i beyond last bracket
@ -1842,7 +1868,7 @@ double Variable::evaluate(char *str, Tree **tree)
char *var = retrieve(word+2);
if (var == NULL)
error->all(FLERR,"Invalid variable evaluation in variable formula");
print_var_error(FLERR,"Invalid variable evaluation in variable formula",ivar);
if (tree) {
Tree *newtree = new Tree();
newtree->type = VALUE;
@ -1858,11 +1884,11 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 0 && style[ivar] == ATOM) {
if (tree == NULL)
error->all(FLERR,
"Atom-style variable in equal-style variable formula");
if (treetype == VECTOR)
error->all(FLERR,
"Atom-style variable in vector-style variable formula");
print_var_error(FLERR,"Atom-style variable in "
"equal-style variable formula",ivar);
if (treetype == VECTOR)
print_var_error(FLERR,"Atom-style variable in "
"vector-style variable formula",ivar);
Tree *newtree;
evaluate(data[ivar][0],&newtree);
@ -1873,11 +1899,11 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 0 && style[ivar] == ATOMFILE) {
if (tree == NULL)
error->all(FLERR,"Atomfile-style variable in "
"equal-style variable formula");
if (treetype == VECTOR)
error->all(FLERR,"Atomfile-style variable in "
"vector-style variable formula");
print_var_error(FLERR,"Atomfile-style variable in "
"equal-style variable formula",ivar);
if (treetype == VECTOR)
print_var_error(FLERR,"Atomfile-style variable in "
"vector-style variable formula",ivar);
Tree *newtree = new Tree();
newtree->type = ATOMARRAY;
@ -1894,11 +1920,11 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (nbracket == 0 && style[ivar] == VECTOR) {
if (tree == NULL)
error->all(FLERR,
"Vector-style variable in equal-style variable formula");
print_var_error(FLERR,"Vector-style variable in "
"equal-style variable formula",ivar);
if (treetype == ATOM)
error->all(FLERR,
"Vector-style variable in atom-style variable formula");
print_var_error(FLERR,"Vector-style variable in "
"atom-style variable formula",ivar);
double *vec;
int nvec = compute_vector(ivar,&vec);
@ -1941,7 +1967,7 @@ double Variable::evaluate(char *str, Tree **tree)
double *vec;
int nvec = compute_vector(ivar,&vec);
if (index <= 0 || index > nvec)
error->all(FLERR,"Invalid index into vector-style variable");
print_var_error(FLERR,"Invalid index into vector-style variable",ivar);
int m = index; // convert from tagint to int
if (tree) {
@ -1953,7 +1979,7 @@ double Variable::evaluate(char *str, Tree **tree)
treestack[ntreestack++] = newtree;
} else argstack[nargstack++] = vec[m-1];
} else error->all(FLERR,"Mismatched variable in variable formula");
} else print_var_error(FLERR,"Mismatched variable in variable formula",ivar);
// ----------------
// math/group/special function or atom value/vector or
@ -1968,7 +1994,7 @@ double Variable::evaluate(char *str, Tree **tree)
if (str[i] == '(') {
char *contents;
i = find_matching_paren(str,i,contents);
i = find_matching_paren(str,i,contents,ivar);
i++;
if (math_function(word,contents,tree,
@ -1977,8 +2003,12 @@ double Variable::evaluate(char *str, Tree **tree)
treestack,ntreestack,argstack,nargstack));
else if (special_function(word,contents,tree,
treestack,ntreestack,argstack,nargstack));
else error->all(FLERR,"Invalid math/group/special function "
"in variable formula");
else {
char msg[128];
sprintf(msg,"Invalid math/group/special function '%s()'"
"in variable formula", word);
print_var_error(FLERR,msg,ivar);
}
delete [] contents;
// ----------------
@ -1987,8 +2017,8 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (str[i] == '[') {
if (domain->box_exist == 0)
error->all(FLERR,
"Variable evaluation before simulation box is defined");
print_var_error(FLERR,"Variable evaluation before "
"simulation box is defined",ivar);
ptr = &str[i];
tagint id = int_between_brackets(ptr,1);
@ -2003,8 +2033,8 @@ double Variable::evaluate(char *str, Tree **tree)
} else if (is_atom_vector(word)) {
if (domain->box_exist == 0)
error->all(FLERR,
"Variable evaluation before simulation box is defined");
print_var_error(FLERR,"Variable evaluation before "
"simulation box is defined",ivar);
atom_vector(word,tree,treestack,ntreestack);
@ -2029,12 +2059,15 @@ double Variable::evaluate(char *str, Tree **tree)
} else {
if (domain->box_exist == 0)
error->all(FLERR,
"Variable evaluation before simulation box is defined");
print_var_error(FLERR,"Variable evaluation before "
"simulation box is defined",ivar);
int flag = output->thermo->evaluate_keyword(word,&value1);
if (flag)
error->all(FLERR,"Invalid thermo keyword in variable formula");
if (flag) {
char msg[128];
sprintf(msg,"Invalid thermo keyword '%s' in variable formula",word);
print_var_error(FLERR,msg,ivar);
}
if (tree) {
Tree *newtree = new Tree();
newtree->type = VALUE;
@ -2061,7 +2094,7 @@ double Variable::evaluate(char *str, Tree **tree)
else if (onechar == '^') op = CARAT;
else if (onechar == '=') {
if (str[i+1] != '=')
error->all(FLERR,"Invalid syntax in variable formula");
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
op = EQ;
i++;
} else if (onechar == '!') {
@ -2083,13 +2116,13 @@ double Variable::evaluate(char *str, Tree **tree)
}
} else if (onechar == '&') {
if (str[i+1] != '&')
error->all(FLERR,"Invalid syntax in variable formula");
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
op = AND;
i++;
} else if (onechar == '|') {
if (str[i+1] == '|') op = OR;
else if (str[i+1] == '^') op = XOR;
else error->all(FLERR,"Invalid syntax in variable formula");
else print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
i++;
} else op = DONE;
@ -2104,7 +2137,8 @@ double Variable::evaluate(char *str, Tree **tree)
continue;
}
if (expect == ARG) error->all(FLERR,"Invalid syntax in variable formula");
if (expect == ARG)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
expect = ARG;
// evaluate stack as deep as possible while respecting precedence
@ -2140,17 +2174,17 @@ double Variable::evaluate(char *str, Tree **tree)
argstack[nargstack++] = value1 * value2;
else if (opprevious == DIVIDE) {
if (value2 == 0.0)
error->all(FLERR,"Divide by 0 in variable formula");
print_var_error(FLERR,"Divide by 0 in variable formula",ivar);
argstack[nargstack++] = value1 / value2;
} else if (opprevious == MODULO) {
if (value2 == 0.0)
error->all(FLERR,"Modulo 0 in variable formula");
print_var_error(FLERR,"Modulo 0 in variable formula",ivar);
argstack[nargstack++] = fmod(value1,value2);
} else if (opprevious == CARAT) {
if (value2 == 0.0)
argstack[nargstack++] = 1.0;
else if ((value1 == 0.0) && (value2 < 0.0))
error->all(FLERR,"Invalid power expression in variable formula");
print_var_error(FLERR,"Invalid power expression in variable formula",ivar);
else argstack[nargstack++] = pow(value1,value2);
} else if (opprevious == UNARY) {
argstack[nargstack++] = -value2;
@ -2197,20 +2231,22 @@ double Variable::evaluate(char *str, Tree **tree)
opstack[nopstack++] = op;
} else error->all(FLERR,"Invalid syntax in variable formula");
} else print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
}
if (nopstack) error->all(FLERR,"Invalid syntax in variable formula");
if (nopstack) print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
// for atom-style variable, return remaining tree
// for equal-style variable, return remaining arg
if (tree) {
if (ntreestack != 1) error->all(FLERR,"Invalid syntax in variable formula");
if (ntreestack != 1)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
*tree = treestack[0];
return 0.0;
} else {
if (nargstack != 1) error->all(FLERR,"Invalid syntax in variable formula");
if (nargstack != 1)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
return argstack[0];
}
}
@ -3133,7 +3169,7 @@ void Variable::free_tree(Tree *tree)
return loc or right paren
------------------------------------------------------------------------- */
int Variable::find_matching_paren(char *str, int i,char *&contents)
int Variable::find_matching_paren(char *str, int i, char *&contents, int ivar)
{
// istop = matching ')' at same level, allowing for nested parens
@ -3146,7 +3182,7 @@ int Variable::find_matching_paren(char *str, int i,char *&contents)
else if (str[i] == ')' && ilevel) ilevel--;
else if (str[i] == ')') break;
}
if (!str[i]) error->all(FLERR,"Invalid syntax in variable formula");
if (!str[i]) print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
int istop = i;
int n = istop - istart - 1;
@ -3929,8 +3965,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
} else index = 0;
int icompute = modify->find_compute(&args[0][2]);
if (icompute < 0)
error->all(FLERR,"Invalid compute ID in variable formula");
if (icompute < 0) {
char msg[128];
sprintf(msg,"Invalid compute ID '%s' in variable formula",word+2);
print_var_error(FLERR,msg,ivar);
}
compute = modify->compute[icompute];
if (index == 0 && compute->vector_flag) {
if (update->whichflag == 0) {
@ -4548,6 +4587,21 @@ char *Variable::find_next_comma(char *str)
return NULL;
}
/* ----------------------------------------------------------------------
debug routine for printing formula tree recursively
------------------------------------------------------------------------- */
void Variable::print_var_error(const char *srcfile, int lineno,
const char *errmsg, int ivar)
{
const char *varname = (const char*)"(unknown)";
if ((ivar >= 0) && (ivar < nvar)) varname = names[ivar];
char msg[128];
sprintf(msg,"Variable %s: %s",varname,errmsg);
error->all(srcfile,lineno,msg);}
/* ----------------------------------------------------------------------
debug routine for printing formula tree recursively
------------------------------------------------------------------------- */

View File

@ -97,13 +97,13 @@ class Variable : protected Pointers {
void remove(int);
void grow();
void copy(int, char **, char **);
double evaluate(char *, Tree **);
double evaluate(char *, Tree **, int ivar=-1);
double collapse_tree(Tree *);
double eval_tree(Tree *, int);
int size_tree_vector(Tree *);
int compare_tree_vector(int, int);
void free_tree(Tree *);
int find_matching_paren(char *, int, char *&);
int find_matching_paren(char *, int, char *&, int ivar=-1);
int math_function(char *, char *, Tree **, Tree **, int &, double *, int &);
int group_function(char *, char *, Tree **, Tree **, int &, double *, int &);
int region_function(char *);
@ -117,6 +117,7 @@ class Variable : protected Pointers {
double constant(char *);
int parse_args(char *, char **);
char *find_next_comma(char *);
void print_var_error(const char *, int, const char *, int);
void print_tree(Tree *, int);
};