diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index 69aff2d72d..63bc168271 100644
--- a/cmake/CMakeLists.txt
+++ b/cmake/CMakeLists.txt
@@ -1220,8 +1220,7 @@ if(PKG_USER-INTEL)
${USER-INTEL_SOURCES_DIR}/fix_nh_intel.cpp
${USER-INTEL_SOURCES_DIR}/intel_buffers.cpp
${USER-INTEL_SOURCES_DIR}/nbin_intel.cpp
- ${USER-INTEL_SOURCES_DIR}/npair_intel.cpp
- ${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.cpp)
+ ${USER-INTEL_SOURCES_DIR}/npair_intel.cpp)
set_property(GLOBAL PROPERTY "USER-INTEL_SOURCES" "${USER-INTEL_SOURCES}")
@@ -1230,9 +1229,12 @@ if(PKG_USER-INTEL)
RegisterNBinStyle(${USER-INTEL_SOURCES_DIR}/nbin_intel.h)
RegisterNPairStyle(${USER-INTEL_SOURCES_DIR}/npair_intel.h)
RegisterFixStyle(${USER-INTEL_SOURCES_DIR}/fix_intel.h)
- RegisterIntegrateStyle(${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.h)
get_property(USER-INTEL_SOURCES GLOBAL PROPERTY USER-INTEL_SOURCES)
+ if(PKG_KSPACE)
+ list(APPEND USER-INTEL_SOURCES ${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.cpp)
+ RegisterIntegrateStyle(${USER-INTEL_SOURCES_DIR}/verlet_lrt_intel.h)
+ endif()
list(APPEND LIB_SOURCES ${USER-INTEL_SOURCES})
include_directories(${USER-INTEL_SOURCES_DIR})
@@ -1370,7 +1372,15 @@ if(PKG_GPU)
set(OCL_COMMON_HEADERS ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_preprocessor.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_aux_fun1.h)
file(GLOB GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/[^.]*.cu)
- list(REMOVE_ITEM GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne.cu ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne_lj.cu)
+ list(REMOVE_ITEM GPU_LIB_CU
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne_lj.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_re_squared.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_re_squared_lj.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_zbl.cu
+ ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_mod.cu
+ )
foreach(GPU_KERNEL ${GPU_LIB_CU})
get_filename_component(basename ${GPU_KERNEL} NAME_WE)
@@ -1381,7 +1391,21 @@ if(PKG_GPU)
GenerateOpenCLHeader(gayberne ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne.cu)
GenerateOpenCLHeader(gayberne_lj ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_lj_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_gayberne_lj.cu)
- list(APPEND GPU_LIB_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_cl.h ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_lj_cl.h)
+ GenerateOpenCLHeader(re_squared ${CMAKE_CURRENT_BINARY_DIR}/gpu/re_squared_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_re_squared.cu)
+ GenerateOpenCLHeader(re_squared_lj ${CMAKE_CURRENT_BINARY_DIR}/gpu/re_squared_lj_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_ellipsoid_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_re_squared_lj.cu)
+ GenerateOpenCLHeader(tersoff ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff.cu)
+ GenerateOpenCLHeader(tersoff_zbl ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_zbl_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_zbl_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_zbl.cu)
+ GenerateOpenCLHeader(tersoff_mod ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_mod_cl.h ${OCL_COMMON_HEADERS} ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_mod_extra.h ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_tersoff_mod.cu)
+
+ list(APPEND GPU_LIB_SOURCES
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/gayberne_lj_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/re_squared_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/re_squared_lj_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_zbl_cl.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gpu/tersoff_mod_cl.h
+ )
add_library(gpu STATIC ${GPU_LIB_SOURCES})
target_link_libraries(gpu ${OpenCL_LIBRARIES})
diff --git a/cmake/Modules/OpenCLUtils.cmake b/cmake/Modules/OpenCLUtils.cmake
index 5c147a685c..a9441ce518 100644
--- a/cmake/Modules/OpenCLUtils.cmake
+++ b/cmake/Modules/OpenCLUtils.cmake
@@ -6,7 +6,7 @@ function(GenerateOpenCLHeader varname outfile files)
foreach(IDX RANGE 2 ${ARG_END})
list(GET ARGV ${IDX} filename)
file(READ ${filename} content)
- string(REGEX REPLACE "\\s*//[^\n]*\n" "" content "${content}")
+ string(REGEX REPLACE "\\s*//[^\n]*\n" "\n" content "${content}")
string(REGEX REPLACE "\\\\" "\\\\\\\\" content "${content}")
string(REGEX REPLACE "\"" "\\\\\"" content "${content}")
string(REGEX REPLACE "([^\n]+)\n" "\"\\1\\\\n\"\n" content "${content}")
diff --git a/cmake/README.md b/cmake/README.md
index a635f3e06d..c11326f9d5 100644
--- a/cmake/README.md
+++ b/cmake/README.md
@@ -211,7 +211,7 @@ cmake -C ../cmake/presets/all_on.cmake -C ../cmake/presets/nolib.cmake -D PKG_GP
- |
+ CMAKE_VERBOSE_MAKEFILE |
Enable verbose output from Makefile builds (useful for debugging), the same can be achived by adding `VERBOSE=1` to the `make` call. |
diff --git a/doc/lammps.1 b/doc/lammps.1
index 4686198fef..db2cc16b67 100644
--- a/doc/lammps.1
+++ b/doc/lammps.1
@@ -1,4 +1,4 @@
-.TH LAMMPS "11 April 2019" "2019-04-11"
+.TH LAMMPS "30 April 2019" "2019-04-30"
.SH NAME
.B LAMMPS
\- Molecular Dynamics Simulator.
diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt
index 17d18243f2..3b9da2db39 100644
--- a/doc/src/Build_extras.txt
+++ b/doc/src/Build_extras.txt
@@ -247,7 +247,10 @@ Maxwell50 = NVIDIA Maxwell generation CC 5.0
Maxwell52 = NVIDIA Maxwell generation CC 5.2
Maxwell53 = NVIDIA Maxwell generation CC 5.3
Pascal60 = NVIDIA Pascal generation CC 6.0
-Pascal61 = NVIDIA Pascal generation CC 6.1 :ul
+Pascal61 = NVIDIA Pascal generation CC 6.1
+Volta70 = NVIDIA Volta generation CC 7.0
+Volta72 = NVIDIA Volta generation CC 7.2
+Turing75 = NVIDIA Turing generation CC 7.5 :ul
[CMake build]:
diff --git a/doc/src/Commands_all.txt b/doc/src/Commands_all.txt
index 66c348ee30..52c2e67e2e 100644
--- a/doc/src/Commands_all.txt
+++ b/doc/src/Commands_all.txt
@@ -83,6 +83,7 @@ An alphabetic list of all general LAMMPS commands.
"molecule"_molecule.html,
"ndx2group"_group2ndx.html,
"neb"_neb.html,
+"neb_spin"_neb_spin.html,
"neigh_modify"_neigh_modify.html,
"neighbor"_neighbor.html,
"newton"_newton.html,
diff --git a/doc/src/Commands_category.txt b/doc/src/Commands_category.txt
index 134dae82bb..14a328b227 100644
--- a/doc/src/Commands_category.txt
+++ b/doc/src/Commands_category.txt
@@ -116,6 +116,7 @@ Actions:
"minimize"_minimize.html,
"neb"_neb.html,
+"neb_spin"_neb_spin.html,
"prd"_prd.html,
"rerun"_rerun.html,
"run"_run.html,
diff --git a/doc/src/Commands_fix.txt b/doc/src/Commands_fix.txt
index 14de1d06dd..d2d781d4b2 100644
--- a/doc/src/Commands_fix.txt
+++ b/doc/src/Commands_fix.txt
@@ -107,6 +107,7 @@ OPT.
"mvv/edpd"_fix_mvv_dpd.html,
"mvv/tdpd"_fix_mvv_dpd.html,
"neb"_fix_neb.html,
+"neb_spin"_fix_neb_spin.html,
"nph (ko)"_fix_nh.html,
"nph/asphere (o)"_fix_nph_asphere.html,
"nph/body"_fix_nph_body.html,
diff --git a/doc/src/Commands_pair.txt b/doc/src/Commands_pair.txt
index f56c991322..e9925b0e0b 100644
--- a/doc/src/Commands_pair.txt
+++ b/doc/src/Commands_pair.txt
@@ -81,6 +81,7 @@ OPT.
"dpd/tstat (go)"_pair_dpd.html,
"dsmc"_pair_dsmc.html,
"e3b"_pair_e3b.html,
+"drip"_pair_drip.html,
"eam (gikot)"_pair_eam.html,
"eam/alloy (gikot)"_pair_eam.html,
"eam/cd (o)"_pair_eam.html,
diff --git a/doc/src/Eqs/neb_spin_angle.jpg b/doc/src/Eqs/neb_spin_angle.jpg
new file mode 100644
index 0000000000..b7021c4f62
Binary files /dev/null and b/doc/src/Eqs/neb_spin_angle.jpg differ
diff --git a/doc/src/Eqs/neb_spin_angle.tex b/doc/src/Eqs/neb_spin_angle.tex
new file mode 100644
index 0000000000..03b133cd77
--- /dev/null
+++ b/doc/src/Eqs/neb_spin_angle.tex
@@ -0,0 +1,15 @@
+\documentclass[preview]{standalone}
+\usepackage{varwidth}
+\usepackage[utf8x]{inputenc}
+\usepackage{amsmath, amssymb, graphics, setspace}
+
+\begin{document}
+\begin{varwidth}{50in}
+ \begin{equation}
+ \omega_i^{\nu} =
+ (\nu - 1) \Delta \omega_i
+ {\rm ~~and~~} \Delta \omega_i = \frac{\omega_i}{Q-1}
+ , \nonumber
+ \end{equation}
+\end{varwidth}
+\end{document}
diff --git a/doc/src/Eqs/neb_spin_k.jpg b/doc/src/Eqs/neb_spin_k.jpg
new file mode 100644
index 0000000000..add309694f
Binary files /dev/null and b/doc/src/Eqs/neb_spin_k.jpg differ
diff --git a/doc/src/Eqs/neb_spin_k.tex b/doc/src/Eqs/neb_spin_k.tex
new file mode 100644
index 0000000000..f0ce8e180e
--- /dev/null
+++ b/doc/src/Eqs/neb_spin_k.tex
@@ -0,0 +1,16 @@
+\documentclass[preview]{standalone}
+\usepackage{varwidth}
+\usepackage[utf8x]{inputenc}
+\usepackage{amsmath, amssymb, graphics, setspace}
+
+\begin{document}
+\begin{varwidth}{50in}
+ \begin{equation}
+ \vec{k}_i =
+ \frac{\vec{m}_i^I \times \vec{m}_i^F}{\left|\vec{m}_i^I
+ \times \vec{m}_i^F\right|}
+ %&{\rm ~if~}& \vec{m}_i^I \times \vec{m}_i^F
+ , \nonumber
+ \end{equation}
+\end{varwidth}
+\end{document}
diff --git a/doc/src/Eqs/neb_spin_rodrigues_formula.jpg b/doc/src/Eqs/neb_spin_rodrigues_formula.jpg
new file mode 100644
index 0000000000..66070f7bc5
Binary files /dev/null and b/doc/src/Eqs/neb_spin_rodrigues_formula.jpg differ
diff --git a/doc/src/Eqs/neb_spin_rodrigues_formula.tex b/doc/src/Eqs/neb_spin_rodrigues_formula.tex
new file mode 100644
index 0000000000..4a8347cd79
--- /dev/null
+++ b/doc/src/Eqs/neb_spin_rodrigues_formula.tex
@@ -0,0 +1,16 @@
+\documentclass[preview]{standalone}
+\usepackage{varwidth}
+\usepackage[utf8x]{inputenc}
+\usepackage{amsmath, amssymb, graphics, setspace}
+
+\begin{document}
+\begin{varwidth}{50in}
+ \begin{equation}
+ \vec{m}_i^{\nu} = \vec{m}_i^{I} \cos(\omega_i^{\nu})
+ + (\vec{k}_i \times \vec{m}_i^{I}) \sin(\omega_i^{\nu})
+ + (1.0-\cos(\omega_i^{\nu})) \vec{k}_i (\vec{k}_i\cdot
+ \vec{m}_i^{I})
+ , \nonumber
+ \end{equation}
+\end{varwidth}
+\end{document}
diff --git a/doc/src/Eqs/pair_drip.jpg b/doc/src/Eqs/pair_drip.jpg
new file mode 100644
index 0000000000..a94b4141b0
Binary files /dev/null and b/doc/src/Eqs/pair_drip.jpg differ
diff --git a/doc/src/Eqs/pair_drip.tex b/doc/src/Eqs/pair_drip.tex
new file mode 100644
index 0000000000..079a2cdf84
--- /dev/null
+++ b/doc/src/Eqs/pair_drip.tex
@@ -0,0 +1,14 @@
+\documentclass[12pt]{article}
+\usepackage{amsmath}
+\usepackage{bm}
+
+\begin{document}
+
+\begin{eqnarray*}
+E &=& \frac{1}{2} \sum_{i} \sum_{j\notin\text{layer}\,i} \phi_{ij} \\\phi_{ij} &=& f_\text{c}(x_r) \left[ e^{-\lambda(r_{ij} - z_0 )} \left[C+f(\rho_{ij})+ g(\rho_{ij}, \{\alpha_{ij}^{(m)}\}) \right]- A\left (\frac{z_0}{r_{ij}} \right)^6 \right] \\
+\end{eqnarray*}
+
+
+
+
+\end{document}
\ No newline at end of file
diff --git a/doc/src/Eqs/pair_mdf-6.jpg b/doc/src/Eqs/pair_mdf-6.jpg
index 54a08b25d6..60bd7e3a9e 100644
Binary files a/doc/src/Eqs/pair_mdf-6.jpg and b/doc/src/Eqs/pair_mdf-6.jpg differ
diff --git a/doc/src/Eqs/pair_mdf-6.tex b/doc/src/Eqs/pair_mdf-6.tex
index 9f25e09bc7..b80f6f69b5 100644
--- a/doc/src/Eqs/pair_mdf-6.tex
+++ b/doc/src/Eqs/pair_mdf-6.tex
@@ -1,9 +1,9 @@
\documentclass[12pt]{article}
-
+\pagestyle{empty}
\begin{document}
$$
- E(r) = \frac{A}{r^{12}} - \frac{A}{r^{6}}
+ E(r) = \frac{A}{r^{12}} - \frac{B}{r^{6}}
$$
\end{document}
diff --git a/doc/src/Howto_replica.txt b/doc/src/Howto_replica.txt
index 29d1aa02fd..505967c1b8 100644
--- a/doc/src/Howto_replica.txt
+++ b/doc/src/Howto_replica.txt
@@ -17,6 +17,7 @@ periodically.
These are the relevant commands:
"neb"_neb.html for nudged elastic band calculations
+"neb_spin"_neb_spin.html for magnetic nudged elastic band calculations
"prd"_prd.html for parallel replica dynamics
"tad"_tad.html for temperature accelerated dynamics
"temper"_temper.html for parallel tempering
diff --git a/doc/src/Howto_spins.txt b/doc/src/Howto_spins.txt
index 7f16883487..80b2a54fe4 100644
--- a/doc/src/Howto_spins.txt
+++ b/doc/src/Howto_spins.txt
@@ -10,7 +10,7 @@ Documentation"_ld - "LAMMPS Commands"_lc :c
Magnetic spins :h3
The magnetic spin simulations are enabled by the SPIN package, whose
-implementation is detailed in "Tranchida"_#Tranchida7.
+implementation is detailed in "Tranchida"_#Tranchida.
The model represents the simulation of atomic magnetic spins coupled
to lattice vibrations. The dynamics of those magnetic spins can be used
@@ -36,13 +36,28 @@ A Langevin thermostat can be applied to those magnetic spins using
"fix langevin/spin"_fix_langevin_spin.html. Typically, this thermostat
can be coupled to another Langevin thermostat applied to the atoms
using "fix langevin"_fix_langevin.html in order to simulate
-thermostatted spin-lattice system.
+thermostatted spin-lattice systems.
The magnetic Gilbert damping can also be applied using "fix
langevin/spin"_fix_langevin_spin.html. It allows to either dissipate
the thermal energy of the Langevin thermostat, or to perform a
relaxation of the magnetic configuration toward an equilibrium state.
+The command "fix setforce/spin"_fix_setforce.html allows to set the
+components of the magnetic precession vectors (while erasing and
+replacing the previously computed magnetic precession vectors on
+the atom).
+This command can be used to freeze the magnetic moment of certain
+atoms in the simulation by zeroing their precession vector.
+
+The command "fix nve/spin"_fix_nve_spin.html can be used to
+perform a symplectic integration of the combined dynamics of spins
+and atomic motions.
+
+The minimization style "min/spin"_min_spin.html can be applied
+to the spins to perform a minimization of the spin configuration.
+
+
All the computed magnetic properties can be output by two main
commands. The first one is "compute spin"_compute_spin.html, that
enables to evaluate magnetic averaged quantities, such as the total
@@ -54,6 +69,6 @@ magnetic spin, or the magnetic force acting on this spin.
:line
-:link(Tranchida7)
+:link(Tranchida)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-arXiv preprint arXiv:1801.10233, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt
index e36e4063c9..b4cf8487a3 100644
--- a/doc/src/Manual.txt
+++ b/doc/src/Manual.txt
@@ -1,7 +1,7 @@
LAMMPS Users Manual
-
+
@@ -21,7 +21,7 @@
:line
LAMMPS Documentation :c,h1
-29 Mar 2019 version :c,h2
+30 Apr 2019 version :c,h2
"What is a LAMMPS version?"_Manual_version.html
diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf
index 07d8254475..6194424212 100644
Binary files a/doc/src/PDF/colvars-refman-lammps.pdf and b/doc/src/PDF/colvars-refman-lammps.pdf differ
diff --git a/doc/src/Packages_details.txt b/doc/src/Packages_details.txt
index 0ab1b5e4fd..352a38af84 100644
--- a/doc/src/Packages_details.txt
+++ b/doc/src/Packages_details.txt
@@ -918,6 +918,7 @@ src/SPIN: filenames -> commands
"fix nve/spin"_fix_nve_spin.html
"fix precession/spin"_fix_precession_spin.html
"compute spin"_compute_spin.html
+"neb/spin"_neb_spin.html
examples/SPIN :ul
:line
diff --git a/doc/src/Speed_kokkos.txt b/doc/src/Speed_kokkos.txt
index ef193d7401..23155cd540 100644
--- a/doc/src/Speed_kokkos.txt
+++ b/doc/src/Speed_kokkos.txt
@@ -111,16 +111,10 @@ Makefile.kokkos_mpi_only) will give better performance than the OpenMP
back end (i.e. Makefile.kokkos_omp) because some of the overhead to make
the code thread-safe is removed.
-NOTE: The default for the "package kokkos"_package.html command is to
-use "full" neighbor lists and set the Newton flag to "off" for both
-pairwise and bonded interactions. However, when running on CPUs, it
-will typically be faster to use "half" neighbor lists and set the
-Newton flag to "on", just as is the case for non-accelerated pair
-styles. It can also be faster to use non-threaded communication. Use
-the "-pk kokkos" "command-line switch"_Run_options.html to change the
-default "package kokkos"_package.html options. See its doc page for
-details and default settings. Experimenting with its options can
-provide a speed-up for specific calculations. For example:
+NOTE: Use the "-pk kokkos" "command-line switch"_Run_options.html to
+change the default "package kokkos"_package.html options. See its doc
+page for details and default settings. Experimenting with its options
+can provide a speed-up for specific calculations. For example:
mpirun -np 16 lmp_kokkos_mpi_only -k on -sf kk -pk kokkos newton on neigh half comm no -in in.lj # Newton on, Half neighbor list, non-threaded comm :pre
@@ -190,19 +184,18 @@ tasks/node. The "-k on t Nt" command-line switch sets the number of
threads/task as Nt. The product of these two values should be N, i.e.
256 or 264.
-NOTE: The default for the "package kokkos"_package.html command is to
-use "full" neighbor lists and set the Newton flag to "off" for both
-pairwise and bonded interactions. When running on KNL, this will
-typically be best for pair-wise potentials. For many-body potentials,
-using "half" neighbor lists and setting the Newton flag to "on" may be
-faster. It can also be faster to use non-threaded communication. Use
-the "-pk kokkos" "command-line switch"_Run_options.html to change the
-default "package kokkos"_package.html options. See its doc page for
-details and default settings. Experimenting with its options can
-provide a speed-up for specific calculations. For example:
+NOTE: The default for the "package kokkos"_package.html command when
+running on KNL is to use "half" neighbor lists and set the Newton flag
+to "on" for both pairwise and bonded interactions. This will typically
+be best for many-body potentials. For simpler pair-wise potentials, it
+may be faster to use a "full" neighbor list with Newton flag to "off".
+Use the "-pk kokkos" "command-line switch"_Run_options.html to change
+the default "package kokkos"_package.html options. See its doc page for
+details and default settings. Experimenting with its options can provide
+a speed-up for specific calculations. For example:
-mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos comm no -in in.lj # Newton off, full neighbor list, non-threaded comm
-mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos newton on neigh half comm no -in in.reax # Newton on, half neighbor list, non-threaded comm :pre
+mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos comm host -in in.reax # Newton on, half neighbor list, threaded comm
+mpirun -np 64 lmp_kokkos_phi -k on t 4 -sf kk -pk kokkos newton off neigh full comm no -in in.lj # Newton off, full neighbor list, non-threaded comm :pre
NOTE: MPI tasks and threads should be bound to cores as described
above for CPUs.
@@ -236,19 +229,19 @@ one or more nodes, each with two GPUs:
mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -in in.lj # 1 node, 2 MPI tasks/node, 2 GPUs/node
mpirun -np 32 -ppn 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -in in.lj # 16 nodes, 2 MPI tasks/node, 2 GPUs/node (32 GPUs total) :pre
-NOTE: The default for the "package kokkos"_package.html command is to
-use "full" neighbor lists and set the Newton flag to "off" for both
-pairwise and bonded interactions, along with threaded communication.
-When running on Maxwell or Kepler GPUs, this will typically be
-best. For Pascal GPUs, using "half" neighbor lists and setting the
-Newton flag to "on" may be faster. For many pair styles, setting the
-neighbor binsize equal to the ghost atom cutoff will give speedup.
-Use the "-pk kokkos" "command-line switch"_Run_options.html to change
-the default "package kokkos"_package.html options. See its doc page
-for details and default settings. Experimenting with its options can
-provide a speed-up for specific calculations. For example:
+NOTE: The default for the "package kokkos"_package.html command when
+running on GPUs is to use "full" neighbor lists and set the Newton flag
+to "off" for both pairwise and bonded interactions, along with threaded
+communication. When running on Maxwell or Kepler GPUs, this will
+typically be best. For Pascal GPUs, using "half" neighbor lists and
+setting the Newton flag to "on" may be faster. For many pair styles,
+setting the neighbor binsize equal to twice the CPU default value will
+give speedup, which is the default when running on GPUs. Use the "-pk
+kokkos" "command-line switch"_Run_options.html to change the default
+"package kokkos"_package.html options. See its doc page for details and
+default settings. Experimenting with its options can provide a speed-up
+for specific calculations. For example:
-mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos binsize 2.8 -in in.lj # Set binsize = neighbor ghost cutoff
mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos newton on neigh half binsize 2.8 -in in.lj # Newton on, half neighbor list, set binsize = neighbor ghost cutoff :pre
NOTE: For good performance of the KOKKOS package on GPUs, you must
diff --git a/doc/src/commands_list.txt b/doc/src/commands_list.txt
index 6f90d9c93a..cf716df9ac 100644
--- a/doc/src/commands_list.txt
+++ b/doc/src/commands_list.txt
@@ -67,6 +67,7 @@ Commands :h1
minimize
molecule
neb
+ neb_spin
neigh_modify
neighbor
newton
diff --git a/doc/src/fix.txt b/doc/src/fix.txt
index c424e56074..294802c4fa 100644
--- a/doc/src/fix.txt
+++ b/doc/src/fix.txt
@@ -321,20 +321,16 @@ accelerated styles exist.
"restrain"_fix_restrain.html - constrain a bond, angle, dihedral
"rhok"_fix_rhok.html -
"rigid"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NVE integration
-"rigid/nph"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NPH integration
-"rigid/nph/small"_fix_rigid.html -
-"rigid/npt"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NPT integration
-"rigid/npt/small"_fix_rigid.html -
-"rigid/nve"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with alternate NVE integration
-"rigid/nve/small"_fix_rigid.html -
-"rigid/nvt"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NVT integration
-"rigid/nvt/small"_fix_rigid.html -
-"rigid/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NVE integration
-"rigid/small/nph"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NPH integration
-"rigid/small/npt"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NPT integration
-"rigid/small/nve"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with alternate NVE integration
-"rigid/small/nvt"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NVT integration
"rigid/meso"_fix_rigid_meso.html - constrain clusters of mesoscopic SPH/SDPD particles to move as a rigid body
+"rigid/nph"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NPH integration
+"rigid/nph/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NPH integration
+"rigid/npt"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NPT integration
+"rigid/npt/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NPT integration
+"rigid/nve"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with alternate NVE integration
+"rigid/nve/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with alternate NVE integration
+"rigid/nvt"_fix_rigid.html - constrain one or more clusters of atoms to move as a rigid body with NVT integration
+"rigid/nvt/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NVT integration
+"rigid/small"_fix_rigid.html - constrain many small clusters of atoms to move as a rigid body with NVE integration
"rx"_fix_rx.html -
"saed/vtk"_fix_saed_vtk.html -
"setforce"_fix_setforce.html - set the force on each atom
diff --git a/doc/src/fix_colvars.txt b/doc/src/fix_colvars.txt
index d9eb9ac5aa..304273d451 100644
--- a/doc/src/fix_colvars.txt
+++ b/doc/src/fix_colvars.txt
@@ -98,6 +98,16 @@ fix to add the energy change from the biasing force added by the fix
to the system's potential energy as part of "thermodynamic
output"_thermo_style.html.
+The {fix_modify configfile } option allows to add settings
+from an additional config file to the colvars module. This option can
+only be used, after the system has been initialized with a "run"_run.html
+command.
+
+The {fix_modify config } option allows to add settings
+from inline strings. Those have to fit on a single line when enclosed
+in a pair of double quotes ("), or can span multiple lines when bracketed
+by a pair of triple double quotes (""", like python embedded documentation).
+
This fix computes a global scalar which can be accessed by various
"output commands"_Howto_output.html. The scalar is the cumulative
energy change due to this fix. The scalar value calculated by this
diff --git a/doc/src/fix_langevin_spin.txt b/doc/src/fix_langevin_spin.txt
index ddd3a0319b..e4065adad5 100644
--- a/doc/src/fix_langevin_spin.txt
+++ b/doc/src/fix_langevin_spin.txt
@@ -99,4 +99,4 @@ integration fix (e.g. {fix nve/spin}).
:link(Tranchida2)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt
index 410ab3d4d1..87292bb5cd 100644
--- a/doc/src/fix_neb.txt
+++ b/doc/src/fix_neb.txt
@@ -97,7 +97,7 @@ Note that in this case the specified {Kspring} is in force/distance
units.
With a value of {ideal}, the spring force is computed as suggested in
-"(WeinenE)"_#WeinenE :
+"(WeinanE)"_#WeinanE :
Fnudge_parallel = -{Kspring} * (RD-RDideal) / (2 * meanDist) :pre
@@ -224,8 +224,8 @@ specified (no inter-replica force on the end replicas).
[(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113,
9901-9904 (2000).
-:link(WeinenE)
-[(WeinenE)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002).
+:link(WeinanE)
+[(WeinanE)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002).
:link(Jonsson)
[(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum
diff --git a/doc/src/fix_neb_spin.txt b/doc/src/fix_neb_spin.txt
new file mode 100644
index 0000000000..89420f451c
--- /dev/null
+++ b/doc/src/fix_neb_spin.txt
@@ -0,0 +1,76 @@
+"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
+
+:link(lws,http://lammps.sandia.gov)
+:link(ld,Manual.html)
+:link(lc,Commands_all.html)
+
+:line
+
+fix neb/spin command :h3
+
+[Syntax:]
+
+fix ID group-ID neb/spin Kspring :pre
+
+ID, group-ID are documented in "fix"_fix.html command :ulb,l
+neb/spin = style name of this fix command :l
+Kspring = spring constant for parallel nudging force
+(force/distance units or force units, see parallel keyword) :pre,ule
+
+[Examples:]
+
+fix 1 active neb/spin 1.0
+
+[Description:]
+
+Add nudging forces to spins in the group for a multi-replica
+simulation run via the "neb/spin"_neb_spin.html command to perform a
+geodesic nudged elastic band (GNEB) calculation for finding the
+transition state.
+Hi-level explanations of GNEB are given with the
+"neb/spin"_neb_spin.html command and on the
+"Howto replica"_Howto_replica.html doc page.
+The fix neb/spin command must be used with the "neb/spin" command and
+defines how inter-replica nudging forces are computed. A GNEB
+calculation is divided in two stages. In the first stage n replicas
+are relaxed toward a MEP until convergence. In the second stage, the
+climbing image scheme is enabled, so that the replica having the highest
+energy relaxes toward the saddle point (i.e. the point of highest energy
+along the MEP), and a second relaxation is performed.
+
+The nudging forces are calculated as explained in
+"(BessarabB)"_#BessarabB).
+See this reference for more explanation about their expression.
+
+[Restart, fix_modify, output, run start/stop, minimize info:]
+
+No information about this fix is written to "binary restart
+files"_restart.html. None of the "fix_modify"_fix_modify.html options
+are relevant to this fix. No global or per-atom quantities are stored
+by this fix for access by various "output commands"_Howto_output.html.
+No parameter of this fix can be used with the {start/stop} keywords of
+the "run"_run.html command.
+
+The forces due to this fix are imposed during an energy minimization,
+as invoked by the "minimize"_minimize.html command via the
+"neb/spin"_neb_spin.html command.
+
+[Restrictions:]
+
+This command can only be used if LAMMPS was built with the SPIN
+package. See the "Build package"_Build_package.html doc
+page for more info.
+
+[Related commands:]
+
+"neb_spin"_neb_spin.html
+
+[Default:]
+
+none
+
+:line
+
+:link(BessarabB)
+[(BessarabB)] Bessarab, Uzdin, Jonsson, Comp Phys Comm, 196,
+335-347 (2015).
diff --git a/doc/src/fix_nve_spin.txt b/doc/src/fix_nve_spin.txt
index af435dc730..7b382bb6ad 100644
--- a/doc/src/fix_nve_spin.txt
+++ b/doc/src/fix_nve_spin.txt
@@ -73,4 +73,4 @@ instead of "array" is also valid.
:link(Tranchida1)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/fix_precession_spin.txt b/doc/src/fix_precession_spin.txt
index f16522c7b6..05814931ea 100644
--- a/doc/src/fix_precession_spin.txt
+++ b/doc/src/fix_precession_spin.txt
@@ -31,7 +31,7 @@ fix 1 all precession/spin zeeman 0.1 0.0 0.0 1.0 anisotropy 0.001 0.0 0.0 1.0 :p
[Description:]
-Impose a force torque to each magnetic spin in the group.
+This fix applies a precession torque to each magnetic spin in the group.
Style {zeeman} is used for the simulation of the interaction
between the magnetic spins in the defined group and an external
diff --git a/doc/src/fix_print.txt b/doc/src/fix_print.txt
index d23c1103d3..cafc180718 100644
--- a/doc/src/fix_print.txt
+++ b/doc/src/fix_print.txt
@@ -14,7 +14,7 @@ fix ID group-ID print N string keyword value ... :pre
ID, group-ID are documented in "fix"_fix.html command :ulb,l
print = style name of this fix command :l
-N = print every N steps :l
+N = print every N steps; N can be a variable (see below) :l
string = text string to print with optional variable names :l
zero or more keyword/value pairs may be appended :l
keyword = {file} or {append} or {screen} or {title} :l
@@ -40,6 +40,21 @@ If it contains variables it must be enclosed in double quotes to
insure they are not evaluated when the input script line is read, but
will instead be evaluated each time the string is printed.
+Instead of a numeric value, N can be specified as an "equal-style
+variable"_variable.html, which should be specified as v_name, where
+name is the variable name. In this case, the variable is evaluated at
+the beginning of a run to determine the [next] timestep at which the
+string will be written out. On that timestep, the variable will be
+evaluated again to determine the next timestep, etc.
+Thus the variable should return timestep values. See the stagger()
+and logfreq() and stride() math functions for "equal-style
+variables"_variable.html, as examples of useful functions to use in
+this context. For example, the following commands will print output at
+timesteps 10,20,30,100,200,300,1000,2000,etc:
+
+variable s equal logfreq(10,3,10)
+fix extra all print v_s "Coords of marker atom = $x $y $z" :pre
+
The specified group-ID is ignored by this fix.
See the "variable"_variable.html command for a description of {equal}
diff --git a/doc/src/fix_setforce.txt b/doc/src/fix_setforce.txt
index 4b9abba52f..63713d87c2 100644
--- a/doc/src/fix_setforce.txt
+++ b/doc/src/fix_setforce.txt
@@ -8,6 +8,7 @@
fix setforce command :h3
fix setforce/kk command :h3
+fix setforce/spin command :h3
[Syntax:]
@@ -27,6 +28,7 @@ keyword = {region} :l
fix freeze indenter setforce 0.0 0.0 0.0
fix 2 edge setforce NULL 0.0 0.0
+fix 1 edge setforce/spin 0.0 0.0 0.0
fix 2 edge setforce NULL 0.0 v_oscillate :pre
[Description:]
@@ -65,6 +67,19 @@ to it.
:line
+Style {spin} suffix sets the components of the magnetic precession
+vectors instead of the mechanical forces. This also erases all
+previously computed magnetic precession vectors on the atom, though
+additional magnetic fixes could add new forces.
+
+This command can be used to freeze the magnetic moment of certain
+atoms in the simulation by zeroing their precession vector.
+
+All options defined above remain valid, they just apply to the magnetic
+precession vectors instead of the forces.
+
+: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
@@ -117,7 +132,10 @@ forces to any value besides zero when performing a minimization. Use
the "fix addforce"_fix_addforce.html command if you want to apply a
non-zero force to atoms during a minimization.
-[Restrictions:] none
+[Restrictions:]
+
+The fix {setforce/spin} only makes sense when LAMMPS was built with the
+SPIN package.
[Related commands:]
diff --git a/doc/src/fix_wall_gran.txt b/doc/src/fix_wall_gran.txt
index b517d48cca..4b3ff15cc9 100644
--- a/doc/src/fix_wall_gran.txt
+++ b/doc/src/fix_wall_gran.txt
@@ -17,13 +17,13 @@ wall/gran = style name of this fix command :l
fstyle = style of force interactions between particles and wall :l
possible choices: hooke, hooke/history, hertz/history, granular :pre
fstyle_params = parameters associated with force interaction style :l
- For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are:
- Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below)
- Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below)
- gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below)
- gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below)
- xmu = static yield criterion (unitless value between 0.0 and 1.0e4)
- dampflag = 0 or 1 if tangential damping force is excluded or included :pre
+ For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are:
+ Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below)
+ Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below)
+ gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below)
+ gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below)
+ xmu = static yield criterion (unitless value between 0.0 and 1.0e4)
+ dampflag = 0 or 1 if tangential damping force is excluded or included :pre
For {granular}, {fstyle_params} are set using the same syntax as for the {pair_coeff} command of "pair_style granular"_pair_granular.html :pre
wallstyle = {xplane} or {yplane} or {zplane} or {zcylinder} :l
args = list of arguments for a particular style :l
@@ -46,10 +46,10 @@ keyword = {wiggle} or {shear} :l
fix 1 all wall/gran hooke 200000.0 NULL 50.0 NULL 0.5 0 xplane -10.0 10.0
fix 1 all wall/gran hooke/history 200000.0 NULL 50.0 NULL 0.5 0 zplane 0.0 NULL
-fix 2 all wall/gran hooke 100000.0 20000.0 50.0 30.0 0.5 1 zcylinder 15.0 wiggle z 3.0 2.0
-fix 3 all wall/gran granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 zplane 0.0 NULL
-fix 4 all wall/gran granular jkr 1000.0 50.0 0.3 5.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall zcylinder 15.0 wiggle z 3.0 2.0
-fix 5 all wall/gran granular dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall zplane 0.0 NULL :pre
+fix 2 all wall/gran hooke 100000.0 20000.0 50.0 30.0 0.5 1 zcylinder 15.0 wiggle z 3.0 2.0
+fix 3 all wall/gran/region granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 damping velocity region myBox
+fix 4 all wall/gran/region granular jkr 1e5 1500.0 0.3 10.0 tangential mindlin NULL 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall region myCone
+fix 5 all wall/gran/region granular dmt 1e5 0.2 0.3 10.0 tangential mindlin NULL 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall damping tsuji region myCone :pre
[Description:]
diff --git a/doc/src/fix_wall_gran_region.txt b/doc/src/fix_wall_gran_region.txt
index 8a39d6b642..50dad364e0 100644
--- a/doc/src/fix_wall_gran_region.txt
+++ b/doc/src/fix_wall_gran_region.txt
@@ -17,23 +17,23 @@ wall/region = style name of this fix command :l
fstyle = style of force interactions between particles and wall :l
possible choices: hooke, hooke/history, hertz/history, granular :pre
fstyle_params = parameters associated with force interaction style :l
- For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are:
- Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below)
- Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below)
- gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below)
- gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below)
- xmu = static yield criterion (unitless value between 0.0 and 1.0e4)
- dampflag = 0 or 1 if tangential damping force is excluded or included :pre
+ For {hooke}, {hooke/history}, and {hertz/history}, {fstyle_params} are:
+ Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below)
+ Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below)
+ gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below)
+ gamma_t = damping coefficient for collisions in tangential direction (1/time units or 1/time-distance units - see discussion below)
+ xmu = static yield criterion (unitless value between 0.0 and 1.0e4)
+ dampflag = 0 or 1 if tangential damping force is excluded or included :pre
For {granular}, {fstyle_params} are set using the same syntax as for the {pair_coeff} command of "pair_style granular"_pair_granular.html :pre
wallstyle = region (see "fix wall/gran"_fix_wall_gran.html for options for other kinds of walls) :l
region-ID = region whose boundary will act as wall :l,ule
[Examples:]
-fix wall all wall/gran/region hooke/history 1000.0 200.0 200.0 100.0 0.5 1 region myCone
-fix 3 all wall/gran/region granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 region myBox
-fix 4 all wall/gran/region granular jkr 1000.0 50.0 tangential linear_history 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall region myCone
-fix 5 all wall/gran/region granular dmt 1000.0 50.0 0.3 10.0 tangential linear_history 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall region myCone :pre
+fix wall all wall/gran/region hooke/history 1000.0 200.0 200.0 100.0 0.5 1 region myCone
+fix 3 all wall/gran/region granular hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 damping velocity region myBox
+fix 4 all wall/gran/region granular jkr 1e5 1500.0 0.3 10.0 tangential mindlin NULL 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall region myCone
+fix 5 all wall/gran/region granular dmt 1e5 0.2 0.3 10.0 tangential mindlin NULL 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall damping tsuji region myCone :pre
[Description:]
diff --git a/doc/src/fixes.txt b/doc/src/fixes.txt
index d77acf946d..d966b9a225 100644
--- a/doc/src/fixes.txt
+++ b/doc/src/fixes.txt
@@ -84,6 +84,7 @@ Fixes :h1
fix_msst
fix_mvv_dpd
fix_neb
+ fix_neb_spin
fix_nh
fix_nh_eff
fix_nh_uef
diff --git a/doc/src/lammps.book b/doc/src/lammps.book
index 8f61026280..2738c9b051 100644
--- a/doc/src/lammps.book
+++ b/doc/src/lammps.book
@@ -179,6 +179,7 @@ min_spin.html
minimize.html
molecule.html
neb.html
+neb_spin.html
neigh_modify.html
neighbor.html
newton.html
@@ -309,6 +310,7 @@ fix_mscg.html
fix_msst.html
fix_mvv_dpd.html
fix_neb.html
+fix_neb_spin.html
fix_nh.html
fix_nh_eff.html
fix_nph_asphere.html
@@ -573,6 +575,7 @@ pair_dpd.html
pair_dpd_fdt.html
pair_dsmc.html
pair_e3b.html
+pair_drip.html
pair_eam.html
pair_edip.html
pair_eff.html
diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt
new file mode 100644
index 0000000000..70c0fe2ab5
--- /dev/null
+++ b/doc/src/neb_spin.txt
@@ -0,0 +1,375 @@
+"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
+
+:link(lws,http://lammps.sandia.gov)
+:link(ld,Manual.html)
+:link(lc,Commands_all.html)
+
+:line
+
+neb command :h3
+
+[Syntax:]
+
+neb/spin etol ttol N1 N2 Nevery file-style arg keyword :pre
+
+etol = stopping tolerance for energy (energy units) :ulb,l
+ttol = stopping tolerance for torque ( units) :l
+N1 = max # of iterations (timesteps) to run initial NEB :l
+N2 = max # of iterations (timesteps) to run barrier-climbing NEB :l
+Nevery = print replica energies and reaction coordinates every this many timesteps :l
+file-style = {final} or {each} or {none} :l
+ {final} arg = filename
+ filename = file with initial coords for final replica
+ coords for intermediate replicas are linearly interpolated
+ between first and last replica
+ {each} arg = filename
+ filename = unique filename for each replica (except first)
+ with its initial coords
+ {none} arg = no argument all replicas assumed to already have
+ their initial coords :pre
+keyword = {verbose}
+:ule
+
+[Examples:]
+
+neb/spin 0.1 0.0 1000 500 50 final coords.final
+neb/spin 0.0 0.001 1000 500 50 each coords.initial.$i
+neb/spin 0.0 0.001 1000 500 50 none verbose :pre
+
+[Description:]
+
+Perform a geodesic nudged elastic band (GNEB) calculation using multiple
+replicas of a system. Two or more replicas must be used; the first
+and last are the end points of the transition path.
+
+GNEB is a method for finding both the spin configurations and height
+of the energy barrier associated with a transition state, e.g.
+spins to perform a collective rotation from one energy basin to
+another.
+The implementation in LAMMPS follows the discussion in the
+following paper: "(BessarabA)"_#BessarabA.
+
+Each replica runs on a partition of one or more processors. Processor
+partitions are defined at run-time using the "-partition command-line
+switch"_Run_options.html. Note that if you have MPI installed, you
+can run a multi-replica simulation with more replicas (partitions)
+than you have physical processors, e.g you can run a 10-replica
+simulation on just one or two processors. You will simply not get the
+performance speed-up you would see with one or more physical
+processors per replica. See the "Howto replica"_Howto_replica.html
+doc page for further discussion.
+
+NOTE: As explained below, a GNEB calculation performs a damped dynamics
+minimization across all the replicas. The "spin"_min_spin.html
+style minimizer has to be defined in your input script.
+
+When a GNEB calculation is performed, it is assumed that each replica
+is running the same system, though LAMMPS does not check for this.
+I.e. the simulation domain, the number of magnetic atoms, the
+interaction potentials, and the starting configuration when the neb
+command is issued should be the same for every replica.
+
+In a GNEB calculation each replica is connected to other replicas by
+inter-replica nudging forces. These forces are imposed by the "fix
+neb/spin"_fix_neb_spin.html command, which must be used in conjunction
+with the neb command.
+The group used to define the fix neb/spin command defines the
+GNEB magnetic atoms which are the only ones that inter-replica springs
+are applied to.
+If the group does not include all magnetic atoms, then non-GNEB
+magnetic atoms have no inter-replica springs and the torques they feel
+and their precession motion is computed in the usual way due only
+to other magnetic atoms within their replica.
+Conceptually, the non-GNEB atoms provide a background force field for
+the GNEB atoms.
+Their magnetic spins can be allowed to evolve during the GNEB
+minimization procedure.
+
+The initial spin configuration for each of the replicas can be
+specified in different manners via the {file-style} setting, as
+discussed below. Only atomic spins whose initial coordinates should
+differ from the current configuration need to be specified.
+
+Conceptually, the initial and final configurations for the first
+replica should be states on either side of an energy barrier.
+
+As explained below, the initial configurations of intermediate
+replicas can be spin coordinates interpolated in a linear fashion
+between the first and last replicas. This is often adequate for
+simple transitions. For more complex transitions, it may lead to slow
+convergence or even bad results if the minimum energy path (MEP, see
+below) of states over the barrier cannot be correctly converged to
+from such an initial path. In this case, you will want to generate
+initial states for the intermediate replicas that are geometrically
+closer to the MEP and read them in.
+
+:line
+
+For a {file-style} setting of {final}, a filename is specified which
+contains atomic and spin coordinates for zero or more atoms, in the
+format described below.
+For each atom that appears in the file, the new coordinates are
+assigned to that atom in the final replica. Each intermediate replica
+also assigns a new spin to that atom in an interpolated manner.
+This is done by using the current direction of the spin at the starting
+point and the read-in direction as the final point.
+The "angular distance" between them is calculated, and the new direction
+is assigned to be a fraction of the angular distance.
+
+NOTE: The "angular distance" between the starting and final point is
+evaluated in the geodesic sense, as described in
+"(BessarabA)"_#BessarabA.
+
+NOTE: The angular interpolation between the starting and final point
+is achieved using Rodrigues formula:
+
+:c,image(Eqs/neb_spin_rodrigues_formula.jpg)
+
+where m_i^I is the initial spin configuration for the spin i,
+omega_i^nu is a rotation angle defined as:
+
+:c,image(Eqs/neb_spin_angle.jpg)
+
+with nu the image number, Q the total number of images, and
+omega_i the total rotation between the initial and final spins.
+k_i defines a rotation axis such as:
+
+:c,image(Eqs/neb_spin_k.jpg)
+
+if the initial and final spins are not aligned.
+If the initial and final spins are aligned, then their cross
+product is null, and the expression above does not apply.
+If they point toward the same direction, the intermediate images
+conserve the same orientation.
+If the initial and final spins are aligned, but point toward
+opposite directions, an arbitrary rotation vector belonging to
+the plane perpendicular to initial and final spins is chosen.
+In this case, a warning message is displayed.
+
+For a {file-style} setting of {each}, a filename is specified which is
+assumed to be unique to each replica.
+See the "neb"_neb.html documentation page for more information about this
+option.
+
+For a {file-style} setting of {none}, no filename is specified. Each
+replica is assumed to already be in its initial configuration at the
+time the neb command is issued. This allows each replica to define
+its own configuration by reading a replica-specific data or restart or
+dump file, via the "read_data"_read_data.html,
+"read_restart"_read_restart.html, or "read_dump"_read_dump.html
+commands. The replica-specific names of these files can be specified
+as in the discussion above for the {each} file-style. Also see the
+section below for how a NEB calculation can produce restart files, so
+that a long calculation can be restarted if needed.
+
+NOTE: None of the {file-style} settings change the initial
+configuration of any atom in the first replica. The first replica
+must thus be in the correct initial configuration at the time the neb
+command is issued.
+
+:line
+
+A NEB calculation proceeds in two stages, each of which is a
+minimization procedure, performed via damped dynamics. To enable
+this, you must first define a damped spin dynamics
+"min_style"_min_style.html, using the {spin} style (see
+"min_spin"_min_spin.html for more information).
+The other styles cannot be used, since they relax the lattice
+degrees of freedom instead of the spins.
+
+The minimizer tolerances for energy and force are set by {etol} and
+{ttol}, the same as for the "minimize"_minimize.html command.
+
+A non-zero {etol} means that the GNEB calculation will terminate if the
+energy criterion is met by every replica. The energies being compared
+to {etol} do not include any contribution from the inter-replica
+nudging forces, since these are non-conservative. A non-zero {ttol}
+means that the GNEB calculation will terminate if the torque criterion
+is met by every replica. The torques being compared to {ttol} include
+the inter-replica nudging forces.
+
+The maximum number of iterations in each stage is set by {N1} and
+{N2}. These are effectively timestep counts since each iteration of
+damped dynamics is like a single timestep in a dynamics
+"run"_run.html. During both stages, the potential energy of each
+replica and its normalized distance along the reaction path (reaction
+coordinate RD) will be printed to the screen and log file every
+{Nevery} timesteps. The RD is 0 and 1 for the first and last replica.
+For intermediate replicas, it is the cumulative angular distance
+(normalized by the total cumulative angular distance) between adjacent
+replicas, where "distance" is defined as the length of the 3N-vector of
+the geodesic distances in spin coordinates, with N the number of
+GNEB spins involved (see equation (13) in "(BessarabA)"_#BessarabA).
+These outputs allow you to monitor NEB's progress in
+finding a good energy barrier. {N1} and {N2} must both be multiples
+of {Nevery}.
+
+In the first stage of GNEB, the set of replicas should converge toward
+a minimum energy path (MEP) of conformational states that transition
+over a barrier. The MEP for a transition is defined as a sequence of
+3N-dimensional spin states, each of which has a potential energy
+gradient parallel to the MEP itself.
+The configuration of highest energy along a MEP corresponds to a saddle
+point. The replica states will also be roughly equally spaced along
+the MEP due to the inter-replica nudging force added by the
+"fix neb"_fix_neb.html command.
+
+In the second stage of GNEB, the replica with the highest energy is
+selected and the inter-replica forces on it are converted to a force
+that drives its spin coordinates to the top or saddle point of the
+barrier, via the barrier-climbing calculation described in
+"(BessarabA)"_#BessarabA. As before, the other replicas rearrange
+themselves along the MEP so as to be roughly equally spaced.
+
+When both stages are complete, if the GNEB calculation was successful,
+the configurations of the replicas should be along (close to) the MEP
+and the replica with the highest energy should be a spin
+configuration at (close to) the saddle point of the transition. The
+potential energies for the set of replicas represents the energy
+profile of the transition along the MEP.
+
+:line
+
+An atom map must be defined which it is not by default for "atom_style
+atomic"_atom_style.html problems. The "atom_modify
+map"_atom_modify.html command can be used to do this.
+
+An initial value can be defined for the timestep. Although, the {spin}
+minimization algorithm is an adaptive timestep methodology, so that
+this timestep is likely to evolve during the calculation.
+
+The minimizers in LAMMPS operate on all spins in your system, even
+non-GNEB atoms, as defined above.
+
+:line
+
+Each file read by the neb/spin command containing spin coordinates used
+to initialize one or more replicas must be formatted as follows.
+
+The file can be ASCII text or a gzipped text file (detected by a .gz
+suffix). The file can contain initial blank lines or comment lines
+starting with "#" which are ignored. The first non-blank, non-comment
+line should list N = the number of lines to follow. The N successive
+lines contain the following information:
+
+ID1 g1 x1 y1 z1 sx1 sy1 sz1
+ID2 g2 x2 y2 z2 sx2 sy2 sz2
+...
+IDN gN yN zN sxN syN szN :pre
+
+The fields are the atom ID, the norm of the associated magnetic spin,
+followed by the {x,y,z} coordinates and the {sx,sy,sz} spin coordinates.
+The lines can be listed in any order. Additional trailing information on
+the line is OK, such as a comment.
+
+Note that for a typical GNEB calculation you do not need to specify
+initial spin coordinates for very many atoms to produce differing starting
+and final replicas whose intermediate replicas will converge to the
+energy barrier. Typically only new spin coordinates for atoms
+geometrically near the barrier need be specified.
+
+Also note there is no requirement that the atoms in the file
+correspond to the GNEB atoms in the group defined by the "fix
+neb"_fix_neb.html command. Not every GNEB atom need be in the file,
+and non-GNEB atoms can be listed in the file.
+
+:line
+
+Four kinds of output can be generated during a GNEB calculation: energy
+barrier statistics, thermodynamic output by each replica, dump files,
+and restart files.
+
+When running with multiple partitions (each of which is a replica in
+this case), the print-out to the screen and master log.lammps file
+contains a line of output, printed once every {Nevery} timesteps. It
+contains the timestep, the maximum torque per replica, the maximum
+torque per atom (in any replica), potential gradients in the initial,
+final, and climbing replicas, the forward and backward energy
+barriers, the total reaction coordinate (RDT), and the normalized
+reaction coordinate and potential energy of each replica.
+
+The "maximum torque per replica" is the two-norm of the
+3N-length vector given by the cross product of a spin by its
+precession vector omega, in each replica, maximized across replicas,
+which is what the {ttol} setting is checking against. In this case, N is
+all the atoms in each replica. The "maximum torque per atom" is the
+maximum torque component of any atom in any replica. The potential
+gradients are the two-norm of the 3N-length magnetic precession vector
+solely due to the interaction potential i.e. without adding in
+inter-replica forces, and projected along the path tangent (as detailed
+in Appendix D of "(BessarabA)"_#BessarabA).
+
+The "reaction coordinate" (RD) for each replica is the two-norm of the
+3N-length vector of geodesic distances between its spins and the preceding
+replica's spins (see equation (13) of "(BessarabA)"_#BessarabA), added to
+the RD of the preceding replica. The RD of the first replica RD1 = 0.0;
+the RD of the final replica RDN = RDT, the total reaction coordinate.
+The normalized RDs are divided by RDT, so that they form a monotonically
+increasing sequence from zero to one. When computing RD, N only includes
+the spins being operated on by the fix neb/spin command.
+
+The forward (reverse) energy barrier is the potential energy of the
+highest replica minus the energy of the first (last) replica.
+
+Supplementary information for all replicas can be printed out to the
+screen and master log.lammps file by adding the verbose keyword. This
+information include the following.
+The "GradVidottan" are the projections of the potential gradient for
+the replica i on its tangent vector (as detailed in Appendix D of
+"(BessarabA)"_#BessarabA).
+The "DNi" are the non normalized geodesic distances (see equation (13)
+of "(BessarabA)"_#BessarabA), between a replica i and the next replica
+i+1. For the last replica, this distance is not defined and a "NAN"
+value is the corresponding output.
+
+When a NEB calculation does not converge properly, the supplementary
+information can help understanding what is going wrong.
+
+When running on multiple partitions, LAMMPS produces additional log
+files for each partition, e.g. log.lammps.0, log.lammps.1, etc. For a
+GNEB calculation, these contain the thermodynamic output for each
+replica.
+
+If "dump"_dump.html commands in the input script define a filename
+that includes a {universe} or {uloop} style "variable"_variable.html,
+then one dump file (per dump command) will be created for each
+replica. At the end of the GNEB calculation, the final snapshot in
+each file will contain the sequence of snapshots that transition the
+system over the energy barrier. Earlier snapshots will show the
+convergence of the replicas to the MEP.
+
+Likewise, "restart"_restart.html filenames can be specified with a
+{universe} or {uloop} style "variable"_variable.html, to generate
+restart files for each replica. These may be useful if the GNEB
+calculation fails to converge properly to the MEP, and you wish to
+restart the calculation from an intermediate point with altered
+parameters.
+
+A c file script in provided in the tool/spin/interpolate_gneb
+directory, that interpolates the MEP given the information provided
+by the verbose output option (as detailed in Appendix D of
+"(BessarabA)"_#BessarabA).
+
+:line
+
+[Restrictions:]
+
+This command can only be used if LAMMPS was built with the SPIN
+package. See the "Build package"_Build_package.html doc
+page for more info.
+
+:line
+
+[Related commands:]
+
+"min/spin"_min_spin.html, "fix neb/spin"_fix_neb_spin.html
+
+[Default:]
+
+none
+
+:line
+
+:link(BessarabA)
+[(BessarabA)] Bessarab, Uzdin, Jonsson, Comp Phys Comm, 196,
+335-347 (2015).
diff --git a/doc/src/package.txt b/doc/src/package.txt
index c226d7942f..a9412447b8 100644
--- a/doc/src/package.txt
+++ b/doc/src/package.txt
@@ -64,7 +64,7 @@ args = arguments specific to the style :l
{no_affinity} values = none
{kokkos} args = keyword value ...
zero or more keyword/value pairs may be appended
- keywords = {neigh} or {neigh/qeq} or {newton} or {binsize} or {comm} or {comm/exchange} or {comm/forward} or {comm/reverse}
+ keywords = {neigh} or {neigh/qeq} or {newton} or {binsize} or {comm} or {comm/exchange} or {comm/forward} or {comm/reverse} or {gpu/direct}
{neigh} value = {full} or {half}
full = full neighbor list
half = half neighbor list built in thread-safe manner
@@ -72,7 +72,7 @@ args = arguments specific to the style :l
full = full neighbor list
half = half neighbor list built in thread-safe manner
{newton} = {off} or {on}
- off = set Newton pairwise and bonded flags off (default)
+ off = set Newton pairwise and bonded flags off
on = set Newton pairwise and bonded flags on
{binsize} value = size
size = bin size for neighbor list construction (distance units)
@@ -422,101 +422,103 @@ processes/threads used for LAMMPS.
:line
-The {kokkos} style invokes settings associated with the use of the
-KOKKOS package.
+The {kokkos} style invokes settings associated with the use of the
+KOKKOS package.
-All of the settings are optional keyword/value pairs. Each has a
-default value as listed below.
+All of the settings are optional keyword/value pairs. Each has a default
+value as listed below.
-The {neigh} keyword determines how neighbor lists are built. A value
-of {half} uses a thread-safe variant of half-neighbor lists,
-the same as used by most pair styles in LAMMPS.
+The {neigh} keyword determines how neighbor lists are built. A value of
+{half} uses a thread-safe variant of half-neighbor lists, the same as
+used by most pair styles in LAMMPS, which is the default when running on
+CPUs (i.e. the Kokkos CUDA back end is not enabled).
-A value of {full} uses a full neighbor lists and is the default. This
-performs twice as much computation as the {half} option, however that
-is often a win because it is thread-safe and doesn't require atomic
-operations in the calculation of pair forces. For that reason, {full}
-is the default setting. However, when running in MPI-only mode with 1
-thread per MPI task, {half} neighbor lists will typically be faster,
-just as it is for non-accelerated pair styles. Similarly, the {neigh/qeq}
-keyword determines how neighbor lists are built for "fix qeq/reax/kk"_fix_qeq_reax.html.
-If not explicitly set, the value of {neigh/qeq} will match {neigh}.
+A value of {full} uses a full neighbor lists and is the default when
+running on GPUs. This performs twice as much computation as the {half}
+option, however that is often a win because it is thread-safe and
+doesn't require atomic operations in the calculation of pair forces. For
+that reason, {full} is the default setting for GPUs. However, when
+running on CPUs, a {half} neighbor list is the default because it are
+often faster, just as it is for non-accelerated pair styles. Similarly,
+the {neigh/qeq} keyword determines how neighbor lists are built for "fix
+qeq/reax/kk"_fix_qeq_reax.html. If not explicitly set, the value of
+{neigh/qeq} will match {neigh}.
-The {newton} keyword sets the Newton flags for pairwise and bonded
-interactions to {off} or {on}, the same as the "newton"_newton.html
-command allows. The default is {off} because this will almost always
-give better performance for the KOKKOS package. This means more
-computation is done, but less communication. However, when running in
-MPI-only mode with 1 thread per MPI task, a value of {on} will
-typically be faster, just as it is for non-accelerated pair styles.
+The {newton} keyword sets the Newton flags for pairwise and bonded
+interactions to {off} or {on}, the same as the "newton"_newton.html
+command allows. The default for GPUs is {off} because this will almost
+always give better performance for the KOKKOS package. This means more
+computation is done, but less communication. However, when running on
+CPUs a value of {on} is the default since it can often be faster, just
+as it is for non-accelerated pair styles
-The {binsize} keyword sets the size of bins used to bin atoms in
-neighbor list builds. The same value can be set by the "neigh_modify
-binsize"_neigh_modify.html command. Making it an option in the
-package kokkos command allows it to be set from the command line. The
-default value is 0.0, which means the LAMMPS default will be used,
-which is bins = 1/2 the size of the pairwise cutoff + neighbor skin
-distance. This is fine when neighbor lists are built on the CPU. For
-GPU builds, a 2x larger binsize equal to the pairwise cutoff +
-neighbor skin, is often faster, which can be set by this keyword.
-Note that if you use a longer-than-usual pairwise cutoff, e.g. to
-allow for a smaller fraction of KSpace work with a "long-range
-Coulombic solver"_kspace_style.html because the GPU is faster at
-performing pairwise interactions, then this rule of thumb may give too
-large a binsize.
+The {binsize} keyword sets the size of bins used to bin atoms in
+neighbor list builds. The same value can be set by the "neigh_modify
+binsize"_neigh_modify.html command. Making it an option in the package
+kokkos command allows it to be set from the command line. The default
+value for CPUs is 0.0, which means the LAMMPS default will be used,
+which is bins = 1/2 the size of the pairwise cutoff + neighbor skin
+distance. This is fine when neighbor lists are built on the CPU. For GPU
+builds, a 2x larger binsize equal to the pairwise cutoff + neighbor skin
+is often faster, which is the default. Note that if you use a
+longer-than-usual pairwise cutoff, e.g. to allow for a smaller fraction
+of KSpace work with a "long-range Coulombic solver"_kspace_style.html
+because the GPU is faster at performing pairwise interactions, then this
+rule of thumb may give too large a binsize and the default should be
+overridden with a smaller value.
-The {comm} and {comm/exchange} and {comm/forward} and {comm/reverse} keywords determine
-whether the host or device performs the packing and unpacking of data
-when communicating per-atom data between processors. "Exchange"
-communication happens only on timesteps that neighbor lists are
-rebuilt. The data is only for atoms that migrate to new processors.
-"Forward" communication happens every timestep. "Reverse" communication
-happens every timestep if the {newton} option is on. The data is for atom
-coordinates and any other atom properties that needs to be updated for
-ghost atoms owned by each processor.
+The {comm} and {comm/exchange} and {comm/forward} and {comm/reverse}
+keywords determine whether the host or device performs the packing and
+unpacking of data when communicating per-atom data between processors.
+"Exchange" communication happens only on timesteps that neighbor lists
+are rebuilt. The data is only for atoms that migrate to new processors.
+"Forward" communication happens every timestep. "Reverse" communication
+happens every timestep if the {newton} option is on. The data is for
+atom coordinates and any other atom properties that needs to be updated
+for ghost atoms owned by each processor.
-The {comm} keyword is simply a short-cut to set the same value
-for both the {comm/exchange} and {comm/forward} and {comm/reverse} keywords.
+The {comm} keyword is simply a short-cut to set the same value for both
+the {comm/exchange} and {comm/forward} and {comm/reverse} keywords.
-The value options for all 3 keywords are {no} or {host} or {device}.
-A value of {no} means to use the standard non-KOKKOS method of
-packing/unpacking data for the communication. A value of {host} means
-to use the host, typically a multi-core CPU, and perform the
-packing/unpacking in parallel with threads. A value of {device}
-means to use the device, typically a GPU, to perform the
-packing/unpacking operation.
+The value options for all 3 keywords are {no} or {host} or {device}. A
+value of {no} means to use the standard non-KOKKOS method of
+packing/unpacking data for the communication. A value of {host} means to
+use the host, typically a multi-core CPU, and perform the
+packing/unpacking in parallel with threads. A value of {device} means to
+use the device, typically a GPU, to perform the packing/unpacking
+operation.
-The optimal choice for these keywords depends on the input script and
-the hardware used. The {no} value is useful for verifying that the
-Kokkos-based {host} and {device} values are working correctly.
-It may also be the fastest choice when using Kokkos styles in
-MPI-only mode (i.e. with a thread count of 1).
+The optimal choice for these keywords depends on the input script and
+the hardware used. The {no} value is useful for verifying that the
+Kokkos-based {host} and {device} values are working correctly. It is the
+default when running on CPUs since it is usually the fastest.
-When running on CPUs or Xeon Phi, the {host} and {device} values work
-identically. When using GPUs, the {device} value will typically be
-optimal if all of your styles used in your input script are supported
-by the KOKKOS package. In this case data can stay on the GPU for many
-timesteps without being moved between the host and GPU, if you use the
-{device} value. This requires that your MPI is able to access GPU
-memory directly. Currently that is true for OpenMPI 1.8 (or later
-versions), Mvapich2 1.9 (or later), and CrayMPI. If your script uses
-styles (e.g. fixes) which are not yet supported by the KOKKOS package,
-then data has to be move between the host and device anyway, so it is
-typically faster to let the host handle communication, by using the
-{host} value. Using {host} instead of {no} will enable use of
-multiple threads to pack/unpack communicated data.
+When running on CPUs or Xeon Phi, the {host} and {device} values work
+identically. When using GPUs, the {device} value is the default since it
+will typically be optimal if all of your styles used in your input
+script are supported by the KOKKOS package. In this case data can stay
+on the GPU for many timesteps without being moved between the host and
+GPU, if you use the {device} value. This requires that your MPI is able
+to access GPU memory directly. Currently that is true for OpenMPI 1.8
+(or later versions), Mvapich2 1.9 (or later), and CrayMPI. If your
+script uses styles (e.g. fixes) which are not yet supported by the
+KOKKOS package, then data has to be move between the host and device
+anyway, so it is typically faster to let the host handle communication,
+by using the {host} value. Using {host} instead of {no} will enable use
+of multiple threads to pack/unpack communicated data.
-The {gpu/direct} keyword chooses whether GPU-direct will be used. When
-this keyword is set to {on}, buffers in GPU memory are passed directly
-through MPI send/receive calls. This reduces overhead of first copying
-the data to the host CPU. However GPU-direct is not supported on all
-systems, which can lead to segmentation faults and would require
-using a value of {off}. If LAMMPS can safely detect that GPU-direct is
-not available (currently only possible with OpenMPI v2.0.0 or later),
-then the {gpu/direct} keyword is automatically set to {off} by default.
-When the {gpu/direct} keyword is set to {off} while any of the {comm}
-keywords are set to {device}, the value for these {comm} keywords will
-be automatically changed to {host}.
+The {gpu/direct} keyword chooses whether GPU-direct will be used. When
+this keyword is set to {on}, buffers in GPU memory are passed directly
+through MPI send/receive calls. This reduces overhead of first copying
+the data to the host CPU. However GPU-direct is not supported on all
+systems, which can lead to segmentation faults and would require using a
+value of {off}. If LAMMPS can safely detect that GPU-direct is not
+available (currently only possible with OpenMPI v2.0.0 or later), then
+the {gpu/direct} keyword is automatically set to {off} by default. When
+the {gpu/direct} keyword is set to {off} while any of the {comm}
+keywords are set to {device}, the value for these {comm} keywords will
+be automatically changed to {host}. This setting has no effect if not
+running on GPUs.
:line
@@ -623,14 +625,16 @@ not used, you must invoke the package intel command in your input
script or or via the "-pk intel" "command-line
switch"_Run_options.html.
-For the KOKKOS package, the option defaults neigh = full, neigh/qeq =
-full, newton = off, binsize = 0.0, and comm = device, gpu/direct = on.
-When LAMMPS can safely detect, that GPU-direct is not available, the
-default value of gpu/direct becomes "off".
-These settings are made automatically by the required "-k on"
-"command-line switch"_Run_options.html. You can change them by
-using the package kokkos command in your input script or via the
-"-pk kokkos command-line switch"_Run_options.html.
+For the KOKKOS package, the option defaults for GPUs are neigh = full,
+neigh/qeq = full, newton = off, binsize for GPUs = 2x LAMMPS default
+value, comm = device, gpu/direct = on. When LAMMPS can safely detect
+that GPU-direct is not available, the default value of gpu/direct
+becomes "off". For CPUs or Xeon Phis, the option defaults are neigh =
+half, neigh/qeq = half, newton = on, binsize = 0.0, and comm = no. These
+settings are made automatically by the required "-k on" "command-line
+switch"_Run_options.html. You can change them by using the package
+kokkos command in your input script or via the "-pk kokkos command-line
+switch"_Run_options.html.
For the OMP package, the default is Nthreads = 0 and the option
defaults are neigh = yes. These settings are made automatically if
diff --git a/doc/src/pair_airebo.txt b/doc/src/pair_airebo.txt
index 3708fb287d..4956ba7575 100644
--- a/doc/src/pair_airebo.txt
+++ b/doc/src/pair_airebo.txt
@@ -36,7 +36,7 @@ pair_style airebo/morse 3.0
pair_coeff * * ../potentials/CH.airebo-m H C :pre
pair_style rebo
-pair_coeff * * ../potentials/CH.airebo H C :pre
+pair_coeff * * ../potentials/CH.rebo H C :pre
[Description:]
@@ -57,7 +57,8 @@ The {rebo} pair style computes the Reactive Empirical Bond Order (REBO)
Potential of "(Brenner)"_#Brenner. Note that this is the so-called
2nd generation REBO from 2002, not the original REBO from 1990.
As discussed below, 2nd generation REBO is closely related to the
-initial AIREBO; it is just a subset of the potential energy terms.
+initial AIREBO; it is just a subset of the potential energy terms
+with a few slightly different parameters
The AIREBO potential consists of three terms:
@@ -113,12 +114,12 @@ various dihedral angle preferences in hydrocarbon configurations.
:line
Only a single pair_coeff command is used with the {airebo}, {airebo}
-or {rebo} style which specifies an AIREBO or AIREBO-M potential file
-with parameters for C and H. Note that the {rebo} style in LAMMPS
-uses the same AIREBO-formatted potential file. These are mapped to
-LAMMPS atom types by specifying N additional arguments after the
-filename in the pair_coeff command, where N is the number of LAMMPS
-atom types:
+or {rebo} style which specifies an AIREBO, REBO, or AIREBO-M potential
+file with parameters for C and H. Note that as of LAMMPS version
+15 May 2019 the {rebo} style in LAMMPS uses its own potential
+file (CH.rebo). These are mapped to LAMMPS atom types by specifying
+N additional arguments after the filename in the pair_coeff command,
+where N is the number of LAMMPS atom types:
filename
N element names = mapping of AIREBO elements to atom types :ul
diff --git a/doc/src/pair_drip.txt b/doc/src/pair_drip.txt
new file mode 100644
index 0000000000..84c92b04e4
--- /dev/null
+++ b/doc/src/pair_drip.txt
@@ -0,0 +1,141 @@
+"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
+
+:link(lws,http://lammps.sandia.gov)
+:link(ld,Manual.html)
+:link(lc,Commands_all.html)
+
+:line
+
+pair_style drip command :h3
+
+[Syntax:]
+
+pair_style hybrid/overlay drip \[styles ...\] :pre
+
+styles = other styles to be overlayed with drip (optional) :ul
+
+[Examples:]
+
+pair_style hybrid/overlay drip
+pair_coeff * * none
+pair_coeff * * drip C.drip C :pre
+
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C
+pair_coeff * * rebo CH.airebo C :pre
+
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C NULL
+pair_coeff * * rebo CH.airebo C H :pre
+
+
+[Description:]
+
+Style {drip} computes the interlayer interactions of layered materials using
+the dihedral-angle-corrected registry-dependent (DRIP) potential as described
+in "(Wen)"_#Wen2018, which is based on the "(Kolmogorov)"_#Kolmogorov2005
+potential and provides an improved prediction for forces.
+The total potential energy of a system is
+
+:c,image(Eqs/pair_drip.jpg)
+
+where the {r^-6} term models the attractive London dispersion,
+the exponential term is designed to capture the registry effect due to
+overlapping {pi} bonds, and {fc} is a cutoff function.
+
+
+This potential (DRIP) only provides the interlayer interactions between
+graphene layers. So, to perform a realistic simulation, it should be used in
+combination with an intralayer potential such as "REBO"_pair_airebo.html and
+"Tersoff"_pair_tersoff.html.
+To keep the intralayer interactions unaffected, we should avoid applying DRIP
+to contribute energy to intralayer interactions. This can be achieved by
+assigning different molecular IDs to atoms in different layers, and DRIP is
+implemented such that only atoms with different molecular ID can interact with
+each other. For this purpose, "atom style"_atom_style.html "molecular" or
+"full" has to be used.
+
+On the other way around, "REBO"_pair_airebo.html ("Tersoff"_pair_tersoff.html
+or any other potential used to provide the intralayer interactions) should not
+interfere with the interlayer interactions described by DRIP. This is typically
+automatically achieved using the commands provided in the {Examples} section
+above, since the cutoff distance for carbon-carbon interaction in the intralayer
+potentials (e.g. 2 Angstrom for "REBO"_pair_airebo.html) is much smaller than
+the equilibrium layer distance of graphene layers (about 3.4 Angstrom).
+If you want, you can enforce this by assigning different atom types to atoms in
+different layers, and apply an intralayer potential to one atom type.
+See "pair_hybrid"_pair_hybrid.html for details.
+
+:line
+
+The "pair_coeff"_pair_coeff.html command for DRIP takes {4+N} arguments, where
+{N} is the number of LAMMPS atom types. The fist three arguments must be fixed
+to be {* * drip}, the fourth argument is the path to the DRIP parameter file,
+and the remaining N arguments specifying the mapping between element in the
+parameter file and atom types. For example, if your LAMMPS simulation has 3 atom
+types and you want all of them to be C, you would use the following pair_coeff
+command:
+
+pair_coeff * * drip C.drip C C C :pre
+
+If a mapping value is specified as NULL, the mapping is not performed. This
+could be useful when DRIP is used to model part of the system where other
+element exists. Suppose you have a hydrocarbon system, with C of atom type 1
+and H of atom type 2, you can use the following command to inform DRIP not to
+model H atoms:
+
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C NULL
+pair_coeff * * rebo CH.airebo C H :pre
+
+NOTE: The potential parameters developed in "(Wen)"_#Wen2018 are provided with
+LAMMPS (see the "potentials" directory). Besides those in "Wen"_#Wen2018, an
+additional parameter "normal_cutoff", specific to the LAMMPS implementation, is
+used to find the three nearest neighbors of an atom to construct the normal.
+
+
+:line
+
+[Mixing, shift, table, tail correction, and restart info]:
+
+This pair style does not support the pair_modify mix, shift, table,
+and tail options.
+
+This pair style does not write their information to binary restart files, since
+it is stored in potential files. Thus, you need to re-specify the pair_style and
+pair_coeff commands in an input script that reads a restart file.
+
+[Restrictions:]
+
+This pair style is part of the USER-MISC package. It is only enabled if LAMMPS
+was built with that package. See the "Build package"_Build_package.html doc
+page for more info.
+
+This pair potential requires the "newton"_newton.html setting to be "on" for
+pair interactions.
+
+
+The {C.drip} parameter file provided with LAMMPS (see the "potentials"
+directory) is parameterized for metal "units"_units.html. You can use the DRIP
+potential with any LAMMPS units, but you would need to create your own custom
+parameter file with coefficients listed in the appropriate units, if your
+simulation doesn't use "metal" units.
+
+
+[Related commands:]
+
+"pair_style lebedeva_z"_pair_lebedeva_z.html,
+"pair_style kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html,
+"pair_style kolmogorov/crespi/full"_pair_kolmogorov_crespi_full.html,
+"pair_style ilp/graphene/hbn"_pair_ilp_graphene_hbn.html.
+
+
+:line
+
+:link(Wen2018)
+[(Wen)] M. Wen, S. Carr, S. Fang, E. Kaxiras, and E. B. Tadmor, Phys. Rev. B,
+98, 235404 (2018)
+
+:link(Kolmogorov2005)
+[(Kolmogorov)] A. N. Kolmogorov, V. H. Crespi, Phys. Rev. B 71, 235415 (2005)
+
diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt
index d287123246..f16cd9fe0b 100644
--- a/doc/src/pair_granular.txt
+++ b/doc/src/pair_granular.txt
@@ -24,22 +24,24 @@ cutoff = global cutoff (optional). See discussion below. :ul
[Examples:]
pair_style granular
-pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 :pre
+pair_coeff * * hooke 1000.0 50.0 tangential linear_nohistory 1.0 0.4 damping mass_velocity :pre
pair_style granular
-pair_coeff * * hertz 1000.0 50.0 tangential mindlin NULL 1.0 0.4 :pre
+pair_coeff * * hooke 1000.0 50.0 tangential linear_history 500.0 1.0 0.4 damping mass_velocity :pre
pair_style granular
-pair_coeff * * hertz/material 1e8 0.3 tangential mindlin_rescale NULL 1.0 0.4 damping tsuji :pre
+pair_coeff * * hertz 1000.0 50.0 tangential mindlin 1000.0 1.0 0.4 :pre
pair_style granular
-pair_coeff 1 1 jkr 1000.0 50.0 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
-pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre
+pair_coeff * * hertz/material 1e8 0.3 0.3 tangential mindlin_rescale NULL 1.0 0.4 damping tsuji :pre
pair_style granular
-pair_coeff 1 1 hertz 1000.0 50.0 tangential mindlin 800.0 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
-pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall
-pair_coeff 1 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin 800.0 0.5 0.1 roll sds 500.0 200.0 0.1 twisting marshall :pre
+pair_coeff 1 * jkr 1000.0 500.0 0.3 10 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
+pair_coeff 2 2 hertz 200.0 100.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall :pre
+
+pair_style granular
+pair_coeff 1 1 dmt 1000.0 50.0 0.3 0.0 tangential mindlin NULL 0.5 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
+pair_coeff 2 2 dmt 1000.0 50.0 0.3 10.0 tangential mindlin NULL 0.5 0.1 rolling sds 500.0 200.0 0.1 twisting marshall :pre
[Description:]
@@ -57,18 +59,18 @@ global, but can be set to different values for different combinations
of particle types, as determined by the "pair_coeff"_pair_coeff.html
command. If the contact model choice is the same for two particle
types, the mixing for the cross-coefficients can be carried out
-automatically. This is shown in the second example, where model
+automatically. This is shown in the last example, where model
choices are the same for type 1 - type 1 as for type 2 - type2
interactions, but coefficients are different. In this case, the
-coefficients for type 2 - type interactions can be determined from
+mixed coefficients for type 1 - type 2 interactions can be determined from
mixing rules discussed below. For additional flexibility,
coefficients as well as model forms can vary between particle types,
-as shown in the third example: type 1- type 1 interactions are based
-on a Hertzian normal contact model and 2-2 interactions are based on a
-DMT cohesive model (see below). In that example, 1-1 and 2-2
-interactions have different model forms, in which case mixing of
+as shown in the fourth example: type 1 - type 1 interactions are based
+on a Johnson-Kendall-Roberts normal contact model and 2-2 interactions
+are based on a DMT cohesive model (see below). In that example, 1-1
+and 2-2 interactions have different model forms, in which case mixing of
coefficients cannot be determined, so 1-2 interactions must be
-explicitly defined via the {pair_coeff 1 2} command, otherwise an
+explicitly defined via the {pair_coeff 1 *} command, otherwise an
error would result.
:line
@@ -189,6 +191,7 @@ other settings, potentially also the twisting damping). The options
for the damping model currently supported are:
{velocity}
+{mass_velocity}
{viscoelastic}
{tsuji} :ol
@@ -199,11 +202,23 @@ For {damping velocity}, the normal damping is simply equal to the
user-specified damping coefficient in the {normal} model:
\begin\{equation\}
-\eta_n = \eta_\{n0\}\
+\eta_n = \eta_\{n0\}
\end\{equation\}
-Here, \(\gamma_n\) is the damping coefficient specified for the normal
-contact model, in units of {mass}/{time},
+Here, \(\eta_\{n0\}\) is the damping coefficient specified for the normal
+contact model, in units of {mass}/{time}.
+
+For {damping mass_velocity}, the normal damping is given by:
+
+\begin\{equation\}
+\eta_n = \eta_\{n0\} m_\{eff\}
+\end\{equation\}
+
+Here, \(\eta_\{n0\}\) is the damping coefficient specified for the normal
+contact model, in units of {mass}/{time} and
+\(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass.
+Use {damping mass_velocity} to reproduce the damping behavior of
+{pair gran/hooke/*}.
The {damping viscoelastic} model is based on the viscoelastic
treatment of "(Brilliantov et al)"_#Brill1996, where the normal
@@ -213,11 +228,10 @@ damping is given by:
\eta_n = \eta_\{n0\}\ a m_\{eff\}
\end\{equation\}
-Here, \(m_\{eff\} = m_i m_j/(m_i + m_j)\) is the effective mass, {a}
-is the contact radius, given by \(a =\sqrt\{R\delta\}\) for all models
-except {jkr}, for which it is given implicitly according to \(delta =
-a^2/R - 2\sqrt\{\pi \gamma a/E\}\). In this case, \eta_\{n0\}\ is in
-units of 1/({time}*{distance}).
+Here, {a} is the contact radius, given by \(a =\sqrt\{R\delta\}\)
+for all models except {jkr}, for which it is given implicitly according
+to \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\). For {damping viscoelastic},
+\(\eta_\{n0\}\) is in units of 1/({time}*{distance}).
The {tsuji} model is based on the work of "(Tsuji et
al)"_#Tsuji1992. Here, the damping coefficient specified as part of
@@ -564,6 +578,20 @@ Finally, the twisting torque on each particle is given by:
:line
+The {granular} pair style can reproduce the behavior of the
+{pair gran/*} styles with the appropriate settings (some very
+minor differences can be expected due to corrections in
+displacement history frame-of-reference, and the application
+of the torque at the center of the contact rather than
+at each particle). The first example above
+is equivalent to {pair gran/hooke 1000.0 NULL 50.0 50.0 0.4 1}.
+The second example is equivalent to
+{pair gran/hooke/history 1000.0 500.0 50.0 50.0 0.4 1}.
+The third example is equivalent to
+{pair gran/hertz/history 1000.0 500.0 50.0 50.0 0.4 1}.
+
+:line
+
LAMMPS automatically sets pairwise cutoff values for {pair_style
granular} based on particle radii (and in the case of {jkr} pull-off
distances). In the vast majority of situations, this is adequate.
@@ -619,7 +647,7 @@ interactions is set to \(\mu_1\), and friction coefficient for type
2-type 2 interactions is set to \(\mu_2\), the friction coefficient
for type1-type2 interactions is computed as \(\sqrt\{\mu_1\mu_2\}\)
(unless explicitly specified to a different value by a {pair_coeff 1 2
-...} command. The exception to this is elastic modulus, only
+...} command). The exception to this is elastic modulus, only
applicable to {hertz/material}, {dmt} and {jkr} normal contact
models. In that case, the effective elastic modulus is computed as:
@@ -706,7 +734,7 @@ For the {pair_coeff} settings: {damping viscoelastic}, {rolling none},
J. M., & Poschel, T. (1996). Model for collisions in granular
gases. Physical review E, 53(5), 5382.
-:link(Tsuji1992)
+:link(Tsuji1992)
[(Tsuji et al, 1992)] Tsuji, Y., Tanaka, T., & Ishida,
T. (1992). Lagrangian numerical simulation of plug flow of
cohesionless particles in a horizontal pipe. Powder technology, 71(3),
diff --git a/doc/src/pair_ilp_graphene_hbn.txt b/doc/src/pair_ilp_graphene_hbn.txt
index 3a5d4accd5..6a28c5e064 100644
--- a/doc/src/pair_ilp_graphene_hbn.txt
+++ b/doc/src/pair_ilp_graphene_hbn.txt
@@ -50,11 +50,11 @@ calculating the normals.
NOTE: This potential (ILP) is intended for interlayer interactions between two
different layers of graphene, hexagonal boron nitride (h-BN) and their hetero-junction.
To perform a realistic simulation, this potential must be used in combination with
-intra-layer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential.
-To keep the intra-layer properties unaffected, the interlayer interaction
+intralayer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential.
+To keep the intralayer properties unaffected, the interlayer interaction
within the same layers should be avoided. Hence, each atom has to have a layer
identifier such that atoms residing on the same layer interact via the
-appropriate intra-layer potential and atoms residing on different layers
+appropriate intralayer potential and atoms residing on different layers
interact via the ILP. Here, the molecule id is chosen as the layer identifier,
thus a data file with the "full" atom style is required to use this potential.
@@ -117,6 +117,7 @@ units, if your simulation does not use {metal} units.
"pair_coeff"_pair_coeff.html,
"pair_none"_pair_none.html,
"pair_style hybrid/overlay"_pair_hybrid.html,
+"pair_style drip"_pair_drip.html,
"pair_style pair_kolmogorov_crespi_z"_pair_kolmogorov_crespi_z.html,
"pair_style pair_kolmogorov_crespi_full"_pair_kolmogorov_crespi_full.html,
"pair_style pair_lebedeva_z"_pair_lebedeva_z.html,
diff --git a/doc/src/pair_kolmogorov_crespi_full.txt b/doc/src/pair_kolmogorov_crespi_full.txt
index 05effc5620..20ebe9a3b1 100644
--- a/doc/src/pair_kolmogorov_crespi_full.txt
+++ b/doc/src/pair_kolmogorov_crespi_full.txt
@@ -44,12 +44,12 @@ can be found in pair style "ilp/graphene/hbn"_pair_ilp_graphene_hbn.html.
NOTE: This potential (ILP) is intended for interlayer interactions between two
different layers of graphene. To perform a realistic simulation, this potential
-must be used in combination with intra-layer potential, such as
+must be used in combination with intralayer potential, such as
"AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential.
-To keep the intra-layer properties unaffected, the interlayer interaction
+To keep the intralayer properties unaffected, the interlayer interaction
within the same layers should be avoided. Hence, each atom has to have a layer
identifier such that atoms residing on the same layer interact via the
-appropriate intra-layer potential and atoms residing on different layers
+appropriate intralayer potential and atoms residing on different layers
interact via the ILP. Here, the molecule id is chosen as the layer identifier,
thus a data file with the "full" atom style is required to use this potential.
@@ -106,6 +106,7 @@ units.
"pair_coeff"_pair_coeff.html,
"pair_none"_pair_none.html,
"pair_style hybrid/overlay"_pair_hybrid.html,
+"pair_style drip"_pair_drip.html,
"pair_style pair_lebedeva_z"_pair_lebedeva_z.html,
"pair_style kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html,
"pair_style ilp/graphene/hbn"_pair_ilp_graphene_hbn.html.
diff --git a/doc/src/pair_kolmogorov_crespi_z.txt b/doc/src/pair_kolmogorov_crespi_z.txt
index aabb3460e7..c3132bb031 100644
--- a/doc/src/pair_kolmogorov_crespi_z.txt
+++ b/doc/src/pair_kolmogorov_crespi_z.txt
@@ -59,6 +59,7 @@ package"_Build_package.html doc page for more info.
"pair_coeff"_pair_coeff.html,
"pair_none"_pair_none.html,
"pair_style hybrid/overlay"_pair_hybrid.html,
+"pair_style drip"_pair_drip.html,
"pair_style ilp/graphene/hbn"_pair_ilp_graphene_hbn.html.
"pair_style kolmogorov/crespi/full"_pair_kolmogorov_crespi_full.html,
"pair_style lebedeva/z"_pair_lebedeva_z.html
diff --git a/doc/src/pair_lebedeva_z.txt b/doc/src/pair_lebedeva_z.txt
index 9eab56d0d9..a05f5a3533 100644
--- a/doc/src/pair_lebedeva_z.txt
+++ b/doc/src/pair_lebedeva_z.txt
@@ -53,6 +53,7 @@ package"_Build_package.html doc page for more info.
"pair_coeff"_pair_coeff.html,
"pair_style none"_pair_none.html,
"pair_style hybrid/overlay"_pair_hybrid.html,
+"pair_style drip"_pair_drip.html,
"pair_style ilp/graphene/hbd"_pair_ilp_graphene_hbn.html,
"pair_style kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html,
"pair_style kolmogorov/crespi/full"_pair_kolmogorov_crespi_full.html.
diff --git a/doc/src/pair_mdf.txt b/doc/src/pair_mdf.txt
index 8a1551dded..44c9e7f67d 100644
--- a/doc/src/pair_mdf.txt
+++ b/doc/src/pair_mdf.txt
@@ -30,16 +30,16 @@ args = list of arguments for a particular style :l
[Examples:]
pair_style lj/mdf 2.5 3.0
-pair_coeff * * 1 1
-pair_coeff 1 1 1 1.1 2.8 3.0 3.2 :pre
+pair_coeff * * 1.0 1.0
+pair_coeff 1 1 1.1 2.8 3.0 3.2 :pre
pair_style buck 2.5 3.0
pair_coeff * * 100.0 1.5 200.0
pair_coeff * * 100.0 1.5 200.0 3.0 3.5 :pre
pair_style lennard/mdf 2.5 3.0
-pair_coeff * * 1 1
-pair_coeff 1 1 1 1.1 2.8 3.0 3.2 :pre
+pair_coeff * * 1.0 1.0
+pair_coeff 1 1 1021760.3664 2120.317338 3.0 3.2 :pre
[Description:]
@@ -69,11 +69,12 @@ standard 12-6 Lennard-Jones written in the epsilon/sigma form:
:c,image(Eqs/pair_mdf-4.jpg)
-The following coefficients must be defined for each pair of atoms
-types via the pair_coeff command as in the examples above, or in the
-data file or restart files read by the "read_data"_read_data.html or
-"read_restart commands"_read_restart.html, or by mixing as described
-below:
+Either the first two or all of the following coefficients must be
+defined for each pair of atoms types via the pair_coeff command as
+in the examples above, or in the data file read by the
+"read_data"_read_data.html. The two cutoffs default to the global
+values and epsilon and sigma can also be determined by mixing as
+described below:
epsilon (energy units)
sigma (distance units)
@@ -83,7 +84,9 @@ r_{cut} (distance units) :ul
:line
For the {buck/mdf} pair_style, the potential energy, {E(r)}, is the
-standard Buckingham potential:
+standard Buckingham potential with three required coefficients.
+The two cutoffs can be omitted and default to the corresponding
+global values:
:c,image(Eqs/pair_mdf-5.jpg)
@@ -91,19 +94,20 @@ A (energy units)
\rho (distance units)
C (energy-distance^6 units)
r_m (distance units)
-r_{cut}$ (distance units) :ul
+r_{cut} (distance units) :ul
:line
For the {lennard/mdf} pair_style, the potential energy, {E(r)}, is the
-standard 12-6 Lennard-Jones written in the $A/B$ form:
+standard 12-6 Lennard-Jones written in the A/B form:
:c,image(Eqs/pair_mdf-6.jpg)
The following coefficients must be defined for each pair of atoms
types via the pair_coeff command as in the examples above, or in the
-data file or restart files read by the read_data or read_restart
-commands, or by mixing as described below:
+data file read by the read_data commands, or by mixing as described below.
+The two cutoffs default to their global values and must be either both
+given or both left out:
A (energy-distance^12 units)
B (energy-distance^6 units)
@@ -115,33 +119,23 @@ r_{cut} (distance units) :ul
[Mixing, shift, table, tail correction, restart, rRESPA info]:
For atom type pairs I,J and I != J, the epsilon and sigma coefficients
-and cutoff distance for all of the lj/cut pair styles can be mixed.
+and cutoff distances for the lj/mdf pair style can be mixed.
The default mix value is {geometric}. See the "pair_modify" command
-for details.
+for details. The other two pair styles buck/mdf and lennard/mdf do not
+support mixing, so all I,J pairs of coefficients must be specified
+explicitly.
-All of the {lj/cut} pair styles support the
-"pair_modify"_pair_modify.html shift option for the energy of the
-Lennard-Jones portion of the pair interaction.
+None of the lj/mdf, buck/mdf, or lennard/mdf pair styles supports
+the "pair_modify"_pair_modify.html shift option or long-range
+tail corrections to pressure and energy.
-The {lj/cut/coul/long} and {lj/cut/tip4p/long} pair styles support the
-"pair_modify"_pair_modify.html table option since they can tabulate
-the short-range portion of the long-range Coulombic interaction.
+These styles write their information to "binary restart
+files"_restart.html, so pair_style and pair_coeff commands do not need
+to be specified in an input script that reads a restart file.
-All of the {lj/cut} pair styles support the
-"pair_modify"_pair_modify.html tail option for adding a long-range
-tail correction to the energy and pressure for the Lennard-Jones
-portion of the pair interaction.
-
-All of the {lj/cut} pair styles write their information to "binary
-restart files"_restart.html, so pair_style and pair_coeff commands do
-not need to be specified in an input script that reads a restart file.
-
-The {lj/cut} and {lj/cut/coul/long} pair styles support the use of the
-{inner}, {middle}, and {outer} keywords of the "run_style
-respa"_run_style.html command, meaning the pairwise forces can be
-partitioned by distance at different levels of the rRESPA hierarchy.
-The other styles only support the {pair} keyword of run_style respa.
-See the "run_style"_run_style.html command for details.
+These styles can only be used via the {pair} keyword of the "run_style
+respa"_run_style.html command. They do not support the {inner},
+{middle}, {outer} keywords.
:line
diff --git a/doc/src/pair_spin_dmi.txt b/doc/src/pair_spin_dmi.txt
index bc67e43ecd..9ddff8a8dc 100644
--- a/doc/src/pair_spin_dmi.txt
+++ b/doc/src/pair_spin_dmi.txt
@@ -88,4 +88,4 @@ package"_Build_package.html doc page for more info.
Physical Review B, 88(18), 184422. (2013).
:link(Tranchida5)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/pair_spin_exchange.txt b/doc/src/pair_spin_exchange.txt
index 10d65a55a1..76a6d508d2 100644
--- a/doc/src/pair_spin_exchange.txt
+++ b/doc/src/pair_spin_exchange.txt
@@ -95,4 +95,4 @@ package"_Build_package.html doc page for more info.
:link(Tranchida3)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/pair_spin_magelec.txt b/doc/src/pair_spin_magelec.txt
index 151ecdec3d..206da4bb51 100644
--- a/doc/src/pair_spin_magelec.txt
+++ b/doc/src/pair_spin_magelec.txt
@@ -70,4 +70,4 @@ package"_Build_package.html doc page for more info.
:link(Tranchida4)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau, and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/pair_spin_neel.txt b/doc/src/pair_spin_neel.txt
index 8e2242f013..009ef7947d 100644
--- a/doc/src/pair_spin_neel.txt
+++ b/doc/src/pair_spin_neel.txt
@@ -80,4 +80,4 @@ package"_Build_package.html doc page for more info.
:link(Tranchida6)
[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson,
-Journal of Computational Physics, (2018).
+Journal of Computational Physics, 372, 406-425, (2018).
diff --git a/doc/src/pair_style.txt b/doc/src/pair_style.txt
index 27cc168236..e305bc705d 100644
--- a/doc/src/pair_style.txt
+++ b/doc/src/pair_style.txt
@@ -148,6 +148,7 @@ accelerated styles exist.
"dpd/tstat"_pair_dpd.html - pair-wise DPD thermostatting
"dsmc"_pair_dsmc.html - Direct Simulation Monte Carlo (DSMC)
"e3b"_pair_e3b.html - Explicit-three body (E3B) water model
+"drip"_pair_drip.html - Dihedral-angle-corrected registry-dependent interlayer potential (DRIP)
"eam"_pair_eam.html - embedded atom method (EAM)
"eam/alloy"_pair_eam.html - alloy EAM
"eam/cd"_pair_eam.html - concentration-dependent EAM
@@ -175,7 +176,7 @@ accelerated styles exist.
"kolmogorov/crespi/full"_pair_kolmogorov_crespi_full.html - Kolmogorov-Crespi (KC) potential with no simplifications
"kolmogorov/crespi/z"_pair_kolmogorov_crespi_z.html - Kolmogorov-Crespi (KC) potential with normals along z-axis
"lcbop"_pair_lcbop.html - long-range bond-order potential (LCBOP)
-"lebedeva/z"_pair_lebedeva_z.html - Lebedeva inter-layer potential for graphene with normals along z-axis
+"lebedeva/z"_pair_lebedeva_z.html - Lebedeva interlayer potential for graphene with normals along z-axis
"lennard/mdf"_pair_mdf.html - LJ potential in A/B form with a taper function
"line/lj"_pair_line_lj.html - LJ potential between line segments
"list"_pair_list.html - potential between pairs of atoms explicitly listed in an input file
diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt
index 119771cd0d..babdd2d1cc 100644
--- a/doc/src/pairs.txt
+++ b/doc/src/pairs.txt
@@ -31,6 +31,7 @@ Pair Styles :h1
pair_dipole
pair_dpd
pair_dpd_fdt
+ pair_drip
pair_dsmc
pair_e3b
pair_eam
diff --git a/doc/src/write_coeff.txt b/doc/src/write_coeff.txt
index 5dc4b331de..74d19b5c3d 100644
--- a/doc/src/write_coeff.txt
+++ b/doc/src/write_coeff.txt
@@ -26,11 +26,9 @@ coefficients in a way, that it can be read by LAMMPS with the
option of "write_data"_write_data.html this can be used to move
the Coeffs sections from a data file into a separate file.
-NOTE: The write_coeff command is not yet fully implemented in two
-respects. First, some pair styles do not yet write their coefficient
-information into the coeff file. This means you will need to specify
-that information in your input script that reads the data file, via
-the "pair_coeff"_pair_coeff.html command.
+NOTE: The write_coeff command is not yet fully implemented as
+some pair styles do not output their coefficient information.
+This means you will need to add/copy this information manually.
:line
diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt
index 041337786c..e8a722e3e2 100644
--- a/doc/utils/sphinx-config/false_positives.txt
+++ b/doc/utils/sphinx-config/false_positives.txt
@@ -200,6 +200,7 @@ Berkowitz
berlin
Berne
Bertotti
+Bessarab
Beutler
bgq
Bh
@@ -593,6 +594,7 @@ Dmax
dmg
dmi
dnf
+DNi
Dobson
Dodds
dodgerblue
@@ -965,6 +967,8 @@ gmail
gmake
gmask
Gmask
+gneb
+GNEB
googlemail
Gordan
GPa
@@ -1159,6 +1163,7 @@ Interparticle
interstitials
Intr
intra
+intralayer
intramolecular
ints
inv
@@ -1275,6 +1280,7 @@ Katsnelson
Katsura
Kaufmann
Kawata
+Kaxiras
Kayser
kb
kB
@@ -2373,6 +2379,7 @@ rNEMD
ro
Rochus
Rockett
+Rodrigues
Rohart
Ronchetti
Rosati
@@ -2779,6 +2786,7 @@ tt
Tt
TThis
ttm
+ttol
tu
Tuckerman
tue
@@ -2851,6 +2859,7 @@ utsa
Uttormark
uvm
uwo
+Uzdin
vacf
valent
Valeriu
@@ -2950,7 +2959,7 @@ wB
Wbody
webpage
Weckner
-WeinenE
+WeinanE
Wennberg
Westview
wget
diff --git a/examples/SPIN/gneb/README b/examples/SPIN/gneb/README
new file mode 100644
index 0000000000..9d43c775b6
--- /dev/null
+++ b/examples/SPIN/gneb/README
@@ -0,0 +1,13 @@
+Perform geodesic NEB calculations for spin configurations.
+The two examples are:
+- the magnetic switching of an iron nanoisland
+- the collapse of a magnetic skyrmion
+
+Run those examples as:
+
+mpirun -np 3 lmp_mpi -in in.gneb.iron -partition 3x1
+
+You should be able to use any number of replicas >= 3.
+
+In the interpolate/ directory, a c routine is provided to
+interpolate the MEP.
diff --git a/examples/SPIN/gneb/iron/final.iron_spin b/examples/SPIN/gneb/iron/final.iron_spin
new file mode 100644
index 0000000000..aa1cbae770
--- /dev/null
+++ b/examples/SPIN/gneb/iron/final.iron_spin
@@ -0,0 +1,68 @@
+32
+1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+2 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+3 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+4 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+5 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+6 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+7 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+8 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+9 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+10 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+11 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+12 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+13 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+14 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+15 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+16 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+17 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+18 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+19 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+20 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+21 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+22 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+23 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+24 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+25 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+26 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+27 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+28 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+29 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+30 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+31 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+32 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/SPIN/gneb/iron/in.gneb.iron b/examples/SPIN/gneb/iron/in.gneb.iron
new file mode 100644
index 0000000000..95e7071cb0
--- /dev/null
+++ b/examples/SPIN/gneb/iron/in.gneb.iron
@@ -0,0 +1,50 @@
+
+units metal
+dimension 3
+boundary p p f
+atom_style spin
+
+# necessary for the serial algorithm (sametag)
+atom_modify map array
+
+# setting mass, mag. moments, and interactions for bcc iron
+# (mass not necessary for fixed lattice calculation)
+
+read_data initial.iron_spin
+mass 1 55.845
+
+pair_style spin/exchange 3.5
+pair_coeff * * exchange 3.4 0.02726 0.2171 1.841
+
+neighbor 0.1 bin
+neigh_modify every 10 check yes delay 20
+
+fix 1 all precession/spin zeeman 0.1 0.0 0.0 1.0 anisotropy 0.0001 1.0 0.0 0.0
+fix_modify 1 energy yes
+fix 3 all neb/spin 1.0
+
+timestep 0.0001
+thermo 100
+
+compute out_mag all spin
+compute out_pe all pe
+compute out_ke all ke
+compute out_temp all temp
+
+variable magx equal c_out_mag[1]
+variable magy equal c_out_mag[2]
+variable magz equal c_out_mag[3]
+variable magnorm equal c_out_mag[4]
+variable emag equal c_out_mag[5]
+
+thermo 100
+thermo_style custom step time v_magx v_magz v_magnorm etotal
+thermo_modify format float %20.15g
+
+compute outsp all property/atom spx spy spz sp fmx fmy fmz
+variable u universe 1 2 3 4
+dump 1 all custom 200 dump.$u type x y z c_outsp[1] c_outsp[2] c_outsp[3]
+
+min_style spin
+min_modify alpha_damp 1.0 discrete_factor 10.0
+neb/spin 1.0e-12 1.0e-12 200000 100000 1000 final final.iron_spin verbose
diff --git a/examples/SPIN/gneb/iron/initial.iron_spin b/examples/SPIN/gneb/iron/initial.iron_spin
new file mode 100644
index 0000000000..1d28afe400
--- /dev/null
+++ b/examples/SPIN/gneb/iron/initial.iron_spin
@@ -0,0 +1,82 @@
+LAMMPS data file via write_data, version 4 Jan 2019, timestep = 0
+
+32 atoms
+1 atom types
+
+0.0000000000000000e+00 1.1465999999999999e+01 xlo xhi
+0.0000000000000000e+00 1.1465999999999999e+01 ylo yhi
+0.0000000000000000e+00 2.8664999999999998e+00 zlo zhi
+
+Masses
+
+1 55.845
+
+Atoms # spin
+
+1 1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+2 1 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+3 1 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+4 1 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+5 1 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+6 1 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+7 1 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+8 1 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+9 1 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+11 1 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+13 1 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+15 1 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+10 1 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+12 1 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+14 1 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+16 1 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+17 1 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+18 1 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+19 1 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+20 1 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+21 1 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+22 1 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+23 1 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+24 1 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+25 1 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+27 1 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+29 1 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+31 1 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+26 1 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+28 1 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+30 1 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+32 1 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0
+
+Velocities
+
+1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
diff --git a/examples/SPIN/gneb/skyrmion/final.skyrmion b/examples/SPIN/gneb/skyrmion/final.skyrmion
new file mode 100644
index 0000000000..4ff51f6376
--- /dev/null
+++ b/examples/SPIN/gneb/skyrmion/final.skyrmion
@@ -0,0 +1,401 @@
+400
+1 2.5 0.0 0.0 0.0 0.0 0.0 1.0
+2 2.5 0.0 3.0 0.0 0.0 0.0 1.0
+3 2.5 0.0 6.0 0.0 0.0 0.0 1.0
+4 2.5 0.0 9.0 0.0 0.0 0.0 1.0
+5 2.5 0.0 12.0 0.0 0.0 0.0 1.0
+6 2.5 0.0 15.0 0.0 0.0 0.0 1.0
+7 2.5 0.0 18.0 0.0 0.0 0.0 1.0
+8 2.5 0.0 21.0 0.0 0.0 0.0 1.0
+9 2.5 0.0 24.0 0.0 0.0 0.0 1.0
+10 2.5 0.0 27.0 0.0 0.0 0.0 1.0
+11 2.5 0.0 30.0 0.0 0.0 0.0 1.0
+12 2.5 0.0 33.0 0.0 0.0 0.0 1.0
+13 2.5 0.0 36.0 0.0 0.0 0.0 1.0
+14 2.5 0.0 39.0 0.0 0.0 0.0 1.0
+15 2.5 0.0 42.0 0.0 0.0 0.0 1.0
+16 2.5 0.0 45.0 0.0 0.0 0.0 1.0
+17 2.5 0.0 48.0 0.0 0.0 0.0 1.0
+18 2.5 0.0 51.0 0.0 0.0 0.0 1.0
+19 2.5 0.0 54.0 0.0 0.0 0.0 1.0
+20 2.5 0.0 57.0 0.0 0.0 0.0 1.0
+21 2.5 3.0 0.0 0.0 0.0 0.0 1.0
+22 2.5 3.0 3.0 0.0 0.0 0.0 1.0
+23 2.5 3.0 6.0 0.0 0.0 0.0 1.0
+24 2.5 3.0 9.0 0.0 0.0 0.0 1.0
+25 2.5 3.0 12.0 0.0 0.0 0.0 1.0
+26 2.5 3.0 15.0 0.0 0.0 0.0 1.0
+27 2.5 3.0 18.0 0.0 0.0 0.0 1.0
+28 2.5 3.0 21.0 0.0 0.0 0.0 1.0
+29 2.5 3.0 24.0 0.0 0.0 0.0 1.0
+30 2.5 3.0 27.0 0.0 0.0 0.0 1.0
+31 2.5 3.0 30.0 0.0 0.0 0.0 1.0
+32 2.5 3.0 33.0 0.0 0.0 0.0 1.0
+33 2.5 3.0 36.0 0.0 0.0 0.0 1.0
+34 2.5 3.0 39.0 0.0 0.0 0.0 1.0
+35 2.5 3.0 42.0 0.0 0.0 0.0 1.0
+36 2.5 3.0 45.0 0.0 0.0 0.0 1.0
+37 2.5 3.0 48.0 0.0 0.0 0.0 1.0
+38 2.5 3.0 51.0 0.0 0.0 0.0 1.0
+39 2.5 3.0 54.0 0.0 0.0 0.0 1.0
+40 2.5 3.0 57.0 0.0 0.0 0.0 1.0
+41 2.5 6.0 0.0 0.0 0.0 0.0 1.0
+42 2.5 6.0 3.0 0.0 0.0 0.0 1.0
+43 2.5 6.0 6.0 0.0 0.0 0.0 1.0
+44 2.5 6.0 9.0 0.0 0.0 0.0 1.0
+45 2.5 6.0 12.0 0.0 0.0 0.0 1.0
+46 2.5 6.0 15.0 0.0 0.0 0.0 1.0
+47 2.5 6.0 18.0 0.0 0.0 0.0 1.0
+48 2.5 6.0 21.0 0.0 0.0 0.0 1.0
+49 2.5 6.0 24.0 0.0 0.0 0.0 1.0
+50 2.5 6.0 27.0 0.0 0.0 0.0 1.0
+51 2.5 6.0 30.0 0.0 0.0 0.0 1.0
+52 2.5 6.0 33.0 0.0 0.0 0.0 1.0
+53 2.5 6.0 36.0 0.0 0.0 0.0 1.0
+54 2.5 6.0 39.0 0.0 0.0 0.0 1.0
+55 2.5 6.0 42.0 0.0 0.0 0.0 1.0
+56 2.5 6.0 45.0 0.0 0.0 0.0 1.0
+57 2.5 6.0 48.0 0.0 0.0 0.0 1.0
+58 2.5 6.0 51.0 0.0 0.0 0.0 1.0
+59 2.5 6.0 54.0 0.0 0.0 0.0 1.0
+60 2.5 6.0 57.0 0.0 0.0 0.0 1.0
+61 2.5 9.0 0.0 0.0 0.0 0.0 1.0
+62 2.5 9.0 3.0 0.0 0.0 0.0 1.0
+63 2.5 9.0 6.0 0.0 0.0 0.0 1.0
+64 2.5 9.0 9.0 0.0 0.0 0.0 1.0
+65 2.5 9.0 12.0 0.0 0.0 0.0 1.0
+66 2.5 9.0 15.0 0.0 0.0 0.0 1.0
+67 2.5 9.0 18.0 0.0 0.0 0.0 1.0
+68 2.5 9.0 21.0 0.0 0.0 0.0 1.0
+69 2.5 9.0 24.0 0.0 0.0 0.0 1.0
+70 2.5 9.0 27.0 0.0 0.0 0.0 1.0
+71 2.5 9.0 30.0 0.0 0.0 0.0 1.0
+72 2.5 9.0 33.0 0.0 0.0 0.0 1.0
+73 2.5 9.0 36.0 0.0 0.0 0.0 1.0
+74 2.5 9.0 39.0 0.0 0.0 0.0 1.0
+75 2.5 9.0 42.0 0.0 0.0 0.0 1.0
+76 2.5 9.0 45.0 0.0 0.0 0.0 1.0
+77 2.5 9.0 48.0 0.0 0.0 0.0 1.0
+78 2.5 9.0 51.0 0.0 0.0 0.0 1.0
+79 2.5 9.0 54.0 0.0 0.0 0.0 1.0
+80 2.5 9.0 57.0 0.0 0.0 0.0 1.0
+81 2.5 12.0 0.0 0.0 0.0 0.0 1.0
+82 2.5 12.0 3.0 0.0 0.0 0.0 1.0
+83 2.5 12.0 6.0 0.0 0.0 0.0 1.0
+84 2.5 12.0 9.0 0.0 0.0 0.0 1.0
+85 2.5 12.0 12.0 0.0 0.0 0.0 1.0
+86 2.5 12.0 15.0 0.0 0.0 0.0 1.0
+87 2.5 12.0 18.0 0.0 0.0 0.0 1.0
+88 2.5 12.0 21.0 0.0 0.0 0.0 1.0
+89 2.5 12.0 24.0 0.0 0.0 0.0 1.0
+90 2.5 12.0 27.0 0.0 0.0 0.0 1.0
+91 2.5 12.0 30.0 0.0 0.0 0.0 1.0
+92 2.5 12.0 33.0 0.0 0.0 0.0 1.0
+93 2.5 12.0 36.0 0.0 0.0 0.0 1.0
+94 2.5 12.0 39.0 0.0 0.0 0.0 1.0
+95 2.5 12.0 42.0 0.0 0.0 0.0 1.0
+96 2.5 12.0 45.0 0.0 0.0 0.0 1.0
+97 2.5 12.0 48.0 0.0 0.0 0.0 1.0
+98 2.5 12.0 51.0 0.0 0.0 0.0 1.0
+99 2.5 12.0 54.0 0.0 0.0 0.0 1.0
+100 2.5 12.0 57.0 0.0 0.0 0.0 1.0
+101 2.5 15.0 0.0 0.0 0.0 0.0 1.0
+102 2.5 15.0 3.0 0.0 0.0 0.0 1.0
+103 2.5 15.0 6.0 0.0 0.0 0.0 1.0
+104 2.5 15.0 9.0 0.0 0.0 0.0 1.0
+105 2.5 15.0 12.0 0.0 0.0 0.0 1.0
+106 2.5 15.0 15.0 0.0 0.0 0.0 1.0
+107 2.5 15.0 18.0 0.0 0.0 0.0 1.0
+108 2.5 15.0 21.0 0.0 0.0 0.0 1.0
+109 2.5 15.0 24.0 0.0 0.0 0.0 1.0
+110 2.5 15.0 27.0 0.0 0.0 0.0 1.0
+111 2.5 15.0 30.0 0.0 0.0 0.0 1.0
+112 2.5 15.0 33.0 0.0 0.0 0.0 1.0
+113 2.5 15.0 36.0 0.0 0.0 0.0 1.0
+114 2.5 15.0 39.0 0.0 0.0 0.0 1.0
+115 2.5 15.0 42.0 0.0 0.0 0.0 1.0
+116 2.5 15.0 45.0 0.0 0.0 0.0 1.0
+117 2.5 15.0 48.0 0.0 0.0 0.0 1.0
+118 2.5 15.0 51.0 0.0 0.0 0.0 1.0
+119 2.5 15.0 54.0 0.0 0.0 0.0 1.0
+120 2.5 15.0 57.0 0.0 0.0 0.0 1.0
+121 2.5 18.0 0.0 0.0 0.0 0.0 1.0
+122 2.5 18.0 3.0 0.0 0.0 0.0 1.0
+123 2.5 18.0 6.0 0.0 0.0 0.0 1.0
+124 2.5 18.0 9.0 0.0 0.0 0.0 1.0
+125 2.5 18.0 12.0 0.0 0.0 0.0 1.0
+126 2.5 18.0 15.0 0.0 0.0 0.0 1.0
+127 2.5 18.0 18.0 0.0 0.0 0.0 1.0
+128 2.5 18.0 21.0 0.0 0.0 0.0 1.0
+129 2.5 18.0 24.0 0.0 0.0 0.0 1.0
+130 2.5 18.0 27.0 0.0 0.0 0.0 1.0
+131 2.5 18.0 30.0 0.0 0.0 0.0 1.0
+132 2.5 18.0 33.0 0.0 0.0 0.0 1.0
+133 2.5 18.0 36.0 0.0 0.0 0.0 1.0
+134 2.5 18.0 39.0 0.0 0.0 0.0 1.0
+135 2.5 18.0 42.0 0.0 0.0 0.0 1.0
+136 2.5 18.0 45.0 0.0 0.0 0.0 1.0
+137 2.5 18.0 48.0 0.0 0.0 0.0 1.0
+138 2.5 18.0 51.0 0.0 0.0 0.0 1.0
+139 2.5 18.0 54.0 0.0 0.0 0.0 1.0
+140 2.5 18.0 57.0 0.0 0.0 0.0 1.0
+141 2.5 21.0 0.0 0.0 0.0 0.0 1.0
+142 2.5 21.0 3.0 0.0 0.0 0.0 1.0
+143 2.5 21.0 6.0 0.0 0.0 0.0 1.0
+144 2.5 21.0 9.0 0.0 0.0 0.0 1.0
+145 2.5 21.0 12.0 0.0 0.0 0.0 1.0
+146 2.5 21.0 15.0 0.0 0.0 0.0 1.0
+147 2.5 21.0 18.0 0.0 0.0 0.0 1.0
+148 2.5 21.0 21.0 0.0 0.0 0.0 1.0
+149 2.5 21.0 24.0 0.0 0.0 0.0 1.0
+150 2.5 21.0 27.0 0.0 0.0 0.0 1.0
+151 2.5 21.0 30.0 0.0 0.0 0.0 1.0
+152 2.5 21.0 33.0 0.0 0.0 0.0 1.0
+153 2.5 21.0 36.0 0.0 0.0 0.0 1.0
+154 2.5 21.0 39.0 0.0 0.0 0.0 1.0
+155 2.5 21.0 42.0 0.0 0.0 0.0 1.0
+156 2.5 21.0 45.0 0.0 0.0 0.0 1.0
+157 2.5 21.0 48.0 0.0 0.0 0.0 1.0
+158 2.5 21.0 51.0 0.0 0.0 0.0 1.0
+159 2.5 21.0 54.0 0.0 0.0 0.0 1.0
+160 2.5 21.0 57.0 0.0 0.0 0.0 1.0
+161 2.5 24.0 0.0 0.0 0.0 0.0 1.0
+162 2.5 24.0 3.0 0.0 0.0 0.0 1.0
+163 2.5 24.0 6.0 0.0 0.0 0.0 1.0
+164 2.5 24.0 9.0 0.0 0.0 0.0 1.0
+165 2.5 24.0 12.0 0.0 0.0 0.0 1.0
+166 2.5 24.0 15.0 0.0 0.0 0.0 1.0
+167 2.5 24.0 18.0 0.0 0.0 0.0 1.0
+168 2.5 24.0 21.0 0.0 0.0 0.0 1.0
+169 2.5 24.0 24.0 0.0 0.0 0.0 1.0
+170 2.5 24.0 27.0 0.0 0.0 0.0 1.0
+171 2.5 24.0 30.0 0.0 0.0 0.0 1.0
+172 2.5 24.0 33.0 0.0 0.0 0.0 1.0
+173 2.5 24.0 36.0 0.0 0.0 0.0 1.0
+174 2.5 24.0 39.0 0.0 0.0 0.0 1.0
+175 2.5 24.0 42.0 0.0 0.0 0.0 1.0
+176 2.5 24.0 45.0 0.0 0.0 0.0 1.0
+177 2.5 24.0 48.0 0.0 0.0 0.0 1.0
+178 2.5 24.0 51.0 0.0 0.0 0.0 1.0
+179 2.5 24.0 54.0 0.0 0.0 0.0 1.0
+180 2.5 24.0 57.0 0.0 0.0 0.0 1.0
+181 2.5 27.0 0.0 0.0 0.0 0.0 1.0
+182 2.5 27.0 3.0 0.0 0.0 0.0 1.0
+183 2.5 27.0 6.0 0.0 0.0 0.0 1.0
+184 2.5 27.0 9.0 0.0 0.0 0.0 1.0
+185 2.5 27.0 12.0 0.0 0.0 0.0 1.0
+186 2.5 27.0 15.0 0.0 0.0 0.0 1.0
+187 2.5 27.0 18.0 0.0 0.0 0.0 1.0
+188 2.5 27.0 21.0 0.0 0.0 0.0 1.0
+189 2.5 27.0 24.0 0.0 0.0 0.0 1.0
+190 2.5 27.0 27.0 0.0 0.0 0.0 1.0
+191 2.5 27.0 30.0 0.0 0.0 0.0 1.0
+192 2.5 27.0 33.0 0.0 0.0 0.0 1.0
+193 2.5 27.0 36.0 0.0 0.0 0.0 1.0
+194 2.5 27.0 39.0 0.0 0.0 0.0 1.0
+195 2.5 27.0 42.0 0.0 0.0 0.0 1.0
+196 2.5 27.0 45.0 0.0 0.0 0.0 1.0
+197 2.5 27.0 48.0 0.0 0.0 0.0 1.0
+198 2.5 27.0 51.0 0.0 0.0 0.0 1.0
+199 2.5 27.0 54.0 0.0 0.0 0.0 1.0
+200 2.5 27.0 57.0 0.0 0.0 0.0 1.0
+201 2.5 30.0 0.0 0.0 0.0 0.0 1.0
+202 2.5 30.0 3.0 0.0 0.0 0.0 1.0
+203 2.5 30.0 6.0 0.0 0.0 0.0 1.0
+204 2.5 30.0 9.0 0.0 0.0 0.0 1.0
+205 2.5 30.0 12.0 0.0 0.0 0.0 1.0
+206 2.5 30.0 15.0 0.0 0.0 0.0 1.0
+207 2.5 30.0 18.0 0.0 0.0 0.0 1.0
+208 2.5 30.0 21.0 0.0 0.0 0.0 1.0
+209 2.5 30.0 24.0 0.0 0.0 0.0 1.0
+210 2.5 30.0 27.0 0.0 0.0 0.0 1.0
+211 2.5 30.0 30.0 0.0 0.0 0.0 1.0
+212 2.5 30.0 33.0 0.0 0.0 0.0 1.0
+213 2.5 30.0 36.0 0.0 0.0 0.0 1.0
+214 2.5 30.0 39.0 0.0 0.0 0.0 1.0
+215 2.5 30.0 42.0 0.0 0.0 0.0 1.0
+216 2.5 30.0 45.0 0.0 0.0 0.0 1.0
+217 2.5 30.0 48.0 0.0 0.0 0.0 1.0
+218 2.5 30.0 51.0 0.0 0.0 0.0 1.0
+219 2.5 30.0 54.0 0.0 0.0 0.0 1.0
+220 2.5 30.0 57.0 0.0 0.0 0.0 1.0
+221 2.5 33.0 0.0 0.0 0.0 0.0 1.0
+222 2.5 33.0 3.0 0.0 0.0 0.0 1.0
+223 2.5 33.0 6.0 0.0 0.0 0.0 1.0
+224 2.5 33.0 9.0 0.0 0.0 0.0 1.0
+225 2.5 33.0 12.0 0.0 0.0 0.0 1.0
+226 2.5 33.0 15.0 0.0 0.0 0.0 1.0
+227 2.5 33.0 18.0 0.0 0.0 0.0 1.0
+228 2.5 33.0 21.0 0.0 0.0 0.0 1.0
+229 2.5 33.0 24.0 0.0 0.0 0.0 1.0
+230 2.5 33.0 27.0 0.0 0.0 0.0 1.0
+231 2.5 33.0 30.0 0.0 0.0 0.0 1.0
+232 2.5 33.0 33.0 0.0 0.0 0.0 1.0
+233 2.5 33.0 36.0 0.0 0.0 0.0 1.0
+234 2.5 33.0 39.0 0.0 0.0 0.0 1.0
+235 2.5 33.0 42.0 0.0 0.0 0.0 1.0
+236 2.5 33.0 45.0 0.0 0.0 0.0 1.0
+237 2.5 33.0 48.0 0.0 0.0 0.0 1.0
+238 2.5 33.0 51.0 0.0 0.0 0.0 1.0
+239 2.5 33.0 54.0 0.0 0.0 0.0 1.0
+240 2.5 33.0 57.0 0.0 0.0 0.0 1.0
+241 2.5 36.0 0.0 0.0 0.0 0.0 1.0
+242 2.5 36.0 3.0 0.0 0.0 0.0 1.0
+243 2.5 36.0 6.0 0.0 0.0 0.0 1.0
+244 2.5 36.0 9.0 0.0 0.0 0.0 1.0
+245 2.5 36.0 12.0 0.0 0.0 0.0 1.0
+246 2.5 36.0 15.0 0.0 0.0 0.0 1.0
+247 2.5 36.0 18.0 0.0 0.0 0.0 1.0
+248 2.5 36.0 21.0 0.0 0.0 0.0 1.0
+249 2.5 36.0 24.0 0.0 0.0 0.0 1.0
+250 2.5 36.0 27.0 0.0 0.0 0.0 1.0
+251 2.5 36.0 30.0 0.0 0.0 0.0 1.0
+252 2.5 36.0 33.0 0.0 0.0 0.0 1.0
+253 2.5 36.0 36.0 0.0 0.0 0.0 1.0
+254 2.5 36.0 39.0 0.0 0.0 0.0 1.0
+255 2.5 36.0 42.0 0.0 0.0 0.0 1.0
+256 2.5 36.0 45.0 0.0 0.0 0.0 1.0
+257 2.5 36.0 48.0 0.0 0.0 0.0 1.0
+258 2.5 36.0 51.0 0.0 0.0 0.0 1.0
+259 2.5 36.0 54.0 0.0 0.0 0.0 1.0
+260 2.5 36.0 57.0 0.0 0.0 0.0 1.0
+261 2.5 39.0 0.0 0.0 0.0 0.0 1.0
+262 2.5 39.0 3.0 0.0 0.0 0.0 1.0
+263 2.5 39.0 6.0 0.0 0.0 0.0 1.0
+264 2.5 39.0 9.0 0.0 0.0 0.0 1.0
+265 2.5 39.0 12.0 0.0 0.0 0.0 1.0
+266 2.5 39.0 15.0 0.0 0.0 0.0 1.0
+267 2.5 39.0 18.0 0.0 0.0 0.0 1.0
+268 2.5 39.0 21.0 0.0 0.0 0.0 1.0
+269 2.5 39.0 24.0 0.0 0.0 0.0 1.0
+270 2.5 39.0 27.0 0.0 0.0 0.0 1.0
+271 2.5 39.0 30.0 0.0 0.0 0.0 1.0
+272 2.5 39.0 33.0 0.0 0.0 0.0 1.0
+273 2.5 39.0 36.0 0.0 0.0 0.0 1.0
+274 2.5 39.0 39.0 0.0 0.0 0.0 1.0
+275 2.5 39.0 42.0 0.0 0.0 0.0 1.0
+276 2.5 39.0 45.0 0.0 0.0 0.0 1.0
+277 2.5 39.0 48.0 0.0 0.0 0.0 1.0
+278 2.5 39.0 51.0 0.0 0.0 0.0 1.0
+279 2.5 39.0 54.0 0.0 0.0 0.0 1.0
+280 2.5 39.0 57.0 0.0 0.0 0.0 1.0
+281 2.5 42.0 0.0 0.0 0.0 0.0 1.0
+282 2.5 42.0 3.0 0.0 0.0 0.0 1.0
+283 2.5 42.0 6.0 0.0 0.0 0.0 1.0
+284 2.5 42.0 9.0 0.0 0.0 0.0 1.0
+285 2.5 42.0 12.0 0.0 0.0 0.0 1.0
+286 2.5 42.0 15.0 0.0 0.0 0.0 1.0
+287 2.5 42.0 18.0 0.0 0.0 0.0 1.0
+288 2.5 42.0 21.0 0.0 0.0 0.0 1.0
+289 2.5 42.0 24.0 0.0 0.0 0.0 1.0
+290 2.5 42.0 27.0 0.0 0.0 0.0 1.0
+291 2.5 42.0 30.0 0.0 0.0 0.0 1.0
+292 2.5 42.0 33.0 0.0 0.0 0.0 1.0
+293 2.5 42.0 36.0 0.0 0.0 0.0 1.0
+294 2.5 42.0 39.0 0.0 0.0 0.0 1.0
+295 2.5 42.0 42.0 0.0 0.0 0.0 1.0
+296 2.5 42.0 45.0 0.0 0.0 0.0 1.0
+297 2.5 42.0 48.0 0.0 0.0 0.0 1.0
+298 2.5 42.0 51.0 0.0 0.0 0.0 1.0
+299 2.5 42.0 54.0 0.0 0.0 0.0 1.0
+300 2.5 42.0 57.0 0.0 0.0 0.0 1.0
+301 2.5 45.0 0.0 0.0 0.0 0.0 1.0
+302 2.5 45.0 3.0 0.0 0.0 0.0 1.0
+303 2.5 45.0 6.0 0.0 0.0 0.0 1.0
+304 2.5 45.0 9.0 0.0 0.0 0.0 1.0
+305 2.5 45.0 12.0 0.0 0.0 0.0 1.0
+306 2.5 45.0 15.0 0.0 0.0 0.0 1.0
+307 2.5 45.0 18.0 0.0 0.0 0.0 1.0
+308 2.5 45.0 21.0 0.0 0.0 0.0 1.0
+309 2.5 45.0 24.0 0.0 0.0 0.0 1.0
+310 2.5 45.0 27.0 0.0 0.0 0.0 1.0
+311 2.5 45.0 30.0 0.0 0.0 0.0 1.0
+312 2.5 45.0 33.0 0.0 0.0 0.0 1.0
+313 2.5 45.0 36.0 0.0 0.0 0.0 1.0
+314 2.5 45.0 39.0 0.0 0.0 0.0 1.0
+315 2.5 45.0 42.0 0.0 0.0 0.0 1.0
+316 2.5 45.0 45.0 0.0 0.0 0.0 1.0
+317 2.5 45.0 48.0 0.0 0.0 0.0 1.0
+318 2.5 45.0 51.0 0.0 0.0 0.0 1.0
+319 2.5 45.0 54.0 0.0 0.0 0.0 1.0
+320 2.5 45.0 57.0 0.0 0.0 0.0 1.0
+321 2.5 48.0 0.0 0.0 0.0 0.0 1.0
+322 2.5 48.0 3.0 0.0 0.0 0.0 1.0
+323 2.5 48.0 6.0 0.0 0.0 0.0 1.0
+324 2.5 48.0 9.0 0.0 0.0 0.0 1.0
+325 2.5 48.0 12.0 0.0 0.0 0.0 1.0
+326 2.5 48.0 15.0 0.0 0.0 0.0 1.0
+327 2.5 48.0 18.0 0.0 0.0 0.0 1.0
+328 2.5 48.0 21.0 0.0 0.0 0.0 1.0
+329 2.5 48.0 24.0 0.0 0.0 0.0 1.0
+330 2.5 48.0 27.0 0.0 0.0 0.0 1.0
+331 2.5 48.0 30.0 0.0 0.0 0.0 1.0
+332 2.5 48.0 33.0 0.0 0.0 0.0 1.0
+333 2.5 48.0 36.0 0.0 0.0 0.0 1.0
+334 2.5 48.0 39.0 0.0 0.0 0.0 1.0
+335 2.5 48.0 42.0 0.0 0.0 0.0 1.0
+336 2.5 48.0 45.0 0.0 0.0 0.0 1.0
+337 2.5 48.0 48.0 0.0 0.0 0.0 1.0
+338 2.5 48.0 51.0 0.0 0.0 0.0 1.0
+339 2.5 48.0 54.0 0.0 0.0 0.0 1.0
+340 2.5 48.0 57.0 0.0 0.0 0.0 1.0
+341 2.5 51.0 0.0 0.0 0.0 0.0 1.0
+342 2.5 51.0 3.0 0.0 0.0 0.0 1.0
+343 2.5 51.0 6.0 0.0 0.0 0.0 1.0
+344 2.5 51.0 9.0 0.0 0.0 0.0 1.0
+345 2.5 51.0 12.0 0.0 0.0 0.0 1.0
+346 2.5 51.0 15.0 0.0 0.0 0.0 1.0
+347 2.5 51.0 18.0 0.0 0.0 0.0 1.0
+348 2.5 51.0 21.0 0.0 0.0 0.0 1.0
+349 2.5 51.0 24.0 0.0 0.0 0.0 1.0
+350 2.5 51.0 27.0 0.0 0.0 0.0 1.0
+351 2.5 51.0 30.0 0.0 0.0 0.0 1.0
+352 2.5 51.0 33.0 0.0 0.0 0.0 1.0
+353 2.5 51.0 36.0 0.0 0.0 0.0 1.0
+354 2.5 51.0 39.0 0.0 0.0 0.0 1.0
+355 2.5 51.0 42.0 0.0 0.0 0.0 1.0
+356 2.5 51.0 45.0 0.0 0.0 0.0 1.0
+357 2.5 51.0 48.0 0.0 0.0 0.0 1.0
+358 2.5 51.0 51.0 0.0 0.0 0.0 1.0
+359 2.5 51.0 54.0 0.0 0.0 0.0 1.0
+360 2.5 51.0 57.0 0.0 0.0 0.0 1.0
+361 2.5 54.0 0.0 0.0 0.0 0.0 1.0
+362 2.5 54.0 3.0 0.0 0.0 0.0 1.0
+363 2.5 54.0 6.0 0.0 0.0 0.0 1.0
+364 2.5 54.0 9.0 0.0 0.0 0.0 1.0
+365 2.5 54.0 12.0 0.0 0.0 0.0 1.0
+366 2.5 54.0 15.0 0.0 0.0 0.0 1.0
+367 2.5 54.0 18.0 0.0 0.0 0.0 1.0
+368 2.5 54.0 21.0 0.0 0.0 0.0 1.0
+369 2.5 54.0 24.0 0.0 0.0 0.0 1.0
+370 2.5 54.0 27.0 0.0 0.0 0.0 1.0
+371 2.5 54.0 30.0 0.0 0.0 0.0 1.0
+372 2.5 54.0 33.0 0.0 0.0 0.0 1.0
+373 2.5 54.0 36.0 0.0 0.0 0.0 1.0
+374 2.5 54.0 39.0 0.0 0.0 0.0 1.0
+375 2.5 54.0 42.0 0.0 0.0 0.0 1.0
+376 2.5 54.0 45.0 0.0 0.0 0.0 1.0
+377 2.5 54.0 48.0 0.0 0.0 0.0 1.0
+378 2.5 54.0 51.0 0.0 0.0 0.0 1.0
+379 2.5 54.0 54.0 0.0 0.0 0.0 1.0
+380 2.5 54.0 57.0 0.0 0.0 0.0 1.0
+381 2.5 57.0 0.0 0.0 0.0 0.0 1.0
+382 2.5 57.0 3.0 0.0 0.0 0.0 1.0
+383 2.5 57.0 6.0 0.0 0.0 0.0 1.0
+384 2.5 57.0 9.0 0.0 0.0 0.0 1.0
+385 2.5 57.0 12.0 0.0 0.0 0.0 1.0
+386 2.5 57.0 15.0 0.0 0.0 0.0 1.0
+387 2.5 57.0 18.0 0.0 0.0 0.0 1.0
+388 2.5 57.0 21.0 0.0 0.0 0.0 1.0
+389 2.5 57.0 24.0 0.0 0.0 0.0 1.0
+390 2.5 57.0 27.0 0.0 0.0 0.0 1.0
+391 2.5 57.0 30.0 0.0 0.0 0.0 1.0
+392 2.5 57.0 33.0 0.0 0.0 0.0 1.0
+393 2.5 57.0 36.0 0.0 0.0 0.0 1.0
+394 2.5 57.0 39.0 0.0 0.0 0.0 1.0
+395 2.5 57.0 42.0 0.0 0.0 0.0 1.0
+396 2.5 57.0 45.0 0.0 0.0 0.0 1.0
+397 2.5 57.0 48.0 0.0 0.0 0.0 1.0
+398 2.5 57.0 51.0 0.0 0.0 0.0 1.0
+399 2.5 57.0 54.0 0.0 0.0 0.0 1.0
+400 2.5 57.0 57.0 0.0 0.0 0.0 1.0
diff --git a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion
new file mode 100644
index 0000000000..37075c2e30
--- /dev/null
+++ b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion
@@ -0,0 +1,47 @@
+
+units metal
+dimension 3
+boundary p p f
+atom_style spin
+
+# necessary for the serial algorithm (sametag)
+atom_modify map array
+
+# setting mass, mag. moments, and interactions for bcc iron
+# (mass not necessary for fixed lattice calculation)
+
+read_data initial.skyrmion
+mass 1 55.845
+
+pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1
+pair_coeff * * spin/exchange exchange 3.1 0.01593 0.06626915552 1.211
+pair_coeff * * spin/dmi dmi 3.1 0.12e-03 0.0 0.0 1.0
+
+neighbor 0.1 bin
+neigh_modify every 10 check yes delay 20
+
+fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 anisotropy 5e-05 0.0 0.0 1.0
+fix_modify 1 energy yes
+fix 2 all langevin/spin 0.0 0.0 21
+fix 3 all neb/spin 1.0
+
+timestep 0.0001
+
+compute out_mag all spin
+variable magx equal c_out_mag[1]
+variable magy equal c_out_mag[2]
+variable magz equal c_out_mag[3]
+variable magnorm equal c_out_mag[4]
+variable emag equal c_out_mag[5]
+
+thermo 100
+thermo_style custom step time v_magx v_magz v_magnorm etotal
+thermo_modify format float %20.15g
+
+compute outsp all property/atom spx spy spz sp fmx fmy fmz
+variable u universe 1 2 3 4
+dump 1 all custom 1 dump.$u type x y z c_outsp[1] c_outsp[2] c_outsp[3]
+
+min_style spin
+min_modify alpha_damp 1.0 discrete_factor 10.0
+neb/spin 1.0e-9 1.0e-9 10000 10000 10 final final.skyrmion
diff --git a/examples/SPIN/gneb/skyrmion/initial.skyrmion b/examples/SPIN/gneb/skyrmion/initial.skyrmion
new file mode 100644
index 0000000000..f940aee182
--- /dev/null
+++ b/examples/SPIN/gneb/skyrmion/initial.skyrmion
@@ -0,0 +1,818 @@
+LAMMPS data file via write_data, version 28 Feb 2019, timestep = 6
+
+400 atoms
+1 atom types
+
+0.0000000000000000e+00 6.0000000000000000e+01 xlo xhi
+0.0000000000000000e+00 6.0000000000000000e+01 ylo yhi
+0.0000000000000000e+00 3.0000000000000000e+00 zlo zhi
+
+Masses
+
+1 55.845
+
+Atoms # spin
+
+1 1 2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -3.9693242391277868e-03 -3.9693242391277929e-03 9.9998424434096433e-01 0 0 0
+21 1 2.5000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.1868011343002482e-02 -4.8145058779812530e-03 9.9991798205648519e-01 0 0 0
+41 1 2.5000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.9561861499557517e-02 -6.5828744882500201e-03 9.9978697697966845e-01 0 0 0
+61 1 2.5000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.6644762521588476e-02 -9.3989438861432541e-03 9.9960077855311480e-01 0 0 0
+81 1 2.5000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.2364838887478299e-02 -1.3362272507461704e-02 9.9938679542868891e-01 0 0 0
+101 1 2.5000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.5634992015801843e-02 -1.8429703183501425e-02 9.9919492261750509e-01 0 0 0
+121 1 2.5000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.5235119566844247e-02 -2.4270277420221115e-02 9.9908430073895971e-01 0 0 0
+141 1 2.5000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.0237916900163156e-02 -3.0163850736159143e-02 9.9908748890690546e-01 0 0 0
+161 1 2.5000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -2.0551704657275890e-02 -3.5058787503171429e-02 9.9917391321755789e-01 0 0 0
+181 1 2.5000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -7.2971667669136115e-03 -3.7860607272964066e-02 9.9925638640646097e-01 0 0 0
+201 1 2.5000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 7.2971667669136028e-03 -3.7860607272964066e-02 9.9925638640646086e-01 0 0 0
+221 1 2.5000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 2.0551704657275901e-02 -3.5058787503171443e-02 9.9917391321755789e-01 0 0 0
+241 1 2.5000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.0237916900163156e-02 -3.0163850736159153e-02 9.9908748890690535e-01 0 0 0
+261 1 2.5000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.5235119566844234e-02 -2.4270277420221108e-02 9.9908430073895960e-01 0 0 0
+281 1 2.5000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.5634992015801829e-02 -1.8429703183501414e-02 9.9919492261750498e-01 0 0 0
+301 1 2.5000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.2364838887478306e-02 -1.3362272507461704e-02 9.9938679542868891e-01 0 0 0
+321 1 2.5000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 2.6644762521588494e-02 -9.3989438861432611e-03 9.9960077855311491e-01 0 0 0
+341 1 2.5000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.9561861499557517e-02 -6.5828744882500201e-03 9.9978697697966856e-01 0 0 0
+361 1 2.5000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1868011343002482e-02 -4.8145058779812547e-03 9.9991798205648508e-01 0 0 0
+381 1 2.5000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.9693242391277929e-03 -3.9693242391277937e-03 9.9998424434096445e-01 0 0 0
+2 1 2.5000000000000000e+00 0.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -4.8145058779812512e-03 -1.1868011343002475e-02 9.9991798205648519e-01 0 0 0
+22 1 2.5000000000000000e+00 3.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -1.4489047587394138e-02 -1.4489047587394138e-02 9.9979004545955574e-01 0 0 0
+42 1 2.5000000000000000e+00 6.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -2.4184841732588187e-02 -2.0009637034407928e-02 9.9950723251816487e-01 0 0 0
+62 1 2.5000000000000000e+00 9.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -3.3534698701154796e-02 -2.8894018478272422e-02 9.9901979944303421e-01 0 0 0
+82 1 2.5000000000000000e+00 1.2000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.1631298256624205e-02 -4.1569375222726884e-02 9.9826791095830603e-01 0 0 0
+102 1 2.5000000000000000e+00 1.5000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.6947676140268457e-02 -5.8031121465001792e-02 9.9721026100143129e-01 0 0 0
+122 1 2.5000000000000000e+00 1.8000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.7535409319668050e-02 -7.7312985281705895e-02 9.9587302763336383e-01 0 0 0
+142 1 2.5000000000000000e+00 2.1000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.1653952417990837e-02 -9.7059251840902777e-02 9.9440658177630958e-01 0 0 0
+162 1 2.5000000000000000e+00 2.4000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -2.8752729368399305e-02 -1.1365104497068100e-01 9.9310458690459180e-01 0 0 0
+182 1 2.5000000000000000e+00 2.7000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -1.0293413501576094e-02 -1.2321728304286263e-01 9.9232633079951105e-01 0 0 0
+202 1 2.5000000000000000e+00 3.0000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 1.0293413501576086e-02 -1.2321728304286261e-01 9.9232633079951116e-01 0 0 0
+222 1 2.5000000000000000e+00 3.3000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 2.8752729368399291e-02 -1.1365104497068100e-01 9.9310458690459180e-01 0 0 0
+242 1 2.5000000000000000e+00 3.6000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.1653952417990824e-02 -9.7059251840902777e-02 9.9440658177630958e-01 0 0 0
+262 1 2.5000000000000000e+00 3.9000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.7535409319668057e-02 -7.7312985281705895e-02 9.9587302763336383e-01 0 0 0
+282 1 2.5000000000000000e+00 4.2000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.6947676140268443e-02 -5.8031121465001792e-02 9.9721026100143140e-01 0 0 0
+302 1 2.5000000000000000e+00 4.5000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.1631298256624191e-02 -4.1569375222726877e-02 9.9826791095830592e-01 0 0 0
+322 1 2.5000000000000000e+00 4.8000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 3.3534698701154809e-02 -2.8894018478272433e-02 9.9901979944303410e-01 0 0 0
+342 1 2.5000000000000000e+00 5.1000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 2.4184841732588204e-02 -2.0009637034407945e-02 9.9950723251816487e-01 0 0 0
+362 1 2.5000000000000000e+00 5.4000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 1.4489047587394149e-02 -1.4489047587394138e-02 9.9979004545955585e-01 0 0 0
+382 1 2.5000000000000000e+00 5.7000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.8145058779812547e-03 -1.1868011343002482e-02 9.9991798205648519e-01 0 0 0
+3 1 2.5000000000000000e+00 0.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -6.5828744882500158e-03 -1.9561861499557527e-02 9.9978697697966856e-01 0 0 0
+23 1 2.5000000000000000e+00 3.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -2.0009637034407932e-02 -2.4184841732588200e-02 9.9950723251816498e-01 0 0 0
+43 1 2.5000000000000000e+00 6.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -3.4047077037887570e-02 -3.4047077037887577e-02 9.9884012388887977e-01 0 0 0
+63 1 2.5000000000000000e+00 9.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -4.8498220596720307e-02 -5.0241530269051260e-02 9.9755887607457838e-01 0 0 0
+83 1 2.5000000000000000e+00 1.2000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -6.2196104012276265e-02 -7.3954811425103587e-02 9.9532021506285684e-01 0 0 0
+103 1 2.5000000000000000e+00 1.5000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -7.2649992877525826e-02 -1.0567933713226435e-01 9.9174283775491956e-01 0 0 0
+123 1 2.5000000000000000e+00 1.8000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -7.6126593015943808e-02 -1.4398087111736477e-01 9.8664798717073865e-01 0 0 0
+143 1 2.5000000000000000e+00 2.1000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -6.8709104650143085e-02 -1.8428174194944069e-01 9.8046891767268973e-01 0 0 0
+163 1 2.5000000000000000e+00 2.4000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -4.8457456104349643e-02 -2.1884669159068457e-01 9.7455528346405618e-01 0 0 0
+183 1 2.5000000000000000e+00 2.7000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -1.7543173966404597e-02 -2.3902270727461428e-01 9.7085548999544657e-01 0 0 0
+203 1 2.5000000000000000e+00 3.0000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 1.7543173966404587e-02 -2.3902270727461422e-01 9.7085548999544646e-01 0 0 0
+223 1 2.5000000000000000e+00 3.3000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 4.8457456104349608e-02 -2.1884669159068454e-01 9.7455528346405618e-01 0 0 0
+243 1 2.5000000000000000e+00 3.6000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.8709104650143044e-02 -1.8428174194944069e-01 9.8046891767268962e-01 0 0 0
+263 1 2.5000000000000000e+00 3.9000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 7.6126593015943766e-02 -1.4398087111736474e-01 9.8664798717073865e-01 0 0 0
+283 1 2.5000000000000000e+00 4.2000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 7.2649992877525826e-02 -1.0567933713226434e-01 9.9174283775491956e-01 0 0 0
+303 1 2.5000000000000000e+00 4.5000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.2196104012276258e-02 -7.3954811425103573e-02 9.9532021506285673e-01 0 0 0
+323 1 2.5000000000000000e+00 4.8000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 4.8498220596720307e-02 -5.0241530269051260e-02 9.9755887607457838e-01 0 0 0
+343 1 2.5000000000000000e+00 5.1000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 3.4047077037887577e-02 -3.4047077037887577e-02 9.9884012388887966e-01 0 0 0
+363 1 2.5000000000000000e+00 5.4000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 2.0009637034407942e-02 -2.4184841732588211e-02 9.9950723251816498e-01 0 0 0
+383 1 2.5000000000000000e+00 5.7000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.5828744882500201e-03 -1.9561861499557531e-02 9.9978697697966856e-01 0 0 0
+4 1 2.5000000000000000e+00 0.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -9.3989438861432524e-03 -2.6644762521588497e-02 9.9960077855311480e-01 0 0 0
+24 1 2.5000000000000000e+00 3.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -2.8894018478272426e-02 -3.3534698701154803e-02 9.9901979944303410e-01 0 0 0
+44 1 2.5000000000000000e+00 6.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -5.0241530269051232e-02 -4.8498220596720286e-02 9.9755887607457827e-01 0 0 0
+64 1 2.5000000000000000e+00 9.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -7.3771080474423129e-02 -7.3771080474423115e-02 9.9454293792237669e-01 0 0 0
+84 1 2.5000000000000000e+00 1.2000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -9.8127311868331568e-02 -1.1214098437153223e-01 9.8883539089662387e-01 0 0 0
+104 1 2.5000000000000000e+00 1.5000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.1922421797550638e-01 -1.6561310406555055e-01 9.7895755046370747e-01 0 0 0
+124 1 2.5000000000000000e+00 1.8000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.2975986317850730e-01 -2.3284022614534144e-01 9.6381938504912923e-01 0 0 0
+144 1 2.5000000000000000e+00 2.1000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.2090775615411226e-01 -3.0602867088565672e-01 9.4431338394504205e-01 0 0 0
+164 1 2.5000000000000000e+00 2.4000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -8.7191355151399766e-02 -3.7026717261459724e-01 9.2482424734154478e-01 0 0 0
+184 1 2.5000000000000000e+00 2.7000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -3.1922103301157183e-02 -4.0821375936870385e-01 9.1232806927272614e-01 0 0 0
+204 1 2.5000000000000000e+00 3.0000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 3.1922103301157155e-02 -4.0821375936870385e-01 9.1232806927272625e-01 0 0 0
+224 1 2.5000000000000000e+00 3.3000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 8.7191355151399724e-02 -3.7026717261459718e-01 9.2482424734154478e-01 0 0 0
+244 1 2.5000000000000000e+00 3.6000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.2090775615411219e-01 -3.0602867088565661e-01 9.4431338394504194e-01 0 0 0
+264 1 2.5000000000000000e+00 3.9000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.2975986317850724e-01 -2.3284022614534142e-01 9.6381938504912912e-01 0 0 0
+284 1 2.5000000000000000e+00 4.2000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.1922421797550635e-01 -1.6561310406555052e-01 9.7895755046370747e-01 0 0 0
+304 1 2.5000000000000000e+00 4.5000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 9.8127311868331568e-02 -1.1214098437153228e-01 9.8883539089662398e-01 0 0 0
+324 1 2.5000000000000000e+00 4.8000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 7.3771080474423129e-02 -7.3771080474423142e-02 9.9454293792237669e-01 0 0 0
+344 1 2.5000000000000000e+00 5.1000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 5.0241530269051253e-02 -4.8498220596720314e-02 9.9755887607457827e-01 0 0 0
+364 1 2.5000000000000000e+00 5.4000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 2.8894018478272443e-02 -3.3534698701154816e-02 9.9901979944303410e-01 0 0 0
+384 1 2.5000000000000000e+00 5.7000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 9.3989438861432611e-03 -2.6644762521588494e-02 9.9960077855311480e-01 0 0 0
+5 1 2.5000000000000000e+00 0.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -1.3362272507461699e-02 -3.2364838887478299e-02 9.9938679542868880e-01 0 0 0
+25 1 2.5000000000000000e+00 3.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -4.1569375222726863e-02 -4.1631298256624198e-02 9.9826791095830603e-01 0 0 0
+45 1 2.5000000000000000e+00 6.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -7.3954811425103559e-02 -6.2196104012276245e-02 9.9532021506285673e-01 0 0 0
+65 1 2.5000000000000000e+00 9.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -1.1214098437153225e-01 -9.8127311868331554e-02 9.8883539089662398e-01 0 0 0
+85 1 2.5000000000000000e+00 1.2000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.5508313718777630e-01 -1.5508313718777628e-01 9.7565282817198595e-01 0 0 0
+105 1 2.5000000000000000e+00 1.5000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.9646003525323200e-01 -2.3830565311068275e-01 9.5111191257590177e-01 0 0 0
+125 1 2.5000000000000000e+00 1.8000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -2.2234110900479689e-01 -3.4758786972735528e-01 9.1090455266450188e-01 0 0 0
+145 1 2.5000000000000000e+00 2.1000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -2.1357380845070773e-01 -4.7013886220911955e-01 8.5636188529416402e-01 0 0 0
+165 1 2.5000000000000000e+00 2.4000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.5692234237038313e-01 -5.7886257432716870e-01 8.0018341554190886e-01 0 0 0
+185 1 2.5000000000000000e+00 2.7000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -5.7920936211537863e-02 -6.4295931380698856e-01 7.6370706814669809e-01 0 0 0
+205 1 2.5000000000000000e+00 3.0000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 5.7920936211537793e-02 -6.4295931380698856e-01 7.6370706814669809e-01 0 0 0
+225 1 2.5000000000000000e+00 3.3000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.5692234237038311e-01 -5.7886257432716881e-01 8.0018341554190908e-01 0 0 0
+245 1 2.5000000000000000e+00 3.6000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 2.1357380845070767e-01 -4.7013886220911949e-01 8.5636188529416413e-01 0 0 0
+265 1 2.5000000000000000e+00 3.9000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 2.2234110900479689e-01 -3.4758786972735528e-01 9.1090455266450188e-01 0 0 0
+285 1 2.5000000000000000e+00 4.2000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.9646003525323205e-01 -2.3830565311068283e-01 9.5111191257590177e-01 0 0 0
+305 1 2.5000000000000000e+00 4.5000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.5508313718777633e-01 -1.5508313718777636e-01 9.7565282817198595e-01 0 0 0
+325 1 2.5000000000000000e+00 4.8000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.1214098437153229e-01 -9.8127311868331610e-02 9.8883539089662398e-01 0 0 0
+345 1 2.5000000000000000e+00 5.1000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 7.3954811425103614e-02 -6.2196104012276265e-02 9.9532021506285684e-01 0 0 0
+365 1 2.5000000000000000e+00 5.4000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 4.1569375222726898e-02 -4.1631298256624198e-02 9.9826791095830603e-01 0 0 0
+385 1 2.5000000000000000e+00 5.7000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.3362272507461706e-02 -3.2364838887478299e-02 9.9938679542868891e-01 0 0 0
+6 1 2.5000000000000000e+00 0.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.8429703183501404e-02 -3.5634992015801836e-02 9.9919492261750509e-01 0 0 0
+26 1 2.5000000000000000e+00 3.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -5.8031121465001771e-02 -4.6947676140268457e-02 9.9721026100143140e-01 0 0 0
+46 1 2.5000000000000000e+00 6.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.0567933713226434e-01 -7.2649992877525812e-02 9.9174283775491956e-01 0 0 0
+66 1 2.5000000000000000e+00 9.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.6561310406555055e-01 -1.1922421797550634e-01 9.7895755046370747e-01 0 0 0
+86 1 2.5000000000000000e+00 1.2000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -2.3830565311068275e-01 -1.9646003525323197e-01 9.5111191257590177e-01 0 0 0
+106 1 2.5000000000000000e+00 1.5000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.1460569929723275e-01 -3.1460569929723275e-01 8.9557049300398384e-01 0 0 0
+126 1 2.5000000000000000e+00 1.8000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.6852592591640337e-01 -4.7476254409897906e-01 7.9924287212844281e-01 0 0 0
+146 1 2.5000000000000000e+00 2.1000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.6081689881382256e-01 -6.5421949001862334e-01 6.6468641058031896e-01 0 0 0
+166 1 2.5000000000000000e+00 2.4000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -2.6598547494087149e-01 -8.0744368404029232e-01 5.2657993146712301e-01 0 0 0
+186 1 2.5000000000000000e+00 2.7000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -9.7873033584060118e-02 -8.9330169771966939e-01 4.3867179775797049e-01 0 0 0
+206 1 2.5000000000000000e+00 3.0000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 9.7873033584060007e-02 -8.9330169771966939e-01 4.3867179775797044e-01 0 0 0
+226 1 2.5000000000000000e+00 3.3000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 2.6598547494087138e-01 -8.0744368404029232e-01 5.2657993146712301e-01 0 0 0
+246 1 2.5000000000000000e+00 3.6000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.6081689881382251e-01 -6.5421949001862334e-01 6.6468641058031896e-01 0 0 0
+266 1 2.5000000000000000e+00 3.9000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.6852592591640337e-01 -4.7476254409897911e-01 7.9924287212844303e-01 0 0 0
+286 1 2.5000000000000000e+00 4.2000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.1460569929723281e-01 -3.1460569929723281e-01 8.9557049300398361e-01 0 0 0
+306 1 2.5000000000000000e+00 4.5000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 2.3830565311068277e-01 -1.9646003525323205e-01 9.5111191257590177e-01 0 0 0
+326 1 2.5000000000000000e+00 4.8000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.6561310406555055e-01 -1.1922421797550636e-01 9.7895755046370736e-01 0 0 0
+346 1 2.5000000000000000e+00 5.1000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.0567933713226439e-01 -7.2649992877525854e-02 9.9174283775491956e-01 0 0 0
+366 1 2.5000000000000000e+00 5.4000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 5.8031121465001820e-02 -4.6947676140268485e-02 9.9721026100143140e-01 0 0 0
+386 1 2.5000000000000000e+00 5.7000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.8429703183501425e-02 -3.5634992015801836e-02 9.9919492261750498e-01 0 0 0
+7 1 2.5000000000000000e+00 0.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -2.4270277420221083e-02 -3.5235119566844234e-02 9.9908430073895960e-01 0 0 0
+27 1 2.5000000000000000e+00 3.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -7.7312985281705854e-02 -4.7535409319668043e-02 9.9587302763336372e-01 0 0 0
+47 1 2.5000000000000000e+00 6.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -1.4398087111736474e-01 -7.6126593015943766e-02 9.8664798717073854e-01 0 0 0
+67 1 2.5000000000000000e+00 9.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -2.3284022614534147e-01 -1.2975986317850727e-01 9.6381938504912923e-01 0 0 0
+87 1 2.5000000000000000e+00 1.2000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -3.4758786972735523e-01 -2.2234110900479681e-01 9.1090455266450177e-01 0 0 0
+107 1 2.5000000000000000e+00 1.5000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -4.7476254409897900e-01 -3.6852592591640326e-01 7.9924287212844292e-01 0 0 0
+127 1 2.5000000000000000e+00 1.8000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -5.6571145299922609e-01 -5.6571145299922598e-01 5.9995091790163058e-01 0 0 0
+147 1 2.5000000000000000e+00 2.1000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -5.4725458628470525e-01 -7.6968694425946660e-01 3.2877716713129740e-01 0 0 0
+167 1 2.5000000000000000e+00 2.4000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -3.9048923819288139e-01 -9.1777534868081290e-01 7.2156525757244322e-02 0 0 0
+187 1 2.5000000000000000e+00 2.7000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -1.3991724696158017e-01 -9.8714633419212083e-01 -7.7235217962726241e-02 0 0 0
+207 1 2.5000000000000000e+00 3.0000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 1.3991724696158006e-01 -9.8714633419212106e-01 -7.7235217962726241e-02 0 0 0
+227 1 2.5000000000000000e+00 3.3000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 3.9048923819288128e-01 -9.1777534868081279e-01 7.2156525757244322e-02 0 0 0
+247 1 2.5000000000000000e+00 3.6000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 5.4725458628470514e-01 -7.6968694425946649e-01 3.2877716713129734e-01 0 0 0
+267 1 2.5000000000000000e+00 3.9000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 5.6571145299922621e-01 -5.6571145299922609e-01 5.9995091790163035e-01 0 0 0
+287 1 2.5000000000000000e+00 4.2000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 4.7476254409897917e-01 -3.6852592591640337e-01 7.9924287212844281e-01 0 0 0
+307 1 2.5000000000000000e+00 4.5000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 3.4758786972735534e-01 -2.2234110900479692e-01 9.1090455266450188e-01 0 0 0
+327 1 2.5000000000000000e+00 4.8000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 2.3284022614534147e-01 -1.2975986317850732e-01 9.6381938504912912e-01 0 0 0
+347 1 2.5000000000000000e+00 5.1000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 1.4398087111736477e-01 -7.6126593015943808e-02 9.8664798717073854e-01 0 0 0
+367 1 2.5000000000000000e+00 5.4000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 7.7312985281705909e-02 -4.7535409319668064e-02 9.9587302763336372e-01 0 0 0
+387 1 2.5000000000000000e+00 5.7000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 2.4270277420221129e-02 -3.5235119566844247e-02 9.9908430073895971e-01 0 0 0
+8 1 2.5000000000000000e+00 0.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -3.0163850736159105e-02 -3.0237916900163149e-02 9.9908748890690535e-01 0 0 0
+28 1 2.5000000000000000e+00 3.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -9.7059251840902722e-02 -4.1653952417990810e-02 9.9440658177630958e-01 0 0 0
+48 1 2.5000000000000000e+00 6.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -1.8428174194944064e-01 -6.8709104650143071e-02 9.8046891767268973e-01 0 0 0
+68 1 2.5000000000000000e+00 9.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -3.0602867088565666e-01 -1.2090775615411221e-01 9.4431338394504205e-01 0 0 0
+88 1 2.5000000000000000e+00 1.2000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -4.7013886220911943e-01 -2.1357380845070767e-01 8.5636188529416413e-01 0 0 0
+108 1 2.5000000000000000e+00 1.5000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -6.5421949001862312e-01 -3.6081689881382245e-01 6.6468641058031908e-01 0 0 0
+128 1 2.5000000000000000e+00 1.8000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -7.6968694425946649e-01 -5.4725458628470514e-01 3.2877716713129745e-01 0 0 0
+148 1 2.5000000000000000e+00 2.1000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -7.0472416296125850e-01 -7.0472416296125850e-01 -8.2022608329090224e-02 0 0 0
+168 1 2.5000000000000000e+00 2.4000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -4.6907708232882805e-01 -7.8303583820847300e-01 -4.0843795968914098e-01 0 0 0
+188 1 2.5000000000000000e+00 2.7000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -1.6077801357100108e-01 -8.0506391360620255e-01 -5.7098382232881861e-01 0 0 0
+208 1 2.5000000000000000e+00 3.0000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 1.6077801357100094e-01 -8.0506391360620255e-01 -5.7098382232881872e-01 0 0 0
+228 1 2.5000000000000000e+00 3.3000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 4.6907708232882789e-01 -7.8303583820847278e-01 -4.0843795968914093e-01 0 0 0
+248 1 2.5000000000000000e+00 3.6000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 7.0472416296125839e-01 -7.0472416296125850e-01 -8.2022608329090321e-02 0 0 0
+268 1 2.5000000000000000e+00 3.9000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 7.6968694425946660e-01 -5.4725458628470514e-01 3.2877716713129729e-01 0 0 0
+288 1 2.5000000000000000e+00 4.2000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 6.5421949001862334e-01 -3.6081689881382256e-01 6.6468641058031885e-01 0 0 0
+308 1 2.5000000000000000e+00 4.5000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 4.7013886220911955e-01 -2.1357380845070770e-01 8.5636188529416402e-01 0 0 0
+328 1 2.5000000000000000e+00 4.8000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 3.0602867088565666e-01 -1.2090775615411227e-01 9.4431338394504194e-01 0 0 0
+348 1 2.5000000000000000e+00 5.1000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 1.8428174194944072e-01 -6.8709104650143099e-02 9.8046891767268962e-01 0 0 0
+368 1 2.5000000000000000e+00 5.4000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 9.7059251840902791e-02 -4.1653952417990824e-02 9.9440658177630958e-01 0 0 0
+388 1 2.5000000000000000e+00 5.7000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 3.0163850736159153e-02 -3.0237916900163146e-02 9.9908748890690535e-01 0 0 0
+9 1 2.5000000000000000e+00 0.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -3.5058787503171387e-02 -2.0551704657275887e-02 9.9917391321755789e-01 0 0 0
+29 1 2.5000000000000000e+00 3.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -1.1365104497068090e-01 -2.8752729368399281e-02 9.9310458690459180e-01 0 0 0
+49 1 2.5000000000000000e+00 6.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -2.1884669159068454e-01 -4.8457456104349608e-02 9.7455528346405629e-01 0 0 0
+69 1 2.5000000000000000e+00 9.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -3.7026717261459713e-01 -8.7191355151399724e-02 9.2482424734154478e-01 0 0 0
+89 1 2.5000000000000000e+00 1.2000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -5.7886257432716870e-01 -1.5692234237038305e-01 8.0018341554190908e-01 0 0 0
+109 1 2.5000000000000000e+00 1.5000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -8.0744368404029221e-01 -2.6598547494087144e-01 5.2657993146712301e-01 0 0 0
+129 1 2.5000000000000000e+00 1.8000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -9.1777534868081279e-01 -3.9048923819288128e-01 7.2156525757244433e-02 0 0 0
+149 1 2.5000000000000000e+00 2.1000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -7.8303583820847289e-01 -4.6907708232882789e-01 -4.0843795968914071e-01 0 0 0
+169 1 2.5000000000000000e+00 2.4000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -4.8741359543182999e-01 -4.8741359543182988e-01 -7.2446944309365668e-01 0 0 0
+189 1 2.5000000000000000e+00 2.7000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -1.6115060626850930e-01 -4.8338466373268979e-01 -8.6044741208706443e-01 0 0 0
+209 1 2.5000000000000000e+00 3.0000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 1.6115060626850913e-01 -4.8338466373268968e-01 -8.6044741208706432e-01 0 0 0
+229 1 2.5000000000000000e+00 3.3000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 4.8741359543182988e-01 -4.8741359543182988e-01 -7.2446944309365668e-01 0 0 0
+249 1 2.5000000000000000e+00 3.6000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 7.8303583820847289e-01 -4.6907708232882789e-01 -4.0843795968914098e-01 0 0 0
+269 1 2.5000000000000000e+00 3.9000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 9.1777534868081290e-01 -3.9048923819288139e-01 7.2156525757244280e-02 0 0 0
+289 1 2.5000000000000000e+00 4.2000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 8.0744368404029232e-01 -2.6598547494087149e-01 5.2657993146712290e-01 0 0 0
+309 1 2.5000000000000000e+00 4.5000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 5.7886257432716870e-01 -1.5692234237038313e-01 8.0018341554190908e-01 0 0 0
+329 1 2.5000000000000000e+00 4.8000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 3.7026717261459713e-01 -8.7191355151399724e-02 9.2482424734154478e-01 0 0 0
+349 1 2.5000000000000000e+00 5.1000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 2.1884669159068457e-01 -4.8457456104349622e-02 9.7455528346405618e-01 0 0 0
+369 1 2.5000000000000000e+00 5.4000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 1.1365104497068097e-01 -2.8752729368399291e-02 9.9310458690459180e-01 0 0 0
+389 1 2.5000000000000000e+00 5.7000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 3.5058787503171436e-02 -2.0551704657275904e-02 9.9917391321755789e-01 0 0 0
+10 1 2.5000000000000000e+00 0.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -3.7860607272964017e-02 -7.2971667669136089e-03 9.9925638640646097e-01 0 0 0
+30 1 2.5000000000000000e+00 3.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -1.2321728304286257e-01 -1.0293413501576077e-02 9.9232633079951116e-01 0 0 0
+50 1 2.5000000000000000e+00 6.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -2.3902270727461422e-01 -1.7543173966404584e-02 9.7085548999544669e-01 0 0 0
+70 1 2.5000000000000000e+00 9.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -4.0821375936870385e-01 -3.1922103301157141e-02 9.1232806927272625e-01 0 0 0
+90 1 2.5000000000000000e+00 1.2000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -6.4295931380698856e-01 -5.7920936211537787e-02 7.6370706814669798e-01 0 0 0
+110 1 2.5000000000000000e+00 1.5000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -8.9330169771966939e-01 -9.7873033584060035e-02 4.3867179775797044e-01 0 0 0
+130 1 2.5000000000000000e+00 1.8000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -9.8714633419212094e-01 -1.3991724696158003e-01 -7.7235217962726088e-02 0 0 0
+150 1 2.5000000000000000e+00 2.1000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -8.0506391360620255e-01 -1.6077801357100097e-01 -5.7098382232881850e-01 0 0 0
+170 1 2.5000000000000000e+00 2.4000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -4.8338466373268996e-01 -1.6115060626850919e-01 -8.6044741208706443e-01 0 0 0
+190 1 2.5000000000000000e+00 2.7000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -1.5704482464087621e-01 -1.5704482464087605e-01 -9.7502504896388853e-01 0 0 0
+210 1 2.5000000000000000e+00 3.0000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 1.5704482464087599e-01 -1.5704482464087605e-01 -9.7502504896388842e-01 0 0 0
+230 1 2.5000000000000000e+00 3.3000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 4.8338466373268973e-01 -1.6115060626850916e-01 -8.6044741208706443e-01 0 0 0
+250 1 2.5000000000000000e+00 3.6000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 8.0506391360620255e-01 -1.6077801357100097e-01 -5.7098382232881861e-01 0 0 0
+270 1 2.5000000000000000e+00 3.9000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 9.8714633419212106e-01 -1.3991724696158012e-01 -7.7235217962726269e-02 0 0 0
+290 1 2.5000000000000000e+00 4.2000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 8.9330169771966950e-01 -9.7873033584060062e-02 4.3867179775797038e-01 0 0 0
+310 1 2.5000000000000000e+00 4.5000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 6.4295931380698856e-01 -5.7920936211537821e-02 7.6370706814669798e-01 0 0 0
+330 1 2.5000000000000000e+00 4.8000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 4.0821375936870391e-01 -3.1922103301157183e-02 9.1232806927272614e-01 0 0 0
+350 1 2.5000000000000000e+00 5.1000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 2.3902270727461428e-01 -1.7543173966404597e-02 9.7085548999544657e-01 0 0 0
+370 1 2.5000000000000000e+00 5.4000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 1.2321728304286259e-01 -1.0293413501576086e-02 9.9232633079951105e-01 0 0 0
+390 1 2.5000000000000000e+00 5.7000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 3.7860607272964045e-02 -7.2971667669136028e-03 9.9925638640646086e-01 0 0 0
+11 1 2.5000000000000000e+00 0.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -3.7860607272964017e-02 7.2971667669136028e-03 9.9925638640646086e-01 0 0 0
+31 1 2.5000000000000000e+00 3.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -1.2321728304286254e-01 1.0293413501576089e-02 9.9232633079951105e-01 0 0 0
+51 1 2.5000000000000000e+00 6.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -2.3902270727461422e-01 1.7543173966404594e-02 9.7085548999544657e-01 0 0 0
+71 1 2.5000000000000000e+00 9.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -4.0821375936870374e-01 3.1922103301157183e-02 9.1232806927272625e-01 0 0 0
+91 1 2.5000000000000000e+00 1.2000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -6.4295931380698856e-01 5.7920936211537842e-02 7.6370706814669798e-01 0 0 0
+111 1 2.5000000000000000e+00 1.5000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -8.9330169771966950e-01 9.7873033584060118e-02 4.3867179775797055e-01 0 0 0
+131 1 2.5000000000000000e+00 1.8000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -9.8714633419212083e-01 1.3991724696158012e-01 -7.7235217962726102e-02 0 0 0
+151 1 2.5000000000000000e+00 2.1000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -8.0506391360620255e-01 1.6077801357100108e-01 -5.7098382232881850e-01 0 0 0
+171 1 2.5000000000000000e+00 2.4000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -4.8338466373268996e-01 1.6115060626850930e-01 -8.6044741208706443e-01 0 0 0
+191 1 2.5000000000000000e+00 2.7000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -1.5704482464087621e-01 1.5704482464087616e-01 -9.7502504896388853e-01 0 0 0
+211 1 2.5000000000000000e+00 3.0000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 1.5704482464087602e-01 1.5704482464087616e-01 -9.7502504896388842e-01 0 0 0
+231 1 2.5000000000000000e+00 3.3000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 4.8338466373268985e-01 1.6115060626850930e-01 -8.6044741208706443e-01 0 0 0
+251 1 2.5000000000000000e+00 3.6000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 8.0506391360620266e-01 1.6077801357100105e-01 -5.7098382232881861e-01 0 0 0
+271 1 2.5000000000000000e+00 3.9000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 9.8714633419212094e-01 1.3991724696158014e-01 -7.7235217962726227e-02 0 0 0
+291 1 2.5000000000000000e+00 4.2000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 8.9330169771966950e-01 9.7873033584060118e-02 4.3867179775797049e-01 0 0 0
+311 1 2.5000000000000000e+00 4.5000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 6.4295931380698867e-01 5.7920936211537849e-02 7.6370706814669809e-01 0 0 0
+331 1 2.5000000000000000e+00 4.8000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 4.0821375936870391e-01 3.1922103301157183e-02 9.1232806927272614e-01 0 0 0
+351 1 2.5000000000000000e+00 5.1000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 2.3902270727461428e-01 1.7543173966404590e-02 9.7085548999544657e-01 0 0 0
+371 1 2.5000000000000000e+00 5.4000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 1.2321728304286261e-01 1.0293413501576086e-02 9.9232633079951116e-01 0 0 0
+391 1 2.5000000000000000e+00 5.7000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 3.7860607272964052e-02 7.2971667669136046e-03 9.9925638640646097e-01 0 0 0
+12 1 2.5000000000000000e+00 0.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -3.5058787503171387e-02 2.0551704657275897e-02 9.9917391321755789e-01 0 0 0
+32 1 2.5000000000000000e+00 3.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -1.1365104497068096e-01 2.8752729368399288e-02 9.9310458690459191e-01 0 0 0
+52 1 2.5000000000000000e+00 6.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -2.1884669159068451e-01 4.8457456104349615e-02 9.7455528346405618e-01 0 0 0
+72 1 2.5000000000000000e+00 9.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -3.7026717261459707e-01 8.7191355151399710e-02 9.2482424734154478e-01 0 0 0
+92 1 2.5000000000000000e+00 1.2000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -5.7886257432716870e-01 1.5692234237038316e-01 8.0018341554190908e-01 0 0 0
+112 1 2.5000000000000000e+00 1.5000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -8.0744368404029210e-01 2.6598547494087149e-01 5.2657993146712301e-01 0 0 0
+132 1 2.5000000000000000e+00 1.8000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -9.1777534868081267e-01 3.9048923819288134e-01 7.2156525757244433e-02 0 0 0
+152 1 2.5000000000000000e+00 2.1000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -7.8303583820847311e-01 4.6907708232882811e-01 -4.0843795968914082e-01 0 0 0
+172 1 2.5000000000000000e+00 2.4000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -4.8741359543183005e-01 4.8741359543182999e-01 -7.2446944309365657e-01 0 0 0
+192 1 2.5000000000000000e+00 2.7000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -1.6115060626850930e-01 4.8338466373268979e-01 -8.6044741208706432e-01 0 0 0
+212 1 2.5000000000000000e+00 3.0000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 1.6115060626850916e-01 4.8338466373268979e-01 -8.6044741208706443e-01 0 0 0
+232 1 2.5000000000000000e+00 3.3000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 4.8741359543182988e-01 4.8741359543182999e-01 -7.2446944309365657e-01 0 0 0
+252 1 2.5000000000000000e+00 3.6000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 7.8303583820847278e-01 4.6907708232882794e-01 -4.0843795968914076e-01 0 0 0
+272 1 2.5000000000000000e+00 3.9000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 9.1777534868081279e-01 3.9048923819288139e-01 7.2156525757244377e-02 0 0 0
+292 1 2.5000000000000000e+00 4.2000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 8.0744368404029221e-01 2.6598547494087149e-01 5.2657993146712301e-01 0 0 0
+312 1 2.5000000000000000e+00 4.5000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 5.7886257432716870e-01 1.5692234237038316e-01 8.0018341554190908e-01 0 0 0
+332 1 2.5000000000000000e+00 4.8000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 3.7026717261459713e-01 8.7191355151399738e-02 9.2482424734154467e-01 0 0 0
+352 1 2.5000000000000000e+00 5.1000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 2.1884669159068457e-01 4.8457456104349622e-02 9.7455528346405618e-01 0 0 0
+372 1 2.5000000000000000e+00 5.4000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 1.1365104497068099e-01 2.8752729368399295e-02 9.9310458690459180e-01 0 0 0
+392 1 2.5000000000000000e+00 5.7000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 3.5058787503171422e-02 2.0551704657275897e-02 9.9917391321755777e-01 0 0 0
+13 1 2.5000000000000000e+00 0.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -3.0163850736159126e-02 3.0237916900163156e-02 9.9908748890690546e-01 0 0 0
+33 1 2.5000000000000000e+00 3.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -9.7059251840902735e-02 4.1653952417990817e-02 9.9440658177630958e-01 0 0 0
+53 1 2.5000000000000000e+00 6.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -1.8428174194944066e-01 6.8709104650143071e-02 9.8046891767268973e-01 0 0 0
+73 1 2.5000000000000000e+00 9.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -3.0602867088565661e-01 1.2090775615411221e-01 9.4431338394504194e-01 0 0 0
+93 1 2.5000000000000000e+00 1.2000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -4.7013886220911938e-01 2.1357380845070770e-01 8.5636188529416413e-01 0 0 0
+113 1 2.5000000000000000e+00 1.5000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -6.5421949001862323e-01 3.6081689881382251e-01 6.6468641058031896e-01 0 0 0
+133 1 2.5000000000000000e+00 1.8000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -7.6968694425946660e-01 5.4725458628470525e-01 3.2877716713129751e-01 0 0 0
+153 1 2.5000000000000000e+00 2.1000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -7.0472416296125850e-01 7.0472416296125850e-01 -8.2022608329090127e-02 0 0 0
+173 1 2.5000000000000000e+00 2.4000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -4.6907708232882805e-01 7.8303583820847300e-01 -4.0843795968914076e-01 0 0 0
+193 1 2.5000000000000000e+00 2.7000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -1.6077801357100108e-01 8.0506391360620244e-01 -5.7098382232881861e-01 0 0 0
+213 1 2.5000000000000000e+00 3.0000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 1.6077801357100091e-01 8.0506391360620277e-01 -5.7098382232881861e-01 0 0 0
+233 1 2.5000000000000000e+00 3.3000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 4.6907708232882794e-01 7.8303583820847300e-01 -4.0843795968914076e-01 0 0 0
+253 1 2.5000000000000000e+00 3.6000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 7.0472416296125850e-01 7.0472416296125850e-01 -8.2022608329090210e-02 0 0 0
+273 1 2.5000000000000000e+00 3.9000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 7.6968694425946649e-01 5.4725458628470525e-01 3.2877716713129740e-01 0 0 0
+293 1 2.5000000000000000e+00 4.2000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 6.5421949001862323e-01 3.6081689881382251e-01 6.6468641058031896e-01 0 0 0
+313 1 2.5000000000000000e+00 4.5000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 4.7013886220911949e-01 2.1357380845070775e-01 8.5636188529416413e-01 0 0 0
+333 1 2.5000000000000000e+00 4.8000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 3.0602867088565661e-01 1.2090775615411223e-01 9.4431338394504194e-01 0 0 0
+353 1 2.5000000000000000e+00 5.1000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 1.8428174194944069e-01 6.8709104650143099e-02 9.8046891767268973e-01 0 0 0
+373 1 2.5000000000000000e+00 5.4000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 9.7059251840902763e-02 4.1653952417990830e-02 9.9440658177630947e-01 0 0 0
+393 1 2.5000000000000000e+00 5.7000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 3.0163850736159133e-02 3.0237916900163159e-02 9.9908748890690535e-01 0 0 0
+14 1 2.5000000000000000e+00 0.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -2.4270277420221101e-02 3.5235119566844240e-02 9.9908430073895960e-01 0 0 0
+34 1 2.5000000000000000e+00 3.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -7.7312985281705854e-02 4.7535409319668036e-02 9.9587302763336372e-01 0 0 0
+54 1 2.5000000000000000e+00 6.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -1.4398087111736474e-01 7.6126593015943766e-02 9.8664798717073854e-01 0 0 0
+74 1 2.5000000000000000e+00 9.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -2.3284022614534142e-01 1.2975986317850727e-01 9.6381938504912923e-01 0 0 0
+94 1 2.5000000000000000e+00 1.2000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -3.4758786972735517e-01 2.2234110900479689e-01 9.1090455266450199e-01 0 0 0
+114 1 2.5000000000000000e+00 1.5000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -4.7476254409897917e-01 3.6852592591640326e-01 7.9924287212844314e-01 0 0 0
+134 1 2.5000000000000000e+00 1.8000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -5.6571145299922609e-01 5.6571145299922598e-01 5.9995091790163058e-01 0 0 0
+154 1 2.5000000000000000e+00 2.1000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -5.4725458628470514e-01 7.6968694425946649e-01 3.2877716713129751e-01 0 0 0
+174 1 2.5000000000000000e+00 2.4000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -3.9048923819288139e-01 9.1777534868081279e-01 7.2156525757244475e-02 0 0 0
+194 1 2.5000000000000000e+00 2.7000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -1.3991724696158014e-01 9.8714633419212094e-01 -7.7235217962726074e-02 0 0 0
+214 1 2.5000000000000000e+00 3.0000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 1.3991724696158006e-01 9.8714633419212106e-01 -7.7235217962726074e-02 0 0 0
+234 1 2.5000000000000000e+00 3.3000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 3.9048923819288128e-01 9.1777534868081290e-01 7.2156525757244516e-02 0 0 0
+254 1 2.5000000000000000e+00 3.6000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 5.4725458628470502e-01 7.6968694425946649e-01 3.2877716713129757e-01 0 0 0
+274 1 2.5000000000000000e+00 3.9000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 5.6571145299922598e-01 5.6571145299922598e-01 5.9995091790163058e-01 0 0 0
+294 1 2.5000000000000000e+00 4.2000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 4.7476254409897917e-01 3.6852592591640337e-01 7.9924287212844292e-01 0 0 0
+314 1 2.5000000000000000e+00 4.5000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 3.4758786972735523e-01 2.2234110900479689e-01 9.1090455266450188e-01 0 0 0
+334 1 2.5000000000000000e+00 4.8000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 2.3284022614534150e-01 1.2975986317850730e-01 9.6381938504912923e-01 0 0 0
+354 1 2.5000000000000000e+00 5.1000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 1.4398087111736474e-01 7.6126593015943780e-02 9.8664798717073843e-01 0 0 0
+374 1 2.5000000000000000e+00 5.4000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 7.7312985281705868e-02 4.7535409319668070e-02 9.9587302763336383e-01 0 0 0
+394 1 2.5000000000000000e+00 5.7000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 2.4270277420221108e-02 3.5235119566844240e-02 9.9908430073895971e-01 0 0 0
+15 1 2.5000000000000000e+00 0.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.8429703183501411e-02 3.5634992015801829e-02 9.9919492261750498e-01 0 0 0
+35 1 2.5000000000000000e+00 3.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -5.8031121465001799e-02 4.6947676140268450e-02 9.9721026100143129e-01 0 0 0
+55 1 2.5000000000000000e+00 6.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.0567933713226436e-01 7.2649992877525812e-02 9.9174283775491956e-01 0 0 0
+75 1 2.5000000000000000e+00 9.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.6561310406555052e-01 1.1922421797550635e-01 9.7895755046370747e-01 0 0 0
+95 1 2.5000000000000000e+00 1.2000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -2.3830565311068272e-01 1.9646003525323200e-01 9.5111191257590177e-01 0 0 0
+115 1 2.5000000000000000e+00 1.5000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.1460569929723275e-01 3.1460569929723275e-01 8.9557049300398384e-01 0 0 0
+135 1 2.5000000000000000e+00 1.8000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.6852592591640337e-01 4.7476254409897900e-01 7.9924287212844303e-01 0 0 0
+155 1 2.5000000000000000e+00 2.1000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.6081689881382245e-01 6.5421949001862312e-01 6.6468641058031908e-01 0 0 0
+175 1 2.5000000000000000e+00 2.4000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -2.6598547494087144e-01 8.0744368404029221e-01 5.2657993146712301e-01 0 0 0
+195 1 2.5000000000000000e+00 2.7000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -9.7873033584060104e-02 8.9330169771966939e-01 4.3867179775797061e-01 0 0 0
+215 1 2.5000000000000000e+00 3.0000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 9.7873033584060048e-02 8.9330169771966939e-01 4.3867179775797061e-01 0 0 0
+235 1 2.5000000000000000e+00 3.3000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 2.6598547494087144e-01 8.0744368404029221e-01 5.2657993146712312e-01 0 0 0
+255 1 2.5000000000000000e+00 3.6000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.6081689881382245e-01 6.5421949001862323e-01 6.6468641058031908e-01 0 0 0
+275 1 2.5000000000000000e+00 3.9000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.6852592591640332e-01 4.7476254409897917e-01 7.9924287212844303e-01 0 0 0
+295 1 2.5000000000000000e+00 4.2000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.1460569929723275e-01 3.1460569929723275e-01 8.9557049300398373e-01 0 0 0
+315 1 2.5000000000000000e+00 4.5000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 2.3830565311068272e-01 1.9646003525323200e-01 9.5111191257590177e-01 0 0 0
+335 1 2.5000000000000000e+00 4.8000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.6561310406555046e-01 1.1922421797550636e-01 9.7895755046370747e-01 0 0 0
+355 1 2.5000000000000000e+00 5.1000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.0567933713226434e-01 7.2649992877525826e-02 9.9174283775491967e-01 0 0 0
+375 1 2.5000000000000000e+00 5.4000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 5.8031121465001792e-02 4.6947676140268464e-02 9.9721026100143140e-01 0 0 0
+395 1 2.5000000000000000e+00 5.7000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.8429703183501421e-02 3.5634992015801836e-02 9.9919492261750509e-01 0 0 0
+16 1 2.5000000000000000e+00 0.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -1.3362272507461697e-02 3.2364838887478299e-02 9.9938679542868891e-01 0 0 0
+36 1 2.5000000000000000e+00 3.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -4.1569375222726877e-02 4.1631298256624177e-02 9.9826791095830592e-01 0 0 0
+56 1 2.5000000000000000e+00 6.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -7.3954811425103587e-02 6.2196104012276252e-02 9.9532021506285684e-01 0 0 0
+76 1 2.5000000000000000e+00 9.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -1.1214098437153222e-01 9.8127311868331527e-02 9.8883539089662387e-01 0 0 0
+96 1 2.5000000000000000e+00 1.2000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.5508313718777622e-01 1.5508313718777625e-01 9.7565282817198595e-01 0 0 0
+116 1 2.5000000000000000e+00 1.5000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.9646003525323200e-01 2.3830565311068266e-01 9.5111191257590189e-01 0 0 0
+136 1 2.5000000000000000e+00 1.8000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -2.2234110900479692e-01 3.4758786972735517e-01 9.1090455266450188e-01 0 0 0
+156 1 2.5000000000000000e+00 2.1000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -2.1357380845070770e-01 4.7013886220911938e-01 8.5636188529416413e-01 0 0 0
+176 1 2.5000000000000000e+00 2.4000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.5692234237038313e-01 5.7886257432716870e-01 8.0018341554190919e-01 0 0 0
+196 1 2.5000000000000000e+00 2.7000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -5.7920936211537842e-02 6.4295931380698867e-01 7.6370706814669809e-01 0 0 0
+216 1 2.5000000000000000e+00 3.0000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 5.7920936211537780e-02 6.4295931380698856e-01 7.6370706814669798e-01 0 0 0
+236 1 2.5000000000000000e+00 3.3000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.5692234237038313e-01 5.7886257432716870e-01 8.0018341554190919e-01 0 0 0
+256 1 2.5000000000000000e+00 3.6000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 2.1357380845070764e-01 4.7013886220911938e-01 8.5636188529416402e-01 0 0 0
+276 1 2.5000000000000000e+00 3.9000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 2.2234110900479681e-01 3.4758786972735523e-01 9.1090455266450177e-01 0 0 0
+296 1 2.5000000000000000e+00 4.2000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.9646003525323197e-01 2.3830565311068272e-01 9.5111191257590177e-01 0 0 0
+316 1 2.5000000000000000e+00 4.5000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.5508313718777625e-01 1.5508313718777628e-01 9.7565282817198595e-01 0 0 0
+336 1 2.5000000000000000e+00 4.8000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.1214098437153222e-01 9.8127311868331568e-02 9.8883539089662398e-01 0 0 0
+356 1 2.5000000000000000e+00 5.1000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 7.3954811425103573e-02 6.2196104012276258e-02 9.9532021506285684e-01 0 0 0
+376 1 2.5000000000000000e+00 5.4000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 4.1569375222726877e-02 4.1631298256624191e-02 9.9826791095830603e-01 0 0 0
+396 1 2.5000000000000000e+00 5.7000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.3362272507461703e-02 3.2364838887478306e-02 9.9938679542868891e-01 0 0 0
+17 1 2.5000000000000000e+00 0.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -9.3989438861432541e-03 2.6644762521588483e-02 9.9960077855311480e-01 0 0 0
+37 1 2.5000000000000000e+00 3.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -2.8894018478272422e-02 3.3534698701154803e-02 9.9901979944303410e-01 0 0 0
+57 1 2.5000000000000000e+00 6.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -5.0241530269051239e-02 4.8498220596720300e-02 9.9755887607457838e-01 0 0 0
+77 1 2.5000000000000000e+00 9.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -7.3771080474423129e-02 7.3771080474423115e-02 9.9454293792237680e-01 0 0 0
+97 1 2.5000000000000000e+00 1.2000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -9.8127311868331568e-02 1.1214098437153222e-01 9.8883539089662398e-01 0 0 0
+117 1 2.5000000000000000e+00 1.5000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.1922421797550634e-01 1.6561310406555049e-01 9.7895755046370736e-01 0 0 0
+137 1 2.5000000000000000e+00 1.8000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.2975986317850727e-01 2.3284022614534133e-01 9.6381938504912912e-01 0 0 0
+157 1 2.5000000000000000e+00 2.1000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.2090775615411221e-01 3.0602867088565655e-01 9.4431338394504194e-01 0 0 0
+177 1 2.5000000000000000e+00 2.4000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -8.7191355151399738e-02 3.7026717261459713e-01 9.2482424734154467e-01 0 0 0
+197 1 2.5000000000000000e+00 2.7000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -3.1922103301157183e-02 4.0821375936870380e-01 9.1232806927272625e-01 0 0 0
+217 1 2.5000000000000000e+00 3.0000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 3.1922103301157141e-02 4.0821375936870391e-01 9.1232806927272625e-01 0 0 0
+237 1 2.5000000000000000e+00 3.3000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 8.7191355151399710e-02 3.7026717261459707e-01 9.2482424734154489e-01 0 0 0
+257 1 2.5000000000000000e+00 3.6000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.2090775615411221e-01 3.0602867088565661e-01 9.4431338394504205e-01 0 0 0
+277 1 2.5000000000000000e+00 3.9000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.2975986317850727e-01 2.3284022614534139e-01 9.6381938504912912e-01 0 0 0
+297 1 2.5000000000000000e+00 4.2000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.1922421797550634e-01 1.6561310406555052e-01 9.7895755046370747e-01 0 0 0
+317 1 2.5000000000000000e+00 4.5000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 9.8127311868331568e-02 1.1214098437153222e-01 9.8883539089662398e-01 0 0 0
+337 1 2.5000000000000000e+00 4.8000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 7.3771080474423115e-02 7.3771080474423129e-02 9.9454293792237680e-01 0 0 0
+357 1 2.5000000000000000e+00 5.1000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 5.0241530269051225e-02 4.8498220596720300e-02 9.9755887607457838e-01 0 0 0
+377 1 2.5000000000000000e+00 5.4000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 2.8894018478272426e-02 3.3534698701154796e-02 9.9901979944303410e-01 0 0 0
+397 1 2.5000000000000000e+00 5.7000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 9.3989438861432593e-03 2.6644762521588490e-02 9.9960077855311480e-01 0 0 0
+18 1 2.5000000000000000e+00 0.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -6.5828744882500166e-03 1.9561861499557524e-02 9.9978697697966856e-01 0 0 0
+38 1 2.5000000000000000e+00 3.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -2.0009637034407939e-02 2.4184841732588204e-02 9.9950723251816498e-01 0 0 0
+58 1 2.5000000000000000e+00 6.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -3.4047077037887570e-02 3.4047077037887563e-02 9.9884012388887966e-01 0 0 0
+78 1 2.5000000000000000e+00 9.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -4.8498220596720300e-02 5.0241530269051239e-02 9.9755887607457827e-01 0 0 0
+98 1 2.5000000000000000e+00 1.2000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -6.2196104012276252e-02 7.3954811425103573e-02 9.9532021506285684e-01 0 0 0
+118 1 2.5000000000000000e+00 1.5000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -7.2649992877525812e-02 1.0567933713226434e-01 9.9174283775491956e-01 0 0 0
+138 1 2.5000000000000000e+00 1.8000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -7.6126593015943753e-02 1.4398087111736468e-01 9.8664798717073843e-01 0 0 0
+158 1 2.5000000000000000e+00 2.1000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -6.8709104650143085e-02 1.8428174194944066e-01 9.8046891767268962e-01 0 0 0
+178 1 2.5000000000000000e+00 2.4000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -4.8457456104349608e-02 2.1884669159068451e-01 9.7455528346405618e-01 0 0 0
+198 1 2.5000000000000000e+00 2.7000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -1.7543173966404604e-02 2.3902270727461422e-01 9.7085548999544669e-01 0 0 0
+218 1 2.5000000000000000e+00 3.0000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 1.7543173966404566e-02 2.3902270727461419e-01 9.7085548999544657e-01 0 0 0
+238 1 2.5000000000000000e+00 3.3000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 4.8457456104349608e-02 2.1884669159068451e-01 9.7455528346405618e-01 0 0 0
+258 1 2.5000000000000000e+00 3.6000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.8709104650143071e-02 1.8428174194944066e-01 9.8046891767268962e-01 0 0 0
+278 1 2.5000000000000000e+00 3.9000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 7.6126593015943766e-02 1.4398087111736474e-01 9.8664798717073843e-01 0 0 0
+298 1 2.5000000000000000e+00 4.2000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 7.2649992877525799e-02 1.0567933713226434e-01 9.9174283775491956e-01 0 0 0
+318 1 2.5000000000000000e+00 4.5000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.2196104012276245e-02 7.3954811425103587e-02 9.9532021506285684e-01 0 0 0
+338 1 2.5000000000000000e+00 4.8000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 4.8498220596720293e-02 5.0241530269051232e-02 9.9755887607457827e-01 0 0 0
+358 1 2.5000000000000000e+00 5.1000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 3.4047077037887570e-02 3.4047077037887570e-02 9.9884012388887977e-01 0 0 0
+378 1 2.5000000000000000e+00 5.4000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 2.0009637034407935e-02 2.4184841732588200e-02 9.9950723251816487e-01 0 0 0
+398 1 2.5000000000000000e+00 5.7000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.5828744882500193e-03 1.9561861499557524e-02 9.9978697697966856e-01 0 0 0
+19 1 2.5000000000000000e+00 0.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -4.8145058779812486e-03 1.1868011343002475e-02 9.9991798205648519e-01 0 0 0
+39 1 2.5000000000000000e+00 3.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -1.4489047587394143e-02 1.4489047587394136e-02 9.9979004545955585e-01 0 0 0
+59 1 2.5000000000000000e+00 6.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -2.4184841732588200e-02 2.0009637034407932e-02 9.9950723251816498e-01 0 0 0
+79 1 2.5000000000000000e+00 9.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -3.3534698701154803e-02 2.8894018478272433e-02 9.9901979944303421e-01 0 0 0
+99 1 2.5000000000000000e+00 1.2000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.1631298256624205e-02 4.1569375222726870e-02 9.9826791095830603e-01 0 0 0
+119 1 2.5000000000000000e+00 1.5000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.6947676140268450e-02 5.8031121465001771e-02 9.9721026100143129e-01 0 0 0
+139 1 2.5000000000000000e+00 1.8000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.7535409319668043e-02 7.7312985281705840e-02 9.9587302763336372e-01 0 0 0
+159 1 2.5000000000000000e+00 2.1000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.1653952417990810e-02 9.7059251840902694e-02 9.9440658177630958e-01 0 0 0
+179 1 2.5000000000000000e+00 2.4000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -2.8752729368399278e-02 1.1365104497068095e-01 9.9310458690459180e-01 0 0 0
+199 1 2.5000000000000000e+00 2.7000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -1.0293413501576094e-02 1.2321728304286254e-01 9.9232633079951105e-01 0 0 0
+219 1 2.5000000000000000e+00 3.0000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 1.0293413501576077e-02 1.2321728304286257e-01 9.9232633079951116e-01 0 0 0
+239 1 2.5000000000000000e+00 3.3000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 2.8752729368399284e-02 1.1365104497068095e-01 9.9310458690459180e-01 0 0 0
+259 1 2.5000000000000000e+00 3.6000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.1653952417990817e-02 9.7059251840902749e-02 9.9440658177630958e-01 0 0 0
+279 1 2.5000000000000000e+00 3.9000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.7535409319668036e-02 7.7312985281705868e-02 9.9587302763336383e-01 0 0 0
+299 1 2.5000000000000000e+00 4.2000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.6947676140268443e-02 5.8031121465001785e-02 9.9721026100143129e-01 0 0 0
+319 1 2.5000000000000000e+00 4.5000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.1631298256624191e-02 4.1569375222726877e-02 9.9826791095830603e-01 0 0 0
+339 1 2.5000000000000000e+00 4.8000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 3.3534698701154803e-02 2.8894018478272433e-02 9.9901979944303410e-01 0 0 0
+359 1 2.5000000000000000e+00 5.1000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 2.4184841732588204e-02 2.0009637034407932e-02 9.9950723251816498e-01 0 0 0
+379 1 2.5000000000000000e+00 5.4000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 1.4489047587394145e-02 1.4489047587394140e-02 9.9979004545955585e-01 0 0 0
+399 1 2.5000000000000000e+00 5.7000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.8145058779812486e-03 1.1868011343002480e-02 9.9991798205648519e-01 0 0 0
+20 1 2.5000000000000000e+00 0.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -3.9693242391277937e-03 3.9693242391277764e-03 9.9998424434096445e-01 0 0 0
+40 1 2.5000000000000000e+00 3.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -1.1868011343002482e-02 4.8145058779812460e-03 9.9991798205648519e-01 0 0 0
+60 1 2.5000000000000000e+00 6.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -1.9561861499557517e-02 6.5828744882500097e-03 9.9978697697966856e-01 0 0 0
+80 1 2.5000000000000000e+00 9.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -2.6644762521588487e-02 9.3989438861432437e-03 9.9960077855311491e-01 0 0 0
+100 1 2.5000000000000000e+00 1.2000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.2364838887478306e-02 1.3362272507461690e-02 9.9938679542868891e-01 0 0 0
+120 1 2.5000000000000000e+00 1.5000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.5634992015801822e-02 1.8429703183501404e-02 9.9919492261750509e-01 0 0 0
+140 1 2.5000000000000000e+00 1.8000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.5235119566844240e-02 2.4270277420221090e-02 9.9908430073895971e-01 0 0 0
+160 1 2.5000000000000000e+00 2.1000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.0237916900163146e-02 3.0163850736159105e-02 9.9908748890690546e-01 0 0 0
+180 1 2.5000000000000000e+00 2.4000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -2.0551704657275894e-02 3.5058787503171394e-02 9.9917391321755789e-01 0 0 0
+200 1 2.5000000000000000e+00 2.7000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -7.2971667669136028e-03 3.7860607272964010e-02 9.9925638640646086e-01 0 0 0
+220 1 2.5000000000000000e+00 3.0000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 7.2971667669136037e-03 3.7860607272964024e-02 9.9925638640646097e-01 0 0 0
+240 1 2.5000000000000000e+00 3.3000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 2.0551704657275890e-02 3.5058787503171394e-02 9.9917391321755777e-01 0 0 0
+260 1 2.5000000000000000e+00 3.6000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.0237916900163159e-02 3.0163850736159115e-02 9.9908748890690535e-01 0 0 0
+280 1 2.5000000000000000e+00 3.9000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.5235119566844234e-02 2.4270277420221094e-02 9.9908430073895960e-01 0 0 0
+300 1 2.5000000000000000e+00 4.2000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.5634992015801836e-02 1.8429703183501414e-02 9.9919492261750498e-01 0 0 0
+320 1 2.5000000000000000e+00 4.5000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.2364838887478299e-02 1.3362272507461701e-02 9.9938679542868891e-01 0 0 0
+340 1 2.5000000000000000e+00 4.8000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 2.6644762521588480e-02 9.3989438861432611e-03 9.9960077855311480e-01 0 0 0
+360 1 2.5000000000000000e+00 5.1000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 1.9561861499557527e-02 6.5828744882500097e-03 9.9978697697966845e-01 0 0 0
+380 1 2.5000000000000000e+00 5.4000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 1.1868011343002492e-02 4.8145058779812391e-03 9.9991798205648519e-01 0 0 0
+400 1 2.5000000000000000e+00 5.7000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.9693242391277937e-03 3.9693242391277851e-03 9.9998424434096445e-01 0 0 0
+
+Velocities
+
+1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+81 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+101 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+121 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+141 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+161 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+181 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+201 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+221 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+241 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+261 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+281 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+301 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+321 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+341 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+361 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+381 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+82 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+102 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+122 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+142 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+162 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+182 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+202 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+222 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+242 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+262 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+282 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+302 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+322 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+342 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+362 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+382 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+83 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+103 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+123 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+143 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+163 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+183 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+203 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+223 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+243 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+263 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+283 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+303 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+323 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+343 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+363 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+383 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+84 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+104 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+124 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+144 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+164 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+184 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+204 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+224 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+244 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+264 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+284 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+304 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+324 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+344 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+364 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+384 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+65 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+85 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+105 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+125 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+145 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+165 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+185 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+205 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+225 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+245 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+265 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+285 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+305 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+325 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+345 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+365 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+385 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+66 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+86 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+106 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+126 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+146 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+166 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+186 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+206 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+226 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+246 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+266 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+286 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+306 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+326 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+346 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+366 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+386 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+67 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+87 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+107 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+127 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+147 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+167 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+187 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+207 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+227 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+247 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+267 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+287 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+307 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+327 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+347 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+367 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+387 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+68 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+88 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+108 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+128 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+148 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+168 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+188 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+208 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+228 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+248 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+268 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+288 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+308 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+328 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+348 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+368 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+388 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+69 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+89 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+109 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+129 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+149 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+169 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+189 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+209 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+229 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+249 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+269 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+289 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+309 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+329 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+349 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+369 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+389 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+70 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+90 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+110 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+130 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+150 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+170 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+190 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+210 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+230 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+250 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+270 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+290 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+310 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+330 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+350 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+370 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+390 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+71 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+91 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+111 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+131 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+151 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+171 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+191 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+211 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+231 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+251 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+271 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+291 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+311 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+331 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+351 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+371 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+391 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+72 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+92 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+112 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+132 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+152 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+172 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+192 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+212 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+232 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+252 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+272 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+292 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+312 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+332 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+352 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+372 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+392 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+73 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+93 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+113 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+133 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+153 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+173 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+193 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+213 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+233 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+253 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+273 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+293 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+313 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+333 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+353 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+373 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+393 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+74 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+94 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+114 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+134 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+154 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+174 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+194 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+214 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+234 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+254 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+274 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+294 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+314 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+334 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+354 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+374 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+394 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+75 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+95 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+115 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+135 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+155 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+175 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+195 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+215 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+235 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+255 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+275 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+295 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+315 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+335 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+355 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+375 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+395 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+76 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+96 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+116 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+136 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+156 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+176 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+196 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+216 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+236 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+256 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+276 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+296 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+316 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+336 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+356 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+376 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+396 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+77 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+97 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+117 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+137 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+157 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+177 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+197 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+217 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+237 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+257 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+277 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+297 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+317 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+337 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+357 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+377 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+397 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+78 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+98 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+118 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+138 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+158 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+178 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+198 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+218 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+238 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+258 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+278 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+298 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+318 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+338 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+358 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+378 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+398 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+79 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+99 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+119 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+139 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+159 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+179 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+199 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+219 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+239 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+259 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+279 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+299 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+319 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+339 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+359 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+379 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+399 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+80 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+100 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+120 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+140 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+160 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+180 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+200 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+220 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+240 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+260 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+280 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+300 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+320 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+340 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+360 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+380 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
+400 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
diff --git a/examples/SPIN/read_restart/in.spin.read_data b/examples/SPIN/read_restart/in.spin.read_data
index 17343994b5..a450421699 100644
--- a/examples/SPIN/read_restart/in.spin.read_data
+++ b/examples/SPIN/read_restart/in.spin.read_data
@@ -40,6 +40,6 @@ thermo_style custom step time v_magnorm v_emag v_tmag temp etotal
thermo_modify format float %20.15g
compute outsp all property/atom spx spy spz sp fmx fmy fmz
-dump 10 all custom 1 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7]
+dump 1 all custom 1 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7]
run 100
diff --git a/examples/SPIN/setforce_spin/in.spinmin.setforce b/examples/SPIN/setforce_spin/in.spinmin.setforce
new file mode 100644
index 0000000000..10d4df66ed
--- /dev/null
+++ b/examples/SPIN/setforce_spin/in.spinmin.setforce
@@ -0,0 +1,59 @@
+
+units metal
+dimension 3
+boundary f f f
+atom_style spin
+
+# necessary for the serial algorithm (sametag)
+atom_modify map array
+
+lattice sc 3.0
+region box block 0.0 10.0 0.0 10.0 0.0 1.0
+create_box 2 box
+region reg1 block 0.0 10.0 0.0 5.0 0.0 1.0
+region reg2 block 0.0 10.0 6.0 10.0 0.0 1.0
+create_atoms 1 region reg1
+create_atoms 2 region reg2
+
+# setting mass, mag. moments, and interactions for bcc iron
+
+mass 1 55.845
+mass 2 55.845
+set region reg1 spin 2.2 0.0 0.0 1.0
+set region reg2 spin/random 31 2.2
+
+group fixed_spin region reg1
+
+pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1
+pair_coeff * * spin/exchange exchange 3.1 -0.01593 0.06626915552 1.211
+pair_coeff * * spin/dmi dmi 3.1 0.12e-03 0.0 0.0 1.0
+
+neighbor 0.1 bin
+neigh_modify every 10 check yes delay 20
+
+fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 anisotropy 5e-05 0.0 0.0 1.0
+fix_modify 1 energy yes
+fix 2 fixed_spin setforce/spin 0.0 0.0 0.0
+fix 3 all langevin/spin 0.0 0.1 21
+fix 4 all nve/spin lattice no
+
+timestep 0.0001
+
+compute out_mag all spin
+variable magx equal c_out_mag[1]
+variable magy equal c_out_mag[2]
+variable magz equal c_out_mag[3]
+variable magnorm equal c_out_mag[4]
+variable emag equal c_out_mag[5]
+variable tmag equal c_out_mag[6]
+
+thermo 1000
+thermo_style custom step time v_magx v_magz v_magnorm v_tmag etotal
+thermo_modify format float %20.15g
+
+compute outsp all property/atom spx spy spz sp fmx fmy fmz
+dump 1 all custom 1000 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[5] c_outsp[6] c_outsp[7]
+
+min_style spin
+min_modify alpha_damp 1.0 discrete_factor 20.0
+minimize 1.0e-16 1.0e-16 50000 1000
diff --git a/examples/USER/misc/drip/C.drip b/examples/USER/misc/drip/C.drip
new file mode 120000
index 0000000000..44959e2423
--- /dev/null
+++ b/examples/USER/misc/drip/C.drip
@@ -0,0 +1 @@
+../../../../potentials/C.drip
\ No newline at end of file
diff --git a/examples/USER/misc/drip/CH.rebo b/examples/USER/misc/drip/CH.rebo
new file mode 120000
index 0000000000..c5a6a40100
--- /dev/null
+++ b/examples/USER/misc/drip/CH.rebo
@@ -0,0 +1 @@
+../../../../potentials/CH.rebo
\ No newline at end of file
diff --git a/examples/USER/misc/drip/README.txt b/examples/USER/misc/drip/README.txt
new file mode 100644
index 0000000000..26a8e3dd00
--- /dev/null
+++ b/examples/USER/misc/drip/README.txt
@@ -0,0 +1,6 @@
+in.C_drip:
+ Use DRIP and REBO to relax a bilayer graphene.
+
+in.CH_drip:
+ Use DRIP and REBO to relax a bilayer graphene with additional hydrogen atoms
+ on top of it.
diff --git a/examples/USER/misc/drip/data.C b/examples/USER/misc/drip/data.C
new file mode 100644
index 0000000000..18ff6af645
--- /dev/null
+++ b/examples/USER/misc/drip/data.C
@@ -0,0 +1,416 @@
+LAMMPS data file
+
+400 atoms
+1 atom types
+
+0.0 2.465000000000000e+01 xlo xhi
+0.0 2.134752620328641e+01 ylo yhi
+0.0 3.000000000000000e+01 zlo zhi
+1.232500000000000e+01 0.000000000000000e+00 0.000000000000000e+00 xy xz yz
+
+Masses
+
+1 12.011
+
+Atoms # molecular
+
+1 1 1 0.000000000000000e+00 0.000000000000000e+00 1.498097531971289e+01
+2 1 1 9.859999999999999e+00 1.707802096262913e+01 1.489139792549795e+01
+3 1 1 2.588250000000000e+01 6.404257860985923e+00 1.495586615731768e+01
+4 1 1 2.711500000000000e+01 7.115842067762138e+00 1.501795235919980e+01
+5 1 1 4.930000000000000e+00 8.539010481314564e+00 1.492827527515956e+01
+6 1 1 6.162499999999999e+00 9.250594688090777e+00 1.500678649580791e+01
+7 1 1 3.204499999999999e+01 1.565485254907670e+01 1.511662064028576e+01
+8 1 1 3.081250000000000e+01 1.494326834230049e+01 1.505500683988625e+01
+9 1 1 7.395000000000000e+00 8.539010481314564e+00 1.504923694256975e+01
+10 1 1 8.627500000000000e+00 9.250594688090777e+00 1.503332570633445e+01
+11 1 1 9.859999999999999e+00 8.539010481314564e+00 1.508137430939768e+01
+12 1 1 1.109250000000000e+01 9.250594688090777e+00 1.510475862694483e+01
+13 1 1 1.109250000000000e+01 1.778960516940534e+01 1.494613902888088e+01
+14 1 1 2.958000000000000e+01 1.565485254907670e+01 1.516279958068751e+01
+15 1 1 1.232500000000000e+01 8.539010481314564e+00 1.511276583208523e+01
+16 1 1 1.355750000000000e+01 9.250594688090777e+00 1.495632206546155e+01
+17 1 1 1.479000000000000e+01 8.539010481314564e+00 1.498291715828213e+01
+18 1 1 1.602250000000000e+01 9.250594688090777e+00 1.509801558902469e+01
+19 1 1 2.711499999999999e+01 1.565485254907670e+01 1.500089766276763e+01
+20 1 1 2.588250000000000e+01 1.494326834230049e+01 1.505114888970355e+01
+21 1 1 1.725500000000000e+01 8.539010481314564e+00 1.504495103103041e+01
+22 1 1 1.848750000000000e+01 9.250594688090777e+00 1.513527732850389e+01
+23 1 1 1.972000000000000e+01 8.539010481314564e+00 1.502400693288890e+01
+24 1 1 2.095250000000000e+01 9.250594688090777e+00 1.490419939433632e+01
+25 1 1 2.465000000000000e+01 1.565485254907670e+01 1.492998117758711e+01
+26 1 1 2.834750000000000e+01 1.494326834230049e+01 1.496091474579883e+01
+27 1 1 2.465000000000000e+01 7.115842067762138e+00 1.497394355694102e+01
+28 1 1 2.341750000000000e+01 6.404257860985923e+00 1.500235588455933e+01
+29 1 1 2.218500000000000e+01 7.115842067762138e+00 1.503766448268803e+01
+30 1 1 2.465000000000000e+01 4.269505240657282e+00 1.488340764495658e+01
+31 1 1 2.588250000000000e+01 4.981089447433495e+00 1.490587231994899e+01
+32 1 1 3.697500000000000e+00 6.404257860985923e+00 1.500462204163887e+01
+33 1 1 4.930000000000000e+00 7.115842067762138e+00 1.507823175629797e+01
+34 1 1 2.095250000000000e+01 1.778960516940534e+01 1.485635836857104e+01
+35 1 1 1.972000000000000e+01 1.707802096262913e+01 1.508733405608850e+01
+36 1 1 6.162500000000000e+00 6.404257860985923e+00 1.495657175139946e+01
+37 1 1 7.395000000000000e+00 7.115842067762138e+00 1.505630699893542e+01
+38 1 1 8.627500000000000e+00 6.404257860985923e+00 1.493710859708546e+01
+39 1 1 9.859999999999999e+00 7.115842067762138e+00 1.498031036104573e+01
+40 1 1 1.848750000000000e+01 1.778960516940534e+01 1.492663969598082e+01
+41 1 1 1.725500000000000e+01 1.707802096262913e+01 1.487928391741343e+01
+42 1 1 2.218500000000000e+01 1.280851572197185e+01 1.493339893560164e+01
+43 1 1 1.232500000000000e+01 7.115842067762138e+00 1.507943978677017e+01
+44 1 1 1.355750000000000e+01 6.404257860985923e+00 1.484914917113341e+01
+45 1 1 1.479000000000000e+01 7.115842067762138e+00 1.516663648122805e+01
+46 1 1 1.602250000000000e+01 1.778960516940534e+01 1.494170266401908e+01
+47 1 1 1.479000000000000e+01 1.707802096262913e+01 1.489834582180523e+01
+48 1 1 1.602250000000000e+01 6.404257860985923e+00 1.502658138746657e+01
+49 1 1 1.725500000000000e+01 7.115842067762138e+00 1.498697322036154e+01
+50 1 1 1.848750000000000e+01 6.404257860985923e+00 1.504573856434245e+01
+51 1 1 1.972000000000000e+01 7.115842067762138e+00 1.498510668772038e+01
+52 1 1 1.355750000000000e+01 1.778960516940534e+01 1.503160986637731e+01
+53 1 1 1.232500000000000e+01 1.707802096262913e+01 1.482446479934924e+01
+54 1 1 2.095250000000000e+01 6.404257860985923e+00 1.510811524523195e+01
+55 1 1 2.341750000000000e+01 1.494326834230049e+01 1.505440697642049e+01
+56 1 1 2.218500000000000e+01 1.707802096262913e+01 1.489480063588714e+01
+57 1 1 2.218500000000000e+01 8.539010481314564e+00 1.495045959051609e+01
+58 1 1 2.465000000000000e+01 8.539010481314564e+00 1.512601015985335e+01
+59 1 1 2.588250000000000e+01 1.067376310164321e+01 1.495691790117351e+01
+60 1 1 2.711500000000000e+01 1.138534730841942e+01 1.496195578420333e+01
+61 1 1 9.859999999999999e+00 1.565485254907670e+01 1.488138963237187e+01
+62 1 1 8.627500000000000e+00 1.494326834230049e+01 1.498700505084123e+01
+63 1 1 2.834750000000000e+01 1.067376310164321e+01 1.504459111637339e+01
+64 1 1 2.958000000000000e+01 1.138534730841942e+01 1.495098625433358e+01
+65 1 1 7.395000000000000e+00 1.280851572197185e+01 1.505608046573023e+01
+66 1 1 8.627500000000000e+00 1.352009992874806e+01 1.484199719552881e+01
+67 1 1 3.081250000000000e+01 1.352009992874806e+01 1.483451056838223e+01
+68 1 1 2.958000000000000e+01 1.280851572197185e+01 1.502332948089694e+01
+69 1 1 9.859999999999999e+00 1.280851572197185e+01 1.506286085730730e+01
+70 1 1 2.465000000000000e+01 1.138534730841942e+01 1.506305034228861e+01
+71 1 1 1.109250000000000e+01 1.352009992874806e+01 1.491918072685150e+01
+72 1 1 1.355750000000000e+01 1.352009992874806e+01 1.494644661191470e+01
+73 1 1 2.834750000000000e+01 1.352009992874806e+01 1.496099714517733e+01
+74 1 1 2.711500000000000e+01 1.280851572197185e+01 1.498298656405413e+01
+75 1 1 1.479000000000000e+01 1.280851572197185e+01 1.511808602386498e+01
+76 1 1 1.602250000000000e+01 1.352009992874806e+01 1.509196186449678e+01
+77 1 1 1.725500000000000e+01 1.280851572197185e+01 1.494017769280163e+01
+78 1 1 1.848750000000000e+01 1.352009992874806e+01 1.486540173862453e+01
+79 1 1 2.588250000000000e+01 1.352009992874806e+01 1.502414429870090e+01
+80 1 1 2.465000000000000e+01 1.280851572197185e+01 1.491189258035136e+01
+81 1 1 1.972000000000000e+01 1.280851572197185e+01 1.503451993485524e+01
+82 1 1 2.095250000000000e+01 1.352009992874806e+01 1.503423133885440e+01
+83 1 1 1.232500000000000e+01 1.280851572197185e+01 1.492432047742539e+01
+84 1 1 2.341750000000000e+01 1.067376310164321e+01 1.500488865182437e+01
+85 1 1 1.109250000000000e+01 1.494326834230049e+01 1.509530225402135e+01
+86 1 1 1.232500000000000e+01 1.565485254907670e+01 1.500246060086581e+01
+87 1 1 2.588250000000000e+01 9.250594688090777e+00 1.498734533172262e+01
+88 1 1 2.218500000000000e+01 1.565485254907670e+01 1.504729297899704e+01
+89 1 1 2.095250000000000e+01 1.494326834230049e+01 1.486622917148261e+01
+90 1 1 2.711500000000000e+01 8.539010481314564e+00 1.494373650471835e+01
+91 1 1 2.834750000000000e+01 9.250594688090777e+00 1.488792788684821e+01
+92 1 1 6.162500000000000e+00 1.067376310164321e+01 1.486731884367082e+01
+93 1 1 7.395000000000000e+00 1.138534730841942e+01 1.509646856144050e+01
+94 1 1 1.972000000000000e+01 1.565485254907670e+01 1.488798024124609e+01
+95 1 1 1.848750000000000e+01 1.494326834230049e+01 1.489558509878004e+01
+96 1 1 8.627500000000000e+00 1.067376310164321e+01 1.497336164791434e+01
+97 1 1 9.859999999999999e+00 1.138534730841942e+01 1.496081048392299e+01
+98 1 1 1.109250000000000e+01 1.067376310164321e+01 1.494580009249847e+01
+99 1 1 1.232500000000000e+01 1.138534730841942e+01 1.510396759497348e+01
+100 1 1 1.725500000000000e+01 1.565485254907670e+01 1.499338417222946e+01
+101 1 1 1.602250000000000e+01 1.494326834230049e+01 1.511840116374763e+01
+102 1 1 1.355750000000000e+01 1.067376310164321e+01 1.503281161003896e+01
+103 1 1 1.479000000000000e+01 1.138534730841942e+01 1.499843298302028e+01
+104 1 1 1.602250000000000e+01 1.067376310164321e+01 1.491311607132768e+01
+105 1 1 1.725500000000000e+01 1.138534730841942e+01 1.504030511972019e+01
+106 1 1 1.479000000000000e+01 1.565485254907670e+01 1.486944422096690e+01
+107 1 1 1.355750000000000e+01 1.494326834230049e+01 1.476511580670247e+01
+108 1 1 1.848750000000000e+01 1.067376310164321e+01 1.483733215135541e+01
+109 1 1 1.972000000000000e+01 1.138534730841942e+01 1.483307878319485e+01
+110 1 1 2.095250000000000e+01 1.067376310164321e+01 1.472377202887134e+01
+111 1 1 2.218500000000000e+01 1.138534730841942e+01 1.494032335018560e+01
+112 1 1 2.341750000000000e+01 9.250594688090777e+00 1.511930030385710e+01
+113 1 1 2.341750000000000e+01 1.778960516940534e+01 1.506163255648677e+01
+114 1 1 1.109250000000000e+01 6.404257860985923e+00 1.507183137955260e+01
+115 1 1 2.218500000000000e+01 4.269505240657282e+00 1.492921198534790e+01
+116 1 1 2.341750000000000e+01 7.115842067762137e-01 1.506491820629175e+01
+117 1 1 1.232500000000000e+00 2.134752620328641e+00 1.507012124249483e+01
+118 1 1 2.465000000000000e+00 2.846336827104855e+00 1.503655403336380e+01
+119 1 1 2.218500000000000e+01 1.992435778973398e+01 1.505948767536701e+01
+120 1 1 2.095250000000000e+01 1.921277358295777e+01 1.514330257618634e+01
+121 1 1 3.697500000000000e+00 2.134752620328641e+00 1.502497496406354e+01
+122 1 1 4.930000000000000e+00 2.846336827104855e+00 1.507374298221752e+01
+123 1 1 6.162500000000000e+00 2.134752620328641e+00 1.493733326297393e+01
+124 1 1 7.395000000000000e+00 2.846336827104855e+00 1.487495201368372e+01
+125 1 1 1.972000000000000e+01 1.992435778973398e+01 1.505808760634221e+01
+126 1 1 1.848750000000000e+01 1.921277358295777e+01 1.493872889432326e+01
+127 1 1 2.218500000000000e+01 0.000000000000000e+00 1.501312853963581e+01
+128 1 1 8.627500000000000e+00 2.134752620328641e+00 1.505205628279858e+01
+129 1 1 2.341750000000000e+01 4.981089447433495e+00 1.507571160792217e+01
+130 1 1 1.109250000000000e+01 2.134752620328641e+00 1.489358054803088e+01
+131 1 1 1.232500000000000e+01 2.846336827104855e+00 1.499912561242418e+01
+132 1 1 1.725500000000000e+01 1.992435778973398e+01 1.497577189332382e+01
+133 1 1 1.602250000000000e+01 1.921277358295777e+01 1.499040615876794e+01
+134 1 1 1.355750000000000e+01 2.134752620328641e+00 1.516072772863512e+01
+135 1 1 1.479000000000000e+01 2.846336827104855e+00 1.507211585538748e+01
+136 1 1 1.602250000000000e+01 2.134752620328641e+00 1.504045728176403e+01
+137 1 1 1.725500000000000e+01 2.846336827104855e+00 1.504684394670705e+01
+138 1 1 1.479000000000000e+01 1.992435778973398e+01 1.510384904069957e+01
+139 1 1 1.355750000000000e+01 1.921277358295777e+01 1.511446984282775e+01
+140 1 1 9.859999999999999e+00 2.846336827104855e+00 1.502182693962230e+01
+141 1 1 1.848750000000000e+01 2.134752620328641e+00 1.492115016417242e+01
+142 1 1 2.341750000000000e+01 1.921277358295777e+01 1.511940999724034e+01
+143 1 1 2.095250000000000e+01 7.115842067762137e-01 1.499411067303495e+01
+144 1 1 1.232500000000000e+00 7.115842067762137e-01 1.506494802778743e+01
+145 1 1 3.451000000000000e+01 1.992435778973398e+01 1.504957420337895e+01
+146 1 1 3.327750000000000e+01 1.921277358295777e+01 1.511072511003059e+01
+147 1 1 2.465000000000000e+00 0.000000000000000e+00 1.500837434607164e+01
+148 1 1 3.697500000000000e+00 7.115842067762137e-01 1.499541651074234e+01
+149 1 1 4.930000000000000e+00 0.000000000000000e+00 1.509518604163723e+01
+150 1 1 6.162500000000000e+00 7.115842067762137e-01 1.497074687620619e+01
+151 1 1 3.204500000000000e+01 1.992435778973398e+01 1.500792890976805e+01
+152 1 1 3.081250000000000e+01 1.921277358295777e+01 1.496690270418216e+01
+153 1 1 7.395000000000000e+00 0.000000000000000e+00 1.524069684472765e+01
+154 1 1 8.627500000000000e+00 7.115842067762137e-01 1.491839348334605e+01
+155 1 1 2.465000000000000e+01 1.992435778973398e+01 1.498895095057103e+01
+156 1 1 9.859999999999999e+00 0.000000000000000e+00 1.499465288102860e+01
+157 1 1 2.958000000000000e+01 1.992435778973398e+01 1.495366550654662e+01
+158 1 1 2.834750000000000e+01 1.921277358295777e+01 1.498688543050304e+01
+159 1 1 1.232500000000000e+01 0.000000000000000e+00 1.502461005163719e+01
+160 1 1 1.355750000000000e+01 7.115842067762137e-01 1.488675470180450e+01
+161 1 1 1.479000000000000e+01 0.000000000000000e+00 1.499317346174183e+01
+162 1 1 1.602250000000000e+01 7.115842067762137e-01 1.499167690758548e+01
+163 1 1 2.711499999999999e+01 1.992435778973398e+01 1.501975964337061e+01
+164 1 1 2.588250000000000e+01 1.921277358295777e+01 1.486203378273598e+01
+165 1 1 1.725500000000000e+01 0.000000000000000e+00 1.504809379785000e+01
+166 1 1 1.848750000000000e+01 7.115842067762137e-01 1.491114701451727e+01
+167 1 1 1.972000000000000e+01 0.000000000000000e+00 1.512011452965299e+01
+168 1 1 1.109250000000000e+01 7.115842067762137e-01 1.487408794621075e+01
+169 1 1 1.972000000000000e+01 2.846336827104855e+00 1.507831721537003e+01
+170 1 1 2.341750000000000e+01 1.352009992874806e+01 1.495718486297744e+01
+171 1 1 2.958000000000000e+01 1.707802096262913e+01 1.493147208418856e+01
+172 1 1 1.848750000000000e+01 4.981089447433495e+00 1.494913539471411e+01
+173 1 1 3.697500000000000e+00 4.981089447433495e+00 1.478998858443710e+01
+174 1 1 3.327750000000000e+01 1.778960516940534e+01 1.495502006800012e+01
+175 1 1 3.204500000000000e+01 1.707802096262913e+01 1.495051064694342e+01
+176 1 1 4.930000000000000e+00 4.269505240657282e+00 1.498350377115313e+01
+177 1 1 6.162500000000000e+00 4.981089447433495e+00 1.494667393795457e+01
+178 1 1 7.395000000000000e+00 4.269505240657282e+00 1.507985366541724e+01
+179 1 1 2.588250000000000e+01 1.778960516940534e+01 1.494716376988664e+01
+180 1 1 8.627500000000000e+00 4.981089447433495e+00 1.499320258596098e+01
+181 1 1 1.602250000000000e+01 4.981089447433495e+00 1.500127272897711e+01
+182 1 1 1.479000000000000e+01 4.269505240657282e+00 1.493241109430999e+01
+183 1 1 2.711500000000000e+01 1.707802096262913e+01 1.513215736063149e+01
+184 1 1 2.834750000000000e+01 1.778960516940534e+01 1.491995000096713e+01
+185 1 1 9.859999999999999e+00 4.269505240657282e+00 1.523967414046218e+01
+186 1 1 1.109250000000000e+01 4.981089447433495e+00 1.507658824600498e+01
+187 1 1 1.355750000000000e+01 4.981089447433495e+00 1.498019661433922e+01
+188 1 1 3.081250000000000e+01 1.778960516940534e+01 1.488921763404584e+01
+189 1 1 2.465000000000000e+01 1.707802096262913e+01 1.491522695293121e+01
+190 1 1 1.725500000000000e+01 4.269505240657282e+00 1.484531224085001e+01
+191 1 1 1.972000000000000e+01 4.269505240657282e+00 1.512087841047699e+01
+192 1 1 2.095250000000000e+01 2.134752620328641e+00 1.501366356379743e+01
+193 1 1 2.218500000000000e+01 2.846336827104855e+00 1.512768073569268e+01
+194 1 1 1.232500000000000e+01 1.992435778973398e+01 1.479694154125662e+01
+195 1 1 1.109250000000000e+01 1.921277358295777e+01 1.508375643482666e+01
+196 1 1 2.095250000000000e+01 4.981089447433495e+00 1.502213574954626e+01
+197 1 1 2.465000000000000e+00 4.269505240657282e+00 1.501785776522257e+01
+198 1 1 2.341750000000000e+01 2.134752620328641e+00 1.477223550033331e+01
+199 1 1 1.232500000000000e+01 4.269505240657282e+00 1.509476826791352e+01
+200 1 1 2.465000000000000e+01 2.846336827104855e+00 1.506451005381648e+01
+201 2 1 2.958000000000000e+01 1.423168413552428e+01 1.846233090874204e+01
+202 2 1 1.725500000000000e+01 1.850118937618155e+01 1.830892906667390e+01
+203 2 1 3.204500000000000e+01 1.992435778973398e+01 1.840011296435520e+01
+204 2 1 1.109250000000000e+01 1.636643675585292e+01 1.815423076555236e+01
+205 2 1 9.859999999999999e+00 1.565485254907670e+01 1.857780537003584e+01
+206 2 1 2.341750000000000e+01 1.352009992874806e+01 1.824080722484135e+01
+207 2 1 2.465000000000000e+01 1.423168413552428e+01 1.836017802635158e+01
+208 2 1 2.341750000000000e+01 1.778960516940534e+01 1.828410032494974e+01
+209 2 1 2.711499999999999e+01 1.992435778973398e+01 1.844731239573154e+01
+210 2 1 2.834750000000000e+01 2.063594199651019e+01 1.828146439901283e+01
+211 2 1 2.465000000000000e+01 1.850118937618155e+01 1.836242662973500e+01
+212 2 1 2.711500000000000e+01 1.423168413552428e+01 1.836150573422813e+01
+213 2 1 2.588250000000000e+01 1.352009992874806e+01 1.830533607491024e+01
+214 2 1 3.204499999999999e+01 1.423168413552428e+01 1.852693962525193e+01
+215 2 1 3.327750000000000e+01 2.063594199651019e+01 1.845057006323066e+01
+216 2 1 2.218500000000000e+01 1.850118937618155e+01 1.834530693106420e+01
+217 2 1 2.095250000000000e+01 1.778960516940534e+01 1.817360355124612e+01
+218 2 1 2.711500000000000e+01 1.850118937618155e+01 1.845768039438554e+01
+219 2 1 1.848750000000000e+01 1.778960516940534e+01 1.822837106768257e+01
+220 2 1 1.972000000000000e+01 1.850118937618155e+01 1.834146516606220e+01
+221 2 1 1.602250000000000e+01 1.778960516940534e+01 1.837935563986790e+01
+222 2 1 2.958000000000000e+01 1.992435778973398e+01 1.860134630351601e+01
+223 2 1 3.081250000000000e+01 2.063594199651019e+01 1.829143841375619e+01
+224 2 1 2.588250000000000e+01 1.778960516940534e+01 1.828834782396325e+01
+225 2 1 2.834750000000000e+01 1.352009992874806e+01 1.856412094918868e+01
+226 2 1 3.081250000000000e+01 1.352009992874806e+01 1.853801808786659e+01
+227 2 1 1.355750000000000e+01 2.063594199651019e+01 1.848883167175910e+01
+228 2 1 2.588250000000000e+01 2.063594199651019e+01 1.830177176844362e+01
+229 2 1 1.109250000000000e+01 1.778960516940534e+01 1.835319724200392e+01
+230 2 1 1.848750000000000e+01 2.063594199651019e+01 1.847119667517633e+01
+231 2 1 2.218500000000000e+01 1.565485254907670e+01 1.860318710827055e+01
+232 2 1 2.341750000000000e+01 1.636643675585292e+01 1.837094744555149e+01
+233 2 1 3.327750000000000e+01 1.778960516940534e+01 1.833243244791216e+01
+234 2 1 3.327750000000000e+01 1.636643675585292e+01 1.841374627283294e+01
+235 2 1 3.204499999999999e+01 1.565485254907670e+01 1.831879406900189e+01
+236 2 1 2.095250000000000e+01 1.636643675585292e+01 1.847406800172368e+01
+237 2 1 3.450999999999999e+01 1.850118937618155e+01 1.825509330024598e+01
+238 2 1 2.588250000000000e+01 1.636643675585292e+01 1.858281516013951e+01
+239 2 1 1.602250000000000e+01 2.063594199651019e+01 1.843602760618910e+01
+240 2 1 1.479000000000000e+01 1.992435778973398e+01 1.838252211650205e+01
+241 2 1 2.711499999999999e+01 1.565485254907670e+01 1.853744396051707e+01
+242 2 1 2.834750000000000e+01 1.636643675585292e+01 1.827644925946220e+01
+243 2 1 3.081250000000000e+01 1.636643675585292e+01 1.839489332257254e+01
+244 2 1 2.958000000000000e+01 1.565485254907670e+01 1.835082606731893e+01
+245 2 1 2.465000000000000e+01 1.565485254907670e+01 1.824093445834070e+01
+246 2 1 2.834750000000000e+01 1.778960516940534e+01 1.839125877129669e+01
+247 2 1 1.972000000000000e+01 1.565485254907670e+01 1.850135584349750e+01
+248 2 1 1.972000000000000e+01 1.992435778973398e+01 1.833453778991944e+01
+249 2 1 1.232500000000000e+01 1.565485254907670e+01 1.861569706632533e+01
+250 2 1 1.355750000000000e+01 1.636643675585292e+01 1.838074525366760e+01
+251 2 1 2.465000000000000e+01 1.992435778973398e+01 1.848031566286595e+01
+252 2 1 2.958000000000000e+01 1.850118937618155e+01 1.834558681120988e+01
+253 2 1 1.232500000000000e+01 1.992435778973398e+01 1.837502909143642e+01
+254 2 1 1.479000000000000e+01 1.850118937618155e+01 1.838311174584445e+01
+255 2 1 1.479000000000000e+01 1.565485254907670e+01 1.832442132291042e+01
+256 2 1 1.232500000000000e+01 1.850118937618155e+01 1.828810769113426e+01
+257 2 1 1.602250000000000e+01 1.636643675585292e+01 1.855251516549562e+01
+258 2 1 2.341750000000000e+01 2.063594199651019e+01 1.838894036475336e+01
+259 2 1 2.218500000000000e+01 1.992435778973398e+01 1.846784434616029e+01
+260 2 1 1.725500000000000e+01 1.565485254907670e+01 1.835189752692777e+01
+261 2 1 1.848750000000000e+01 1.636643675585292e+01 1.842967763285558e+01
+262 2 1 3.081250000000000e+01 1.778960516940534e+01 1.844833766662363e+01
+263 2 1 3.204499999999999e+01 1.850118937618155e+01 1.847737939507963e+01
+264 2 1 2.095250000000000e+01 2.063594199651019e+01 1.847095133969059e+01
+265 2 1 1.355750000000000e+01 1.778960516940534e+01 1.828894868367980e+01
+266 2 1 1.725500000000000e+01 1.992435778973398e+01 1.834596243435063e+01
+267 2 1 2.957999999999999e+01 9.962178894866991e+00 1.832354414995078e+01
+268 2 1 2.095250000000000e+01 1.352009992874806e+01 1.831118657380274e+01
+269 2 1 1.972000000000000e+01 2.846336827104855e+00 1.837664127263829e+01
+270 2 1 2.095250000000000e+01 3.557921033881068e+00 1.845927782292901e+01
+271 2 1 2.218500000000000e+01 2.846336827104855e+00 1.847140305919736e+01
+272 2 1 2.341750000000000e+01 3.557921033881068e+00 1.843247974382396e+01
+273 2 1 2.465000000000000e+01 2.846336827104855e+00 1.837823139065125e+01
+274 2 1 2.588250000000000e+01 3.557921033881068e+00 1.832687883090416e+01
+275 2 1 3.697500000000000e+00 4.981089447433495e+00 1.847217701470688e+01
+276 2 1 4.930000000000000e+00 5.692673654209710e+00 1.856242710641034e+01
+277 2 1 6.162500000000000e+00 4.981089447433495e+00 1.843965491743299e+01
+278 2 1 7.395000000000000e+00 5.692673654209710e+00 1.830667264718264e+01
+279 2 1 8.627500000000000e+00 4.981089447433495e+00 1.838064863521239e+01
+280 2 1 9.859999999999999e+00 5.692673654209710e+00 1.861740907316864e+01
+281 2 1 1.109250000000000e+01 4.981089447433495e+00 1.838405249119109e+01
+282 2 1 1.232500000000000e+01 5.692673654209710e+00 1.836039437384349e+01
+283 2 1 1.355750000000000e+01 4.981089447433495e+00 1.831221958504840e+01
+284 2 1 1.479000000000000e+01 5.692673654209710e+00 1.828617147888200e+01
+285 2 1 1.602250000000000e+01 4.981089447433495e+00 1.855140653175703e+01
+286 2 1 1.725500000000000e+01 5.692673654209710e+00 1.841767199745545e+01
+287 2 1 1.848750000000000e+01 4.981089447433495e+00 1.832477807209270e+01
+288 2 1 1.972000000000000e+01 5.692673654209710e+00 1.846923771304869e+01
+289 2 1 2.095250000000000e+01 4.981089447433495e+00 1.836832598911283e+01
+290 2 1 2.218500000000000e+01 5.692673654209710e+00 1.843546423544375e+01
+291 2 1 2.341750000000000e+01 4.981089447433495e+00 1.855277898292336e+01
+292 2 1 2.465000000000000e+01 5.692673654209710e+00 1.847587291495339e+01
+293 2 1 2.588250000000000e+01 4.981089447433495e+00 1.826375194964259e+01
+294 2 1 2.711499999999999e+01 5.692673654209710e+00 1.851411320915631e+01
+295 2 1 4.930000000000000e+00 7.115842067762138e+00 1.840825444435020e+01
+296 2 1 6.162500000000000e+00 7.827426274538350e+00 1.833047038974451e+01
+297 2 1 7.395000000000000e+00 7.115842067762138e+00 1.836426082429110e+01
+298 2 1 1.848750000000000e+01 3.557921033881068e+00 1.837403279549467e+01
+299 2 1 1.725500000000000e+01 2.846336827104855e+00 1.835268380461592e+01
+300 2 1 1.602250000000000e+01 3.557921033881068e+00 1.848952507034905e+01
+301 2 1 1.479000000000000e+01 2.846336827104855e+00 1.851644726747239e+01
+302 2 1 1.232500000000000e+00 7.115842067762137e-01 1.832611230156879e+01
+303 2 1 2.465000000000000e+00 1.423168413552427e+00 1.852709756577955e+01
+304 2 1 3.697500000000000e+00 7.115842067762137e-01 1.827857500530802e+01
+305 2 1 4.929999999999999e+00 1.423168413552427e+00 1.826136806124286e+01
+306 2 1 6.162500000000000e+00 7.115842067762137e-01 1.827242936292011e+01
+307 2 1 7.395000000000000e+00 1.423168413552427e+00 1.844551050904462e+01
+308 2 1 8.627500000000000e+00 7.115842067762137e-01 1.844984225027845e+01
+309 2 1 9.859999999999999e+00 1.423168413552427e+00 1.843114129409313e+01
+310 2 1 1.109250000000000e+01 7.115842067762137e-01 1.824449880776195e+01
+311 2 1 1.232500000000000e+01 1.423168413552427e+00 1.856224612585160e+01
+312 2 1 1.355750000000000e+01 7.115842067762137e-01 1.836481578357231e+01
+313 2 1 1.479000000000000e+01 1.423168413552427e+00 1.843036892933161e+01
+314 2 1 1.602250000000000e+01 7.115842067762137e-01 1.835067728786723e+01
+315 2 1 1.725500000000000e+01 1.423168413552427e+00 1.847697931942738e+01
+316 2 1 8.627499999999998e+00 7.827426274538350e+00 1.840542860269897e+01
+317 2 1 1.848750000000000e+01 7.115842067762137e-01 1.843036272469964e+01
+318 2 1 2.095250000000000e+01 7.115842067762137e-01 1.828037025055374e+01
+319 2 1 2.218500000000000e+01 1.423168413552427e+00 1.847794227938386e+01
+320 2 1 2.341750000000000e+01 7.115842067762137e-01 1.836220929695125e+01
+321 2 1 2.465000000000000e+01 1.423168413552427e+00 1.856129777428492e+01
+322 2 1 2.465000000000000e+00 2.846336827104855e+00 1.828958750195393e+01
+323 2 1 3.697500000000000e+00 3.557921033881068e+00 1.848583325162553e+01
+324 2 1 4.930000000000000e+00 2.846336827104855e+00 1.838401024175294e+01
+325 2 1 6.162499999999999e+00 3.557921033881068e+00 1.837437624437527e+01
+326 2 1 7.395000000000000e+00 2.846336827104855e+00 1.841292915268399e+01
+327 2 1 8.627500000000000e+00 3.557921033881068e+00 1.848557970160289e+01
+328 2 1 9.859999999999999e+00 2.846336827104855e+00 1.842924761810127e+01
+329 2 1 1.109250000000000e+01 3.557921033881068e+00 1.831004365073452e+01
+330 2 1 1.232500000000000e+01 2.846336827104855e+00 1.818033371289823e+01
+331 2 1 1.355750000000000e+01 3.557921033881068e+00 1.844566501118075e+01
+332 2 1 1.972000000000000e+01 1.423168413552427e+00 1.846190975036447e+01
+333 2 1 2.218500000000000e+01 1.423168413552428e+01 1.835322517893207e+01
+334 2 1 9.859999999999999e+00 7.115842067762138e+00 1.839789371642158e+01
+335 2 1 1.232500000000000e+01 7.115842067762138e+00 1.847537444410727e+01
+336 2 1 8.627500000000000e+00 1.209693151519563e+01 1.829199174409380e+01
+337 2 1 9.859999999999999e+00 1.138534730841942e+01 1.829413303647114e+01
+338 2 1 1.109250000000000e+01 1.209693151519563e+01 1.856999584032139e+01
+339 2 1 1.232500000000000e+01 1.138534730841942e+01 1.851349651735582e+01
+340 2 1 1.355750000000000e+01 1.209693151519563e+01 1.831123823696192e+01
+341 2 1 1.479000000000000e+01 1.138534730841942e+01 1.843448433334394e+01
+342 2 1 1.602250000000000e+01 1.209693151519563e+01 1.839428881565063e+01
+343 2 1 1.725500000000000e+01 1.138534730841942e+01 1.849178099784848e+01
+344 2 1 1.848750000000000e+01 1.209693151519563e+01 1.824975358434335e+01
+345 2 1 1.972000000000000e+01 1.138534730841942e+01 1.839694145030204e+01
+346 2 1 2.095250000000000e+01 1.209693151519563e+01 1.829096787226717e+01
+347 2 1 2.218500000000000e+01 1.138534730841942e+01 1.840263887228008e+01
+348 2 1 2.341750000000000e+01 1.209693151519563e+01 1.837666030509410e+01
+349 2 1 2.465000000000000e+01 1.138534730841942e+01 1.835828025909527e+01
+350 2 1 2.588250000000000e+01 1.209693151519563e+01 1.833582168089864e+01
+351 2 1 2.711500000000000e+01 1.138534730841942e+01 1.836353031742933e+01
+352 2 1 2.834750000000000e+01 1.209693151519563e+01 1.845852602484125e+01
+353 2 1 2.958000000000000e+01 1.138534730841942e+01 1.853888136458308e+01
+354 2 1 3.081250000000000e+01 1.209693151519563e+01 1.831036168742244e+01
+355 2 1 8.627500000000000e+00 1.352009992874806e+01 1.835261188649090e+01
+356 2 1 9.859999999999999e+00 1.423168413552428e+01 1.821705864207346e+01
+357 2 1 1.109250000000000e+01 1.352009992874806e+01 1.831524712388831e+01
+358 2 1 1.232500000000000e+01 1.423168413552428e+01 1.852378179475058e+01
+359 2 1 1.355750000000000e+01 1.352009992874806e+01 1.852309441840510e+01
+360 2 1 1.479000000000000e+01 1.423168413552428e+01 1.836621027472939e+01
+361 2 1 1.602250000000000e+01 1.352009992874806e+01 1.849039311610116e+01
+362 2 1 1.725500000000000e+01 1.423168413552428e+01 1.842269825087092e+01
+363 2 1 1.848750000000000e+01 1.352009992874806e+01 1.825468998789840e+01
+364 2 1 1.972000000000000e+01 1.423168413552428e+01 1.849561590548242e+01
+365 2 1 7.395000000000000e+00 1.138534730841942e+01 1.859813014678126e+01
+366 2 1 3.451000000000000e+01 1.992435778973398e+01 1.813501916227946e+01
+367 2 1 2.834750000000000e+01 9.250594688090777e+00 1.847653992697568e+01
+368 2 1 2.711499999999999e+01 9.962178894866991e+00 1.849053529347614e+01
+369 2 1 1.355750000000000e+01 7.827426274538350e+00 1.835096749618396e+01
+370 2 1 1.479000000000000e+01 7.115842067762138e+00 1.844059942495262e+01
+371 2 1 1.602250000000000e+01 7.827426274538350e+00 1.844461353068087e+01
+372 2 1 1.725500000000000e+01 7.115842067762138e+00 1.836290600804645e+01
+373 2 1 1.848750000000000e+01 7.827426274538350e+00 1.825818280452995e+01
+374 2 1 1.972000000000000e+01 7.115842067762138e+00 1.837997086460227e+01
+375 2 1 2.095250000000000e+01 7.827426274538350e+00 1.826491847987811e+01
+376 2 1 2.218500000000000e+01 7.115842067762138e+00 1.841142851923555e+01
+377 2 1 2.341750000000000e+01 7.827426274538350e+00 1.826594520665525e+01
+378 2 1 2.465000000000000e+01 7.115842067762138e+00 1.838708488224049e+01
+379 2 1 2.588250000000000e+01 7.827426274538350e+00 1.830434555380351e+01
+380 2 1 2.711500000000000e+01 7.115842067762138e+00 1.859652575977937e+01
+381 2 1 2.834750000000000e+01 7.827426274538350e+00 1.844094595194482e+01
+382 2 1 6.162499999999999e+00 9.250594688090777e+00 1.856484810097502e+01
+383 2 1 1.109250000000000e+01 7.827426274538350e+00 1.847502232204046e+01
+384 2 1 7.395000000000000e+00 9.962178894866991e+00 1.854741705791729e+01
+385 2 1 9.859999999999999e+00 9.962178894866991e+00 1.837074522628645e+01
+386 2 1 1.109250000000000e+01 9.250594688090777e+00 1.846206781979952e+01
+387 2 1 1.232500000000000e+01 9.962178894866991e+00 1.823251181425658e+01
+388 2 1 1.355750000000000e+01 9.250594688090777e+00 1.834993099844037e+01
+389 2 1 1.479000000000000e+01 9.962178894866991e+00 1.843248036437880e+01
+390 2 1 1.602250000000000e+01 9.250594688090777e+00 1.855142577781635e+01
+391 2 1 1.725500000000000e+01 9.962178894866991e+00 1.847587547064991e+01
+392 2 1 1.848750000000000e+01 9.250594688090777e+00 1.850249139638135e+01
+393 2 1 1.972000000000000e+01 9.962178894866991e+00 1.841266132895000e+01
+394 2 1 2.095250000000000e+01 9.250594688090777e+00 1.837466808881276e+01
+395 2 1 2.218500000000000e+01 9.962178894866991e+00 1.834587370280250e+01
+396 2 1 2.341750000000000e+01 9.250594688090777e+00 1.846590574952954e+01
+397 2 1 2.465000000000000e+01 9.962178894866991e+00 1.835650105398410e+01
+398 2 1 2.588250000000000e+01 9.250594688090777e+00 1.838143174570202e+01
+399 2 1 8.627500000000000e+00 9.250594688090777e+00 1.843904853716322e+01
+400 2 1 3.574249999999999e+01 2.063594199651019e+01 1.839864514570517e+01
diff --git a/examples/USER/misc/drip/data.CH b/examples/USER/misc/drip/data.CH
new file mode 100644
index 0000000000..17e9f4e18f
--- /dev/null
+++ b/examples/USER/misc/drip/data.CH
@@ -0,0 +1,562 @@
+LAMMPS data file
+
+545 atoms
+2 atom types
+
+0.0 2.465000000000000e+01 xlo xhi
+0.0 2.134752620328641e+01 ylo yhi
+0.0 3.000000000000000e+01 zlo zhi
+1.232500000000000e+01 0.000000000000000e+00 0.000000000000000e+00 xy xz yz
+
+Masses
+
+1 12.011
+2 1.0
+
+Atoms # molecular
+
+1 1 1 0.000000000000000e+00 0.000000000000000e+00 1.498097531971289e+01
+2 1 1 9.859999999999999e+00 1.707802096262913e+01 1.489139792549795e+01
+3 1 1 2.588250000000000e+01 6.404257860985923e+00 1.495586615731768e+01
+4 1 1 2.711500000000000e+01 7.115842067762138e+00 1.501795235919980e+01
+5 1 1 4.930000000000000e+00 8.539010481314564e+00 1.492827527515956e+01
+6 1 1 6.162499999999999e+00 9.250594688090777e+00 1.500678649580791e+01
+7 1 1 3.204499999999999e+01 1.565485254907670e+01 1.511662064028576e+01
+8 1 1 3.081250000000000e+01 1.494326834230049e+01 1.505500683988625e+01
+9 1 1 7.395000000000000e+00 8.539010481314564e+00 1.504923694256975e+01
+10 1 1 8.627500000000000e+00 9.250594688090777e+00 1.503332570633445e+01
+11 1 1 9.859999999999999e+00 8.539010481314564e+00 1.508137430939768e+01
+12 1 1 1.109250000000000e+01 9.250594688090777e+00 1.510475862694483e+01
+13 1 1 1.109250000000000e+01 1.778960516940534e+01 1.494613902888088e+01
+14 1 1 2.958000000000000e+01 1.565485254907670e+01 1.516279958068751e+01
+15 1 1 1.232500000000000e+01 8.539010481314564e+00 1.511276583208523e+01
+16 1 1 1.355750000000000e+01 9.250594688090777e+00 1.495632206546155e+01
+17 1 1 1.479000000000000e+01 8.539010481314564e+00 1.498291715828213e+01
+18 1 1 1.602250000000000e+01 9.250594688090777e+00 1.509801558902469e+01
+19 1 1 2.711499999999999e+01 1.565485254907670e+01 1.500089766276763e+01
+20 1 1 2.588250000000000e+01 1.494326834230049e+01 1.505114888970355e+01
+21 1 1 1.725500000000000e+01 8.539010481314564e+00 1.504495103103041e+01
+22 1 1 1.848750000000000e+01 9.250594688090777e+00 1.513527732850389e+01
+23 1 1 1.972000000000000e+01 8.539010481314564e+00 1.502400693288890e+01
+24 1 1 2.095250000000000e+01 9.250594688090777e+00 1.490419939433632e+01
+25 1 1 2.465000000000000e+01 1.565485254907670e+01 1.492998117758711e+01
+26 1 1 2.834750000000000e+01 1.494326834230049e+01 1.496091474579883e+01
+27 1 1 2.465000000000000e+01 7.115842067762138e+00 1.497394355694102e+01
+28 1 1 2.341750000000000e+01 6.404257860985923e+00 1.500235588455933e+01
+29 1 1 2.218500000000000e+01 7.115842067762138e+00 1.503766448268803e+01
+30 1 1 2.465000000000000e+01 4.269505240657282e+00 1.488340764495658e+01
+31 1 1 2.588250000000000e+01 4.981089447433495e+00 1.490587231994899e+01
+32 1 1 3.697500000000000e+00 6.404257860985923e+00 1.500462204163887e+01
+33 1 1 4.930000000000000e+00 7.115842067762138e+00 1.507823175629797e+01
+34 1 1 2.095250000000000e+01 1.778960516940534e+01 1.485635836857104e+01
+35 1 1 1.972000000000000e+01 1.707802096262913e+01 1.508733405608850e+01
+36 1 1 6.162500000000000e+00 6.404257860985923e+00 1.495657175139946e+01
+37 1 1 7.395000000000000e+00 7.115842067762138e+00 1.505630699893542e+01
+38 1 1 8.627500000000000e+00 6.404257860985923e+00 1.493710859708546e+01
+39 1 1 9.859999999999999e+00 7.115842067762138e+00 1.498031036104573e+01
+40 1 1 1.848750000000000e+01 1.778960516940534e+01 1.492663969598082e+01
+41 1 1 1.725500000000000e+01 1.707802096262913e+01 1.487928391741343e+01
+42 1 1 2.218500000000000e+01 1.280851572197185e+01 1.493339893560164e+01
+43 1 1 1.232500000000000e+01 7.115842067762138e+00 1.507943978677017e+01
+44 1 1 1.355750000000000e+01 6.404257860985923e+00 1.484914917113341e+01
+45 1 1 1.479000000000000e+01 7.115842067762138e+00 1.516663648122805e+01
+46 1 1 1.602250000000000e+01 1.778960516940534e+01 1.494170266401908e+01
+47 1 1 1.479000000000000e+01 1.707802096262913e+01 1.489834582180523e+01
+48 1 1 1.602250000000000e+01 6.404257860985923e+00 1.502658138746657e+01
+49 1 1 1.725500000000000e+01 7.115842067762138e+00 1.498697322036154e+01
+50 1 1 1.848750000000000e+01 6.404257860985923e+00 1.504573856434245e+01
+51 1 1 1.972000000000000e+01 7.115842067762138e+00 1.498510668772038e+01
+52 1 1 1.355750000000000e+01 1.778960516940534e+01 1.503160986637731e+01
+53 1 1 1.232500000000000e+01 1.707802096262913e+01 1.482446479934924e+01
+54 1 1 2.095250000000000e+01 6.404257860985923e+00 1.510811524523195e+01
+55 1 1 2.341750000000000e+01 1.494326834230049e+01 1.505440697642049e+01
+56 1 1 2.218500000000000e+01 1.707802096262913e+01 1.489480063588714e+01
+57 1 1 2.218500000000000e+01 8.539010481314564e+00 1.495045959051609e+01
+58 1 1 2.465000000000000e+01 8.539010481314564e+00 1.512601015985335e+01
+59 1 1 2.588250000000000e+01 1.067376310164321e+01 1.495691790117351e+01
+60 1 1 2.711500000000000e+01 1.138534730841942e+01 1.496195578420333e+01
+61 1 1 9.859999999999999e+00 1.565485254907670e+01 1.488138963237187e+01
+62 1 1 8.627500000000000e+00 1.494326834230049e+01 1.498700505084123e+01
+63 1 1 2.834750000000000e+01 1.067376310164321e+01 1.504459111637339e+01
+64 1 1 2.958000000000000e+01 1.138534730841942e+01 1.495098625433358e+01
+65 1 1 7.395000000000000e+00 1.280851572197185e+01 1.505608046573023e+01
+66 1 1 8.627500000000000e+00 1.352009992874806e+01 1.484199719552881e+01
+67 1 1 3.081250000000000e+01 1.352009992874806e+01 1.483451056838223e+01
+68 1 1 2.958000000000000e+01 1.280851572197185e+01 1.502332948089694e+01
+69 1 1 9.859999999999999e+00 1.280851572197185e+01 1.506286085730730e+01
+70 1 1 2.465000000000000e+01 1.138534730841942e+01 1.506305034228861e+01
+71 1 1 1.109250000000000e+01 1.352009992874806e+01 1.491918072685150e+01
+72 1 1 1.355750000000000e+01 1.352009992874806e+01 1.494644661191470e+01
+73 1 1 2.834750000000000e+01 1.352009992874806e+01 1.496099714517733e+01
+74 1 1 2.711500000000000e+01 1.280851572197185e+01 1.498298656405413e+01
+75 1 1 1.479000000000000e+01 1.280851572197185e+01 1.511808602386498e+01
+76 1 1 1.602250000000000e+01 1.352009992874806e+01 1.509196186449678e+01
+77 1 1 1.725500000000000e+01 1.280851572197185e+01 1.494017769280163e+01
+78 1 1 1.848750000000000e+01 1.352009992874806e+01 1.486540173862453e+01
+79 1 1 2.588250000000000e+01 1.352009992874806e+01 1.502414429870090e+01
+80 1 1 2.465000000000000e+01 1.280851572197185e+01 1.491189258035136e+01
+81 1 1 1.972000000000000e+01 1.280851572197185e+01 1.503451993485524e+01
+82 1 1 2.095250000000000e+01 1.352009992874806e+01 1.503423133885440e+01
+83 1 1 1.232500000000000e+01 1.280851572197185e+01 1.492432047742539e+01
+84 1 1 2.341750000000000e+01 1.067376310164321e+01 1.500488865182437e+01
+85 1 1 1.109250000000000e+01 1.494326834230049e+01 1.509530225402135e+01
+86 1 1 1.232500000000000e+01 1.565485254907670e+01 1.500246060086581e+01
+87 1 1 2.588250000000000e+01 9.250594688090777e+00 1.498734533172262e+01
+88 1 1 2.218500000000000e+01 1.565485254907670e+01 1.504729297899704e+01
+89 1 1 2.095250000000000e+01 1.494326834230049e+01 1.486622917148261e+01
+90 1 1 2.711500000000000e+01 8.539010481314564e+00 1.494373650471835e+01
+91 1 1 2.834750000000000e+01 9.250594688090777e+00 1.488792788684821e+01
+92 1 1 6.162500000000000e+00 1.067376310164321e+01 1.486731884367082e+01
+93 1 1 7.395000000000000e+00 1.138534730841942e+01 1.509646856144050e+01
+94 1 1 1.972000000000000e+01 1.565485254907670e+01 1.488798024124609e+01
+95 1 1 1.848750000000000e+01 1.494326834230049e+01 1.489558509878004e+01
+96 1 1 8.627500000000000e+00 1.067376310164321e+01 1.497336164791434e+01
+97 1 1 9.859999999999999e+00 1.138534730841942e+01 1.496081048392299e+01
+98 1 1 1.109250000000000e+01 1.067376310164321e+01 1.494580009249847e+01
+99 1 1 1.232500000000000e+01 1.138534730841942e+01 1.510396759497348e+01
+100 1 1 1.725500000000000e+01 1.565485254907670e+01 1.499338417222946e+01
+101 1 1 1.602250000000000e+01 1.494326834230049e+01 1.511840116374763e+01
+102 1 1 1.355750000000000e+01 1.067376310164321e+01 1.503281161003896e+01
+103 1 1 1.479000000000000e+01 1.138534730841942e+01 1.499843298302028e+01
+104 1 1 1.602250000000000e+01 1.067376310164321e+01 1.491311607132768e+01
+105 1 1 1.725500000000000e+01 1.138534730841942e+01 1.504030511972019e+01
+106 1 1 1.479000000000000e+01 1.565485254907670e+01 1.486944422096690e+01
+107 1 1 1.355750000000000e+01 1.494326834230049e+01 1.476511580670247e+01
+108 1 1 1.848750000000000e+01 1.067376310164321e+01 1.483733215135541e+01
+109 1 1 1.972000000000000e+01 1.138534730841942e+01 1.483307878319485e+01
+110 1 1 2.095250000000000e+01 1.067376310164321e+01 1.472377202887134e+01
+111 1 1 2.218500000000000e+01 1.138534730841942e+01 1.494032335018560e+01
+112 1 1 2.341750000000000e+01 9.250594688090777e+00 1.511930030385710e+01
+113 1 1 2.341750000000000e+01 1.778960516940534e+01 1.506163255648677e+01
+114 1 1 1.109250000000000e+01 6.404257860985923e+00 1.507183137955260e+01
+115 1 1 2.218500000000000e+01 4.269505240657282e+00 1.492921198534790e+01
+116 1 1 2.341750000000000e+01 7.115842067762137e-01 1.506491820629175e+01
+117 1 1 1.232500000000000e+00 2.134752620328641e+00 1.507012124249483e+01
+118 1 1 2.465000000000000e+00 2.846336827104855e+00 1.503655403336380e+01
+119 1 1 2.218500000000000e+01 1.992435778973398e+01 1.505948767536701e+01
+120 1 1 2.095250000000000e+01 1.921277358295777e+01 1.514330257618634e+01
+121 1 1 3.697500000000000e+00 2.134752620328641e+00 1.502497496406354e+01
+122 1 1 4.930000000000000e+00 2.846336827104855e+00 1.507374298221752e+01
+123 1 1 6.162500000000000e+00 2.134752620328641e+00 1.493733326297393e+01
+124 1 1 7.395000000000000e+00 2.846336827104855e+00 1.487495201368372e+01
+125 1 1 1.972000000000000e+01 1.992435778973398e+01 1.505808760634221e+01
+126 1 1 1.848750000000000e+01 1.921277358295777e+01 1.493872889432326e+01
+127 1 1 2.218500000000000e+01 0.000000000000000e+00 1.501312853963581e+01
+128 1 1 8.627500000000000e+00 2.134752620328641e+00 1.505205628279858e+01
+129 1 1 2.341750000000000e+01 4.981089447433495e+00 1.507571160792217e+01
+130 1 1 1.109250000000000e+01 2.134752620328641e+00 1.489358054803088e+01
+131 1 1 1.232500000000000e+01 2.846336827104855e+00 1.499912561242418e+01
+132 1 1 1.725500000000000e+01 1.992435778973398e+01 1.497577189332382e+01
+133 1 1 1.602250000000000e+01 1.921277358295777e+01 1.499040615876794e+01
+134 1 1 1.355750000000000e+01 2.134752620328641e+00 1.516072772863512e+01
+135 1 1 1.479000000000000e+01 2.846336827104855e+00 1.507211585538748e+01
+136 1 1 1.602250000000000e+01 2.134752620328641e+00 1.504045728176403e+01
+137 1 1 1.725500000000000e+01 2.846336827104855e+00 1.504684394670705e+01
+138 1 1 1.479000000000000e+01 1.992435778973398e+01 1.510384904069957e+01
+139 1 1 1.355750000000000e+01 1.921277358295777e+01 1.511446984282775e+01
+140 1 1 9.859999999999999e+00 2.846336827104855e+00 1.502182693962230e+01
+141 1 1 1.848750000000000e+01 2.134752620328641e+00 1.492115016417242e+01
+142 1 1 2.341750000000000e+01 1.921277358295777e+01 1.511940999724034e+01
+143 1 1 2.095250000000000e+01 7.115842067762137e-01 1.499411067303495e+01
+144 1 1 1.232500000000000e+00 7.115842067762137e-01 1.506494802778743e+01
+145 1 1 3.451000000000000e+01 1.992435778973398e+01 1.504957420337895e+01
+146 1 1 3.327750000000000e+01 1.921277358295777e+01 1.511072511003059e+01
+147 1 1 2.465000000000000e+00 0.000000000000000e+00 1.500837434607164e+01
+148 1 1 3.697500000000000e+00 7.115842067762137e-01 1.499541651074234e+01
+149 1 1 4.930000000000000e+00 0.000000000000000e+00 1.509518604163723e+01
+150 1 1 6.162500000000000e+00 7.115842067762137e-01 1.497074687620619e+01
+151 1 1 3.204500000000000e+01 1.992435778973398e+01 1.500792890976805e+01
+152 1 1 3.081250000000000e+01 1.921277358295777e+01 1.496690270418216e+01
+153 1 1 7.395000000000000e+00 0.000000000000000e+00 1.524069684472765e+01
+154 1 1 8.627500000000000e+00 7.115842067762137e-01 1.491839348334605e+01
+155 1 1 2.465000000000000e+01 1.992435778973398e+01 1.498895095057103e+01
+156 1 1 9.859999999999999e+00 0.000000000000000e+00 1.499465288102860e+01
+157 1 1 2.958000000000000e+01 1.992435778973398e+01 1.495366550654662e+01
+158 1 1 2.834750000000000e+01 1.921277358295777e+01 1.498688543050304e+01
+159 1 1 1.232500000000000e+01 0.000000000000000e+00 1.502461005163719e+01
+160 1 1 1.355750000000000e+01 7.115842067762137e-01 1.488675470180450e+01
+161 1 1 1.479000000000000e+01 0.000000000000000e+00 1.499317346174183e+01
+162 1 1 1.602250000000000e+01 7.115842067762137e-01 1.499167690758548e+01
+163 1 1 2.711499999999999e+01 1.992435778973398e+01 1.501975964337061e+01
+164 1 1 2.588250000000000e+01 1.921277358295777e+01 1.486203378273598e+01
+165 1 1 1.725500000000000e+01 0.000000000000000e+00 1.504809379785000e+01
+166 1 1 1.848750000000000e+01 7.115842067762137e-01 1.491114701451727e+01
+167 1 1 1.972000000000000e+01 0.000000000000000e+00 1.512011452965299e+01
+168 1 1 1.109250000000000e+01 7.115842067762137e-01 1.487408794621075e+01
+169 1 1 1.972000000000000e+01 2.846336827104855e+00 1.507831721537003e+01
+170 1 1 2.341750000000000e+01 1.352009992874806e+01 1.495718486297744e+01
+171 1 1 2.958000000000000e+01 1.707802096262913e+01 1.493147208418856e+01
+172 1 1 1.848750000000000e+01 4.981089447433495e+00 1.494913539471411e+01
+173 1 1 3.697500000000000e+00 4.981089447433495e+00 1.478998858443710e+01
+174 1 1 3.327750000000000e+01 1.778960516940534e+01 1.495502006800012e+01
+175 1 1 3.204500000000000e+01 1.707802096262913e+01 1.495051064694342e+01
+176 1 1 4.930000000000000e+00 4.269505240657282e+00 1.498350377115313e+01
+177 1 1 6.162500000000000e+00 4.981089447433495e+00 1.494667393795457e+01
+178 1 1 7.395000000000000e+00 4.269505240657282e+00 1.507985366541724e+01
+179 1 1 2.588250000000000e+01 1.778960516940534e+01 1.494716376988664e+01
+180 1 1 8.627500000000000e+00 4.981089447433495e+00 1.499320258596098e+01
+181 1 1 1.602250000000000e+01 4.981089447433495e+00 1.500127272897711e+01
+182 1 1 1.479000000000000e+01 4.269505240657282e+00 1.493241109430999e+01
+183 1 1 2.711500000000000e+01 1.707802096262913e+01 1.513215736063149e+01
+184 1 1 2.834750000000000e+01 1.778960516940534e+01 1.491995000096713e+01
+185 1 1 9.859999999999999e+00 4.269505240657282e+00 1.523967414046218e+01
+186 1 1 1.109250000000000e+01 4.981089447433495e+00 1.507658824600498e+01
+187 1 1 1.355750000000000e+01 4.981089447433495e+00 1.498019661433922e+01
+188 1 1 3.081250000000000e+01 1.778960516940534e+01 1.488921763404584e+01
+189 1 1 2.465000000000000e+01 1.707802096262913e+01 1.491522695293121e+01
+190 1 1 1.725500000000000e+01 4.269505240657282e+00 1.484531224085001e+01
+191 1 1 1.972000000000000e+01 4.269505240657282e+00 1.512087841047699e+01
+192 1 1 2.095250000000000e+01 2.134752620328641e+00 1.501366356379743e+01
+193 1 1 2.218500000000000e+01 2.846336827104855e+00 1.512768073569268e+01
+194 1 1 1.232500000000000e+01 1.992435778973398e+01 1.479694154125662e+01
+195 1 1 1.109250000000000e+01 1.921277358295777e+01 1.508375643482666e+01
+196 1 1 2.095250000000000e+01 4.981089447433495e+00 1.502213574954626e+01
+197 1 1 2.465000000000000e+00 4.269505240657282e+00 1.501785776522257e+01
+198 1 1 2.341750000000000e+01 2.134752620328641e+00 1.477223550033331e+01
+199 1 1 1.232500000000000e+01 4.269505240657282e+00 1.509476826791352e+01
+200 1 1 2.465000000000000e+01 2.846336827104855e+00 1.506451005381648e+01
+201 2 1 2.958000000000000e+01 1.423168413552428e+01 1.846233090874204e+01
+202 2 1 1.725500000000000e+01 1.850118937618155e+01 1.830892906667390e+01
+203 2 1 3.204500000000000e+01 1.992435778973398e+01 1.840011296435520e+01
+204 2 1 1.109250000000000e+01 1.636643675585292e+01 1.815423076555236e+01
+205 2 1 9.859999999999999e+00 1.565485254907670e+01 1.857780537003584e+01
+206 2 1 2.341750000000000e+01 1.352009992874806e+01 1.824080722484135e+01
+207 2 1 2.465000000000000e+01 1.423168413552428e+01 1.836017802635158e+01
+208 2 1 2.341750000000000e+01 1.778960516940534e+01 1.828410032494974e+01
+209 2 1 2.711499999999999e+01 1.992435778973398e+01 1.844731239573154e+01
+210 2 1 2.834750000000000e+01 2.063594199651019e+01 1.828146439901283e+01
+211 2 1 2.465000000000000e+01 1.850118937618155e+01 1.836242662973500e+01
+212 2 1 2.711500000000000e+01 1.423168413552428e+01 1.836150573422813e+01
+213 2 1 2.588250000000000e+01 1.352009992874806e+01 1.830533607491024e+01
+214 2 1 3.204499999999999e+01 1.423168413552428e+01 1.852693962525193e+01
+215 2 1 3.327750000000000e+01 2.063594199651019e+01 1.845057006323066e+01
+216 2 1 2.218500000000000e+01 1.850118937618155e+01 1.834530693106420e+01
+217 2 1 2.095250000000000e+01 1.778960516940534e+01 1.817360355124612e+01
+218 2 1 2.711500000000000e+01 1.850118937618155e+01 1.845768039438554e+01
+219 2 1 1.848750000000000e+01 1.778960516940534e+01 1.822837106768257e+01
+220 2 1 1.972000000000000e+01 1.850118937618155e+01 1.834146516606220e+01
+221 2 1 1.602250000000000e+01 1.778960516940534e+01 1.837935563986790e+01
+222 2 1 2.958000000000000e+01 1.992435778973398e+01 1.860134630351601e+01
+223 2 1 3.081250000000000e+01 2.063594199651019e+01 1.829143841375619e+01
+224 2 1 2.588250000000000e+01 1.778960516940534e+01 1.828834782396325e+01
+225 2 1 2.834750000000000e+01 1.352009992874806e+01 1.856412094918868e+01
+226 2 1 3.081250000000000e+01 1.352009992874806e+01 1.853801808786659e+01
+227 2 1 1.355750000000000e+01 2.063594199651019e+01 1.848883167175910e+01
+228 2 1 2.588250000000000e+01 2.063594199651019e+01 1.830177176844362e+01
+229 2 1 1.109250000000000e+01 1.778960516940534e+01 1.835319724200392e+01
+230 2 1 1.848750000000000e+01 2.063594199651019e+01 1.847119667517633e+01
+231 2 1 2.218500000000000e+01 1.565485254907670e+01 1.860318710827055e+01
+232 2 1 2.341750000000000e+01 1.636643675585292e+01 1.837094744555149e+01
+233 2 1 3.327750000000000e+01 1.778960516940534e+01 1.833243244791216e+01
+234 2 1 3.327750000000000e+01 1.636643675585292e+01 1.841374627283294e+01
+235 2 1 3.204499999999999e+01 1.565485254907670e+01 1.831879406900189e+01
+236 2 1 2.095250000000000e+01 1.636643675585292e+01 1.847406800172368e+01
+237 2 1 3.450999999999999e+01 1.850118937618155e+01 1.825509330024598e+01
+238 2 1 2.588250000000000e+01 1.636643675585292e+01 1.858281516013951e+01
+239 2 1 1.602250000000000e+01 2.063594199651019e+01 1.843602760618910e+01
+240 2 1 1.479000000000000e+01 1.992435778973398e+01 1.838252211650205e+01
+241 2 1 2.711499999999999e+01 1.565485254907670e+01 1.853744396051707e+01
+242 2 1 2.834750000000000e+01 1.636643675585292e+01 1.827644925946220e+01
+243 2 1 3.081250000000000e+01 1.636643675585292e+01 1.839489332257254e+01
+244 2 1 2.958000000000000e+01 1.565485254907670e+01 1.835082606731893e+01
+245 2 1 2.465000000000000e+01 1.565485254907670e+01 1.824093445834070e+01
+246 2 1 2.834750000000000e+01 1.778960516940534e+01 1.839125877129669e+01
+247 2 1 1.972000000000000e+01 1.565485254907670e+01 1.850135584349750e+01
+248 2 1 1.972000000000000e+01 1.992435778973398e+01 1.833453778991944e+01
+249 2 1 1.232500000000000e+01 1.565485254907670e+01 1.861569706632533e+01
+250 2 1 1.355750000000000e+01 1.636643675585292e+01 1.838074525366760e+01
+251 2 1 2.465000000000000e+01 1.992435778973398e+01 1.848031566286595e+01
+252 2 1 2.958000000000000e+01 1.850118937618155e+01 1.834558681120988e+01
+253 2 1 1.232500000000000e+01 1.992435778973398e+01 1.837502909143642e+01
+254 2 1 1.479000000000000e+01 1.850118937618155e+01 1.838311174584445e+01
+255 2 1 1.479000000000000e+01 1.565485254907670e+01 1.832442132291042e+01
+256 2 1 1.232500000000000e+01 1.850118937618155e+01 1.828810769113426e+01
+257 2 1 1.602250000000000e+01 1.636643675585292e+01 1.855251516549562e+01
+258 2 1 2.341750000000000e+01 2.063594199651019e+01 1.838894036475336e+01
+259 2 1 2.218500000000000e+01 1.992435778973398e+01 1.846784434616029e+01
+260 2 1 1.725500000000000e+01 1.565485254907670e+01 1.835189752692777e+01
+261 2 1 1.848750000000000e+01 1.636643675585292e+01 1.842967763285558e+01
+262 2 1 3.081250000000000e+01 1.778960516940534e+01 1.844833766662363e+01
+263 2 1 3.204499999999999e+01 1.850118937618155e+01 1.847737939507963e+01
+264 2 1 2.095250000000000e+01 2.063594199651019e+01 1.847095133969059e+01
+265 2 1 1.355750000000000e+01 1.778960516940534e+01 1.828894868367980e+01
+266 2 1 1.725500000000000e+01 1.992435778973398e+01 1.834596243435063e+01
+267 2 1 2.957999999999999e+01 9.962178894866991e+00 1.832354414995078e+01
+268 2 1 2.095250000000000e+01 1.352009992874806e+01 1.831118657380274e+01
+269 2 1 1.972000000000000e+01 2.846336827104855e+00 1.837664127263829e+01
+270 2 1 2.095250000000000e+01 3.557921033881068e+00 1.845927782292901e+01
+271 2 1 2.218500000000000e+01 2.846336827104855e+00 1.847140305919736e+01
+272 2 1 2.341750000000000e+01 3.557921033881068e+00 1.843247974382396e+01
+273 2 1 2.465000000000000e+01 2.846336827104855e+00 1.837823139065125e+01
+274 2 1 2.588250000000000e+01 3.557921033881068e+00 1.832687883090416e+01
+275 2 1 3.697500000000000e+00 4.981089447433495e+00 1.847217701470688e+01
+276 2 1 4.930000000000000e+00 5.692673654209710e+00 1.856242710641034e+01
+277 2 1 6.162500000000000e+00 4.981089447433495e+00 1.843965491743299e+01
+278 2 1 7.395000000000000e+00 5.692673654209710e+00 1.830667264718264e+01
+279 2 1 8.627500000000000e+00 4.981089447433495e+00 1.838064863521239e+01
+280 2 1 9.859999999999999e+00 5.692673654209710e+00 1.861740907316864e+01
+281 2 1 1.109250000000000e+01 4.981089447433495e+00 1.838405249119109e+01
+282 2 1 1.232500000000000e+01 5.692673654209710e+00 1.836039437384349e+01
+283 2 1 1.355750000000000e+01 4.981089447433495e+00 1.831221958504840e+01
+284 2 1 1.479000000000000e+01 5.692673654209710e+00 1.828617147888200e+01
+285 2 1 1.602250000000000e+01 4.981089447433495e+00 1.855140653175703e+01
+286 2 1 1.725500000000000e+01 5.692673654209710e+00 1.841767199745545e+01
+287 2 1 1.848750000000000e+01 4.981089447433495e+00 1.832477807209270e+01
+288 2 1 1.972000000000000e+01 5.692673654209710e+00 1.846923771304869e+01
+289 2 1 2.095250000000000e+01 4.981089447433495e+00 1.836832598911283e+01
+290 2 1 2.218500000000000e+01 5.692673654209710e+00 1.843546423544375e+01
+291 2 1 2.341750000000000e+01 4.981089447433495e+00 1.855277898292336e+01
+292 2 1 2.465000000000000e+01 5.692673654209710e+00 1.847587291495339e+01
+293 2 1 2.588250000000000e+01 4.981089447433495e+00 1.826375194964259e+01
+294 2 1 2.711499999999999e+01 5.692673654209710e+00 1.851411320915631e+01
+295 2 1 4.930000000000000e+00 7.115842067762138e+00 1.840825444435020e+01
+296 2 1 6.162500000000000e+00 7.827426274538350e+00 1.833047038974451e+01
+297 2 1 7.395000000000000e+00 7.115842067762138e+00 1.836426082429110e+01
+298 2 1 1.848750000000000e+01 3.557921033881068e+00 1.837403279549467e+01
+299 2 1 1.725500000000000e+01 2.846336827104855e+00 1.835268380461592e+01
+300 2 1 1.602250000000000e+01 3.557921033881068e+00 1.848952507034905e+01
+301 2 1 1.479000000000000e+01 2.846336827104855e+00 1.851644726747239e+01
+302 2 1 1.232500000000000e+00 7.115842067762137e-01 1.832611230156879e+01
+303 2 1 2.465000000000000e+00 1.423168413552427e+00 1.852709756577955e+01
+304 2 1 3.697500000000000e+00 7.115842067762137e-01 1.827857500530802e+01
+305 2 1 4.929999999999999e+00 1.423168413552427e+00 1.826136806124286e+01
+306 2 1 6.162500000000000e+00 7.115842067762137e-01 1.827242936292011e+01
+307 2 1 7.395000000000000e+00 1.423168413552427e+00 1.844551050904462e+01
+308 2 1 8.627500000000000e+00 7.115842067762137e-01 1.844984225027845e+01
+309 2 1 9.859999999999999e+00 1.423168413552427e+00 1.843114129409313e+01
+310 2 1 1.109250000000000e+01 7.115842067762137e-01 1.824449880776195e+01
+311 2 1 1.232500000000000e+01 1.423168413552427e+00 1.856224612585160e+01
+312 2 1 1.355750000000000e+01 7.115842067762137e-01 1.836481578357231e+01
+313 2 1 1.479000000000000e+01 1.423168413552427e+00 1.843036892933161e+01
+314 2 1 1.602250000000000e+01 7.115842067762137e-01 1.835067728786723e+01
+315 2 1 1.725500000000000e+01 1.423168413552427e+00 1.847697931942738e+01
+316 2 1 8.627499999999998e+00 7.827426274538350e+00 1.840542860269897e+01
+317 2 1 1.848750000000000e+01 7.115842067762137e-01 1.843036272469964e+01
+318 2 1 2.095250000000000e+01 7.115842067762137e-01 1.828037025055374e+01
+319 2 1 2.218500000000000e+01 1.423168413552427e+00 1.847794227938386e+01
+320 2 1 2.341750000000000e+01 7.115842067762137e-01 1.836220929695125e+01
+321 2 1 2.465000000000000e+01 1.423168413552427e+00 1.856129777428492e+01
+322 2 1 2.465000000000000e+00 2.846336827104855e+00 1.828958750195393e+01
+323 2 1 3.697500000000000e+00 3.557921033881068e+00 1.848583325162553e+01
+324 2 1 4.930000000000000e+00 2.846336827104855e+00 1.838401024175294e+01
+325 2 1 6.162499999999999e+00 3.557921033881068e+00 1.837437624437527e+01
+326 2 1 7.395000000000000e+00 2.846336827104855e+00 1.841292915268399e+01
+327 2 1 8.627500000000000e+00 3.557921033881068e+00 1.848557970160289e+01
+328 2 1 9.859999999999999e+00 2.846336827104855e+00 1.842924761810127e+01
+329 2 1 1.109250000000000e+01 3.557921033881068e+00 1.831004365073452e+01
+330 2 1 1.232500000000000e+01 2.846336827104855e+00 1.818033371289823e+01
+331 2 1 1.355750000000000e+01 3.557921033881068e+00 1.844566501118075e+01
+332 2 1 1.972000000000000e+01 1.423168413552427e+00 1.846190975036447e+01
+333 2 1 2.218500000000000e+01 1.423168413552428e+01 1.835322517893207e+01
+334 2 1 9.859999999999999e+00 7.115842067762138e+00 1.839789371642158e+01
+335 2 1 1.232500000000000e+01 7.115842067762138e+00 1.847537444410727e+01
+336 2 1 8.627500000000000e+00 1.209693151519563e+01 1.829199174409380e+01
+337 2 1 9.859999999999999e+00 1.138534730841942e+01 1.829413303647114e+01
+338 2 1 1.109250000000000e+01 1.209693151519563e+01 1.856999584032139e+01
+339 2 1 1.232500000000000e+01 1.138534730841942e+01 1.851349651735582e+01
+340 2 1 1.355750000000000e+01 1.209693151519563e+01 1.831123823696192e+01
+341 2 1 1.479000000000000e+01 1.138534730841942e+01 1.843448433334394e+01
+342 2 1 1.602250000000000e+01 1.209693151519563e+01 1.839428881565063e+01
+343 2 1 1.725500000000000e+01 1.138534730841942e+01 1.849178099784848e+01
+344 2 1 1.848750000000000e+01 1.209693151519563e+01 1.824975358434335e+01
+345 2 1 1.972000000000000e+01 1.138534730841942e+01 1.839694145030204e+01
+346 2 1 2.095250000000000e+01 1.209693151519563e+01 1.829096787226717e+01
+347 2 1 2.218500000000000e+01 1.138534730841942e+01 1.840263887228008e+01
+348 2 1 2.341750000000000e+01 1.209693151519563e+01 1.837666030509410e+01
+349 2 1 2.465000000000000e+01 1.138534730841942e+01 1.835828025909527e+01
+350 2 1 2.588250000000000e+01 1.209693151519563e+01 1.833582168089864e+01
+351 2 1 2.711500000000000e+01 1.138534730841942e+01 1.836353031742933e+01
+352 2 1 2.834750000000000e+01 1.209693151519563e+01 1.845852602484125e+01
+353 2 1 2.958000000000000e+01 1.138534730841942e+01 1.853888136458308e+01
+354 2 1 3.081250000000000e+01 1.209693151519563e+01 1.831036168742244e+01
+355 2 1 8.627500000000000e+00 1.352009992874806e+01 1.835261188649090e+01
+356 2 1 9.859999999999999e+00 1.423168413552428e+01 1.821705864207346e+01
+357 2 1 1.109250000000000e+01 1.352009992874806e+01 1.831524712388831e+01
+358 2 1 1.232500000000000e+01 1.423168413552428e+01 1.852378179475058e+01
+359 2 1 1.355750000000000e+01 1.352009992874806e+01 1.852309441840510e+01
+360 2 1 1.479000000000000e+01 1.423168413552428e+01 1.836621027472939e+01
+361 2 1 1.602250000000000e+01 1.352009992874806e+01 1.849039311610116e+01
+362 2 1 1.725500000000000e+01 1.423168413552428e+01 1.842269825087092e+01
+363 2 1 1.848750000000000e+01 1.352009992874806e+01 1.825468998789840e+01
+364 2 1 1.972000000000000e+01 1.423168413552428e+01 1.849561590548242e+01
+365 2 1 7.395000000000000e+00 1.138534730841942e+01 1.859813014678126e+01
+366 2 1 3.451000000000000e+01 1.992435778973398e+01 1.813501916227946e+01
+367 2 1 2.834750000000000e+01 9.250594688090777e+00 1.847653992697568e+01
+368 2 1 2.711499999999999e+01 9.962178894866991e+00 1.849053529347614e+01
+369 2 1 1.355750000000000e+01 7.827426274538350e+00 1.835096749618396e+01
+370 2 1 1.479000000000000e+01 7.115842067762138e+00 1.844059942495262e+01
+371 2 1 1.602250000000000e+01 7.827426274538350e+00 1.844461353068087e+01
+372 2 1 1.725500000000000e+01 7.115842067762138e+00 1.836290600804645e+01
+373 2 1 1.848750000000000e+01 7.827426274538350e+00 1.825818280452995e+01
+374 2 1 1.972000000000000e+01 7.115842067762138e+00 1.837997086460227e+01
+375 2 1 2.095250000000000e+01 7.827426274538350e+00 1.826491847987811e+01
+376 2 1 2.218500000000000e+01 7.115842067762138e+00 1.841142851923555e+01
+377 2 1 2.341750000000000e+01 7.827426274538350e+00 1.826594520665525e+01
+378 2 1 2.465000000000000e+01 7.115842067762138e+00 1.838708488224049e+01
+379 2 1 2.588250000000000e+01 7.827426274538350e+00 1.830434555380351e+01
+380 2 1 2.711500000000000e+01 7.115842067762138e+00 1.859652575977937e+01
+381 2 1 2.834750000000000e+01 7.827426274538350e+00 1.844094595194482e+01
+382 2 1 6.162499999999999e+00 9.250594688090777e+00 1.856484810097502e+01
+383 2 1 1.109250000000000e+01 7.827426274538350e+00 1.847502232204046e+01
+384 2 1 7.395000000000000e+00 9.962178894866991e+00 1.854741705791729e+01
+385 2 1 9.859999999999999e+00 9.962178894866991e+00 1.837074522628645e+01
+386 2 1 1.109250000000000e+01 9.250594688090777e+00 1.846206781979952e+01
+387 2 1 1.232500000000000e+01 9.962178894866991e+00 1.823251181425658e+01
+388 2 1 1.355750000000000e+01 9.250594688090777e+00 1.834993099844037e+01
+389 2 1 1.479000000000000e+01 9.962178894866991e+00 1.843248036437880e+01
+390 2 1 1.602250000000000e+01 9.250594688090777e+00 1.855142577781635e+01
+391 2 1 1.725500000000000e+01 9.962178894866991e+00 1.847587547064991e+01
+392 2 1 1.848750000000000e+01 9.250594688090777e+00 1.850249139638135e+01
+393 2 1 1.972000000000000e+01 9.962178894866991e+00 1.841266132895000e+01
+394 2 1 2.095250000000000e+01 9.250594688090777e+00 1.837466808881276e+01
+395 2 1 2.218500000000000e+01 9.962178894866991e+00 1.834587370280250e+01
+396 2 1 2.341750000000000e+01 9.250594688090777e+00 1.846590574952954e+01
+397 2 1 2.465000000000000e+01 9.962178894866991e+00 1.835650105398410e+01
+398 2 1 2.588250000000000e+01 9.250594688090777e+00 1.838143174570202e+01
+399 2 1 8.627500000000000e+00 9.250594688090777e+00 1.843904853716322e+01
+400 2 1 3.574249999999999e+01 2.063594199651019e+01 1.839864514570517e+01
+401 2 2 2.958000000000000e+01 1.423168413552428e+01 2.000000000000000e+01
+402 2 2 1.725500000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+403 2 2 3.204500000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+404 2 2 1.109250000000000e+01 1.636643675585292e+01 2.000000000000000e+01
+405 2 2 9.859999999999999e+00 1.565485254907670e+01 2.000000000000000e+01
+406 2 2 2.341750000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+407 2 2 2.465000000000000e+01 1.423168413552428e+01 2.000000000000000e+01
+408 2 2 2.341750000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+409 2 2 2.711499999999999e+01 1.992435778973398e+01 2.000000000000000e+01
+410 2 2 2.834750000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+411 2 2 2.465000000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+412 2 2 2.711500000000000e+01 1.423168413552428e+01 2.000000000000000e+01
+413 2 2 2.588250000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+414 2 2 3.204499999999999e+01 1.423168413552428e+01 2.000000000000000e+01
+415 2 2 3.327750000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+416 2 2 2.218500000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+417 2 2 2.095250000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+418 2 2 2.711500000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+419 2 2 1.848750000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+420 2 2 1.972000000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+421 2 2 1.602250000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+422 2 2 2.958000000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+423 2 2 3.081250000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+424 2 2 2.588250000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+425 2 2 2.834750000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+426 2 2 3.081250000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+427 2 2 1.355750000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+428 2 2 2.588250000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+429 2 2 1.109250000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+430 2 2 2.341750000000000e+01 1.636643675585292e+01 2.000000000000000e+01
+431 2 2 3.327750000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+432 2 2 3.327750000000000e+01 1.636643675585292e+01 2.000000000000000e+01
+433 2 2 3.204499999999999e+01 1.565485254907670e+01 2.000000000000000e+01
+434 2 2 2.588250000000000e+01 1.636643675585292e+01 2.000000000000000e+01
+435 2 2 1.602250000000000e+01 2.063594199651019e+01 2.000000000000000e+01
+436 2 2 1.479000000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+437 2 2 2.711499999999999e+01 1.565485254907670e+01 2.000000000000000e+01
+438 2 2 2.465000000000000e+01 1.565485254907670e+01 2.000000000000000e+01
+439 2 2 2.834750000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+440 2 2 1.972000000000000e+01 1.565485254907670e+01 2.000000000000000e+01
+441 2 2 1.972000000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+442 2 2 2.958000000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+443 2 2 1.232500000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+444 2 2 1.479000000000000e+01 1.850118937618155e+01 2.000000000000000e+01
+445 2 2 1.479000000000000e+01 1.565485254907670e+01 2.000000000000000e+01
+446 2 2 2.218500000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+447 2 2 1.725500000000000e+01 1.565485254907670e+01 2.000000000000000e+01
+448 2 2 1.848750000000000e+01 1.636643675585292e+01 2.000000000000000e+01
+449 2 2 3.081250000000000e+01 1.778960516940534e+01 2.000000000000000e+01
+450 2 2 3.204499999999999e+01 1.850118937618155e+01 2.000000000000000e+01
+451 2 2 2.957999999999999e+01 9.962178894866991e+00 2.000000000000000e+01
+452 2 2 2.095250000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+453 2 2 1.972000000000000e+01 2.846336827104855e+00 2.000000000000000e+01
+454 2 2 2.095250000000000e+01 3.557921033881068e+00 2.000000000000000e+01
+455 2 2 2.218500000000000e+01 2.846336827104855e+00 2.000000000000000e+01
+456 2 2 3.697500000000000e+00 4.981089447433495e+00 2.000000000000000e+01
+457 2 2 4.930000000000000e+00 5.692673654209710e+00 2.000000000000000e+01
+458 2 2 6.162500000000000e+00 4.981089447433495e+00 2.000000000000000e+01
+459 2 2 7.395000000000000e+00 5.692673654209710e+00 2.000000000000000e+01
+460 2 2 8.627500000000000e+00 4.981089447433495e+00 2.000000000000000e+01
+461 2 2 1.355750000000000e+01 4.981089447433495e+00 2.000000000000000e+01
+462 2 2 1.479000000000000e+01 5.692673654209710e+00 2.000000000000000e+01
+463 2 2 1.602250000000000e+01 4.981089447433495e+00 2.000000000000000e+01
+464 2 2 1.725500000000000e+01 5.692673654209710e+00 2.000000000000000e+01
+465 2 2 1.848750000000000e+01 4.981089447433495e+00 2.000000000000000e+01
+466 2 2 2.341750000000000e+01 4.981089447433495e+00 2.000000000000000e+01
+467 2 2 2.465000000000000e+01 5.692673654209710e+00 2.000000000000000e+01
+468 2 2 6.162500000000000e+00 7.827426274538350e+00 2.000000000000000e+01
+469 2 2 7.395000000000000e+00 7.115842067762138e+00 2.000000000000000e+01
+470 2 2 1.848750000000000e+01 3.557921033881068e+00 2.000000000000000e+01
+471 2 2 1.725500000000000e+01 2.846336827104855e+00 2.000000000000000e+01
+472 2 2 1.602250000000000e+01 3.557921033881068e+00 2.000000000000000e+01
+473 2 2 1.479000000000000e+01 2.846336827104855e+00 2.000000000000000e+01
+474 2 2 1.232500000000000e+00 7.115842067762137e-01 2.000000000000000e+01
+475 2 2 2.465000000000000e+00 1.423168413552427e+00 2.000000000000000e+01
+476 2 2 3.697500000000000e+00 7.115842067762137e-01 2.000000000000000e+01
+477 2 2 4.929999999999999e+00 1.423168413552427e+00 2.000000000000000e+01
+478 2 2 9.859999999999999e+00 1.423168413552427e+00 2.000000000000000e+01
+479 2 2 1.109250000000000e+01 7.115842067762137e-01 2.000000000000000e+01
+480 2 2 1.232500000000000e+01 1.423168413552427e+00 2.000000000000000e+01
+481 2 2 1.355750000000000e+01 7.115842067762137e-01 2.000000000000000e+01
+482 2 2 1.479000000000000e+01 1.423168413552427e+00 2.000000000000000e+01
+483 2 2 1.602250000000000e+01 7.115842067762137e-01 2.000000000000000e+01
+484 2 2 2.095250000000000e+01 7.115842067762137e-01 2.000000000000000e+01
+485 2 2 2.218500000000000e+01 1.423168413552427e+00 2.000000000000000e+01
+486 2 2 2.341750000000000e+01 7.115842067762137e-01 2.000000000000000e+01
+487 2 2 2.465000000000000e+01 1.423168413552427e+00 2.000000000000000e+01
+488 2 2 2.465000000000000e+00 2.846336827104855e+00 2.000000000000000e+01
+489 2 2 3.697500000000000e+00 3.557921033881068e+00 2.000000000000000e+01
+490 2 2 8.627500000000000e+00 3.557921033881068e+00 2.000000000000000e+01
+491 2 2 9.859999999999999e+00 2.846336827104855e+00 2.000000000000000e+01
+492 2 2 1.109250000000000e+01 3.557921033881068e+00 2.000000000000000e+01
+493 2 2 1.232500000000000e+01 2.846336827104855e+00 2.000000000000000e+01
+494 2 2 1.355750000000000e+01 3.557921033881068e+00 2.000000000000000e+01
+495 2 2 1.972000000000000e+01 1.423168413552427e+00 2.000000000000000e+01
+496 2 2 8.627500000000000e+00 1.209693151519563e+01 2.000000000000000e+01
+497 2 2 9.859999999999999e+00 1.138534730841942e+01 2.000000000000000e+01
+498 2 2 1.109250000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+499 2 2 1.232500000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+500 2 2 1.355750000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+501 2 2 1.479000000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+502 2 2 1.602250000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+503 2 2 2.095250000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+504 2 2 2.218500000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+505 2 2 2.341750000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+506 2 2 2.465000000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+507 2 2 2.588250000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+508 2 2 2.711500000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+509 2 2 2.834750000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+510 2 2 2.958000000000000e+01 1.138534730841942e+01 2.000000000000000e+01
+511 2 2 3.081250000000000e+01 1.209693151519563e+01 2.000000000000000e+01
+512 2 2 8.627500000000000e+00 1.352009992874806e+01 2.000000000000000e+01
+513 2 2 9.859999999999999e+00 1.423168413552428e+01 2.000000000000000e+01
+514 2 2 1.109250000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+515 2 2 1.602250000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+516 2 2 1.725500000000000e+01 1.423168413552428e+01 2.000000000000000e+01
+517 2 2 1.848750000000000e+01 1.352009992874806e+01 2.000000000000000e+01
+518 2 2 1.972000000000000e+01 1.423168413552428e+01 2.000000000000000e+01
+519 2 2 7.395000000000000e+00 1.138534730841942e+01 2.000000000000000e+01
+520 2 2 3.451000000000000e+01 1.992435778973398e+01 2.000000000000000e+01
+521 2 2 2.834750000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+522 2 2 2.711499999999999e+01 9.962178894866991e+00 2.000000000000000e+01
+523 2 2 1.355750000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+524 2 2 1.479000000000000e+01 7.115842067762138e+00 2.000000000000000e+01
+525 2 2 1.972000000000000e+01 7.115842067762138e+00 2.000000000000000e+01
+526 2 2 2.095250000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+527 2 2 2.218500000000000e+01 7.115842067762138e+00 2.000000000000000e+01
+528 2 2 2.341750000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+529 2 2 2.465000000000000e+01 7.115842067762138e+00 2.000000000000000e+01
+530 2 2 2.588250000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+531 2 2 2.711500000000000e+01 7.115842067762138e+00 2.000000000000000e+01
+532 2 2 2.834750000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+533 2 2 6.162499999999999e+00 9.250594688090777e+00 2.000000000000000e+01
+534 2 2 1.109250000000000e+01 7.827426274538350e+00 2.000000000000000e+01
+535 2 2 1.232500000000000e+01 9.962178894866991e+00 2.000000000000000e+01
+536 2 2 1.355750000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+537 2 2 1.479000000000000e+01 9.962178894866991e+00 2.000000000000000e+01
+538 2 2 1.602250000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+539 2 2 1.725500000000000e+01 9.962178894866991e+00 2.000000000000000e+01
+540 2 2 1.848750000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+541 2 2 2.341750000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+542 2 2 2.465000000000000e+01 9.962178894866991e+00 2.000000000000000e+01
+543 2 2 2.588250000000000e+01 9.250594688090777e+00 2.000000000000000e+01
+544 2 2 8.627500000000000e+00 9.250594688090777e+00 2.000000000000000e+01
+545 2 2 3.574249999999999e+01 2.063594199651019e+01 2.000000000000000e+01
diff --git a/examples/USER/misc/drip/in.CH_drip b/examples/USER/misc/drip/in.CH_drip
new file mode 100644
index 0000000000..cf67fae639
--- /dev/null
+++ b/examples/USER/misc/drip/in.CH_drip
@@ -0,0 +1,30 @@
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.CH
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C NULL # only applies to species 1, i.e. C
+pair_coeff * * rebo CH.rebo C H # species 1 is C and species 2 is H
+
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+
diff --git a/examples/USER/misc/drip/in.C_drip b/examples/USER/misc/drip/in.C_drip
new file mode 100644
index 0000000000..0b66d0b9f7
--- /dev/null
+++ b/examples/USER/misc/drip/in.C_drip
@@ -0,0 +1,29 @@
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.C
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C
+pair_coeff * * rebo CH.rebo C
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+
diff --git a/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.1 b/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.1
new file mode 100644
index 0000000000..9aad2cd22f
--- /dev/null
+++ b/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.1
@@ -0,0 +1,111 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.CH
+ triclinic box = (0 0 0) to (24.65 21.3475 30) with tilt (12.325 0 0)
+ 1 by 1 by 1 MPI processor grid
+ reading atoms ...
+ 545 atoms
+ 0 = max # of 1-2 neighbors
+ 0 = max # of 1-3 neighbors
+ 0 = max # of 1-4 neighbors
+ 1 = max # of special neighbors
+ special bonds CPU = 0.000152826 secs
+ read_data CPU = 0.000973701 secs
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C NULL # only applies to species 1, i.e. C
+Reading potential file C.drip with DATE: 2019-04-19
+pair_coeff * * rebo CH.rebo C H # species 1 is C and species 2 is H
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (src/min.cpp:168)
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 17.7
+ ghost atom cutoff = 17.7
+ binsize = 8.85, bins = 5 3 1
+ 2 neighbor lists, perpetual/occasional/extra = 2 0 0
+ (1) pair drip, perpetual, skip from (2)
+ attributes: full, newton on, ghost
+ pair build: skip/ghost
+ stencil: none
+ bin: none
+ (2) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 12.92 | 12.92 | 12.92 Mbytes
+Step Temp E_pair E_mol TotEng Press Volume
+ 0 0 -2884.3731 0 -2884.3731 366196.9 2779.5956
+ 10 0 -3240.4807 0 -3240.4807 -20237.368 2779.5956
+ 20 0 -3281.0671 0 -3281.0671 -13303.696 2779.5956
+ 30 0 -3282.2176 0 -3282.2176 -19187.215 2779.5956
+ 40 0 -3282.4004 0 -3282.4004 -21740.059 2779.5956
+ 50 0 -3282.4755 0 -3282.4755 -22659.554 2779.5956
+ 57 0 -3282.5011 0 -3282.5011 -23313.198 2779.5956
+Loop time of 3.04218 on 1 procs for 57 steps with 545 atoms
+
+99.8% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+Minimization stats:
+ Stopping criterion = max force evaluations
+ Energy initial, next-to-last, final =
+ -2884.37307546 -3282.49993222 -3282.5010627
+ Force two-norm initial, final = 115.342 0.193154
+ Force max component initial, final = 12.0934 0.03617
+ Final line search alpha, max atom move = 1 0.03617
+ Iterations, force evaluations = 57 100
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 3.0291 | 3.0291 | 3.0291 | 0.0 | 99.57
+Bond | 1.8835e-05 | 1.8835e-05 | 1.8835e-05 | 0.0 | 0.00
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.0016081 | 0.0016081 | 0.0016081 | 0.0 | 0.05
+Output | 0.0079796 | 0.0079796 | 0.0079796 | 0.0 | 0.26
+Modify | 0 | 0 | 0 | 0.0 | 0.00
+Other | | 0.003517 | | | 0.12
+
+Nlocal: 545 ave 545 max 545 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 3175 ave 3175 max 3175 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 0 ave 0 max 0 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs: 294122 ave 294122 max 294122 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 294122
+Ave neighs/atom = 539.673
+Ave special neighs/atom = 0
+Neighbor list builds = 0
+Dangerous builds = 0
+
+Total wall time: 0:00:03
diff --git a/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.4 b/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.4
new file mode 100644
index 0000000000..9d439bca45
--- /dev/null
+++ b/examples/USER/misc/drip/log.30Apr19.CH_drip.g++.4
@@ -0,0 +1,111 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.CH
+ triclinic box = (0 0 0) to (24.65 21.3475 30) with tilt (12.325 0 0)
+ 1 by 2 by 2 MPI processor grid
+ reading atoms ...
+ 545 atoms
+ 0 = max # of 1-2 neighbors
+ 0 = max # of 1-3 neighbors
+ 0 = max # of 1-4 neighbors
+ 1 = max # of special neighbors
+ special bonds CPU = 0.000135422 secs
+ read_data CPU = 0.00368595 secs
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C NULL # only applies to species 1, i.e. C
+Reading potential file C.drip with DATE: 2019-04-19
+pair_coeff * * rebo CH.rebo C H # species 1 is C and species 2 is H
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (src/min.cpp:168)
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 17.7
+ ghost atom cutoff = 17.7
+ binsize = 8.85, bins = 5 3 1
+ 2 neighbor lists, perpetual/occasional/extra = 2 0 0
+ (1) pair drip, perpetual, skip from (2)
+ attributes: full, newton on, ghost
+ pair build: skip/ghost
+ stencil: none
+ bin: none
+ (2) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 11.03 | 11.1 | 11.16 Mbytes
+Step Temp E_pair E_mol TotEng Press Volume
+ 0 0 -2884.3731 0 -2884.3731 366196.9 2779.5956
+ 10 0 -3240.4807 0 -3240.4807 -20237.368 2779.5956
+ 20 0 -3281.0671 0 -3281.0671 -13303.696 2779.5956
+ 30 0 -3282.2176 0 -3282.2176 -19187.216 2779.5956
+ 40 0 -3282.4004 0 -3282.4004 -21740.027 2779.5956
+ 50 0 -3282.4753 0 -3282.4753 -22682.604 2779.5956
+ 57 0 -3282.5023 0 -3282.5023 -23355.081 2779.5956
+Loop time of 1.66218 on 4 procs for 57 steps with 545 atoms
+
+99.0% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+Minimization stats:
+ Stopping criterion = max force evaluations
+ Energy initial, next-to-last, final =
+ -2884.37307546 -3282.50070864 -3282.50227121
+ Force two-norm initial, final = 115.342 0.228488
+ Force max component initial, final = 12.0934 0.03365
+ Final line search alpha, max atom move = 1 0.03365
+ Iterations, force evaluations = 57 100
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 1.5571 | 1.5945 | 1.6314 | 2.3 | 95.93
+Bond | 2.265e-05 | 2.9087e-05 | 3.4571e-05 | 0.0 | 0.00
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.020248 | 0.05608 | 0.092328 | 11.8 | 3.37
+Output | 0.0053282 | 0.0054213 | 0.0056982 | 0.2 | 0.33
+Modify | 0 | 0 | 0 | 0.0 | 0.00
+Other | | 0.006172 | | | 0.37
+
+Nlocal: 136.25 ave 177 max 100 min
+Histogram: 2 0 0 0 0 0 0 0 1 1
+Nghost: 2874.75 ave 2912 max 2835 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Neighs: 0 ave 0 max 0 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs: 73530.5 ave 73544 max 73517 min
+Histogram: 1 0 0 0 1 1 0 0 0 1
+
+Total # of neighbors = 294122
+Ave neighs/atom = 539.673
+Ave special neighs/atom = 0
+Neighbor list builds = 0
+Dangerous builds = 0
+
+Total wall time: 0:00:01
diff --git a/examples/USER/misc/drip/log.30Apr19.C_drip.g++.1 b/examples/USER/misc/drip/log.30Apr19.C_drip.g++.1
new file mode 100644
index 0000000000..6f19cee048
--- /dev/null
+++ b/examples/USER/misc/drip/log.30Apr19.C_drip.g++.1
@@ -0,0 +1,110 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.C
+ triclinic box = (0 0 0) to (24.65 21.3475 30) with tilt (12.325 0 0)
+ 1 by 1 by 1 MPI processor grid
+ reading atoms ...
+ 400 atoms
+ 0 = max # of 1-2 neighbors
+ 0 = max # of 1-3 neighbors
+ 0 = max # of 1-4 neighbors
+ 1 = max # of special neighbors
+ special bonds CPU = 0.000912905 secs
+ read_data CPU = 0.00252986 secs
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C
+Reading potential file C.drip with DATE: 2019-04-19
+pair_coeff * * rebo CH.rebo C
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (src/min.cpp:168)
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 17.7
+ ghost atom cutoff = 17.7
+ binsize = 8.85, bins = 5 3 1
+ 2 neighbor lists, perpetual/occasional/extra = 2 0 0
+ (1) pair drip, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+ (2) pair rebo, perpetual, copy from (1)
+ attributes: full, newton on, ghost
+ pair build: copy
+ stencil: none
+ bin: none
+Per MPI rank memory allocation (min/avg/max) = 12.21 | 12.21 | 12.21 Mbytes
+Step Temp E_pair E_mol TotEng Press Volume
+ 0 0 -2941.0549 0 -2941.0549 -52204.715 2052.0534
+ 10 0 -2966.9787 0 -2966.9787 -29717.01 2052.0534
+ 20 0 -2967.0695 0 -2967.0695 -29614.636 2052.0534
+ 30 0 -2967.0859 0 -2967.0859 -29867.385 2052.0534
+ 40 0 -2967.0888 0 -2967.0888 -29997.486 2052.0534
+ 50 0 -2967.0896 0 -2967.0896 -30072.387 2052.0534
+ 51 0 -2967.0896 0 -2967.0896 -30076.548 2052.0534
+Loop time of 2.93337 on 1 procs for 51 steps with 400 atoms
+
+99.8% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+Minimization stats:
+ Stopping criterion = max force evaluations
+ Energy initial, next-to-last, final =
+ -2941.05486197 -2967.08958376 -2967.08962073
+ Force two-norm initial, final = 35.5666 0.0471918
+ Force max component initial, final = 6.23617 0.0050012
+ Final line search alpha, max atom move = 1 0.0050012
+ Iterations, force evaluations = 51 101
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 2.9239 | 2.9239 | 2.9239 | 0.0 | 99.68
+Bond | 1.2398e-05 | 1.2398e-05 | 1.2398e-05 | 0.0 | 0.00
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.0010808 | 0.0010808 | 0.0010808 | 0.0 | 0.04
+Output | 0.0059283 | 0.0059283 | 0.0059283 | 0.0 | 0.20
+Modify | 0 | 0 | 0 | 0.0 | 0.00
+Other | | 0.002466 | | | 0.08
+
+Nlocal: 400 ave 400 max 400 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 2357 ave 2357 max 2357 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 0 ave 0 max 0 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs: 294122 ave 294122 max 294122 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 294122
+Ave neighs/atom = 735.305
+Ave special neighs/atom = 0
+Neighbor list builds = 0
+Dangerous builds = 0
+
+Total wall time: 0:00:03
diff --git a/examples/USER/misc/drip/log.30Apr19.C_drip.g++.4 b/examples/USER/misc/drip/log.30Apr19.C_drip.g++.4
new file mode 100644
index 0000000000..54f9462b59
--- /dev/null
+++ b/examples/USER/misc/drip/log.30Apr19.C_drip.g++.4
@@ -0,0 +1,111 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Define unit set and class of atomic model
+units metal
+atom_style molecular
+
+# BC
+boundary p p s
+
+# read config
+read_data data.C
+ triclinic box = (0 0 0) to (24.65 21.3475 30) with tilt (12.325 0 0)
+ 1 by 2 by 2 MPI processor grid
+ reading atoms ...
+ 400 atoms
+ 0 = max # of 1-2 neighbors
+ 0 = max # of 1-3 neighbors
+ 0 = max # of 1-4 neighbors
+ 1 = max # of special neighbors
+ special bonds CPU = 0.0003407 secs
+ read_data CPU = 0.00411105 secs
+
+
+# potential
+pair_style hybrid/overlay drip rebo
+pair_coeff * * drip C.drip C
+Reading potential file C.drip with DATE: 2019-04-19
+pair_coeff * * rebo CH.rebo C
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+compute peratom all pe/atom
+
+# set what thermodynamic information to print to log
+thermo 10 # print every 1 timestep
+
+# set what information to write to dump file
+dump id all custom 1 lammps.dump id type x y z fx fy fz c_peratom
+dump_modify id every 10 format line "%d %d %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e %13.5e"
+dump_modify id sort id
+
+# minimize energy
+minimize 1.0e-15 1.0e-15 100 100
+WARNING: Using 'neigh_modify every 1 delay 0 check yes' setting during minimization (src/min.cpp:168)
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 17.7
+ ghost atom cutoff = 17.7
+ binsize = 8.85, bins = 5 3 1
+ 2 neighbor lists, perpetual/occasional/extra = 2 0 0
+ (1) pair drip, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+ (2) pair rebo, perpetual, copy from (1)
+ attributes: full, newton on, ghost
+ pair build: copy
+ stencil: none
+ bin: none
+WARNING: Proc sub-domain size < neighbor skin, could lead to lost atoms (src/domain.cpp:934)
+Per MPI rank memory allocation (min/avg/max) = 10.7 | 10.77 | 10.83 Mbytes
+Step Temp E_pair E_mol TotEng Press Volume
+ 0 0 -2941.0549 0 -2941.0549 -52204.715 2052.0534
+ 10 0 -2966.9787 0 -2966.9787 -29717.01 2052.0534
+ 20 0 -2967.0695 0 -2967.0695 -29614.636 2052.0534
+ 30 0 -2967.0859 0 -2967.0859 -29867.385 2052.0534
+ 40 0 -2967.0888 0 -2967.0888 -29997.486 2052.0534
+ 50 0 -2967.0896 0 -2967.0896 -30072.387 2052.0534
+ 51 0 -2967.0896 0 -2967.0896 -30076.548 2052.0534
+Loop time of 1.47901 on 4 procs for 51 steps with 400 atoms
+
+99.1% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+Minimization stats:
+ Stopping criterion = max force evaluations
+ Energy initial, next-to-last, final =
+ -2941.05486197 -2967.08958376 -2967.08962073
+ Force two-norm initial, final = 35.5666 0.0471918
+ Force max component initial, final = 6.23617 0.0050012
+ Final line search alpha, max atom move = 1 0.0050012
+ Iterations, force evaluations = 51 101
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 1.4314 | 1.4405 | 1.4548 | 0.8 | 97.40
+Bond | 1.955e-05 | 2.265e-05 | 2.4796e-05 | 0.0 | 0.00
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.014506 | 0.029363 | 0.038964 | 5.5 | 1.99
+Output | 0.00424 | 0.0043345 | 0.0046172 | 0.2 | 0.29
+Modify | 0 | 0 | 0 | 0.0 | 0.00
+Other | | 0.004772 | | | 0.32
+
+Nlocal: 100 ave 100 max 100 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Nghost: 2132 ave 2132 max 2132 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Neighs: 0 ave 0 max 0 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs: 73530.5 ave 73544 max 73517 min
+Histogram: 1 0 0 0 1 1 0 0 0 1
+
+Total # of neighbors = 294122
+Ave neighs/atom = 735.305
+Ave special neighs/atom = 0
+Neighbor list builds = 0
+Dangerous builds = 0
+
+Total wall time: 0:00:01
diff --git a/examples/USER/misc/kolmogorov_crespi_z/CH.airebo b/examples/USER/misc/kolmogorov_crespi_z/CH.airebo
deleted file mode 120000
index e43e44c133..0000000000
--- a/examples/USER/misc/kolmogorov_crespi_z/CH.airebo
+++ /dev/null
@@ -1 +0,0 @@
-../../../../potentials/CH.airebo
\ No newline at end of file
diff --git a/examples/USER/misc/kolmogorov_crespi_z/CH.rebo b/examples/USER/misc/kolmogorov_crespi_z/CH.rebo
new file mode 120000
index 0000000000..c5a6a40100
--- /dev/null
+++ b/examples/USER/misc/kolmogorov_crespi_z/CH.rebo
@@ -0,0 +1 @@
+../../../../potentials/CH.rebo
\ No newline at end of file
diff --git a/examples/USER/misc/kolmogorov_crespi_z/in.bilayer-graphene b/examples/USER/misc/kolmogorov_crespi_z/in.bilayer-graphene
index 3d63fc09ed..b019b3e5bb 100644
--- a/examples/USER/misc/kolmogorov_crespi_z/in.bilayer-graphene
+++ b/examples/USER/misc/kolmogorov_crespi_z/in.bilayer-graphene
@@ -22,7 +22,7 @@ group adsorbant type 2
######################## Potential defition ########################
pair_style hybrid/overlay rebo kolmogorov/crespi/z 14.0
####################################################################
-pair_coeff * * rebo CH.airebo C C # chemical
+pair_coeff * * rebo CH.rebo C C # chemical
pair_coeff 1 2 kolmogorov/crespi/z CC.KC C C # long-range
####################################################################
diff --git a/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.1 b/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.1
deleted file mode 100644
index 3ba8bfd5df..0000000000
--- a/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.1
+++ /dev/null
@@ -1,208 +0,0 @@
-LAMMPS (8 Mar 2018)
- using 1 OpenMP thread(s) per MPI task
-# Initialization
-units metal
-boundary p p p
-atom_style atomic
-processors * * 1 # domain decomposition over x and y
-
-# System and atom definition
-# we use 2 atom types so that inter- and intra-layer
-# interactions can be specified separately
-read_data data.bilayer-graphene # read lammps data file
- orthogonal box = (0 0 -20) to (17.04 19.6761 40)
- 1 by 1 by 1 MPI processor grid
- reading atoms ...
- 256 atoms
-mass 1 12.0107 # carbon mass (g/mole) | membrane
-mass 2 12.0107 # carbon mass (g/mole) | adsorbate
-# Neighbor update settings
-neighbor 2.0 bin
-neigh_modify every 1
-neigh_modify delay 0
-neigh_modify check yes
-# Separate atom groups
-group membrane type 1
-128 atoms in group membrane
-group adsorbant type 2
-128 atoms in group adsorbant
-
-######################## Potential defition ########################
-pair_style hybrid/overlay rebo kolmogorov/crespi/z 14.0
-####################################################################
-pair_coeff * * rebo CH.airebo C C # chemical
-Reading potential file CH.airebo with DATE: 2011-10-25
-pair_coeff 1 2 kolmogorov/crespi/z CC.KC C C # long-range
-####################################################################
-
-#### Simulation settings ####
-timestep 0.0001
-velocity all create 300.0 12345
-fix thermostat all nve
-compute COM1 membrane com
-compute COM2 adsorbant com
-############################
-
-# Output
-#dump 1 all xyz 100 trajec.xyz
-#dump_modify 1 format line "%s %12.6f %12.6f %12.6f" element "C" "C"
-thermo 10
-thermo_style custom step time etotal pe temp c_COM1[3] c_COM2[3] # spcpu
-thermo_modify line one format float %14.8f
-
-###### Run molecular dynamics ######
-run 1000
-Neighbor list info ...
- update every 1 steps, delay 0 steps, check yes
- max neighbors/atom: 2000, page size: 100000
- master list distance cutoff = 16
- ghost atom cutoff = 16
- binsize = 8, bins = 3 3 8
- 3 neighbor lists, perpetual/occasional/extra = 3 0 0
- (1) pair rebo, perpetual
- attributes: full, newton on, ghost
- pair build: full/bin/ghost
- stencil: full/ghost/bin/3d
- bin: standard
- (2) pair kolmogorov/crespi/z, perpetual, skip from (3)
- attributes: half, newton on
- pair build: skip
- stencil: none
- bin: none
- (3) neighbor class addition, perpetual
- attributes: half, newton on
- pair build: half/bin/atomonly/newton
- stencil: half/bin/3d/newton
- bin: standard
-Per MPI rank memory allocation (min/avg/max) = 4.998 | 4.998 | 4.998 Mbytes
-Step Time TotEng PotEng Temp c_COM1[3] c_COM2[3]
- 0 0.00000000 -1888.67041214 -1898.55881323 300.00000000 0.00000000 3.30000000
- 10 0.00100000 -1888.67037221 -1898.21029897 289.42778520 -0.00020126 3.30020126
- 20 0.00200000 -1888.67021541 -1897.22943612 259.67456089 -0.00041357 3.30041357
- 30 0.00300000 -1888.66999308 -1895.86681311 218.34126559 -0.00063673 3.30063673
- 40 0.00400000 -1888.66978354 -1894.47163830 176.02000692 -0.00087055 3.30087055
- 50 0.00500000 -1888.66966068 -1893.37123377 142.63902862 -0.00111486 3.30111486
- 60 0.00600000 -1888.66966132 -1892.75822749 124.04127205 -0.00136952 3.30136952
- 70 0.00700000 -1888.66976974 -1892.63445751 120.28297808 -0.00163441 3.30163441
- 80 0.00800000 -1888.66992867 -1892.83467462 126.35245792 -0.00190946 3.30190946
- 90 0.00900000 -1888.67006868 -1893.11387069 134.81862145 -0.00219458 3.30219458
- 100 0.01000000 -1888.67013621 -1893.25481851 139.09272853 -0.00248973 3.30248973
- 110 0.01100000 -1888.67011201 -1893.15155790 135.96068294 -0.00279489 3.30279489
- 120 0.01200000 -1888.67001496 -1892.84002960 126.51230266 -0.00311004 3.30311004
- 130 0.01300000 -1888.66988997 -1892.47004238 115.29120968 -0.00343519 3.30343519
- 140 0.01400000 -1888.66979230 -1892.23503116 108.16426723 -0.00377038 3.30377038
- 150 0.01500000 -1888.66976478 -1892.28630583 109.72070257 -0.00411562 3.30411562
- 160 0.01600000 -1888.66982054 -1892.66640611 121.25071190 -0.00447099 3.30447099
- 170 0.01700000 -1888.66993790 -1893.28862637 140.12442721 -0.00483654 3.30483654
- 180 0.01800000 -1888.67007017 -1893.97029258 160.80119589 -0.00521235 3.30521235
- 190 0.01900000 -1888.67016712 -1894.50458787 177.00801243 -0.00559851 3.30559851
- 200 0.02000000 -1888.67019459 -1894.73890106 184.11590729 -0.00599512 3.30599512
- 210 0.02100000 -1888.67014420 -1894.62906014 180.78501932 -0.00640230 3.30640230
- 220 0.02200000 -1888.67003680 -1894.25249103 169.36370738 -0.00682016 3.30682016
- 230 0.02300000 -1888.66991386 -1893.77601613 154.91186767 -0.00724883 3.30724883
- 240 0.02400000 -1888.66982525 -1893.38995084 143.20188490 -0.00768845 3.30768845
- 250 0.02500000 -1888.66980630 -1893.23138936 138.39193056 -0.00813913 3.30813913
- 260 0.02600000 -1888.66986130 -1893.32993923 141.38012476 -0.00860097 3.30860097
- 270 0.02700000 -1888.66996305 -1893.60070606 149.59171763 -0.00907408 3.30907408
- 280 0.02800000 -1888.67006686 -1893.88587226 158.24010433 -0.00955849 3.30955849
- 290 0.02900000 -1888.67012981 -1894.02402669 162.42960292 -0.01005424 3.31005424
- 300 0.03000000 -1888.67012722 -1893.91715234 159.18726627 -0.01056129 3.31056129
- 310 0.03100000 -1888.67005731 -1893.57037242 148.66857852 -0.01107957 3.31107957
- 320 0.03200000 -1888.66994573 -1893.09358619 134.20694883 -0.01160898 3.31160898
- 330 0.03300000 -1888.66983589 -1892.66132663 121.09614207 -0.01214935 3.31214935
- 340 0.03400000 -1888.66977410 -1892.44446345 114.51869676 -0.01270046 3.31270046
- 350 0.03500000 -1888.66978826 -1892.53901235 117.38674604 -0.01326207 3.31326207
- 360 0.03600000 -1888.66987439 -1892.92337288 129.04508371 -0.01383390 3.31383390
- 370 0.03700000 -1888.66999800 -1893.46445570 145.45701555 -0.01441561 3.31441561
- 380 0.03800000 -1888.67010960 -1893.97065516 160.81100020 -0.01500688 3.31500688
- 390 0.03900000 -1888.67016540 -1894.26835818 169.84119247 -0.01560734 3.31560734
- 400 0.04000000 -1888.67014667 -1894.26967975 169.88185546 -0.01621664 3.31621664
- 410 0.04100000 -1888.67006166 -1894.00321069 161.80014280 -0.01683442 3.31683442
- 420 0.04200000 -1888.66994367 -1893.60086324 149.59707418 -0.01746033 3.31746033
- 430 0.04300000 -1888.66984058 -1893.24559841 138.82197275 -0.01809405 3.31809405
- 440 0.04400000 -1888.66979399 -1893.09727874 134.32357877 -0.01873527 3.31873527
- 450 0.04500000 -1888.66982139 -1893.22837442 138.30000378 -0.01938373 3.31938373
- 460 0.04600000 -1888.66990972 -1893.59670383 149.47191354 -0.02003918 3.32003918
- 470 0.04700000 -1888.67002173 -1894.06542598 163.68887743 -0.02070143 3.32070143
- 480 0.04800000 -1888.67011389 -1894.46010842 175.66018439 -0.02137030 3.32137030
- 490 0.04900000 -1888.67015175 -1894.63688098 181.02206322 -0.02204565 3.32204565
- 500 0.05000000 -1888.67012158 -1894.53632221 177.97216882 -0.02272740 3.32272740
- 510 0.05100000 -1888.67003762 -1894.20444731 167.90610436 -0.02341547 3.32341547
- 520 0.05200000 -1888.66993151 -1893.77231066 154.79891353 -0.02410981 3.32410981
- 530 0.05300000 -1888.66984505 -1893.40525927 143.66572038 -0.02481040 3.32481040
- 540 0.05400000 -1888.66981408 -1893.23762083 138.58074854 -0.02551724 3.32551724
- 550 0.05500000 -1888.66985005 -1893.31793594 141.01630317 -0.02623032 3.32623032
- 560 0.05600000 -1888.66993737 -1893.59069013 149.28862751 -0.02694963 3.32694963
- 570 0.05700000 -1888.67003852 -1893.92089571 159.30352588 -0.02767517 3.32767517
- 580 0.05800000 -1888.67011322 -1894.15124753 166.28980524 -0.02840691 3.32840691
- 590 0.05900000 -1888.67013192 -1894.16548041 166.72104345 -0.02914478 3.32914478
- 600 0.06000000 -1888.67008713 -1893.93443318 159.71275856 -0.02988871 3.32988871
- 610 0.06100000 -1888.66999438 -1893.52841656 147.39760646 -0.03063856 3.33063856
- 620 0.06200000 -1888.66988809 -1893.09235021 134.17119963 -0.03139416 3.33139416
- 630 0.06300000 -1888.66980996 -1892.79172016 125.05288240 -0.03215531 3.33215531
- 640 0.06400000 -1888.66979261 -1892.74755390 123.71346730 -0.03292176 3.33292176
- 650 0.06500000 -1888.66984332 -1892.98665459 130.96590324 -0.03369323 3.33369323
- 660 0.06600000 -1888.66994245 -1893.42999868 144.41332389 -0.03446937 3.33446937
- 670 0.06700000 -1888.67005233 -1893.92310681 159.37018806 -0.03524986 3.33524986
- 680 0.06800000 -1888.67013309 -1894.29451581 170.63575808 -0.03603430 3.33603430
- 690 0.06900000 -1888.67015452 -1894.41878117 174.40514192 -0.03682229 3.33682229
- 700 0.07000000 -1888.67010897 -1894.26288036 169.67671530 -0.03761343 3.33761343
- 710 0.07100000 -1888.67001367 -1893.89812904 158.61357114 -0.03840729 3.33840729
- 720 0.07200000 -1888.66990378 -1893.47348746 145.73388454 -0.03920344 3.33920344
- 730 0.07300000 -1888.66982212 -1893.15984839 136.22099960 -0.04000148 3.34000148
- 740 0.07400000 -1888.66980109 -1893.08373746 133.91254029 -0.04080098 3.34080098
- 750 0.07500000 -1888.66984794 -1893.27755511 139.79127024 -0.04160156 3.34160156
- 760 0.07600000 -1888.66994215 -1893.66837365 151.64528967 -0.04240282 3.34240282
- 770 0.07700000 -1888.67004554 -1894.10941206 165.02263027 -0.04320441 3.34320441
- 780 0.07800000 -1888.67011702 -1894.43947545 175.03411436 -0.04400599 3.34400599
- 790 0.07900000 -1888.67013297 -1894.54590471 178.26254255 -0.04480726 3.34480726
- 800 0.08000000 -1888.67008751 -1894.40384142 173.95392406 -0.04560792 3.34560792
- 810 0.08100000 -1888.66999923 -1894.08389003 164.24973321 -0.04640773 3.34640773
- 820 0.08200000 -1888.66990447 -1893.72313979 153.30795965 -0.04720647 3.34720647
- 830 0.08300000 -1888.66984367 -1893.46839190 145.58111626 -0.04800393 3.34800393
- 840 0.08400000 -1888.66984156 -1893.41412536 143.93481093 -0.04879995 3.34879995
- 850 0.08500000 -1888.66989670 -1893.56426154 148.48805553 -0.04959439 3.34959439
- 860 0.08600000 -1888.66998222 -1893.83463719 156.68827294 -0.05038713 3.35038713
- 870 0.08700000 -1888.67006171 -1894.09325045 164.53181920 -0.05117805 3.35117805
- 880 0.08800000 -1888.67010273 -1894.21712661 168.28880100 -0.05196706 3.35196706
- 890 0.08900000 -1888.67008993 -1894.14263950 166.02935656 -0.05275408 3.35275408
- 900 0.09000000 -1888.67002891 -1893.89014571 158.37090587 -0.05353904 3.35353904
- 910 0.09100000 -1888.66994326 -1893.55535709 148.21649469 -0.05432186 3.35432186
- 920 0.09200000 -1888.66986526 -1893.27257949 139.63979178 -0.05510247 3.35510247
- 930 0.09300000 -1888.66982730 -1893.16330891 136.32582949 -0.05588078 3.35588078
- 940 0.09400000 -1888.66984631 -1893.28643285 140.06065785 -0.05665670 3.35665670
- 950 0.09500000 -1888.66991503 -1893.61245342 149.94957268 -0.05743015 3.35743015
- 960 0.09600000 -1888.67000691 -1894.03423922 162.74316516 -0.05820101 3.35820101
- 970 0.09700000 -1888.67008649 -1894.40848025 174.09469037 -0.05896915 3.35896915
- 980 0.09800000 -1888.67012436 -1894.61056767 180.22458605 -0.05973444 3.35973444
- 990 0.09900000 -1888.67010608 -1894.58107659 179.33042338 -0.06049672 3.36049672
- 1000 0.10000000 -1888.67003981 -1894.34773305 172.25312330 -0.06125581 3.36125581
-Loop time of 3.90147 on 1 procs for 1000 steps with 256 atoms
-
-Performance: 2.215 ns/day, 10.837 hours/ns, 256.314 timesteps/s
-99.4% CPU use with 1 MPI tasks x 1 OpenMP threads
-
-MPI task timing breakdown:
-Section | min time | avg time | max time |%varavg| %total
----------------------------------------------------------------
-Pair | 3.8786 | 3.8786 | 3.8786 | 0.0 | 99.41
-Neigh | 0 | 0 | 0 | 0.0 | 0.00
-Comm | 0.010816 | 0.010816 | 0.010816 | 0.0 | 0.28
-Output | 0.002461 | 0.002461 | 0.002461 | 0.0 | 0.06
-Modify | 0.0051703 | 0.0051703 | 0.0051703 | 0.0 | 0.13
-Other | | 0.004447 | | | 0.11
-
-Nlocal: 256 ave 256 max 256 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Nghost: 1721 ave 1721 max 1721 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-Neighs: 37312 ave 37312 max 37312 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-FullNghs: 94592 ave 94592 max 94592 min
-Histogram: 1 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 94592
-Ave neighs/atom = 369.5
-Neighbor list builds = 0
-Dangerous builds = 0
-Total wall time: 0:00:03
diff --git a/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.4 b/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.4
deleted file mode 100644
index b2dd551654..0000000000
--- a/examples/USER/misc/kolmogorov_crespi_z/log.16Mar18.bilayer-graphene.g++.4
+++ /dev/null
@@ -1,208 +0,0 @@
-LAMMPS (8 Mar 2018)
- using 1 OpenMP thread(s) per MPI task
-# Initialization
-units metal
-boundary p p p
-atom_style atomic
-processors * * 1 # domain decomposition over x and y
-
-# System and atom definition
-# we use 2 atom types so that inter- and intra-layer
-# interactions can be specified separately
-read_data data.bilayer-graphene # read lammps data file
- orthogonal box = (0 0 -20) to (17.04 19.6761 40)
- 2 by 2 by 1 MPI processor grid
- reading atoms ...
- 256 atoms
-mass 1 12.0107 # carbon mass (g/mole) | membrane
-mass 2 12.0107 # carbon mass (g/mole) | adsorbate
-# Neighbor update settings
-neighbor 2.0 bin
-neigh_modify every 1
-neigh_modify delay 0
-neigh_modify check yes
-# Separate atom groups
-group membrane type 1
-128 atoms in group membrane
-group adsorbant type 2
-128 atoms in group adsorbant
-
-######################## Potential defition ########################
-pair_style hybrid/overlay rebo kolmogorov/crespi/z 14.0
-####################################################################
-pair_coeff * * rebo CH.airebo C C # chemical
-Reading potential file CH.airebo with DATE: 2011-10-25
-pair_coeff 1 2 kolmogorov/crespi/z CC.KC C C # long-range
-####################################################################
-
-#### Simulation settings ####
-timestep 0.0001
-velocity all create 300.0 12345
-fix thermostat all nve
-compute COM1 membrane com
-compute COM2 adsorbant com
-############################
-
-# Output
-#dump 1 all xyz 100 trajec.xyz
-#dump_modify 1 format line "%s %12.6f %12.6f %12.6f" element "C" "C"
-thermo 10
-thermo_style custom step time etotal pe temp c_COM1[3] c_COM2[3] # spcpu
-thermo_modify line one format float %14.8f
-
-###### Run molecular dynamics ######
-run 1000
-Neighbor list info ...
- update every 1 steps, delay 0 steps, check yes
- max neighbors/atom: 2000, page size: 100000
- master list distance cutoff = 16
- ghost atom cutoff = 16
- binsize = 8, bins = 3 3 8
- 3 neighbor lists, perpetual/occasional/extra = 3 0 0
- (1) pair rebo, perpetual
- attributes: full, newton on, ghost
- pair build: full/bin/ghost
- stencil: full/ghost/bin/3d
- bin: standard
- (2) pair kolmogorov/crespi/z, perpetual, skip from (3)
- attributes: half, newton on
- pair build: skip
- stencil: none
- bin: none
- (3) neighbor class addition, perpetual
- attributes: half, newton on
- pair build: half/bin/atomonly/newton
- stencil: half/bin/3d/newton
- bin: standard
-Per MPI rank memory allocation (min/avg/max) = 4.572 | 4.572 | 4.572 Mbytes
-Step Time TotEng PotEng Temp c_COM1[3] c_COM2[3]
- 0 0.00000000 -1888.67041214 -1898.55881323 300.00000000 0.00000000 3.30000000
- 10 0.00100000 -1888.67037221 -1898.21029897 289.42778520 -0.00020126 3.30020126
- 20 0.00200000 -1888.67021541 -1897.22943612 259.67456089 -0.00041357 3.30041357
- 30 0.00300000 -1888.66999308 -1895.86681311 218.34126559 -0.00063673 3.30063673
- 40 0.00400000 -1888.66978354 -1894.47163830 176.02000692 -0.00087055 3.30087055
- 50 0.00500000 -1888.66966068 -1893.37123377 142.63902862 -0.00111486 3.30111486
- 60 0.00600000 -1888.66966132 -1892.75822749 124.04127205 -0.00136952 3.30136952
- 70 0.00700000 -1888.66976974 -1892.63445751 120.28297808 -0.00163441 3.30163441
- 80 0.00800000 -1888.66992867 -1892.83467462 126.35245792 -0.00190946 3.30190946
- 90 0.00900000 -1888.67006868 -1893.11387069 134.81862145 -0.00219458 3.30219458
- 100 0.01000000 -1888.67013621 -1893.25481851 139.09272853 -0.00248973 3.30248973
- 110 0.01100000 -1888.67011201 -1893.15155790 135.96068294 -0.00279489 3.30279489
- 120 0.01200000 -1888.67001496 -1892.84002960 126.51230266 -0.00311004 3.30311004
- 130 0.01300000 -1888.66988997 -1892.47004238 115.29120968 -0.00343519 3.30343519
- 140 0.01400000 -1888.66979230 -1892.23503116 108.16426723 -0.00377038 3.30377038
- 150 0.01500000 -1888.66976478 -1892.28630583 109.72070257 -0.00411562 3.30411562
- 160 0.01600000 -1888.66982054 -1892.66640611 121.25071190 -0.00447099 3.30447099
- 170 0.01700000 -1888.66993790 -1893.28862637 140.12442721 -0.00483654 3.30483654
- 180 0.01800000 -1888.67007017 -1893.97029258 160.80119589 -0.00521235 3.30521235
- 190 0.01900000 -1888.67016712 -1894.50458787 177.00801243 -0.00559851 3.30559851
- 200 0.02000000 -1888.67019459 -1894.73890106 184.11590729 -0.00599512 3.30599512
- 210 0.02100000 -1888.67014420 -1894.62906014 180.78501932 -0.00640230 3.30640230
- 220 0.02200000 -1888.67003680 -1894.25249103 169.36370738 -0.00682016 3.30682016
- 230 0.02300000 -1888.66991386 -1893.77601613 154.91186767 -0.00724883 3.30724883
- 240 0.02400000 -1888.66982525 -1893.38995084 143.20188490 -0.00768845 3.30768845
- 250 0.02500000 -1888.66980630 -1893.23138936 138.39193056 -0.00813913 3.30813913
- 260 0.02600000 -1888.66986130 -1893.32993923 141.38012476 -0.00860097 3.30860097
- 270 0.02700000 -1888.66996305 -1893.60070606 149.59171763 -0.00907408 3.30907408
- 280 0.02800000 -1888.67006686 -1893.88587226 158.24010433 -0.00955849 3.30955849
- 290 0.02900000 -1888.67012981 -1894.02402669 162.42960292 -0.01005424 3.31005424
- 300 0.03000000 -1888.67012722 -1893.91715234 159.18726627 -0.01056129 3.31056129
- 310 0.03100000 -1888.67005731 -1893.57037242 148.66857852 -0.01107957 3.31107957
- 320 0.03200000 -1888.66994573 -1893.09358619 134.20694883 -0.01160898 3.31160898
- 330 0.03300000 -1888.66983589 -1892.66132663 121.09614207 -0.01214935 3.31214935
- 340 0.03400000 -1888.66977410 -1892.44446345 114.51869676 -0.01270046 3.31270046
- 350 0.03500000 -1888.66978826 -1892.53901235 117.38674604 -0.01326207 3.31326207
- 360 0.03600000 -1888.66987439 -1892.92337288 129.04508371 -0.01383390 3.31383390
- 370 0.03700000 -1888.66999800 -1893.46445570 145.45701555 -0.01441561 3.31441561
- 380 0.03800000 -1888.67010960 -1893.97065516 160.81100020 -0.01500688 3.31500688
- 390 0.03900000 -1888.67016540 -1894.26835818 169.84119247 -0.01560734 3.31560734
- 400 0.04000000 -1888.67014667 -1894.26967975 169.88185546 -0.01621664 3.31621664
- 410 0.04100000 -1888.67006166 -1894.00321069 161.80014280 -0.01683442 3.31683442
- 420 0.04200000 -1888.66994367 -1893.60086324 149.59707418 -0.01746033 3.31746033
- 430 0.04300000 -1888.66984058 -1893.24559841 138.82197275 -0.01809405 3.31809405
- 440 0.04400000 -1888.66979399 -1893.09727874 134.32357877 -0.01873527 3.31873527
- 450 0.04500000 -1888.66982139 -1893.22837442 138.30000378 -0.01938373 3.31938373
- 460 0.04600000 -1888.66990972 -1893.59670383 149.47191354 -0.02003918 3.32003918
- 470 0.04700000 -1888.67002173 -1894.06542598 163.68887743 -0.02070143 3.32070143
- 480 0.04800000 -1888.67011389 -1894.46010842 175.66018439 -0.02137030 3.32137030
- 490 0.04900000 -1888.67015175 -1894.63688098 181.02206322 -0.02204565 3.32204565
- 500 0.05000000 -1888.67012158 -1894.53632221 177.97216882 -0.02272740 3.32272740
- 510 0.05100000 -1888.67003762 -1894.20444731 167.90610436 -0.02341547 3.32341547
- 520 0.05200000 -1888.66993151 -1893.77231066 154.79891353 -0.02410981 3.32410981
- 530 0.05300000 -1888.66984505 -1893.40525927 143.66572038 -0.02481040 3.32481040
- 540 0.05400000 -1888.66981408 -1893.23762083 138.58074854 -0.02551724 3.32551724
- 550 0.05500000 -1888.66985005 -1893.31793594 141.01630317 -0.02623032 3.32623032
- 560 0.05600000 -1888.66993737 -1893.59069013 149.28862751 -0.02694963 3.32694963
- 570 0.05700000 -1888.67003852 -1893.92089571 159.30352588 -0.02767517 3.32767517
- 580 0.05800000 -1888.67011322 -1894.15124753 166.28980524 -0.02840691 3.32840691
- 590 0.05900000 -1888.67013192 -1894.16548041 166.72104345 -0.02914478 3.32914478
- 600 0.06000000 -1888.67008713 -1893.93443318 159.71275856 -0.02988871 3.32988871
- 610 0.06100000 -1888.66999438 -1893.52841656 147.39760646 -0.03063856 3.33063856
- 620 0.06200000 -1888.66988809 -1893.09235021 134.17119963 -0.03139416 3.33139416
- 630 0.06300000 -1888.66980996 -1892.79172016 125.05288240 -0.03215531 3.33215531
- 640 0.06400000 -1888.66979261 -1892.74755390 123.71346730 -0.03292176 3.33292176
- 650 0.06500000 -1888.66984332 -1892.98665459 130.96590324 -0.03369323 3.33369323
- 660 0.06600000 -1888.66994245 -1893.42999868 144.41332389 -0.03446937 3.33446937
- 670 0.06700000 -1888.67005233 -1893.92310681 159.37018806 -0.03524986 3.33524986
- 680 0.06800000 -1888.67013309 -1894.29451581 170.63575808 -0.03603430 3.33603430
- 690 0.06900000 -1888.67015452 -1894.41878117 174.40514192 -0.03682229 3.33682229
- 700 0.07000000 -1888.67010897 -1894.26288036 169.67671530 -0.03761343 3.33761343
- 710 0.07100000 -1888.67001367 -1893.89812904 158.61357114 -0.03840729 3.33840729
- 720 0.07200000 -1888.66990378 -1893.47348746 145.73388454 -0.03920344 3.33920344
- 730 0.07300000 -1888.66982212 -1893.15984839 136.22099960 -0.04000148 3.34000148
- 740 0.07400000 -1888.66980109 -1893.08373746 133.91254029 -0.04080098 3.34080098
- 750 0.07500000 -1888.66984794 -1893.27755511 139.79127024 -0.04160156 3.34160156
- 760 0.07600000 -1888.66994215 -1893.66837365 151.64528967 -0.04240282 3.34240282
- 770 0.07700000 -1888.67004554 -1894.10941206 165.02263027 -0.04320441 3.34320441
- 780 0.07800000 -1888.67011702 -1894.43947545 175.03411436 -0.04400599 3.34400599
- 790 0.07900000 -1888.67013297 -1894.54590471 178.26254255 -0.04480726 3.34480726
- 800 0.08000000 -1888.67008751 -1894.40384142 173.95392406 -0.04560792 3.34560792
- 810 0.08100000 -1888.66999923 -1894.08389003 164.24973321 -0.04640773 3.34640773
- 820 0.08200000 -1888.66990447 -1893.72313979 153.30795965 -0.04720647 3.34720647
- 830 0.08300000 -1888.66984367 -1893.46839190 145.58111626 -0.04800393 3.34800393
- 840 0.08400000 -1888.66984156 -1893.41412536 143.93481093 -0.04879995 3.34879995
- 850 0.08500000 -1888.66989670 -1893.56426154 148.48805553 -0.04959439 3.34959439
- 860 0.08600000 -1888.66998222 -1893.83463719 156.68827294 -0.05038713 3.35038713
- 870 0.08700000 -1888.67006171 -1894.09325045 164.53181920 -0.05117805 3.35117805
- 880 0.08800000 -1888.67010273 -1894.21712661 168.28880100 -0.05196706 3.35196706
- 890 0.08900000 -1888.67008993 -1894.14263950 166.02935656 -0.05275408 3.35275408
- 900 0.09000000 -1888.67002891 -1893.89014571 158.37090587 -0.05353904 3.35353904
- 910 0.09100000 -1888.66994326 -1893.55535709 148.21649469 -0.05432186 3.35432186
- 920 0.09200000 -1888.66986526 -1893.27257949 139.63979178 -0.05510247 3.35510247
- 930 0.09300000 -1888.66982730 -1893.16330891 136.32582949 -0.05588078 3.35588078
- 940 0.09400000 -1888.66984631 -1893.28643285 140.06065785 -0.05665670 3.35665670
- 950 0.09500000 -1888.66991503 -1893.61245342 149.94957268 -0.05743015 3.35743015
- 960 0.09600000 -1888.67000691 -1894.03423922 162.74316516 -0.05820101 3.35820101
- 970 0.09700000 -1888.67008649 -1894.40848025 174.09469037 -0.05896915 3.35896915
- 980 0.09800000 -1888.67012436 -1894.61056767 180.22458605 -0.05973444 3.35973444
- 990 0.09900000 -1888.67010608 -1894.58107659 179.33042338 -0.06049672 3.36049672
- 1000 0.10000000 -1888.67003981 -1894.34773305 172.25312330 -0.06125581 3.36125581
-Loop time of 1.32192 on 4 procs for 1000 steps with 256 atoms
-
-Performance: 6.536 ns/day, 3.672 hours/ns, 756.476 timesteps/s
-98.6% CPU use with 4 MPI tasks x 1 OpenMP threads
-
-MPI task timing breakdown:
-Section | min time | avg time | max time |%varavg| %total
----------------------------------------------------------------
-Pair | 1.1157 | 1.172 | 1.2369 | 4.0 | 88.66
-Neigh | 0 | 0 | 0 | 0.0 | 0.00
-Comm | 0.071678 | 0.13667 | 0.19304 | 11.8 | 10.34
-Output | 0.0029244 | 0.0031272 | 0.0035112 | 0.4 | 0.24
-Modify | 0.0016961 | 0.0017477 | 0.0017846 | 0.1 | 0.13
-Other | | 0.008334 | | | 0.63
-
-Nlocal: 64 ave 64 max 64 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-Nghost: 1265 ave 1265 max 1265 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-Neighs: 9328 ave 9328 max 9328 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-FullNghs: 23648 ave 23648 max 23648 min
-Histogram: 4 0 0 0 0 0 0 0 0 0
-
-Total # of neighbors = 94592
-Ave neighs/atom = 369.5
-Neighbor list builds = 0
-Dangerous builds = 0
-Total wall time: 0:00:01
diff --git a/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 b/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1
new file mode 100644
index 0000000000..5c8616749e
--- /dev/null
+++ b/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1
@@ -0,0 +1,210 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Initialization
+units metal
+boundary p p p
+atom_style atomic
+processors * * 1 # domain decomposition over x and y
+
+# System and atom definition
+# we use 2 atom types so that inter- and intra-layer
+# interactions can be specified separately
+read_data data.bilayer-graphene # read lammps data file
+ orthogonal box = (0 0 -20) to (17.04 19.6761 40)
+ 1 by 1 by 1 MPI processor grid
+ reading atoms ...
+ 256 atoms
+ read_data CPU = 0.000291348 secs
+mass 1 12.0107 # carbon mass (g/mole) | membrane
+mass 2 12.0107 # carbon mass (g/mole) | adsorbate
+# Neighbor update settings
+neighbor 2.0 bin
+neigh_modify every 1
+neigh_modify delay 0
+neigh_modify check yes
+# Separate atom groups
+group membrane type 1
+128 atoms in group membrane
+group adsorbant type 2
+128 atoms in group adsorbant
+
+######################## Potential defition ########################
+pair_style hybrid/overlay rebo kolmogorov/crespi/z 14.0
+####################################################################
+pair_coeff * * rebo CH.rebo C C # chemical
+Reading potential file CH.rebo with DATE: 2018-7-3
+pair_coeff 1 2 kolmogorov/crespi/z CC.KC C C # long-range
+####################################################################
+
+#### Simulation settings ####
+timestep 0.0001
+velocity all create 300.0 12345
+fix thermostat all nve
+compute COM1 membrane com
+compute COM2 adsorbant com
+############################
+
+# Output
+#dump 1 all xyz 100 trajec.xyz
+#dump_modify 1 format line "%s %12.6f %12.6f %12.6f" element "C" "C"
+thermo 10
+thermo_style custom step time etotal pe temp c_COM1[3] c_COM2[3] # spcpu
+thermo_modify line one format float %14.8f
+
+###### Run molecular dynamics ######
+run 1000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 16
+ ghost atom cutoff = 16
+ binsize = 8, bins = 3 3 8
+ 3 neighbor lists, perpetual/occasional/extra = 3 0 0
+ (1) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+ (2) pair kolmogorov/crespi/z, perpetual, skip from (3)
+ attributes: half, newton on
+ pair build: skip
+ stencil: none
+ bin: none
+ (3) neighbor class addition, perpetual
+ attributes: half, newton on
+ pair build: half/bin/atomonly/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 4.998 | 4.998 | 4.998 Mbytes
+Step Time TotEng PotEng Temp c_COM1[3] c_COM2[3]
+ 0 0.00000000 -1888.67041233 -1898.55881343 300.00000000 0.00000000 3.30000000
+ 10 0.00100000 -1888.67037240 -1898.21029916 289.42778520 -0.00020126 3.30020126
+ 20 0.00200000 -1888.67021561 -1897.22943631 259.67456089 -0.00041357 3.30041357
+ 30 0.00300000 -1888.66999327 -1895.86681330 218.34126559 -0.00063673 3.30063673
+ 40 0.00400000 -1888.66978373 -1894.47163849 176.02000692 -0.00087055 3.30087055
+ 50 0.00500000 -1888.66966087 -1893.37123396 142.63902861 -0.00111486 3.30111486
+ 60 0.00600000 -1888.66966151 -1892.75822768 124.04127204 -0.00136952 3.30136952
+ 70 0.00700000 -1888.66976993 -1892.63445770 120.28297806 -0.00163441 3.30163441
+ 80 0.00800000 -1888.66992887 -1892.83467481 126.35245790 -0.00190946 3.30190946
+ 90 0.00900000 -1888.67006887 -1893.11387088 134.81862143 -0.00219458 3.30219458
+ 100 0.01000000 -1888.67013641 -1893.25481870 139.09272852 -0.00248973 3.30248973
+ 110 0.01100000 -1888.67011221 -1893.15155809 135.96068294 -0.00279489 3.30279489
+ 120 0.01200000 -1888.67001516 -1892.84002980 126.51230266 -0.00311004 3.30311004
+ 130 0.01300000 -1888.66989017 -1892.47004258 115.29120969 -0.00343519 3.30343519
+ 140 0.01400000 -1888.66979250 -1892.23503136 108.16426724 -0.00377038 3.30377038
+ 150 0.01500000 -1888.66976498 -1892.28630603 109.72070258 -0.00411562 3.30411562
+ 160 0.01600000 -1888.66982073 -1892.66640631 121.25071190 -0.00447099 3.30447099
+ 170 0.01700000 -1888.66993810 -1893.28862656 140.12442720 -0.00483654 3.30483654
+ 180 0.01800000 -1888.67007037 -1893.97029277 160.80119589 -0.00521235 3.30521235
+ 190 0.01900000 -1888.67016732 -1894.50458806 177.00801243 -0.00559851 3.30559851
+ 200 0.02000000 -1888.67019479 -1894.73890125 184.11590729 -0.00599512 3.30599512
+ 210 0.02100000 -1888.67014440 -1894.62906034 180.78501933 -0.00640230 3.30640230
+ 220 0.02200000 -1888.67003699 -1894.25249122 169.36370739 -0.00682016 3.30682016
+ 230 0.02300000 -1888.66991405 -1893.77601632 154.91186768 -0.00724883 3.30724883
+ 240 0.02400000 -1888.66982545 -1893.38995103 143.20188490 -0.00768845 3.30768845
+ 250 0.02500000 -1888.66980650 -1893.23138955 138.39193054 -0.00813913 3.30813913
+ 260 0.02600000 -1888.66986149 -1893.32993943 141.38012473 -0.00860097 3.30860097
+ 270 0.02700000 -1888.66996324 -1893.60070625 149.59171759 -0.00907408 3.30907408
+ 280 0.02800000 -1888.67006705 -1893.88587245 158.24010430 -0.00955849 3.30955849
+ 290 0.02900000 -1888.67013001 -1894.02402688 162.42960290 -0.01005424 3.31005424
+ 300 0.03000000 -1888.67012741 -1893.91715254 159.18726627 -0.01056129 3.31056129
+ 310 0.03100000 -1888.67005750 -1893.57037262 148.66857854 -0.01107957 3.31107957
+ 320 0.03200000 -1888.66994592 -1893.09358639 134.20694885 -0.01160898 3.31160898
+ 330 0.03300000 -1888.66983608 -1892.66132683 121.09614209 -0.01214935 3.31214935
+ 340 0.03400000 -1888.66977429 -1892.44446364 114.51869677 -0.01270046 3.31270046
+ 350 0.03500000 -1888.66978845 -1892.53901254 117.38674604 -0.01326207 3.31326207
+ 360 0.03600000 -1888.66987459 -1892.92337308 129.04508370 -0.01383390 3.31383390
+ 370 0.03700000 -1888.66999819 -1893.46445589 145.45701553 -0.01441561 3.31441561
+ 380 0.03800000 -1888.67010979 -1893.97065536 160.81100019 -0.01500688 3.31500688
+ 390 0.03900000 -1888.67016559 -1894.26835837 169.84119248 -0.01560734 3.31560734
+ 400 0.04000000 -1888.67014686 -1894.26967995 169.88185548 -0.01621664 3.31621664
+ 410 0.04100000 -1888.67006186 -1894.00321089 161.80014284 -0.01683442 3.31683442
+ 420 0.04200000 -1888.66994386 -1893.60086344 149.59707422 -0.01746033 3.31746033
+ 430 0.04300000 -1888.66984078 -1893.24559860 138.82197278 -0.01809405 3.31809405
+ 440 0.04400000 -1888.66979419 -1893.09727893 134.32357877 -0.01873527 3.31873527
+ 450 0.04500000 -1888.66982159 -1893.22837461 138.30000376 -0.01938373 3.31938373
+ 460 0.04600000 -1888.66990991 -1893.59670402 149.47191350 -0.02003918 3.32003918
+ 470 0.04700000 -1888.67002193 -1894.06542618 163.68887740 -0.02070143 3.32070143
+ 480 0.04800000 -1888.67011408 -1894.46010861 175.66018436 -0.02137030 3.32137030
+ 490 0.04900000 -1888.67015195 -1894.63688117 181.02206322 -0.02204565 3.32204565
+ 500 0.05000000 -1888.67012178 -1894.53632241 177.97216884 -0.02272740 3.32272740
+ 510 0.05100000 -1888.67003782 -1894.20444750 167.90610440 -0.02341547 3.32341547
+ 520 0.05200000 -1888.66993171 -1893.77231086 154.79891357 -0.02410981 3.32410981
+ 530 0.05300000 -1888.66984524 -1893.40525947 143.66572040 -0.02481040 3.32481040
+ 540 0.05400000 -1888.66981428 -1893.23762103 138.58074854 -0.02551724 3.32551724
+ 550 0.05500000 -1888.66985024 -1893.31793613 141.01630314 -0.02623032 3.32623032
+ 560 0.05600000 -1888.66993756 -1893.59069032 149.28862746 -0.02694963 3.32694963
+ 570 0.05700000 -1888.67003871 -1893.92089591 159.30352583 -0.02767517 3.32767517
+ 580 0.05800000 -1888.67011342 -1894.15124772 166.28980520 -0.02840691 3.32840691
+ 590 0.05900000 -1888.67013211 -1894.16548061 166.72104344 -0.02914478 3.32914478
+ 600 0.06000000 -1888.67008732 -1893.93443338 159.71275857 -0.02988871 3.32988871
+ 610 0.06100000 -1888.66999458 -1893.52841675 147.39760649 -0.03063856 3.33063856
+ 620 0.06200000 -1888.66988829 -1893.09235041 134.17119966 -0.03139416 3.33139416
+ 630 0.06300000 -1888.66981016 -1892.79172036 125.05288241 -0.03215531 3.33215531
+ 640 0.06400000 -1888.66979281 -1892.74755409 123.71346729 -0.03292176 3.33292176
+ 650 0.06500000 -1888.66984352 -1892.98665478 130.96590321 -0.03369323 3.33369323
+ 660 0.06600000 -1888.66994264 -1893.42999887 144.41332385 -0.03446937 3.33446937
+ 670 0.06700000 -1888.67005253 -1893.92310700 159.37018803 -0.03524986 3.33524986
+ 680 0.06800000 -1888.67013328 -1894.29451600 170.63575807 -0.03603430 3.33603430
+ 690 0.06900000 -1888.67015472 -1894.41878137 174.40514195 -0.03682229 3.33682229
+ 700 0.07000000 -1888.67010916 -1894.26288055 169.67671536 -0.03761343 3.33761343
+ 710 0.07100000 -1888.67001386 -1893.89812923 158.61357122 -0.03840729 3.33840729
+ 720 0.07200000 -1888.66990397 -1893.47348765 145.73388461 -0.03920344 3.33920344
+ 730 0.07300000 -1888.66982231 -1893.15984859 136.22099965 -0.04000148 3.34000148
+ 740 0.07400000 -1888.66980129 -1893.08373765 133.91254030 -0.04080098 3.34080098
+ 750 0.07500000 -1888.66984814 -1893.27755530 139.79127022 -0.04160156 3.34160156
+ 760 0.07600000 -1888.66994235 -1893.66837384 151.64528962 -0.04240282 3.34240282
+ 770 0.07700000 -1888.67004573 -1894.10941225 165.02263022 -0.04320441 3.34320441
+ 780 0.07800000 -1888.67011722 -1894.43947564 175.03411433 -0.04400599 3.34400599
+ 790 0.07900000 -1888.67013317 -1894.54590490 178.26254255 -0.04480726 3.34480726
+ 800 0.08000000 -1888.67008771 -1894.40384162 173.95392409 -0.04560792 3.34560792
+ 810 0.08100000 -1888.66999942 -1894.08389023 164.24973325 -0.04640773 3.34640773
+ 820 0.08200000 -1888.66990467 -1893.72313999 153.30795968 -0.04720647 3.34720647
+ 830 0.08300000 -1888.66984387 -1893.46839210 145.58111627 -0.04800393 3.34800393
+ 840 0.08400000 -1888.66984175 -1893.41412556 143.93481091 -0.04879995 3.34879995
+ 850 0.08500000 -1888.66989690 -1893.56426173 148.48805548 -0.04959439 3.34959439
+ 860 0.08600000 -1888.66998242 -1893.83463738 156.68827289 -0.05038713 3.35038713
+ 870 0.08700000 -1888.67006191 -1894.09325064 164.53181916 -0.05117805 3.35117805
+ 880 0.08800000 -1888.67010292 -1894.21712680 168.28880099 -0.05196706 3.35196706
+ 890 0.08900000 -1888.67009013 -1894.14263970 166.02935659 -0.05275408 3.35275408
+ 900 0.09000000 -1888.67002911 -1893.89014590 158.37090593 -0.05353904 3.35353904
+ 910 0.09100000 -1888.66994346 -1893.55535729 148.21649476 -0.05432186 3.35432186
+ 920 0.09200000 -1888.66986545 -1893.27257968 139.63979183 -0.05510247 3.35510247
+ 930 0.09300000 -1888.66982750 -1893.16330910 136.32582951 -0.05588078 3.35588078
+ 940 0.09400000 -1888.66984650 -1893.28643304 140.06065783 -0.05665670 3.35665670
+ 950 0.09500000 -1888.66991522 -1893.61245361 149.94957262 -0.05743015 3.35743015
+ 960 0.09600000 -1888.67000710 -1894.03423941 162.74316510 -0.05820101 3.35820101
+ 970 0.09700000 -1888.67008668 -1894.40848044 174.09469033 -0.05896915 3.35896915
+ 980 0.09800000 -1888.67012456 -1894.61056787 180.22458605 -0.05973444 3.35973444
+ 990 0.09900000 -1888.67010627 -1894.58107679 179.33042341 -0.06049672 3.36049672
+ 1000 0.10000000 -1888.67004000 -1894.34773324 172.25312335 -0.06125581 3.36125581
+Loop time of 2.60456 on 1 procs for 1000 steps with 256 atoms
+
+Performance: 3.317 ns/day, 7.235 hours/ns, 383.942 timesteps/s
+99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 2.5864 | 2.5864 | 2.5864 | 0.0 | 99.30
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.0079134 | 0.0079134 | 0.0079134 | 0.0 | 0.30
+Output | 0.0027175 | 0.0027175 | 0.0027175 | 0.0 | 0.10
+Modify | 0.00419 | 0.00419 | 0.00419 | 0.0 | 0.16
+Other | | 0.00331 | | | 0.13
+
+Nlocal: 256 ave 256 max 256 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 1721 ave 1721 max 1721 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 37312 ave 37312 max 37312 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs: 94592 ave 94592 max 94592 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 94592
+Ave neighs/atom = 369.5
+Neighbor list builds = 0
+Dangerous builds = 0
+Total wall time: 0:00:02
diff --git a/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 b/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4
new file mode 100644
index 0000000000..13d402b512
--- /dev/null
+++ b/examples/USER/misc/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4
@@ -0,0 +1,210 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# Initialization
+units metal
+boundary p p p
+atom_style atomic
+processors * * 1 # domain decomposition over x and y
+
+# System and atom definition
+# we use 2 atom types so that inter- and intra-layer
+# interactions can be specified separately
+read_data data.bilayer-graphene # read lammps data file
+ orthogonal box = (0 0 -20) to (17.04 19.6761 40)
+ 2 by 2 by 1 MPI processor grid
+ reading atoms ...
+ 256 atoms
+ read_data CPU = 0.0488505 secs
+mass 1 12.0107 # carbon mass (g/mole) | membrane
+mass 2 12.0107 # carbon mass (g/mole) | adsorbate
+# Neighbor update settings
+neighbor 2.0 bin
+neigh_modify every 1
+neigh_modify delay 0
+neigh_modify check yes
+# Separate atom groups
+group membrane type 1
+128 atoms in group membrane
+group adsorbant type 2
+128 atoms in group adsorbant
+
+######################## Potential defition ########################
+pair_style hybrid/overlay rebo kolmogorov/crespi/z 14.0
+####################################################################
+pair_coeff * * rebo CH.rebo C C # chemical
+Reading potential file CH.rebo with DATE: 2018-7-3
+pair_coeff 1 2 kolmogorov/crespi/z CC.KC C C # long-range
+####################################################################
+
+#### Simulation settings ####
+timestep 0.0001
+velocity all create 300.0 12345
+fix thermostat all nve
+compute COM1 membrane com
+compute COM2 adsorbant com
+############################
+
+# Output
+#dump 1 all xyz 100 trajec.xyz
+#dump_modify 1 format line "%s %12.6f %12.6f %12.6f" element "C" "C"
+thermo 10
+thermo_style custom step time etotal pe temp c_COM1[3] c_COM2[3] # spcpu
+thermo_modify line one format float %14.8f
+
+###### Run molecular dynamics ######
+run 1000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 16
+ ghost atom cutoff = 16
+ binsize = 8, bins = 3 3 8
+ 3 neighbor lists, perpetual/occasional/extra = 3 0 0
+ (1) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+ (2) pair kolmogorov/crespi/z, perpetual, skip from (3)
+ attributes: half, newton on
+ pair build: skip
+ stencil: none
+ bin: none
+ (3) neighbor class addition, perpetual
+ attributes: half, newton on
+ pair build: half/bin/atomonly/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 4.572 | 4.572 | 4.572 Mbytes
+Step Time TotEng PotEng Temp c_COM1[3] c_COM2[3]
+ 0 0.00000000 -1888.67041233 -1898.55881343 300.00000000 0.00000000 3.30000000
+ 10 0.00100000 -1888.67037240 -1898.21029916 289.42778520 -0.00020126 3.30020126
+ 20 0.00200000 -1888.67021561 -1897.22943631 259.67456089 -0.00041357 3.30041357
+ 30 0.00300000 -1888.66999327 -1895.86681330 218.34126559 -0.00063673 3.30063673
+ 40 0.00400000 -1888.66978373 -1894.47163849 176.02000692 -0.00087055 3.30087055
+ 50 0.00500000 -1888.66966087 -1893.37123396 142.63902861 -0.00111486 3.30111486
+ 60 0.00600000 -1888.66966151 -1892.75822768 124.04127204 -0.00136952 3.30136952
+ 70 0.00700000 -1888.66976993 -1892.63445770 120.28297806 -0.00163441 3.30163441
+ 80 0.00800000 -1888.66992887 -1892.83467481 126.35245790 -0.00190946 3.30190946
+ 90 0.00900000 -1888.67006887 -1893.11387088 134.81862143 -0.00219458 3.30219458
+ 100 0.01000000 -1888.67013641 -1893.25481870 139.09272852 -0.00248973 3.30248973
+ 110 0.01100000 -1888.67011221 -1893.15155809 135.96068294 -0.00279489 3.30279489
+ 120 0.01200000 -1888.67001516 -1892.84002980 126.51230266 -0.00311004 3.30311004
+ 130 0.01300000 -1888.66989017 -1892.47004258 115.29120969 -0.00343519 3.30343519
+ 140 0.01400000 -1888.66979250 -1892.23503136 108.16426724 -0.00377038 3.30377038
+ 150 0.01500000 -1888.66976498 -1892.28630603 109.72070258 -0.00411562 3.30411562
+ 160 0.01600000 -1888.66982073 -1892.66640631 121.25071190 -0.00447099 3.30447099
+ 170 0.01700000 -1888.66993810 -1893.28862656 140.12442720 -0.00483654 3.30483654
+ 180 0.01800000 -1888.67007037 -1893.97029277 160.80119589 -0.00521235 3.30521235
+ 190 0.01900000 -1888.67016732 -1894.50458806 177.00801243 -0.00559851 3.30559851
+ 200 0.02000000 -1888.67019479 -1894.73890125 184.11590729 -0.00599512 3.30599512
+ 210 0.02100000 -1888.67014440 -1894.62906034 180.78501933 -0.00640230 3.30640230
+ 220 0.02200000 -1888.67003699 -1894.25249122 169.36370739 -0.00682016 3.30682016
+ 230 0.02300000 -1888.66991405 -1893.77601632 154.91186768 -0.00724883 3.30724883
+ 240 0.02400000 -1888.66982545 -1893.38995103 143.20188490 -0.00768845 3.30768845
+ 250 0.02500000 -1888.66980650 -1893.23138955 138.39193054 -0.00813913 3.30813913
+ 260 0.02600000 -1888.66986149 -1893.32993943 141.38012473 -0.00860097 3.30860097
+ 270 0.02700000 -1888.66996324 -1893.60070625 149.59171759 -0.00907408 3.30907408
+ 280 0.02800000 -1888.67006705 -1893.88587245 158.24010430 -0.00955849 3.30955849
+ 290 0.02900000 -1888.67013001 -1894.02402688 162.42960290 -0.01005424 3.31005424
+ 300 0.03000000 -1888.67012741 -1893.91715254 159.18726627 -0.01056129 3.31056129
+ 310 0.03100000 -1888.67005750 -1893.57037262 148.66857854 -0.01107957 3.31107957
+ 320 0.03200000 -1888.66994592 -1893.09358639 134.20694885 -0.01160898 3.31160898
+ 330 0.03300000 -1888.66983608 -1892.66132683 121.09614209 -0.01214935 3.31214935
+ 340 0.03400000 -1888.66977429 -1892.44446364 114.51869677 -0.01270046 3.31270046
+ 350 0.03500000 -1888.66978845 -1892.53901254 117.38674604 -0.01326207 3.31326207
+ 360 0.03600000 -1888.66987459 -1892.92337308 129.04508370 -0.01383390 3.31383390
+ 370 0.03700000 -1888.66999819 -1893.46445589 145.45701553 -0.01441561 3.31441561
+ 380 0.03800000 -1888.67010979 -1893.97065536 160.81100019 -0.01500688 3.31500688
+ 390 0.03900000 -1888.67016559 -1894.26835837 169.84119248 -0.01560734 3.31560734
+ 400 0.04000000 -1888.67014686 -1894.26967995 169.88185548 -0.01621664 3.31621664
+ 410 0.04100000 -1888.67006186 -1894.00321089 161.80014284 -0.01683442 3.31683442
+ 420 0.04200000 -1888.66994386 -1893.60086344 149.59707422 -0.01746033 3.31746033
+ 430 0.04300000 -1888.66984078 -1893.24559860 138.82197278 -0.01809405 3.31809405
+ 440 0.04400000 -1888.66979419 -1893.09727893 134.32357877 -0.01873527 3.31873527
+ 450 0.04500000 -1888.66982159 -1893.22837461 138.30000376 -0.01938373 3.31938373
+ 460 0.04600000 -1888.66990991 -1893.59670402 149.47191350 -0.02003918 3.32003918
+ 470 0.04700000 -1888.67002193 -1894.06542618 163.68887740 -0.02070143 3.32070143
+ 480 0.04800000 -1888.67011408 -1894.46010861 175.66018436 -0.02137030 3.32137030
+ 490 0.04900000 -1888.67015195 -1894.63688117 181.02206322 -0.02204565 3.32204565
+ 500 0.05000000 -1888.67012178 -1894.53632241 177.97216884 -0.02272740 3.32272740
+ 510 0.05100000 -1888.67003782 -1894.20444750 167.90610440 -0.02341547 3.32341547
+ 520 0.05200000 -1888.66993171 -1893.77231086 154.79891357 -0.02410981 3.32410981
+ 530 0.05300000 -1888.66984524 -1893.40525947 143.66572040 -0.02481040 3.32481040
+ 540 0.05400000 -1888.66981428 -1893.23762103 138.58074854 -0.02551724 3.32551724
+ 550 0.05500000 -1888.66985024 -1893.31793613 141.01630314 -0.02623032 3.32623032
+ 560 0.05600000 -1888.66993756 -1893.59069032 149.28862746 -0.02694963 3.32694963
+ 570 0.05700000 -1888.67003871 -1893.92089591 159.30352583 -0.02767517 3.32767517
+ 580 0.05800000 -1888.67011342 -1894.15124772 166.28980520 -0.02840691 3.32840691
+ 590 0.05900000 -1888.67013211 -1894.16548061 166.72104344 -0.02914478 3.32914478
+ 600 0.06000000 -1888.67008732 -1893.93443338 159.71275857 -0.02988871 3.32988871
+ 610 0.06100000 -1888.66999458 -1893.52841675 147.39760649 -0.03063856 3.33063856
+ 620 0.06200000 -1888.66988829 -1893.09235041 134.17119966 -0.03139416 3.33139416
+ 630 0.06300000 -1888.66981016 -1892.79172036 125.05288241 -0.03215531 3.33215531
+ 640 0.06400000 -1888.66979281 -1892.74755409 123.71346729 -0.03292176 3.33292176
+ 650 0.06500000 -1888.66984352 -1892.98665478 130.96590321 -0.03369323 3.33369323
+ 660 0.06600000 -1888.66994264 -1893.42999887 144.41332385 -0.03446937 3.33446937
+ 670 0.06700000 -1888.67005253 -1893.92310700 159.37018803 -0.03524986 3.33524986
+ 680 0.06800000 -1888.67013328 -1894.29451600 170.63575807 -0.03603430 3.33603430
+ 690 0.06900000 -1888.67015472 -1894.41878137 174.40514195 -0.03682229 3.33682229
+ 700 0.07000000 -1888.67010916 -1894.26288055 169.67671536 -0.03761343 3.33761343
+ 710 0.07100000 -1888.67001386 -1893.89812923 158.61357122 -0.03840729 3.33840729
+ 720 0.07200000 -1888.66990397 -1893.47348765 145.73388461 -0.03920344 3.33920344
+ 730 0.07300000 -1888.66982231 -1893.15984859 136.22099965 -0.04000148 3.34000148
+ 740 0.07400000 -1888.66980129 -1893.08373765 133.91254030 -0.04080098 3.34080098
+ 750 0.07500000 -1888.66984814 -1893.27755530 139.79127022 -0.04160156 3.34160156
+ 760 0.07600000 -1888.66994235 -1893.66837384 151.64528962 -0.04240282 3.34240282
+ 770 0.07700000 -1888.67004573 -1894.10941225 165.02263022 -0.04320441 3.34320441
+ 780 0.07800000 -1888.67011722 -1894.43947564 175.03411433 -0.04400599 3.34400599
+ 790 0.07900000 -1888.67013317 -1894.54590490 178.26254255 -0.04480726 3.34480726
+ 800 0.08000000 -1888.67008771 -1894.40384162 173.95392409 -0.04560792 3.34560792
+ 810 0.08100000 -1888.66999942 -1894.08389023 164.24973325 -0.04640773 3.34640773
+ 820 0.08200000 -1888.66990467 -1893.72313999 153.30795968 -0.04720647 3.34720647
+ 830 0.08300000 -1888.66984387 -1893.46839210 145.58111627 -0.04800393 3.34800393
+ 840 0.08400000 -1888.66984175 -1893.41412556 143.93481091 -0.04879995 3.34879995
+ 850 0.08500000 -1888.66989690 -1893.56426173 148.48805548 -0.04959439 3.34959439
+ 860 0.08600000 -1888.66998242 -1893.83463738 156.68827289 -0.05038713 3.35038713
+ 870 0.08700000 -1888.67006191 -1894.09325064 164.53181916 -0.05117805 3.35117805
+ 880 0.08800000 -1888.67010292 -1894.21712680 168.28880099 -0.05196706 3.35196706
+ 890 0.08900000 -1888.67009013 -1894.14263970 166.02935659 -0.05275408 3.35275408
+ 900 0.09000000 -1888.67002911 -1893.89014590 158.37090593 -0.05353904 3.35353904
+ 910 0.09100000 -1888.66994346 -1893.55535729 148.21649476 -0.05432186 3.35432186
+ 920 0.09200000 -1888.66986545 -1893.27257968 139.63979183 -0.05510247 3.35510247
+ 930 0.09300000 -1888.66982750 -1893.16330910 136.32582951 -0.05588078 3.35588078
+ 940 0.09400000 -1888.66984650 -1893.28643304 140.06065783 -0.05665670 3.35665670
+ 950 0.09500000 -1888.66991522 -1893.61245361 149.94957262 -0.05743015 3.35743015
+ 960 0.09600000 -1888.67000710 -1894.03423941 162.74316510 -0.05820101 3.35820101
+ 970 0.09700000 -1888.67008668 -1894.40848044 174.09469033 -0.05896915 3.35896915
+ 980 0.09800000 -1888.67012456 -1894.61056787 180.22458605 -0.05973444 3.35973444
+ 990 0.09900000 -1888.67010627 -1894.58107679 179.33042341 -0.06049672 3.36049672
+ 1000 0.10000000 -1888.67004000 -1894.34773324 172.25312335 -0.06125581 3.36125581
+Loop time of 1.55992 on 4 procs for 1000 steps with 256 atoms
+
+Performance: 5.539 ns/day, 4.333 hours/ns, 641.059 timesteps/s
+96.5% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 1.3161 | 1.3724 | 1.4128 | 3.0 | 87.98
+Neigh | 0 | 0 | 0 | 0.0 | 0.00
+Comm | 0.11734 | 0.16017 | 0.21617 | 8.9 | 10.27
+Output | 0.0032182 | 0.0051764 | 0.010916 | 4.6 | 0.33
+Modify | 0.0020187 | 0.0022321 | 0.0026002 | 0.5 | 0.14
+Other | | 0.0199 | | | 1.28
+
+Nlocal: 64 ave 64 max 64 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Nghost: 1265 ave 1265 max 1265 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+Neighs: 9328 ave 9328 max 9328 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs: 23648 ave 23648 max 23648 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 94592
+Ave neighs/atom = 369.5
+Neighbor list builds = 0
+Dangerous builds = 0
+Total wall time: 0:00:01
diff --git a/examples/airebo/CH.rebo b/examples/airebo/CH.rebo
new file mode 120000
index 0000000000..9272e57972
--- /dev/null
+++ b/examples/airebo/CH.rebo
@@ -0,0 +1 @@
+../../potentials/CH.rebo
\ No newline at end of file
diff --git a/examples/airebo/in.airebo-0-0 b/examples/airebo/in.airebo-0-0
new file mode 100644
index 0000000000..077da68912
--- /dev/null
+++ b/examples/airebo/in.airebo-0-0
@@ -0,0 +1,22 @@
+# AIREBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+
+replicate 17 16 2
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style airebo 3.0 0 0
+pair_coeff * * CH.airebo C H
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
diff --git a/examples/airebo/in.rebo2 b/examples/airebo/in.rebo2
new file mode 100644
index 0000000000..e06cf462ca
--- /dev/null
+++ b/examples/airebo/in.rebo2
@@ -0,0 +1,22 @@
+# REBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+
+replicate 17 16 2
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style rebo
+pair_coeff * * CH.rebo C H
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
diff --git a/examples/airebo/log.30Apr2019.airebo-0-0.g++.1 b/examples/airebo/log.30Apr2019.airebo-0-0.g++.1
new file mode 100644
index 0000000000..47f5f04a83
--- /dev/null
+++ b/examples/airebo/log.30Apr2019.airebo-0-0.g++.1
@@ -0,0 +1,89 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# AIREBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+ orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
+ 1 by 1 by 1 MPI processor grid
+ reading atoms ...
+ 60 atoms
+ read_data CPU = 0.000232458 secs
+
+replicate 17 16 2
+ orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
+ 1 by 1 by 1 MPI processor grid
+ 32640 atoms
+ replicate CPU = 0.00206327 secs
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style airebo 3.0 0 0
+pair_coeff * * CH.airebo C H
+Reading potential file CH.airebo with DATE: 2011-10-25
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
+Neighbor list info ...
+ update every 1 steps, delay 5 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 6.5
+ ghost atom cutoff = 6.5
+ binsize = 3.25, bins = 22 21 16
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair airebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 34.21 | 34.21 | 34.21 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 300 -138442.83 0 -137177.16 2463.0755
+ 10 179.38448 -137931.29 0 -137174.48 15656.69
+ 20 206.89283 -138047.06 0 -137174.19 -24047.407
+ 30 150.81289 -137807.48 0 -137171.21 -16524.191
+ 40 173.24289 -137902.32 0 -137171.42 -5721.7187
+ 50 151.80722 -137812.37 0 -137171.91 3489.8954
+ 60 199.06038 -138013.7 0 -137173.88 17887.025
+ 70 217.84848 -138093.82 0 -137174.73 -12266.16
+ 80 202.34667 -138029.28 0 -137175.59 -7623.6634
+ 90 194.92367 -137997.12 0 -137174.75 -32277.173
+ 100 185.2078 -137954.64 0 -137173.26 -6888.5104
+Loop time of 9.70367 on 1 procs for 100 steps with 32640 atoms
+
+Performance: 0.445 ns/day, 53.909 hours/ns, 10.305 timesteps/s
+99.5% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 7.2508 | 7.2508 | 7.2508 | 0.0 | 74.72
+Neigh | 2.3573 | 2.3573 | 2.3573 | 0.0 | 24.29
+Comm | 0.03116 | 0.03116 | 0.03116 | 0.0 | 0.32
+Output | 0.0014739 | 0.0014739 | 0.0014739 | 0.0 | 0.02
+Modify | 0.0447 | 0.0447 | 0.0447 | 0.0 | 0.46
+Other | | 0.01819 | | | 0.19
+
+Nlocal: 32640 ave 32640 max 32640 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 26460 ave 26460 max 26460 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 0 ave 0 max 0 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs: 4.90213e+06 ave 4.90213e+06 max 4.90213e+06 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 4902134
+Ave neighs/atom = 150.188
+Neighbor list builds = 9
+Dangerous builds = 0
+Total wall time: 0:00:10
diff --git a/examples/airebo/log.30Apr2019.airebo-0-0.g++.4 b/examples/airebo/log.30Apr2019.airebo-0-0.g++.4
new file mode 100644
index 0000000000..a777e17885
--- /dev/null
+++ b/examples/airebo/log.30Apr2019.airebo-0-0.g++.4
@@ -0,0 +1,89 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# AIREBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+ orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
+ 1 by 1 by 4 MPI processor grid
+ reading atoms ...
+ 60 atoms
+ read_data CPU = 0.000363827 secs
+
+replicate 17 16 2
+ orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
+ 2 by 2 by 1 MPI processor grid
+ 32640 atoms
+ replicate CPU = 0.00244427 secs
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style airebo 3.0 0 0
+pair_coeff * * CH.airebo C H
+Reading potential file CH.airebo with DATE: 2011-10-25
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
+Neighbor list info ...
+ update every 1 steps, delay 5 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 6.5
+ ghost atom cutoff = 6.5
+ binsize = 3.25, bins = 22 21 16
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair airebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.94 | 12.13 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 300 -138442.83 0 -137177.16 2463.0755
+ 10 179.38448 -137931.29 0 -137174.48 15656.69
+ 20 206.89283 -138047.06 0 -137174.19 -24047.407
+ 30 150.81289 -137807.48 0 -137171.21 -16524.191
+ 40 173.24289 -137902.32 0 -137171.42 -5721.7187
+ 50 151.80722 -137812.37 0 -137171.91 3489.8954
+ 60 199.06038 -138013.7 0 -137173.88 17887.025
+ 70 217.84848 -138093.82 0 -137174.73 -12266.16
+ 80 202.34667 -138029.28 0 -137175.59 -7623.6634
+ 90 194.92367 -137997.12 0 -137174.75 -32277.173
+ 100 185.2078 -137954.64 0 -137173.26 -6888.5104
+Loop time of 6.71962 on 4 procs for 100 steps with 32640 atoms
+
+Performance: 0.643 ns/day, 37.331 hours/ns, 14.882 timesteps/s
+96.6% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 4.4598 | 4.6375 | 4.7708 | 5.5 | 69.01
+Neigh | 1.5903 | 1.6452 | 1.7207 | 3.8 | 24.48
+Comm | 0.16708 | 0.37041 | 0.56709 | 25.1 | 5.51
+Output | 0.001061 | 0.0059808 | 0.0090635 | 4.3 | 0.09
+Modify | 0.030086 | 0.03154 | 0.032522 | 0.5 | 0.47
+Other | | 0.02897 | | | 0.43
+
+Nlocal: 8160 ave 8163 max 8157 min
+Histogram: 1 1 0 0 0 0 0 0 1 1
+Nghost: 11605.8 ave 11615 max 11593 min
+Histogram: 1 0 0 0 0 0 2 0 0 1
+Neighs: 0 ave 0 max 0 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs: 1.22553e+06 ave 1.22734e+06 max 1.22455e+06 min
+Histogram: 2 0 0 1 0 0 0 0 0 1
+
+Total # of neighbors = 4902134
+Ave neighs/atom = 150.188
+Neighbor list builds = 9
+Dangerous builds = 0
+Total wall time: 0:00:07
diff --git a/examples/airebo/log.27Nov18.airebo-m.g++.1 b/examples/airebo/log.30Apr2019.airebo-m.g++.1
similarity index 65%
rename from examples/airebo/log.27Nov18.airebo-m.g++.1
rename to examples/airebo/log.30Apr2019.airebo-m.g++.1
index 44d8b9d59c..0115756737 100644
--- a/examples/airebo/log.27Nov18.airebo-m.g++.1
+++ b/examples/airebo/log.30Apr2019.airebo-m.g++.1
@@ -1,36 +1,38 @@
-LAMMPS (27 Nov 2018)
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
using 1 OpenMP thread(s) per MPI task
# AIREBO polyethelene benchmark
-units metal
-atom_style atomic
+units metal
+atom_style atomic
-read_data data.airebo
+read_data data.airebo
orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
1 by 1 by 1 MPI processor grid
reading atoms ...
60 atoms
+ read_data CPU = 0.000225067 secs
-replicate 17 16 2
+replicate 17 16 2
orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
1 by 1 by 1 MPI processor grid
32640 atoms
- Time spent = 0.00141144 secs
+ replicate CPU = 0.00226521 secs
-neighbor 0.5 bin
-neigh_modify delay 5 every 1
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
-pair_style airebo/morse 3.0 1 1
-pair_coeff * * ../../potentials/CH.airebo-m C H
-Reading potential file ../../potentials/CH.airebo-m with DATE: 2016-03-15
+pair_style airebo/morse 3.0 1 1
+pair_coeff * * CH.airebo-m C H
+Reading potential file CH.airebo-m with DATE: 2016-03-15
-velocity all create 300.0 761341
+velocity all create 300.0 761341
-fix 1 all nve
-timestep 0.0005
+fix 1 all nve
+timestep 0.0005
-thermo 10
-run 100
+thermo 10
+run 100
Neighbor list info ...
update every 1 steps, delay 5 steps, check yes
max neighbors/atom: 2000, page size: 100000
@@ -45,7 +47,7 @@ Neighbor list info ...
bin: standard
Per MPI rank memory allocation (min/avg/max) = 106.4 | 106.4 | 106.4 Mbytes
Step Temp E_pair E_mol TotEng Press
- 0 300 -139283.82 0 -138018.14 152.25271
+ 0 300 -139283.82 0 -138018.14 152.25266
10 166.76148 -138718.75 0 -138015.19 17412.343
20 207.7293 -138891.79 0 -138015.4 -19395.339
30 138.54469 -138596.42 0 -138011.92 -11909.248
@@ -55,21 +57,21 @@ Step Temp E_pair E_mol TotEng Press
70 185.72779 -138799.18 0 -138015.61 -10803.744
80 164.28396 -138709.5 0 -138016.4 -1524.7353
90 180.26403 -138776.42 0 -138015.9 -27143.467
- 100 164.05694 -138706.58 0 -138014.44 5157.5516
-Loop time of 64.6107 on 1 procs for 100 steps with 32640 atoms
+ 100 164.05694 -138706.58 0 -138014.44 5157.5517
+Loop time of 111.537 on 1 procs for 100 steps with 32640 atoms
-Performance: 0.067 ns/day, 358.948 hours/ns, 1.548 timesteps/s
+Performance: 0.039 ns/day, 619.650 hours/ns, 0.897 timesteps/s
99.8% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
-Pair | 59.916 | 59.916 | 59.916 | 0.0 | 92.73
-Neigh | 4.6347 | 4.6347 | 4.6347 | 0.0 | 7.17
-Comm | 0.025572 | 0.025572 | 0.025572 | 0.0 | 0.04
-Output | 0.00098896 | 0.00098896 | 0.00098896 | 0.0 | 0.00
-Modify | 0.022327 | 0.022327 | 0.022327 | 0.0 | 0.03
-Other | | 0.01076 | | | 0.02
+Pair | 103.58 | 103.58 | 103.58 | 0.0 | 92.87
+Neigh | 7.8371 | 7.8371 | 7.8371 | 0.0 | 7.03
+Comm | 0.046259 | 0.046259 | 0.046259 | 0.0 | 0.04
+Output | 0.001497 | 0.001497 | 0.001497 | 0.0 | 0.00
+Modify | 0.047151 | 0.047151 | 0.047151 | 0.0 | 0.04
+Other | | 0.02204 | | | 0.02
Nlocal: 32640 ave 32640 max 32640 min
Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -84,4 +86,4 @@ Total # of neighbors = 22210922
Ave neighs/atom = 680.482
Neighbor list builds = 8
Dangerous builds = 0
-Total wall time: 0:01:05
+Total wall time: 0:01:53
diff --git a/examples/airebo/log.27Nov18.airebo-m.g++.4 b/examples/airebo/log.30Apr2019.airebo-m.g++.4
similarity index 64%
rename from examples/airebo/log.27Nov18.airebo-m.g++.4
rename to examples/airebo/log.30Apr2019.airebo-m.g++.4
index a4cc55211b..4139c58387 100644
--- a/examples/airebo/log.27Nov18.airebo-m.g++.4
+++ b/examples/airebo/log.30Apr2019.airebo-m.g++.4
@@ -1,36 +1,38 @@
-LAMMPS (27 Nov 2018)
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
using 1 OpenMP thread(s) per MPI task
# AIREBO polyethelene benchmark
-units metal
-atom_style atomic
+units metal
+atom_style atomic
-read_data data.airebo
+read_data data.airebo
orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
1 by 1 by 4 MPI processor grid
reading atoms ...
60 atoms
+ read_data CPU = 0.000880957 secs
-replicate 17 16 2
+replicate 17 16 2
orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
2 by 2 by 1 MPI processor grid
32640 atoms
- Time spent = 0.000637531 secs
+ replicate CPU = 0.00271702 secs
-neighbor 0.5 bin
-neigh_modify delay 5 every 1
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
-pair_style airebo/morse 3.0 1 1
-pair_coeff * * ../../potentials/CH.airebo-m C H
-Reading potential file ../../potentials/CH.airebo-m with DATE: 2016-03-15
+pair_style airebo/morse 3.0 1 1
+pair_coeff * * CH.airebo-m C H
+Reading potential file CH.airebo-m with DATE: 2016-03-15
-velocity all create 300.0 761341
+velocity all create 300.0 761341
-fix 1 all nve
-timestep 0.0005
+fix 1 all nve
+timestep 0.0005
-thermo 10
-run 100
+thermo 10
+run 100
Neighbor list info ...
update every 1 steps, delay 5 steps, check yes
max neighbors/atom: 2000, page size: 100000
@@ -45,7 +47,7 @@ Neighbor list info ...
bin: standard
Per MPI rank memory allocation (min/avg/max) = 29.37 | 29.75 | 30.13 Mbytes
Step Temp E_pair E_mol TotEng Press
- 0 300 -139283.82 0 -138018.14 152.25271
+ 0 300 -139283.82 0 -138018.14 152.25266
10 166.76148 -138718.75 0 -138015.19 17412.343
20 207.7293 -138891.79 0 -138015.4 -19395.339
30 138.54469 -138596.42 0 -138011.92 -11909.248
@@ -55,21 +57,21 @@ Step Temp E_pair E_mol TotEng Press
70 185.72779 -138799.18 0 -138015.61 -10803.744
80 164.28396 -138709.5 0 -138016.4 -1524.7353
90 180.26403 -138776.42 0 -138015.9 -27143.467
- 100 164.05694 -138706.58 0 -138014.44 5157.5516
-Loop time of 18.1922 on 4 procs for 100 steps with 32640 atoms
+ 100 164.05694 -138706.58 0 -138014.44 5157.5517
+Loop time of 68.9923 on 4 procs for 100 steps with 32640 atoms
-Performance: 0.237 ns/day, 101.068 hours/ns, 5.497 timesteps/s
-98.9% CPU use with 4 MPI tasks x 1 OpenMP threads
+Performance: 0.063 ns/day, 383.290 hours/ns, 1.449 timesteps/s
+96.8% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
-Pair | 15.968 | 16.084 | 16.308 | 3.4 | 88.41
-Neigh | 1.6017 | 1.6334 | 1.7006 | 3.1 | 8.98
-Comm | 0.1603 | 0.45122 | 0.59951 | 26.0 | 2.48
-Output | 0.00042605 | 0.00073195 | 0.0016003 | 0.0 | 0.00
-Modify | 0.0092106 | 0.010544 | 0.014411 | 2.2 | 0.06
-Other | | 0.01193 | | | 0.07
+Pair | 60.09 | 60.276 | 60.515 | 2.1 | 87.37
+Neigh | 6.7521 | 6.8996 | 7.0678 | 4.3 | 10.00
+Comm | 1.5441 | 1.7514 | 2.0838 | 16.9 | 2.54
+Output | 0.0010803 | 0.001972 | 0.0043106 | 3.0 | 0.00
+Modify | 0.031365 | 0.032539 | 0.034404 | 0.7 | 0.05
+Other | | 0.03104 | | | 0.04
Nlocal: 8160 ave 8167 max 8153 min
Histogram: 1 0 1 0 0 0 0 1 0 1
@@ -84,4 +86,4 @@ Total # of neighbors = 22210922
Ave neighs/atom = 680.482
Neighbor list builds = 8
Dangerous builds = 0
-Total wall time: 0:00:18
+Total wall time: 0:01:10
diff --git a/examples/airebo/log.27Nov18.airebo.g++.1 b/examples/airebo/log.30Apr2019.airebo.g++.1
similarity index 63%
rename from examples/airebo/log.27Nov18.airebo.g++.1
rename to examples/airebo/log.30Apr2019.airebo.g++.1
index 3713c8a8f8..61792e9a7a 100644
--- a/examples/airebo/log.27Nov18.airebo.g++.1
+++ b/examples/airebo/log.30Apr2019.airebo.g++.1
@@ -1,36 +1,38 @@
-LAMMPS (27 Nov 2018)
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
using 1 OpenMP thread(s) per MPI task
# AIREBO polyethelene benchmark
-units metal
-atom_style atomic
+units metal
+atom_style atomic
-read_data data.airebo
+read_data data.airebo
orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
1 by 1 by 1 MPI processor grid
reading atoms ...
60 atoms
+ read_data CPU = 0.000217438 secs
-replicate 17 16 2
+replicate 17 16 2
orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
1 by 1 by 1 MPI processor grid
32640 atoms
- Time spent = 0.00144172 secs
+ replicate CPU = 0.00204968 secs
-neighbor 0.5 bin
-neigh_modify delay 5 every 1
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
-pair_style airebo 3.0 1 1
-pair_coeff * * ../../potentials/CH.airebo C H
-Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25
+pair_style airebo 3.0 1 1
+pair_coeff * * CH.airebo C H
+Reading potential file CH.airebo with DATE: 2011-10-25
-velocity all create 300.0 761341
+velocity all create 300.0 761341
-fix 1 all nve
-timestep 0.0005
+fix 1 all nve
+timestep 0.0005
-thermo 10
-run 100
+thermo 10
+run 100
Neighbor list info ...
update every 1 steps, delay 5 steps, check yes
max neighbors/atom: 2000, page size: 100000
@@ -45,31 +47,31 @@ Neighbor list info ...
bin: standard
Per MPI rank memory allocation (min/avg/max) = 106.4 | 106.4 | 106.4 Mbytes
Step Temp E_pair E_mol TotEng Press
- 0 300 -139300.72 0 -138035.04 7988.6647
+ 0 300 -139300.72 0 -138035.04 7988.6646
10 161.34683 -138712.9 0 -138032.19 33228.921
20 208.59504 -138912.79 0 -138032.74 -3211.8806
30 139.7513 -138618.85 0 -138029.25 10878.143
40 142.14562 -138629.02 0 -138029.32 14601.302
- 50 114.23401 -138510.95 0 -138029 24691.125
+ 50 114.23401 -138510.95 0 -138029 24691.124
60 164.92002 -138726 0 -138030.21 35125.541
70 162.15256 -138715.9 0 -138031.79 5658.7946
80 157.16184 -138695.77 0 -138032.72 19824.698
- 90 196.15907 -138860.65 0 -138033.07 -7950.8462
+ 90 196.15907 -138860.65 0 -138033.07 -7950.8463
100 178.31875 -138784.89 0 -138032.57 30997.671
-Loop time of 57.9914 on 1 procs for 100 steps with 32640 atoms
+Loop time of 98.1502 on 1 procs for 100 steps with 32640 atoms
-Performance: 0.074 ns/day, 322.174 hours/ns, 1.724 timesteps/s
-99.9% CPU use with 1 MPI tasks x 1 OpenMP threads
+Performance: 0.044 ns/day, 545.279 hours/ns, 1.019 timesteps/s
+99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
-Pair | 53.275 | 53.275 | 53.275 | 0.0 | 91.87
-Neigh | 4.6548 | 4.6548 | 4.6548 | 0.0 | 8.03
-Comm | 0.026622 | 0.026622 | 0.026622 | 0.0 | 0.05
-Output | 0.00097251 | 0.00097251 | 0.00097251 | 0.0 | 0.00
-Modify | 0.022773 | 0.022773 | 0.022773 | 0.0 | 0.04
-Other | | 0.01089 | | | 0.02
+Pair | 90.237 | 90.237 | 90.237 | 0.0 | 91.94
+Neigh | 7.796 | 7.796 | 7.796 | 0.0 | 7.94
+Comm | 0.048884 | 0.048884 | 0.048884 | 0.0 | 0.05
+Output | 0.0016053 | 0.0016053 | 0.0016053 | 0.0 | 0.00
+Modify | 0.045511 | 0.045511 | 0.045511 | 0.0 | 0.05
+Other | | 0.0217 | | | 0.02
Nlocal: 32640 ave 32640 max 32640 min
Histogram: 1 0 0 0 0 0 0 0 0 0
@@ -84,4 +86,4 @@ Total # of neighbors = 22217840
Ave neighs/atom = 680.694
Neighbor list builds = 8
Dangerous builds = 0
-Total wall time: 0:00:59
+Total wall time: 0:01:39
diff --git a/examples/airebo/log.27Nov18.airebo.g++.4 b/examples/airebo/log.30Apr2019.airebo.g++.4
similarity index 63%
rename from examples/airebo/log.27Nov18.airebo.g++.4
rename to examples/airebo/log.30Apr2019.airebo.g++.4
index 335690684a..9857d9c741 100644
--- a/examples/airebo/log.27Nov18.airebo.g++.4
+++ b/examples/airebo/log.30Apr2019.airebo.g++.4
@@ -1,36 +1,38 @@
-LAMMPS (27 Nov 2018)
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
using 1 OpenMP thread(s) per MPI task
# AIREBO polyethelene benchmark
-units metal
-atom_style atomic
+units metal
+atom_style atomic
-read_data data.airebo
+read_data data.airebo
orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
1 by 1 by 4 MPI processor grid
reading atoms ...
60 atoms
+ read_data CPU = 0.000266314 secs
-replicate 17 16 2
+replicate 17 16 2
orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
2 by 2 by 1 MPI processor grid
32640 atoms
- Time spent = 0.00262594 secs
+ replicate CPU = 0.00146151 secs
-neighbor 0.5 bin
-neigh_modify delay 5 every 1
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
-pair_style airebo 3.0 1 1
-pair_coeff * * ../../potentials/CH.airebo C H
-Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25
+pair_style airebo 3.0 1 1
+pair_coeff * * CH.airebo C H
+Reading potential file CH.airebo with DATE: 2011-10-25
-velocity all create 300.0 761341
+velocity all create 300.0 761341
-fix 1 all nve
-timestep 0.0005
+fix 1 all nve
+timestep 0.0005
-thermo 10
-run 100
+thermo 10
+run 100
Neighbor list info ...
update every 1 steps, delay 5 steps, check yes
max neighbors/atom: 2000, page size: 100000
@@ -45,31 +47,31 @@ Neighbor list info ...
bin: standard
Per MPI rank memory allocation (min/avg/max) = 29.37 | 29.75 | 30.13 Mbytes
Step Temp E_pair E_mol TotEng Press
- 0 300 -139300.72 0 -138035.04 7988.6647
+ 0 300 -139300.72 0 -138035.04 7988.6646
10 161.34683 -138712.9 0 -138032.19 33228.921
20 208.59504 -138912.79 0 -138032.74 -3211.8806
30 139.7513 -138618.85 0 -138029.25 10878.143
40 142.14562 -138629.02 0 -138029.32 14601.302
- 50 114.23401 -138510.95 0 -138029 24691.125
+ 50 114.23401 -138510.95 0 -138029 24691.124
60 164.92002 -138726 0 -138030.21 35125.541
70 162.15256 -138715.9 0 -138031.79 5658.7946
80 157.16184 -138695.77 0 -138032.72 19824.698
- 90 196.15907 -138860.65 0 -138033.07 -7950.8462
+ 90 196.15907 -138860.65 0 -138033.07 -7950.8463
100 178.31875 -138784.89 0 -138032.57 30997.671
-Loop time of 16.4395 on 4 procs for 100 steps with 32640 atoms
+Loop time of 60.4943 on 4 procs for 100 steps with 32640 atoms
-Performance: 0.263 ns/day, 91.331 hours/ns, 6.083 timesteps/s
-98.5% CPU use with 4 MPI tasks x 1 OpenMP threads
+Performance: 0.071 ns/day, 336.080 hours/ns, 1.653 timesteps/s
+97.7% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
-Pair | 14.263 | 14.349 | 14.483 | 2.3 | 87.28
-Neigh | 1.6071 | 1.6283 | 1.6636 | 1.7 | 9.90
-Comm | 0.26261 | 0.43435 | 0.52323 | 16.1 | 2.64
-Output | 0.00042105 | 0.0007121 | 0.001538 | 0.0 | 0.00
-Modify | 0.00898 | 0.009112 | 0.0093675 | 0.2 | 0.06
-Other | | 0.0184 | | | 0.11
+Pair | 51.737 | 52.46 | 52.86 | 6.2 | 86.72
+Neigh | 6.5823 | 6.6605 | 6.726 | 2.0 | 11.01
+Comm | 0.92426 | 1.3125 | 2.0111 | 37.0 | 2.17
+Output | 0.0010669 | 0.0019811 | 0.0043974 | 3.1 | 0.00
+Modify | 0.030364 | 0.031523 | 0.032495 | 0.5 | 0.05
+Other | | 0.028 | | | 0.05
Nlocal: 8160 ave 8174 max 8146 min
Histogram: 1 0 1 0 0 0 0 1 0 1
@@ -84,4 +86,4 @@ Total # of neighbors = 22217840
Ave neighs/atom = 680.694
Neighbor list builds = 8
Dangerous builds = 0
-Total wall time: 0:00:16
+Total wall time: 0:01:01
diff --git a/examples/airebo/log.30Apr2019.rebo2.g++.1 b/examples/airebo/log.30Apr2019.rebo2.g++.1
new file mode 100644
index 0000000000..7cd3d65294
--- /dev/null
+++ b/examples/airebo/log.30Apr2019.rebo2.g++.1
@@ -0,0 +1,89 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# REBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+ orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
+ 1 by 1 by 1 MPI processor grid
+ reading atoms ...
+ 60 atoms
+ read_data CPU = 0.000190735 secs
+
+replicate 17 16 2
+ orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
+ 1 by 1 by 1 MPI processor grid
+ 32640 atoms
+ replicate CPU = 0.00197148 secs
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style rebo
+pair_coeff * * CH.rebo C H
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
+Neighbor list info ...
+ update every 1 steps, delay 5 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 6.5
+ ghost atom cutoff = 6.5
+ binsize = 3.25, bins = 22 21 16
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 34.21 | 34.21 | 34.21 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 300 -138442.83 0 -137177.16 2463.0748
+ 10 179.37985 -137931.27 0 -137174.48 15655.936
+ 20 206.87654 -138046.99 0 -137174.19 -24042.627
+ 30 150.80122 -137807.43 0 -137171.21 -16524.118
+ 40 173.24945 -137902.35 0 -137171.42 -5716.9119
+ 50 151.80455 -137812.36 0 -137171.91 3480.4584
+ 60 199.08777 -138013.82 0 -137173.88 17881.372
+ 70 217.85748 -138093.86 0 -137174.73 -12270.999
+ 80 202.37482 -138029.39 0 -137175.59 -7622.7319
+ 90 194.90628 -137997.05 0 -137174.75 -32267.471
+ 100 185.17818 -137954.51 0 -137173.26 -6901.7499
+Loop time of 9.44819 on 1 procs for 100 steps with 32640 atoms
+
+Performance: 0.457 ns/day, 52.490 hours/ns, 10.584 timesteps/s
+99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 7.037 | 7.037 | 7.037 | 0.0 | 74.48
+Neigh | 2.3182 | 2.3182 | 2.3182 | 0.0 | 24.54
+Comm | 0.029898 | 0.029898 | 0.029898 | 0.0 | 0.32
+Output | 0.0014331 | 0.0014331 | 0.0014331 | 0.0 | 0.02
+Modify | 0.043851 | 0.043851 | 0.043851 | 0.0 | 0.46
+Other | | 0.01774 | | | 0.19
+
+Nlocal: 32640 ave 32640 max 32640 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 26460 ave 26460 max 26460 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 0 ave 0 max 0 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+FullNghs: 4.90213e+06 ave 4.90213e+06 max 4.90213e+06 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 4902134
+Ave neighs/atom = 150.188
+Neighbor list builds = 9
+Dangerous builds = 0
+Total wall time: 0:00:09
diff --git a/examples/airebo/log.30Apr2019.rebo2.g++.4 b/examples/airebo/log.30Apr2019.rebo2.g++.4
new file mode 100644
index 0000000000..14086fbf40
--- /dev/null
+++ b/examples/airebo/log.30Apr2019.rebo2.g++.4
@@ -0,0 +1,89 @@
+LAMMPS (30 Apr 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# REBO polyethelene benchmark
+
+units metal
+atom_style atomic
+
+read_data data.airebo
+ orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579)
+ 1 by 1 by 4 MPI processor grid
+ reading atoms ...
+ 60 atoms
+ read_data CPU = 0.000682831 secs
+
+replicate 17 16 2
+ orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158)
+ 2 by 2 by 1 MPI processor grid
+ 32640 atoms
+ replicate CPU = 0.00221777 secs
+
+neighbor 0.5 bin
+neigh_modify delay 5 every 1
+
+pair_style rebo
+pair_coeff * * CH.rebo C H
+Reading potential file CH.rebo with DATE: 2018-7-3
+
+velocity all create 300.0 761341
+
+fix 1 all nve
+timestep 0.0005
+
+thermo 10
+run 100
+Neighbor list info ...
+ update every 1 steps, delay 5 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 6.5
+ ghost atom cutoff = 6.5
+ binsize = 3.25, bins = 22 21 16
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair rebo, perpetual
+ attributes: full, newton on, ghost
+ pair build: full/bin/ghost
+ stencil: full/ghost/bin/3d
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.94 | 12.13 Mbytes
+Step Temp E_pair E_mol TotEng Press
+ 0 300 -138442.83 0 -137177.16 2463.0748
+ 10 179.37985 -137931.27 0 -137174.48 15655.936
+ 20 206.87654 -138046.99 0 -137174.19 -24042.627
+ 30 150.80122 -137807.43 0 -137171.21 -16524.118
+ 40 173.24945 -137902.35 0 -137171.42 -5716.9119
+ 50 151.80455 -137812.36 0 -137171.91 3480.4584
+ 60 199.08777 -138013.82 0 -137173.88 17881.372
+ 70 217.85748 -138093.86 0 -137174.73 -12270.999
+ 80 202.37482 -138029.39 0 -137175.59 -7622.7319
+ 90 194.90628 -137997.05 0 -137174.75 -32267.471
+ 100 185.17818 -137954.51 0 -137173.26 -6901.7499
+Loop time of 6.35645 on 4 procs for 100 steps with 32640 atoms
+
+Performance: 0.680 ns/day, 35.314 hours/ns, 15.732 timesteps/s
+99.0% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 4.4335 | 4.5041 | 4.56 | 2.1 | 70.86
+Neigh | 1.5332 | 1.5919 | 1.6466 | 3.6 | 25.04
+Comm | 0.098299 | 0.20854 | 0.26277 | 14.2 | 3.28
+Output | 0.0011072 | 0.0018047 | 0.0037503 | 2.6 | 0.03
+Modify | 0.028811 | 0.030358 | 0.031516 | 0.6 | 0.48
+Other | | 0.01977 | | | 0.31
+
+Nlocal: 8160 ave 8163 max 8157 min
+Histogram: 1 1 0 0 0 0 0 0 1 1
+Nghost: 11605.8 ave 11615 max 11593 min
+Histogram: 1 0 0 0 0 0 2 0 0 1
+Neighs: 0 ave 0 max 0 min
+Histogram: 4 0 0 0 0 0 0 0 0 0
+FullNghs: 1.22553e+06 ave 1.22735e+06 max 1.22455e+06 min
+Histogram: 2 0 0 1 0 0 0 0 0 1
+
+Total # of neighbors = 4902134
+Ave neighs/atom = 150.188
+Neighbor list builds = 9
+Dangerous builds = 0
+Total wall time: 0:00:06
diff --git a/examples/granular/in.pour.drum b/examples/granular/in.pour.drum
new file mode 100644
index 0000000000..c30f30b377
--- /dev/null
+++ b/examples/granular/in.pour.drum
@@ -0,0 +1,98 @@
+# pour two types of particles (cohesive and non-cohesive) into cylinder
+# 'turn' cylinder by changing direction of gravity, then rotate it.
+# This simulates a rotating drum powder characterization experiment.
+
+variable name string rotating_drum_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 30
+variable boxy equal 30
+variable boxz equal 50
+
+variable drum_rad equal ${boxx}*0.5
+variable drum_height equal 20
+
+variable xc equal 0.5*${boxx}
+variable yc equal 0.5*${boxx}
+variable zc equal 0.5*${boxz}
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dhi equal 2.0*${rhi}
+
+variable cyl_rad_inner equal ${drum_rad}-1.1*${rhi}
+
+variable dens equal 1.0
+
+variable skin equal 0.4*${rhi}
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+create_box 2 boxreg
+change_box all boundary p p f
+comm_modify vel yes
+
+variable theta equal 0
+
+region curved_wall cylinder z ${xc} ${yc} ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane ${xc} ${yc} 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+
+region insreg cylinder z ${xc} ${yc} ${cyl_rad_inner} ${drum_height} ${boxz}
+
+fix 0 all balance 100 1.0 shift xy 5 1.1
+fix 1 all nve/sphere
+fix grav all gravity 10 vector 0 0 -1
+fix ins1 all pour 2000 1 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * hertz/material 1e5 0.2 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji
+pair_coeff 2 2 jkr 1e5 0.1 0.3 50 tangential mindlin NULL 1.0 0.5 rolling sds 1e3 1e3 0.1 twisting marshall damping tsuji
+
+fix 3 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region curved_wall
+fix 4 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region bottom_wall
+
+thermo_style custom step atoms ke v_theta
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+#dump 1 all custom 100 ${name}.dump id type radius mass x y z
+
+#For removal later
+compute 1 all property/atom radius
+variable zmax atom z+c_1>0.5*${drum_height}
+group delgroup dynamic all var zmax every 10000
+
+run 2000
+
+#Remove any particles that are above z > 0.5*drum_height
+delete_atoms group delgroup
+
+#Add top lid
+region top_wall plane ${xc} ${yc} ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+fix 5 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region top_wall
+
+# 'Turn' drum by switching the direction of gravity
+unfix grav
+fix grav all gravity 10 vector 0 -1 0
+
+variable theta equal 2*PI*elapsed/20000.0
+run 3000
diff --git a/examples/granular/in.pour.flatwall b/examples/granular/in.pour.flatwall
new file mode 100644
index 0000000000..cfa70e2d84
--- /dev/null
+++ b/examples/granular/in.pour.flatwall
@@ -0,0 +1,67 @@
+# pour two types of particles (cohesive and non-cohesive) on flat wall
+
+variable name string pour_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 20
+variable boxy equal 20
+variable boxz equal 30
+
+variable xc1 equal 0.3*${boxx}
+variable xc2 equal 0.7*${boxx}
+variable yc equal 0.5*${boxy}
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dhi equal 2.0*${rhi}
+
+variable dens equal 1.0
+
+variable skin equal 0.3*${rhi}
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+create_box 2 boxreg
+change_box all boundary p p f
+
+comm_modify vel yes
+
+region insreg1 cylinder z ${xc1} ${yc} 5 15 ${boxz}
+region insreg2 cylinder z ${xc2} ${yc} 5 15 ${boxz}
+
+fix 1 all nve/sphere
+fix grav all gravity 10.0 vector 0 0 -1
+fix ins1 all pour 1500 1 3123 region insreg1 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * jkr 1000.0 50.0 0.3 10 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
+pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall
+
+fix 3 all wall/gran granular hertz/material 1e5 1e3 0.3 tangential mindlin NULL 1.0 0.5 zplane 0 NULL
+
+thermo_style custom step cpu atoms ke
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+#dump 1 all custom 100 ${name}.dump id type radius mass x y z
+
+run 5000
diff --git a/examples/granular/log.29Mar19.pour.drum.g++.1 b/examples/granular/log.29Mar19.pour.drum.g++.1
new file mode 100644
index 0000000000..71232ed8dd
--- /dev/null
+++ b/examples/granular/log.29Mar19.pour.drum.g++.1
@@ -0,0 +1,271 @@
+LAMMPS (29 Mar 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# pour two types of particles (cohesive and non-cohesive) into cylinder
+# 'turn' cylinder by changing direction of gravity, then rotate it.
+# This simulates a rotating drum powder characterization experiment.
+
+variable name string rotating_drum_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 30
+variable boxy equal 30
+variable boxz equal 50
+
+variable drum_rad equal ${boxx}*0.5
+variable drum_rad equal 30*0.5
+variable drum_height equal 20
+
+variable xc equal 0.5*${boxx}
+variable xc equal 0.5*30
+variable yc equal 0.5*${boxx}
+variable yc equal 0.5*30
+variable zc equal 0.5*${boxz}
+variable zc equal 0.5*50
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dlo equal 2.0*0.25
+variable dhi equal 2.0*${rhi}
+variable dhi equal 2.0*0.5
+
+variable cyl_rad_inner equal ${drum_rad}-1.1*${rhi}
+variable cyl_rad_inner equal 15-1.1*${rhi}
+variable cyl_rad_inner equal 15-1.1*0.5
+
+variable dens equal 1.0
+
+variable skin equal 0.4*${rhi}
+variable skin equal 0.4*0.5
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+region boxreg block 0 30 0 ${boxy} 0 ${boxz}
+region boxreg block 0 30 0 30 0 ${boxz}
+region boxreg block 0 30 0 30 0 50
+create_box 2 boxreg
+Created orthogonal box = (0 0 0) to (30 30 50)
+ 1 by 1 by 1 MPI processor grid
+change_box all boundary p p f
+comm_modify vel yes
+
+variable theta equal 0
+
+region curved_wall cylinder z ${xc} ${yc} ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 ${yc} ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta 15 ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta 15 15 0 0 0 1
+region bottom_wall plane ${xc} ${yc} 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 ${yc} 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta 15 ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta 15 15 0 0 0 1
+
+region insreg cylinder z ${xc} ${yc} ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 ${yc} ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 15 ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 15 14.45 ${drum_height} ${boxz}
+region insreg cylinder z 15 15 14.45 20 ${boxz}
+region insreg cylinder z 15 15 14.45 20 50
+
+fix 0 all balance 100 1.0 shift xy 5 1.1
+fix 1 all nve/sphere
+fix grav all gravity 10 vector 0 0 -1
+fix ins1 all pour 2000 1 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens 1 ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens 1 1
+Particle insertion: 9396 every 490 steps, 2000 by step 1
+fix ins2 all pour 2000 2 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens 1 ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens 1 1
+Particle insertion: 9396 every 490 steps, 2000 by step 1
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neighbor 0.2 bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * hertz/material 1e5 0.2 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji
+pair_coeff 2 2 jkr 1e5 0.1 0.3 50 tangential mindlin NULL 1.0 0.5 rolling sds 1e3 1e3 0.1 twisting marshall damping tsuji
+
+fix 3 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region curved_wall
+fix 4 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region bottom_wall
+
+thermo_style custom step atoms ke v_theta
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+dump 1 all custom 100 ${name}.dump id type radius mass x y z
+dump 1 all custom 100 rotating_drum_two_types.dump id type radius mass x y z
+
+#For removal later
+compute 1 all property/atom radius
+variable zmax atom z+c_1>0.5*${drum_height}
+variable zmax atom z+c_1>0.5*20
+group delgroup dynamic all var zmax every 10000
+dynamic group delgroup defined
+
+run 2000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 1.2
+ ghost atom cutoff = 1.2
+ binsize = 0.6, bins = 50 50 84
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair granular, perpetual
+ attributes: half, newton on, size, history
+ pair build: half/size/bin/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 13.02 | 13.02 | 13.02 Mbytes
+Step Atoms KinEng v_theta
+ 0 0 -0 0
+ 100 4000 -0 0
+ 200 4000 -0 0
+ 300 4000 -0 0
+ 400 4000 -0 0
+ 500 4000 -0 0
+ 600 4000 -0 0
+ 700 4000 -0 0
+ 800 4000 -0 0
+ 900 4000 -0 0
+ 1000 4000 -0 0
+ 1100 4000 -0 0
+ 1200 4000 -0 0
+ 1300 4000 -0 0
+ 1400 4000 -0 0
+ 1500 4000 -0 0
+ 1600 4000 -0 0
+ 1700 4000 -0 0
+ 1800 4000 -0 0
+ 1900 4000 -0 0
+ 2000 4000 -0 0
+Loop time of 3.54461 on 1 procs for 2000 steps with 4000 atoms
+
+Performance: 48750.057 tau/day, 564.237 timesteps/s
+99.5% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 0.61949 | 0.61949 | 0.61949 | 0.0 | 17.48
+Neigh | 1.2492 | 1.2492 | 1.2492 | 0.0 | 35.24
+Comm | 0.046404 | 0.046404 | 0.046404 | 0.0 | 1.31
+Output | 0.15901 | 0.15901 | 0.15901 | 0.0 | 4.49
+Modify | 1.4165 | 1.4165 | 1.4165 | 0.0 | 39.96
+Other | | 0.05391 | | | 1.52
+
+Nlocal: 4000 ave 4000 max 4000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 166 ave 166 max 166 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 8195 ave 8195 max 8195 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 8195
+Ave neighs/atom = 2.04875
+Neighbor list builds = 1004
+Dangerous builds = 3
+
+#Remove any particles that are above z > 0.5*drum_height
+delete_atoms group delgroup
+Deleted 0 atoms, new total = 4000
+
+#Add top lid
+region top_wall plane ${xc} ${yc} ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 ${yc} ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta 15 ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta 15 15 0 0 0 1
+fix 5 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region top_wall
+
+# 'Turn' drum by switching the direction of gravity
+unfix grav
+fix grav all gravity 10 vector 0 -1 0
+
+variable theta equal 2*PI*elapsed/20000.0
+run 3000
+Per MPI rank memory allocation (min/avg/max) = 24.81 | 24.81 | 24.81 Mbytes
+Step Atoms KinEng v_theta
+ 2000 4000 64.333531 0
+ 2100 4000 106.69182 0.031415927
+ 2200 4000 121.8461 0.062831853
+ 2300 4000 88.767952 0.09424778
+ 2400 4000 82.850721 0.12566371
+ 2500 4000 91.683284 0.15707963
+ 2600 4000 31.56344 0.18849556
+ 2700 4000 4.5697672 0.21991149
+ 2800 4000 3.9879051 0.25132741
+ 2900 4000 4.4394235 0.28274334
+ 3000 4000 5.1212931 0.31415927
+ 3100 4000 5.8608892 0.34557519
+ 3200 4000 6.600714 0.37699112
+ 3300 4000 7.3497851 0.40840704
+ 3400 4000 8.0490988 0.43982297
+ 3500 4000 8.6712396 0.4712389
+ 3600 4000 9.1328667 0.50265482
+ 3700 4000 9.4683561 0.53407075
+ 3800 4000 9.5878145 0.56548668
+ 3900 4000 9.387745 0.5969026
+ 4000 4000 8.9117631 0.62831853
+ 4100 4000 8.2344368 0.65973446
+ 4200 4000 7.5335088 0.69115038
+ 4300 4000 6.8426179 0.72256631
+ 4400 4000 6.0567247 0.75398224
+ 4500 4000 5.4166132 0.78539816
+ 4600 4000 4.6012409 0.81681409
+ 4700 4000 3.8314982 0.84823002
+ 4800 4000 3.1916415 0.87964594
+ 4900 4000 2.7833964 0.91106187
+ 5000 4000 2.5051362 0.9424778
+Loop time of 11.9545 on 1 procs for 3000 steps with 4000 atoms
+
+Performance: 21682.142 tau/day, 250.951 timesteps/s
+99.7% CPU use with 1 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 4.8291 | 4.8291 | 4.8291 | 0.0 | 40.40
+Neigh | 2.7489 | 2.7489 | 2.7489 | 0.0 | 22.99
+Comm | 0.071249 | 0.071249 | 0.071249 | 0.0 | 0.60
+Output | 0.20547 | 0.20547 | 0.20547 | 0.0 | 1.72
+Modify | 4.0179 | 4.0179 | 4.0179 | 0.0 | 33.61
+Other | | 0.0819 | | | 0.69
+
+Nlocal: 4000 ave 4000 max 4000 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Nghost: 322 ave 322 max 322 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+Neighs: 14849 ave 14849 max 14849 min
+Histogram: 1 0 0 0 0 0 0 0 0 0
+
+Total # of neighbors = 14849
+Ave neighs/atom = 3.71225
+Neighbor list builds = 1290
+Dangerous builds = 672
+Total wall time: 0:00:15
diff --git a/examples/granular/log.29Mar19.pour.drum.g++.4 b/examples/granular/log.29Mar19.pour.drum.g++.4
new file mode 100644
index 0000000000..ccd4365a38
--- /dev/null
+++ b/examples/granular/log.29Mar19.pour.drum.g++.4
@@ -0,0 +1,271 @@
+LAMMPS (29 Mar 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# pour two types of particles (cohesive and non-cohesive) into cylinder
+# 'turn' cylinder by changing direction of gravity, then rotate it.
+# This simulates a rotating drum powder characterization experiment.
+
+variable name string rotating_drum_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 30
+variable boxy equal 30
+variable boxz equal 50
+
+variable drum_rad equal ${boxx}*0.5
+variable drum_rad equal 30*0.5
+variable drum_height equal 20
+
+variable xc equal 0.5*${boxx}
+variable xc equal 0.5*30
+variable yc equal 0.5*${boxx}
+variable yc equal 0.5*30
+variable zc equal 0.5*${boxz}
+variable zc equal 0.5*50
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dlo equal 2.0*0.25
+variable dhi equal 2.0*${rhi}
+variable dhi equal 2.0*0.5
+
+variable cyl_rad_inner equal ${drum_rad}-1.1*${rhi}
+variable cyl_rad_inner equal 15-1.1*${rhi}
+variable cyl_rad_inner equal 15-1.1*0.5
+
+variable dens equal 1.0
+
+variable skin equal 0.4*${rhi}
+variable skin equal 0.4*0.5
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+region boxreg block 0 30 0 ${boxy} 0 ${boxz}
+region boxreg block 0 30 0 30 0 ${boxz}
+region boxreg block 0 30 0 30 0 50
+create_box 2 boxreg
+Created orthogonal box = (0 0 0) to (30 30 50)
+ 2 by 2 by 1 MPI processor grid
+change_box all boundary p p f
+comm_modify vel yes
+
+variable theta equal 0
+
+region curved_wall cylinder z ${xc} ${yc} ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 ${yc} ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 ${drum_rad} 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 ${drum_height} side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta 15 ${yc} 0 0 0 1
+region curved_wall cylinder z 15 15 15 0 20 side in rotate v_theta 15 15 0 0 0 1
+region bottom_wall plane ${xc} ${yc} 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 ${yc} 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta 15 ${yc} 0 0 0 1
+region bottom_wall plane 15 15 0 0 0 1 side in rotate v_theta 15 15 0 0 0 1
+
+region insreg cylinder z ${xc} ${yc} ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 ${yc} ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 15 ${cyl_rad_inner} ${drum_height} ${boxz}
+region insreg cylinder z 15 15 14.45 ${drum_height} ${boxz}
+region insreg cylinder z 15 15 14.45 20 ${boxz}
+region insreg cylinder z 15 15 14.45 20 50
+
+fix 0 all balance 100 1.0 shift xy 5 1.1
+fix 1 all nve/sphere
+fix grav all gravity 10 vector 0 0 -1
+fix ins1 all pour 2000 1 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens ${dens} ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens 1 ${dens}
+fix ins1 all pour 2000 1 1234 region insreg diam range 0.5 1 dens 1 1
+Particle insertion: 9396 every 490 steps, 2000 by step 1
+fix ins2 all pour 2000 2 1234 region insreg diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens ${dens} ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens 1 ${dens}
+fix ins2 all pour 2000 2 1234 region insreg diam range 0.5 1 dens 1 1
+Particle insertion: 9396 every 490 steps, 2000 by step 1
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neighbor 0.2 bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * hertz/material 1e5 0.2 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji
+pair_coeff 2 2 jkr 1e5 0.1 0.3 50 tangential mindlin NULL 1.0 0.5 rolling sds 1e3 1e3 0.1 twisting marshall damping tsuji
+
+fix 3 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region curved_wall
+fix 4 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region bottom_wall
+
+thermo_style custom step atoms ke v_theta
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+dump 1 all custom 100 ${name}.dump id type radius mass x y z
+dump 1 all custom 100 rotating_drum_two_types.dump id type radius mass x y z
+
+#For removal later
+compute 1 all property/atom radius
+variable zmax atom z+c_1>0.5*${drum_height}
+variable zmax atom z+c_1>0.5*20
+group delgroup dynamic all var zmax every 10000
+dynamic group delgroup defined
+
+run 2000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 1.2
+ ghost atom cutoff = 1.2
+ binsize = 0.6, bins = 50 50 84
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair granular, perpetual
+ attributes: half, newton on, size, history
+ pair build: half/size/bin/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 12.25 | 12.25 | 12.25 Mbytes
+Step Atoms KinEng v_theta
+ 0 0 -0 0
+ 100 4000 -0 0
+ 200 4000 -0 0
+ 300 4000 -0 0
+ 400 4000 -0 0
+ 500 4000 -0 0
+ 600 4000 -0 0
+ 700 4000 -0 0
+ 800 4000 -0 0
+ 900 4000 -0 0
+ 1000 4000 -0 0
+ 1100 4000 -0 0
+ 1200 4000 -0 0
+ 1300 4000 -0 0
+ 1400 4000 -0 0
+ 1500 4000 -0 0
+ 1600 4000 -0 0
+ 1700 4000 -0 0
+ 1800 4000 -0 0
+ 1900 4000 -0 0
+ 2000 4000 -0 0
+Loop time of 2.0709 on 4 procs for 2000 steps with 4000 atoms
+
+Performance: 83442.024 tau/day, 965.764 timesteps/s
+97.7% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 0.24679 | 0.26336 | 0.28853 | 3.0 | 12.72
+Neigh | 0.52279 | 0.5332 | 0.53858 | 0.9 | 25.75
+Comm | 0.17418 | 0.20253 | 0.23266 | 4.7 | 9.78
+Output | 0.092897 | 0.093531 | 0.09515 | 0.3 | 4.52
+Modify | 0.88151 | 0.89571 | 0.90582 | 0.9 | 43.25
+Other | | 0.08257 | | | 3.99
+
+Nlocal: 1000 ave 1001 max 999 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Nghost: 267.75 ave 276 max 262 min
+Histogram: 1 0 1 0 1 0 0 0 0 1
+Neighs: 2031.5 ave 2091 max 1958 min
+Histogram: 1 0 0 0 1 0 0 1 0 1
+
+Total # of neighbors = 8126
+Ave neighs/atom = 2.0315
+Neighbor list builds = 1004
+Dangerous builds = 3
+
+#Remove any particles that are above z > 0.5*drum_height
+delete_atoms group delgroup
+Deleted 0 atoms, new total = 4000
+
+#Add top lid
+region top_wall plane ${xc} ${yc} ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 ${yc} ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 ${drum_height} 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta ${xc} ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta 15 ${yc} 0 0 0 1
+region top_wall plane 15 15 20 0 0 -1 side in rotate v_theta 15 15 0 0 0 1
+fix 5 all wall/gran/region granular hertz/material 1e5 0.1 0.3 tangential mindlin NULL 1.0 0.5 damping tsuji region top_wall
+
+# 'Turn' drum by switching the direction of gravity
+unfix grav
+fix grav all gravity 10 vector 0 -1 0
+
+variable theta equal 2*PI*elapsed/20000.0
+run 3000
+Per MPI rank memory allocation (min/avg/max) = 21.6 | 22.6 | 23.82 Mbytes
+Step Atoms KinEng v_theta
+ 2000 4000 64.255821 0
+ 2100 4000 106.47082 0.031415927
+ 2200 4000 121.52634 0.062831853
+ 2300 4000 87.748818 0.09424778
+ 2400 4000 82.712784 0.12566371
+ 2500 4000 90.618713 0.15707963
+ 2600 4000 30.096031 0.18849556
+ 2700 4000 4.0838611 0.21991149
+ 2800 4000 3.7485959 0.25132741
+ 2900 4000 4.2159774 0.28274334
+ 3000 4000 4.8730048 0.31415927
+ 3100 4000 5.6109465 0.34557519
+ 3200 4000 6.4290528 0.37699112
+ 3300 4000 7.2699677 0.40840704
+ 3400 4000 8.0895944 0.43982297
+ 3500 4000 8.7222781 0.4712389
+ 3600 4000 9.133205 0.50265482
+ 3700 4000 9.3404584 0.53407075
+ 3800 4000 9.3359844 0.56548668
+ 3900 4000 9.0916854 0.5969026
+ 4000 4000 8.5596424 0.62831853
+ 4100 4000 7.9734883 0.65973446
+ 4200 4000 7.2154383 0.69115038
+ 4300 4000 6.7039232 0.72256631
+ 4400 4000 6.1542738 0.75398224
+ 4500 4000 5.4049454 0.78539816
+ 4600 4000 4.4603192 0.81681409
+ 4700 4000 3.6197985 0.84823002
+ 4800 4000 2.9895571 0.87964594
+ 4900 4000 2.5314553 0.91106187
+ 5000 4000 2.2645533 0.9424778
+Loop time of 6.64209 on 4 procs for 3000 steps with 4000 atoms
+
+Performance: 39023.861 tau/day, 451.665 timesteps/s
+96.6% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 1.8376 | 2.126 | 2.3131 | 12.6 | 32.01
+Neigh | 0.97762 | 1.0518 | 1.1337 | 5.4 | 15.84
+Comm | 0.53699 | 0.84265 | 1.2325 | 27.6 | 12.69
+Output | 0.13922 | 0.14159 | 0.14388 | 0.4 | 2.13
+Modify | 1.8815 | 2.1026 | 2.3368 | 11.2 | 31.66
+Other | | 0.3774 | | | 5.68
+
+Nlocal: 1000 ave 1256 max 744 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Nghost: 579.5 ave 789 max 498 min
+Histogram: 2 1 0 0 0 0 0 0 0 1
+Neighs: 3696.25 ave 4853 max 2590 min
+Histogram: 2 0 0 0 0 0 0 0 1 1
+
+Total # of neighbors = 14785
+Ave neighs/atom = 3.69625
+Neighbor list builds = 1230
+Dangerous builds = 676
+Total wall time: 0:00:08
diff --git a/examples/granular/log.29Mar19.pour.flatwall.g++.1 b/examples/granular/log.29Mar19.pour.flatwall.g++.1
new file mode 100644
index 0000000000..daab5efce3
--- /dev/null
+++ b/examples/granular/log.29Mar19.pour.flatwall.g++.1
@@ -0,0 +1,134 @@
+LAMMPS (29 Mar 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# pour two types of particles (cohesive and non-cohesive) on flat wall
+
+variable name string pour_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 20
+variable boxy equal 20
+variable boxz equal 30
+
+variable xc1 equal 0.3*${boxx}
+variable xc1 equal 0.3*20
+variable xc2 equal 0.7*${boxx}
+variable xc2 equal 0.7*20
+variable yc equal 0.5*${boxy}
+variable yc equal 0.5*20
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dlo equal 2.0*0.25
+variable dhi equal 2.0*${rhi}
+variable dhi equal 2.0*0.5
+
+variable dens equal 1.0
+
+variable skin equal 0.3*${rhi}
+variable skin equal 0.3*0.5
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+region boxreg block 0 20 0 ${boxy} 0 ${boxz}
+region boxreg block 0 20 0 20 0 ${boxz}
+region boxreg block 0 20 0 20 0 30
+create_box 2 boxreg
+Created orthogonal box = (0 0 0) to (20 20 30)
+ 1 by 1 by 1 MPI processor grid
+change_box all boundary p p f
+
+comm_modify vel yes
+
+region insreg1 cylinder z ${xc1} ${yc} 5 15 ${boxz}
+region insreg1 cylinder z 6 ${yc} 5 15 ${boxz}
+region insreg1 cylinder z 6 10 5 15 ${boxz}
+region insreg1 cylinder z 6 10 5 15 30
+region insreg2 cylinder z ${xc2} ${yc} 5 15 ${boxz}
+region insreg2 cylinder z 14 ${yc} 5 15 ${boxz}
+region insreg2 cylinder z 14 10 5 15 ${boxz}
+region insreg2 cylinder z 14 10 5 15 30
+
+fix 1 all nve/sphere
+fix grav all gravity 10.0 vector 0 0 -1
+fix ins1 all pour 1500 1 3123 region insreg1 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens 1 ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens 1 1
+Particle insertion: 562 every 346 steps, 1500 by step 693
+fix ins2 all pour 1500 2 3123 region insreg2 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens 1 ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens 1 1
+Particle insertion: 562 every 346 steps, 1500 by step 693
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neighbor 0.15 bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * jkr 1000.0 50.0 0.3 10 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
+pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall
+
+fix 3 all wall/gran granular hertz/material 1e5 1e3 0.3 tangential mindlin NULL 1.0 0.5 zplane 0 NULL
+
+thermo_style custom step cpu atoms ke
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+#dump 1 all custom 100 ${name}.dump id type radius mass x y z
+
+run 5000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 1.15
+ ghost atom cutoff = 1.15
+ binsize = 0.575, bins = 35 35 53
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair granular, perpetual
+ attributes: half, newton on, size, history
+ pair build: half/size/bin/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 12.22 | 12.22 | 12.22 Mbytes
+Step CPU Atoms KinEng
+ 0 0 0 -0
+ 100 3.8153191 855 -0
+ 200 4.195287 855 -0
+ 300 4.5890362 855 -0
+ 400 10.636087 1500 -0
+ 500 11.306909 1500 -0
+ 600 11.968198 1500 -0
+ 700 22.631892 2288 -0
+ 800 23.711387 2288 -0
+ 900 24.754344 2288 -0
+ 1000 25.811778 2288 -0
+ 1100 35.368869 2845 -0
+ 1200 37.149843 2845 -0
+ 1300 39.026458 2845 -0
+ 1400 41.757583 3000 -0
+ 1500 45.155503 3000 -0
+ 1600 48.570241 3000 -0
+ 1700 52.839322 3000 -0
+ 1800 59.772697 3000 -0
+ 1900 69.493305 3000 -0
+ 2000 114.61886 3000 -0
+ 2100 152.89232 3000 -0
diff --git a/examples/granular/log.29Mar19.pour.flatwall.g++.4 b/examples/granular/log.29Mar19.pour.flatwall.g++.4
new file mode 100644
index 0000000000..62a8b96c05
--- /dev/null
+++ b/examples/granular/log.29Mar19.pour.flatwall.g++.4
@@ -0,0 +1,191 @@
+LAMMPS (29 Mar 2019)
+OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:88)
+ using 1 OpenMP thread(s) per MPI task
+# pour two types of particles (cohesive and non-cohesive) on flat wall
+
+variable name string pour_two_types
+
+atom_style sphere
+units lj
+
+###############################################
+# Geometry-related parameters
+###############################################
+
+variable boxx equal 20
+variable boxy equal 20
+variable boxz equal 30
+
+variable xc1 equal 0.3*${boxx}
+variable xc1 equal 0.3*20
+variable xc2 equal 0.7*${boxx}
+variable xc2 equal 0.7*20
+variable yc equal 0.5*${boxy}
+variable yc equal 0.5*20
+
+###############################################
+# Particle-related parameters
+###############################################
+variable rlo equal 0.25
+variable rhi equal 0.5
+variable dlo equal 2.0*${rlo}
+variable dlo equal 2.0*0.25
+variable dhi equal 2.0*${rhi}
+variable dhi equal 2.0*0.5
+
+variable dens equal 1.0
+
+variable skin equal 0.3*${rhi}
+variable skin equal 0.3*0.5
+
+#############
+processors * * 1
+region boxreg block 0 ${boxx} 0 ${boxy} 0 ${boxz}
+region boxreg block 0 20 0 ${boxy} 0 ${boxz}
+region boxreg block 0 20 0 20 0 ${boxz}
+region boxreg block 0 20 0 20 0 30
+create_box 2 boxreg
+Created orthogonal box = (0 0 0) to (20 20 30)
+ 2 by 2 by 1 MPI processor grid
+change_box all boundary p p f
+
+comm_modify vel yes
+
+region insreg1 cylinder z ${xc1} ${yc} 5 15 ${boxz}
+region insreg1 cylinder z 6 ${yc} 5 15 ${boxz}
+region insreg1 cylinder z 6 10 5 15 ${boxz}
+region insreg1 cylinder z 6 10 5 15 30
+region insreg2 cylinder z ${xc2} ${yc} 5 15 ${boxz}
+region insreg2 cylinder z 14 ${yc} 5 15 ${boxz}
+region insreg2 cylinder z 14 10 5 15 ${boxz}
+region insreg2 cylinder z 14 10 5 15 30
+
+fix 1 all nve/sphere
+fix grav all gravity 10.0 vector 0 0 -1
+fix ins1 all pour 1500 1 3123 region insreg1 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens ${dens} ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens 1 ${dens}
+fix ins1 all pour 1500 1 3123 region insreg1 diam range 0.5 1 dens 1 1
+Particle insertion: 562 every 346 steps, 1500 by step 693
+fix ins2 all pour 1500 2 3123 region insreg2 diam range ${dlo} ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 ${dhi} dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens ${dens} ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens 1 ${dens}
+fix ins2 all pour 1500 2 3123 region insreg2 diam range 0.5 1 dens 1 1
+Particle insertion: 562 every 346 steps, 1500 by step 693
+
+comm_modify vel yes
+
+neighbor ${skin} bin
+neighbor 0.15 bin
+neigh_modify delay 0 every 1 check yes
+
+pair_style granular
+pair_coeff 1 * jkr 1000.0 50.0 0.3 10 tangential mindlin 800.0 1.0 0.5 rolling sds 500.0 200.0 0.5 twisting marshall
+pair_coeff 2 2 hertz 200.0 20.0 tangential linear_history 300.0 1.0 0.1 rolling sds 200.0 100.0 0.1 twisting marshall
+
+fix 3 all wall/gran granular hertz/material 1e5 1e3 0.3 tangential mindlin NULL 1.0 0.5 zplane 0 NULL
+
+thermo_style custom step cpu atoms ke
+thermo_modify lost warn
+thermo 100
+
+timestep 0.001
+
+dump 1 all custom 100 ${name}.dump id type radius mass x y z
+dump 1 all custom 100 pour_two_types.dump id type radius mass x y z
+
+run 5000
+Neighbor list info ...
+ update every 1 steps, delay 0 steps, check yes
+ max neighbors/atom: 2000, page size: 100000
+ master list distance cutoff = 1.15
+ ghost atom cutoff = 1.15
+ binsize = 0.575, bins = 35 35 53
+ 1 neighbor lists, perpetual/occasional/extra = 1 0 0
+ (1) pair granular, perpetual
+ attributes: half, newton on, size, history
+ pair build: half/size/bin/newton
+ stencil: half/bin/3d/newton
+ bin: standard
+Per MPI rank memory allocation (min/avg/max) = 11.98 | 11.98 | 11.98 Mbytes
+Step CPU Atoms KinEng
+ 0 0 0 -0
+ 100 0.11584234 855 -0
+ 200 0.12743592 855 -0
+ 300 0.13925815 855 -0
+ 400 0.35203671 1500 -0
+ 500 0.37055922 1500 -0
+ 600 0.38671875 1500 -0
+ 700 0.71736908 2288 -0
+ 800 0.74506783 2288 -0
+ 900 0.77112222 2288 -0
+ 1000 0.79632139 2288 -0
+ 1100 1.0384252 2845 -0
+ 1200 1.08093 2845 -0
+ 1300 1.1224561 2845 -0
+ 1400 1.1811485 3000 -0
+ 1500 1.2414908 3000 -0
+ 1600 1.3105879 3000 -0
+ 1700 1.390928 3000 -0
+ 1800 1.4869275 3000 -0
+ 1900 1.5958266 3000 -0
+ 2000 1.7172487 3000 -0
+ 2100 1.851155 3000 -0
+ 2200 1.9957182 3000 -0
+ 2300 2.1593764 3000 -0
+ 2400 2.3433132 3000 -0
+ 2500 2.532742 3000 -0
+ 2600 2.7376895 3000 -0
+ 2700 2.9463468 3000 -0
+ 2800 3.1645725 3000 -0
+ 2900 3.3879526 3000 -0
+ 3000 3.6152103 3000 -0
+ 3100 3.8467371 3000 -0
+ 3200 4.0787683 3000 -0
+ 3300 4.3097105 3000 -0
+ 3400 4.5423617 3000 -0
+ 3500 4.7773693 3000 -0
+ 3600 5.0127218 3000 -0
+ 3700 5.2519271 3000 -0
+ 3800 5.4951298 3000 -0
+ 3900 5.7210469 3000 -0
+ 4000 5.9432652 3000 -0
+ 4100 6.1687591 3000 -0
+ 4200 6.3942792 3000 -0
+ 4300 6.6331475 3000 -0
+ 4400 6.8632154 3000 -0
+ 4500 7.0979366 3000 -0
+ 4600 7.3305347 3000 -0
+ 4700 7.5670528 3000 -0
+ 4800 7.8086057 3000 -0
+ 4900 8.0407174 3000 -0
+ 5000 8.2765219 3000 -0
+Loop time of 8.27669 on 4 procs for 5000 steps with 3000 atoms
+
+Performance: 52194.788 tau/day, 604.106 timesteps/s
+97.7% CPU use with 4 MPI tasks x 1 OpenMP threads
+
+MPI task timing breakdown:
+Section | min time | avg time | max time |%varavg| %total
+---------------------------------------------------------------
+Pair | 1.6106 | 3.4073 | 5.4191 | 95.7 | 41.17
+Neigh | 0.51456 | 0.64572 | 0.81542 | 16.6 | 7.80
+Comm | 0.2808 | 2.5222 | 4.4998 | 121.9 | 30.47
+Output | 0.15695 | 0.15919 | 0.16502 | 0.8 | 1.92
+Modify | 1.3517 | 1.4192 | 1.4904 | 4.9 | 17.15
+Other | | 0.123 | | | 1.49
+
+Nlocal: 750 ave 1036 max 482 min
+Histogram: 2 0 0 0 0 0 0 0 1 1
+Nghost: 429.75 ave 475 max 386 min
+Histogram: 2 0 0 0 0 0 0 0 0 2
+Neighs: 4051.75 ave 6274 max 2057 min
+Histogram: 2 0 0 0 0 0 0 0 1 1
+
+Total # of neighbors = 16207
+Ave neighs/atom = 5.40233
+Neighbor list builds = 1165
+Dangerous builds = 0
+Total wall time: 0:00:08
diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp
index 8b28eaa0df..723a54ad39 100644
--- a/lib/colvars/colvar.cpp
+++ b/lib/colvars/colvar.cpp
@@ -24,12 +24,13 @@ colvar::colvar()
{
runave_os = NULL;
- prev_timestep = -1;
+ prev_timestep = -1L;
after_restart = false;
kinetic_energy = 0.0;
potential_energy = 0.0;
- init_cv_requires();
+ description = "uninitialized colvar";
+ init_dependencies();
}
@@ -193,7 +194,7 @@ int colvar::init(std::string const &conf)
{
bool homogeneous = is_enabled(f_cv_linear);
for (i = 0; i < cvcs.size(); i++) {
- if ((std::fabs(cvcs[i]->sup_coeff) - 1.0) > 1.0e-10) {
+ if ((cvm::fabs(cvcs[i]->sup_coeff) - 1.0) > 1.0e-10) {
homogeneous = false;
}
}
@@ -224,7 +225,7 @@ int colvar::init(std::string const &conf)
// Allow scripted/custom functions to be defined as periodic
if ( (is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function)) && is_enabled(f_cv_scalar) ) {
if (get_keyval(conf, "period", period, 0.)) {
- set_enabled(f_cv_periodic, true);
+ enable(f_cv_periodic);
get_keyval(conf, "wrapAround", wrap_center, 0.);
}
}
@@ -471,7 +472,7 @@ int colvar::init_grid_parameters(std::string const &conf)
if (get_keyval(conf, "lowerWallConstant", lower_wall_k, 0.0,
parse_silent)) {
cvm::log("Reading legacy options lowerWall and lowerWallConstant: "
- "consider using a harmonicWalls restraint.\n");
+ "consider using a harmonicWalls restraint\n(caution: force constant would then be scaled by width^2).\n");
lower_wall.type(value());
if (!get_keyval(conf, "lowerWall", lower_wall, lower_boundary)) {
cvm::log("Warning: lowerWall will need to be "
@@ -485,7 +486,7 @@ int colvar::init_grid_parameters(std::string const &conf)
if (get_keyval(conf, "upperWallConstant", upper_wall_k, 0.0,
parse_silent)) {
cvm::log("Reading legacy options upperWall and upperWallConstant: "
- "consider using a harmonicWalls restraint.\n");
+ "consider using a harmonicWalls restraint\n(caution: force constant would then be scaled by width^2).\n");
upper_wall.type(value());
if (!get_keyval(conf, "upperWall", upper_wall, upper_boundary)) {
cvm::log("Warning: upperWall will need to be "
@@ -562,13 +563,13 @@ int colvar::init_extended_Lagrangian(std::string const &conf)
get_keyval_feature(this, conf, "extendedLagrangian", f_cv_extended_Lagrangian, false);
if (is_enabled(f_cv_extended_Lagrangian)) {
- cvm::real temp, tolerance, period;
+ cvm::real temp, tolerance, extended_period;
cvm::log("Enabling the extended Lagrangian term for colvar \""+
this->name+"\".\n");
- xr.type(value());
- vr.type(value());
+ x_ext.type(value());
+ v_ext.type(value());
fr.type(value());
const bool found = get_keyval(conf, "extendedTemp", temp, cvm::temperature());
@@ -590,11 +591,11 @@ int colvar::init_extended_Lagrangian(std::string const &conf)
ext_force_k = cvm::boltzmann() * temp / (tolerance * tolerance);
cvm::log("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " [E]/U^2");
- get_keyval(conf, "extendedTimeConstant", period, 200.0);
- if (period <= 0.0) {
+ get_keyval(conf, "extendedTimeConstant", extended_period, 200.0);
+ if (extended_period <= 0.0) {
cvm::error("Error: \"extendedTimeConstant\" must be positive.\n", INPUT_ERROR);
}
- ext_mass = (cvm::boltzmann() * temp * period * period)
+ ext_mass = (cvm::boltzmann() * temp * extended_period * extended_period)
/ (4.0 * PI * PI * tolerance * tolerance);
cvm::log("Computed fictitious mass: " + cvm::to_str(ext_mass) + " [E]/(U/fs)^2 (U: colvar unit)");
@@ -615,7 +616,7 @@ int colvar::init_extended_Lagrangian(std::string const &conf)
enable(f_cv_Langevin);
ext_gamma *= 1.0e-3; // correct as long as input is required in ps-1 and cvm::dt() is in fs
// Adjust Langevin sigma for slow time step if time_step_factor != 1
- ext_sigma = std::sqrt(2.0 * cvm::boltzmann() * temp * ext_gamma * ext_mass / (cvm::dt() * cvm::real(time_step_factor)));
+ ext_sigma = cvm::sqrt(2.0 * cvm::boltzmann() * temp * ext_gamma * ext_mass / (cvm::dt() * cvm::real(time_step_factor)));
}
}
@@ -761,6 +762,8 @@ int colvar::init_components(std::string const &conf)
"weighted by inverse power", "distanceInv");
error_code |= init_components_type(conf, "N1xN2-long vector "
"of pairwise distances", "distancePairs");
+ error_code |= init_components_type(conf, "dipole magnitude",
+ "dipoleMagnitude");
error_code |= init_components_type(conf, "coordination "
"number", "coordNum");
error_code |= init_components_type(conf, "self-coordination "
@@ -831,22 +834,25 @@ void colvar::build_atom_list(void)
for (size_t i = 0; i < cvcs.size(); i++) {
for (size_t j = 0; j < cvcs[i]->atom_groups.size(); j++) {
- cvm::atom_group &ag = *(cvcs[i]->atom_groups[j]);
+ cvm::atom_group const &ag = *(cvcs[i]->atom_groups[j]);
for (size_t k = 0; k < ag.size(); k++) {
temp_id_list.push_back(ag[k].id);
}
+ if (ag.is_enabled(f_ag_fitting_group) && ag.is_enabled(f_ag_fit_gradients)) {
+ cvm::atom_group const &fg = *(ag.fitting_group);
+ for (size_t k = 0; k < fg.size(); k++) {
+ temp_id_list.push_back(fg[k].id);
+ }
+ }
}
}
temp_id_list.sort();
temp_id_list.unique();
- // atom_ids = std::vector (temp_id_list.begin(), temp_id_list.end());
- unsigned int id_i = 0;
std::list::iterator li;
for (li = temp_id_list.begin(); li != temp_id_list.end(); ++li) {
- atom_ids[id_i] = *li;
- id_i++;
+ atom_ids.push_back(*li);
}
temp_id_list.clear();
@@ -934,16 +940,153 @@ int colvar::parse_analysis(std::string const &conf)
}
-void colvar::setup() {
- // loop over all components to reset masses of all groups
- for (size_t i = 0; i < cvcs.size(); i++) {
- for (size_t ig = 0; ig < cvcs[i]->atom_groups.size(); ig++) {
- cvm::atom_group &atoms = *(cvcs[i]->atom_groups[ig]);
- atoms.setup();
- atoms.reset_mass(name,i,ig);
- atoms.read_positions();
+int colvar::init_dependencies() {
+ size_t i;
+ if (features().size() == 0) {
+ for (i = 0; i < f_cv_ntot; i++) {
+ modify_features().push_back(new feature);
+ }
+
+ init_feature(f_cv_active, "active", f_type_dynamic);
+ // Do not require f_cvc_active in children, as some components may be disabled
+ // Colvars must be either a linear combination, or scalar (and polynomial) or scripted/custom
+ require_feature_alt(f_cv_active, f_cv_scalar, f_cv_linear, f_cv_scripted, f_cv_custom_function);
+
+ init_feature(f_cv_awake, "awake", f_type_static);
+ require_feature_self(f_cv_awake, f_cv_active);
+
+ init_feature(f_cv_gradient, "gradient", f_type_dynamic);
+ require_feature_children(f_cv_gradient, f_cvc_gradient);
+
+ init_feature(f_cv_collect_gradient, "collect gradient", f_type_dynamic);
+ require_feature_self(f_cv_collect_gradient, f_cv_gradient);
+ require_feature_self(f_cv_collect_gradient, f_cv_scalar);
+ // The following exlusion could be lifted by implementing the feature
+ exclude_feature_self(f_cv_collect_gradient, f_cv_scripted);
+ require_feature_children(f_cv_collect_gradient, f_cvc_explicit_gradient);
+
+ init_feature(f_cv_fdiff_velocity, "velocity from finite differences", f_type_dynamic);
+
+ // System force: either trivial (spring force); through extended Lagrangian, or calculated explicitly
+ init_feature(f_cv_total_force, "total force", f_type_dynamic);
+ require_feature_alt(f_cv_total_force, f_cv_extended_Lagrangian, f_cv_total_force_calc);
+
+ // Deps for explicit total force calculation
+ init_feature(f_cv_total_force_calc, "total force calculation", f_type_dynamic);
+ require_feature_self(f_cv_total_force_calc, f_cv_scalar);
+ require_feature_self(f_cv_total_force_calc, f_cv_linear);
+ require_feature_children(f_cv_total_force_calc, f_cvc_inv_gradient);
+ require_feature_self(f_cv_total_force_calc, f_cv_Jacobian);
+
+ init_feature(f_cv_Jacobian, "Jacobian derivative", f_type_dynamic);
+ require_feature_self(f_cv_Jacobian, f_cv_scalar);
+ require_feature_self(f_cv_Jacobian, f_cv_linear);
+ require_feature_children(f_cv_Jacobian, f_cvc_Jacobian);
+
+ init_feature(f_cv_hide_Jacobian, "hide Jacobian force", f_type_user);
+ require_feature_self(f_cv_hide_Jacobian, f_cv_Jacobian); // can only hide if calculated
+
+ init_feature(f_cv_extended_Lagrangian, "extended Lagrangian", f_type_user);
+ require_feature_self(f_cv_extended_Lagrangian, f_cv_scalar);
+ require_feature_self(f_cv_extended_Lagrangian, f_cv_gradient);
+
+ init_feature(f_cv_Langevin, "Langevin dynamics", f_type_user);
+ require_feature_self(f_cv_Langevin, f_cv_extended_Lagrangian);
+
+ init_feature(f_cv_linear, "linear", f_type_static);
+
+ init_feature(f_cv_scalar, "scalar", f_type_static);
+
+ init_feature(f_cv_output_energy, "output energy", f_type_user);
+
+ init_feature(f_cv_output_value, "output value", f_type_user);
+
+ init_feature(f_cv_output_velocity, "output velocity", f_type_user);
+ require_feature_self(f_cv_output_velocity, f_cv_fdiff_velocity);
+
+ init_feature(f_cv_output_applied_force, "output applied force", f_type_user);
+
+ init_feature(f_cv_output_total_force, "output total force", f_type_user);
+ require_feature_self(f_cv_output_total_force, f_cv_total_force);
+
+ init_feature(f_cv_subtract_applied_force, "subtract applied force from total force", f_type_user);
+ require_feature_self(f_cv_subtract_applied_force, f_cv_total_force);
+
+ init_feature(f_cv_lower_boundary, "lower boundary", f_type_user);
+ require_feature_self(f_cv_lower_boundary, f_cv_scalar);
+
+ init_feature(f_cv_upper_boundary, "upper boundary", f_type_user);
+ require_feature_self(f_cv_upper_boundary, f_cv_scalar);
+
+ init_feature(f_cv_grid, "grid", f_type_dynamic);
+ require_feature_self(f_cv_grid, f_cv_lower_boundary);
+ require_feature_self(f_cv_grid, f_cv_upper_boundary);
+
+ init_feature(f_cv_runave, "running average", f_type_user);
+
+ init_feature(f_cv_corrfunc, "correlation function", f_type_user);
+
+ init_feature(f_cv_scripted, "scripted", f_type_user);
+
+ init_feature(f_cv_custom_function, "custom function", f_type_user);
+ exclude_feature_self(f_cv_custom_function, f_cv_scripted);
+
+ init_feature(f_cv_periodic, "periodic", f_type_static);
+ require_feature_self(f_cv_periodic, f_cv_scalar);
+ init_feature(f_cv_scalar, "scalar", f_type_static);
+ init_feature(f_cv_linear, "linear", f_type_static);
+ init_feature(f_cv_homogeneous, "homogeneous", f_type_static);
+
+ // because total forces are obtained from the previous time step,
+ // we cannot (currently) have colvar values and total forces for the same timestep
+ init_feature(f_cv_multiple_ts, "multiple timestep colvar", f_type_static);
+ exclude_feature_self(f_cv_multiple_ts, f_cv_total_force_calc);
+
+ // check that everything is initialized
+ for (i = 0; i < colvardeps::f_cv_ntot; i++) {
+ if (is_not_set(i)) {
+ cvm::error("Uninitialized feature " + cvm::to_str(i) + " in " + description);
+ }
}
}
+
+ // Initialize feature_states for each instance
+ feature_states.reserve(f_cv_ntot);
+ for (i = 0; i < f_cv_ntot; i++) {
+ feature_states.push_back(feature_state(true, false));
+ // Most features are available, so we set them so
+ // and list exceptions below
+ }
+
+ feature_states[f_cv_fdiff_velocity].available =
+ cvm::main()->proxy->simulation_running();
+
+ return COLVARS_OK;
+}
+
+
+void colvar::setup()
+{
+ // loop over all components to update masses and charges of all groups
+ for (size_t i = 0; i < cvcs.size(); i++) {
+ for (size_t ig = 0; ig < cvcs[i]->atom_groups.size(); ig++) {
+ cvm::atom_group *atoms = cvcs[i]->atom_groups[ig];
+ atoms->setup();
+ atoms->print_properties(name, i, ig);
+ atoms->read_positions();
+ }
+ }
+}
+
+
+std::vector > colvar::get_atom_lists()
+{
+ std::vector > lists;
+ for (size_t i = 0; i < cvcs.size(); i++) {
+ std::vector > li = cvcs[i]->get_atom_lists();
+ lists.insert(lists.end(), li.begin(), li.end());
+ }
+ return lists;
}
@@ -953,8 +1096,8 @@ colvar::~colvar()
// because the children are cvcs and will be deleted
// just below
-// Clear references to this colvar's cvcs as children
-// for dependency purposes
+ // Clear references to this colvar's cvcs as children
+ // for dependency purposes
remove_all_children();
for (std::vector::reverse_iterator ci = cvcs.rbegin();
@@ -1231,7 +1374,6 @@ int colvar::calc_cvc_gradients(int first_cvc, size_t num_cvcs)
int colvar::collect_cvc_gradients()
{
size_t i;
-
if (is_enabled(f_cv_collect_gradient)) {
// Collect the atomic gradients inside colvar object
for (unsigned int a = 0; a < atomic_gradients.size(); a++) {
@@ -1239,34 +1381,7 @@ int colvar::collect_cvc_gradients()
}
for (i = 0; i < cvcs.size(); i++) {
if (!cvcs[i]->is_enabled()) continue;
- // Coefficient: d(a * x^n) = a * n * x^(n-1) * dx
- cvm::real coeff = (cvcs[i])->sup_coeff * cvm::real((cvcs[i])->sup_np) *
- cvm::integer_power((cvcs[i])->value().real_value, (cvcs[i])->sup_np-1);
-
- for (size_t j = 0; j < cvcs[i]->atom_groups.size(); j++) {
-
- cvm::atom_group &ag = *(cvcs[i]->atom_groups[j]);
-
- // If necessary, apply inverse rotation to get atomic
- // gradient in the laboratory frame
- if (ag.b_rotate) {
- cvm::rotation const rot_inv = ag.rot.inverse();
-
- for (size_t k = 0; k < ag.size(); k++) {
- size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
- ag[k].id) - atom_ids.begin();
- atomic_gradients[a] += coeff * rot_inv.rotate(ag[k].grad);
- }
-
- } else {
-
- for (size_t k = 0; k < ag.size(); k++) {
- size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
- ag[k].id) - atom_ids.begin();
- atomic_gradients[a] += coeff * ag[k].grad;
- }
- }
- }
+ cvcs[i]->collect_gradients(atom_ids, atomic_gradients);
}
}
return COLVARS_OK;
@@ -1391,20 +1506,20 @@ int colvar::calc_colvar_properties()
// initialize the restraint center in the first step to the value
// just calculated from the cvcs
if (cvm::step_relative() == 0 && !after_restart) {
- xr = x;
- vr.reset(); // (already 0; added for clarity)
+ x_ext = x;
+ v_ext.reset(); // (already 0; added for clarity)
}
// Special case of a repeated timestep (eg. multiple NAMD "run" statements)
// revert values of the extended coordinate and velocity prior to latest integration
- if (cvm::step_relative() == prev_timestep) {
- xr = prev_xr;
- vr = prev_vr;
+ if (cvm::proxy->simulation_running() && cvm::step_relative() == prev_timestep) {
+ x_ext = prev_x_ext;
+ v_ext = prev_v_ext;
}
// report the restraint center as "value"
- x_reported = xr;
- v_reported = vr;
+ x_reported = x_ext;
+ v_reported = v_ext;
// the "total force" with the extended Lagrangian is
// calculated in update_forces_energy() below
@@ -1458,77 +1573,86 @@ cvm::real colvar::update_forces_energy()
// extended variable if there is one
if (is_enabled(f_cv_extended_Lagrangian)) {
- if (cvm::debug()) {
- cvm::log("Updating extended-Lagrangian degree of freedom.\n");
- }
-
- if (prev_timestep > -1) {
- // Keep track of slow timestep to integrate MTS colvars
- // the colvar checks the interval after waking up twice
- int n_timesteps = cvm::step_relative() - prev_timestep;
- if (n_timesteps != 0 && n_timesteps != time_step_factor) {
- cvm::error("Error: extended-Lagrangian " + description + " has timeStepFactor " +
- cvm::to_str(time_step_factor) + ", but was activated after " + cvm::to_str(n_timesteps) +
- " steps at timestep " + cvm::to_str(cvm::step_absolute()) + " (relative step: " +
- cvm::to_str(cvm::step_relative()) + ").\n" +
- "Make sure that this colvar is requested by biases at multiples of timeStepFactor.\n");
- return 0.;
+ if (cvm::proxy->simulation_running()) {
+ // Only integrate the extended equations of motion in running MD simulations
+ if (cvm::debug()) {
+ cvm::log("Updating extended-Lagrangian degree of freedom.\n");
}
- }
- // Integrate with slow timestep (if time_step_factor != 1)
- cvm::real dt = cvm::dt() * cvm::real(time_step_factor);
+ if (prev_timestep > -1) {
+ // Keep track of slow timestep to integrate MTS colvars
+ // the colvar checks the interval after waking up twice
+ int n_timesteps = cvm::step_relative() - prev_timestep;
+ if (n_timesteps != 0 && n_timesteps != time_step_factor) {
+ cvm::error("Error: extended-Lagrangian " + description + " has timeStepFactor " +
+ cvm::to_str(time_step_factor) + ", but was activated after " + cvm::to_str(n_timesteps) +
+ " steps at timestep " + cvm::to_str(cvm::step_absolute()) + " (relative step: " +
+ cvm::to_str(cvm::step_relative()) + ").\n" +
+ "Make sure that this colvar is requested by biases at multiples of timeStepFactor.\n");
+ return 0.;
+ }
+ }
- colvarvalue f_ext(fr.type()); // force acting on the extended variable
- f_ext.reset();
+ // Integrate with slow timestep (if time_step_factor != 1)
+ cvm::real dt = cvm::dt() * cvm::real(time_step_factor);
- // the total force is applied to the fictitious mass, while the
- // atoms only feel the harmonic force + wall force
- // fr: bias force on extended variable (without harmonic spring), for output in trajectory
- // f_ext: total force on extended variable (including harmonic spring)
- // f: - initially, external biasing force
- // - after this code block, colvar force to be applied to atomic coordinates
- // ie. spring force (fb_actual will be added just below)
- fr = f;
- // External force has been scaled for a 1-timestep impulse, scale it back because we will
- // integrate it with the colvar's own timestep factor
- f_ext = f / cvm::real(time_step_factor);
- f_ext += (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x);
- f = (-0.5 * ext_force_k) * this->dist2_rgrad(xr, x);
- // Coupling force is a slow force, to be applied to atomic coords impulse-style
- f *= cvm::real(time_step_factor);
+ colvarvalue f_ext(fr.type()); // force acting on the extended variable
+ f_ext.reset();
- if (is_enabled(f_cv_subtract_applied_force)) {
- // Report a "system" force without the biases on this colvar
- // that is, just the spring force
- ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(xr, x);
+ // the total force is applied to the fictitious mass, while the
+ // atoms only feel the harmonic force + wall force
+ // fr: bias force on extended variable (without harmonic spring), for output in trajectory
+ // f_ext: total force on extended variable (including harmonic spring)
+ // f: - initially, external biasing force
+ // - after this code block, colvar force to be applied to atomic coordinates
+ // ie. spring force (fb_actual will be added just below)
+ fr = f;
+ // External force has been scaled for a 1-timestep impulse, scale it back because we will
+ // integrate it with the colvar's own timestep factor
+ f_ext = f / cvm::real(time_step_factor);
+ f_ext += (-0.5 * ext_force_k) * this->dist2_lgrad(x_ext, x);
+ f = (-0.5 * ext_force_k) * this->dist2_rgrad(x_ext, x);
+ // Coupling force is a slow force, to be applied to atomic coords impulse-style
+ f *= cvm::real(time_step_factor);
+
+ if (is_enabled(f_cv_subtract_applied_force)) {
+ // Report a "system" force without the biases on this colvar
+ // that is, just the spring force
+ ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(x_ext, x);
+ } else {
+ // The total force acting on the extended variable is f_ext
+ // This will be used in the next timestep
+ ft_reported = f_ext;
+ }
+
+ // backup in case we need to revert this integration timestep
+ // if the same MD timestep is re-run
+ prev_x_ext = x_ext;
+ prev_v_ext = v_ext;
+
+ // leapfrog: starting from x_i, f_i, v_(i-1/2)
+ v_ext += (0.5 * dt) * f_ext / ext_mass;
+ // Because of leapfrog, kinetic energy at time i is approximate
+ kinetic_energy = 0.5 * ext_mass * v_ext * v_ext;
+ potential_energy = 0.5 * ext_force_k * this->dist2(x_ext, x);
+ // leap to v_(i+1/2)
+ if (is_enabled(f_cv_Langevin)) {
+ v_ext -= dt * ext_gamma * v_ext;
+ colvarvalue rnd(x);
+ rnd.set_random();
+ v_ext += dt * ext_sigma * rnd / ext_mass;
+ }
+ v_ext += (0.5 * dt) * f_ext / ext_mass;
+ x_ext += dt * v_ext;
+ x_ext.apply_constraints();
+ this->wrap(x_ext);
} else {
- // The total force acting on the extended variable is f_ext
- // This will be used in the next timestep
- ft_reported = f_ext;
+ // If this is a postprocessing run (eg. in VMD), the extended DOF
+ // is equal to the actual coordinate
+ x_ext = x;
}
-
- // backup in case we need to revert this integration timestep
- // if the same MD timestep is re-run
- prev_xr = xr;
- prev_vr = vr;
-
- // leapfrog: starting from x_i, f_i, v_(i-1/2)
- vr += (0.5 * dt) * f_ext / ext_mass;
- // Because of leapfrog, kinetic energy at time i is approximate
- kinetic_energy = 0.5 * ext_mass * vr * vr;
- potential_energy = 0.5 * ext_force_k * this->dist2(xr, x);
- // leap to v_(i+1/2)
- if (is_enabled(f_cv_Langevin)) {
- vr -= dt * ext_gamma * vr;
- colvarvalue rnd(x);
- rnd.set_random();
- vr += dt * ext_sigma * rnd / ext_mass;
- }
- vr += (0.5 * dt) * f_ext / ext_mass;
- xr += dt * vr;
- xr.apply_constraints();
- this->wrap(xr);
+ // Report extended value
+ x_reported = x_ext;
}
// Now adding the force on the actual colvar (for those biases that
@@ -1730,7 +1854,7 @@ int colvar::update_cvc_config(std::vector const &confs)
// ******************** METRIC FUNCTIONS ********************
-// Use the metrics defined by \link cvc \endlink objects
+// Use the metrics defined by \link colvar::cvc \endlink objects
bool colvar::periodic_boundaries(colvarvalue const &lb, colvarvalue const &ub) const
@@ -1742,7 +1866,7 @@ bool colvar::periodic_boundaries(colvarvalue const &lb, colvarvalue const &ub) c
}
if (period > 0.0) {
- if ( ((std::sqrt(this->dist2(lb, ub))) / this->width)
+ if ( ((cvm::sqrt(this->dist2(lb, ub))) / this->width)
< 1.0E-10 ) {
return true;
}
@@ -1792,21 +1916,21 @@ colvarvalue colvar::dist2_rgrad(colvarvalue const &x1,
}
}
-void colvar::wrap(colvarvalue &x) const
+
+void colvar::wrap(colvarvalue &x_unwrapped) const
{
- if ( !is_enabled(f_cv_periodic) ) {
+ if (!is_enabled(f_cv_periodic)) {
return;
}
if ( is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function) ) {
// Scripted functions do their own wrapping, as cvcs might not be periodic
- cvm::real shift = std::floor((x.real_value - wrap_center) / period + 0.5);
- x.real_value -= shift * period;
+ cvm::real shift = cvm::floor((x_unwrapped.real_value - wrap_center) /
+ period + 0.5);
+ x_unwrapped.real_value -= shift * period;
} else {
- cvcs[0]->wrap(x);
+ cvcs[0]->wrap(x_unwrapped);
}
-
- return;
}
@@ -1852,15 +1976,15 @@ std::istream & colvar::read_restart(std::istream &is)
if (is_enabled(f_cv_extended_Lagrangian)) {
- if ( !(get_keyval(conf, "extended_x", xr,
+ if ( !(get_keyval(conf, "extended_x", x_ext,
colvarvalue(x.type()), colvarparse::parse_silent)) &&
- !(get_keyval(conf, "extended_v", vr,
+ !(get_keyval(conf, "extended_v", v_ext,
colvarvalue(x.type()), colvarparse::parse_silent)) ) {
cvm::log("Error: restart file does not contain "
"\"extended_x\" or \"extended_v\" for the colvar \""+
name+"\", but you requested \"extendedLagrangian\".\n");
}
- x_reported = xr;
+ x_reported = x_ext;
} else {
x_reported = x;
}
@@ -1875,7 +1999,7 @@ std::istream & colvar::read_restart(std::istream &is)
}
if (is_enabled(f_cv_extended_Lagrangian)) {
- v_reported = vr;
+ v_reported = v_ext;
} else {
v_reported = v_fdiff;
}
@@ -1901,8 +2025,8 @@ std::istream & colvar::read_traj(std::istream &is)
}
if (is_enabled(f_cv_extended_Lagrangian)) {
- is >> xr;
- x_reported = xr;
+ is >> x_ext;
+ x_reported = x_ext;
} else {
x_reported = x;
}
@@ -1913,8 +2037,8 @@ std::istream & colvar::read_traj(std::istream &is)
is >> v_fdiff;
if (is_enabled(f_cv_extended_Lagrangian)) {
- is >> vr;
- v_reported = vr;
+ is >> v_ext;
+ v_reported = v_ext;
} else {
v_reported = v_fdiff;
}
@@ -1955,11 +2079,11 @@ std::ostream & colvar::write_restart(std::ostream &os) {
os << " extended_x "
<< std::setprecision(cvm::cv_prec)
<< std::setw(cvm::cv_width)
- << xr << "\n"
+ << x_ext << "\n"
<< " extended_v "
<< std::setprecision(cvm::cv_prec)
<< std::setw(cvm::cv_width)
- << vr << "\n";
+ << v_ext << "\n";
}
os << "}\n\n";
@@ -2190,6 +2314,7 @@ int colvar::calc_acf()
acf_x_history_p = acf_x_history.begin();
break;
+ case acf_notset:
default:
break;
}
@@ -2222,6 +2347,7 @@ int colvar::calc_acf()
history_incr(acf_x_history, acf_x_history_p);
break;
+ case acf_notset:
default:
break;
}
@@ -2257,7 +2383,7 @@ void colvar::calc_vel_acf(std::list &v_list,
void colvar::calc_coor_acf(std::list &x_list,
- colvarvalue const &x)
+ colvarvalue const &x_now)
{
// same as above but for coordinates
if (x_list.size() >= acf_length+acf_offset) {
@@ -2269,7 +2395,7 @@ void colvar::calc_coor_acf(std::list &x_list,
*(acf_i++) += x.norm2();
- colvarvalue::inner_opt(x, xs_i, x_list.end(), acf_i);
+ colvarvalue::inner_opt(x_now, xs_i, x_list.end(), acf_i);
acf_nframes++;
}
@@ -2277,7 +2403,7 @@ void colvar::calc_coor_acf(std::list &x_list,
void colvar::calc_p2coor_acf(std::list &x_list,
- colvarvalue const &x)
+ colvarvalue const &x_now)
{
// same as above but with second order Legendre polynomial instead
// of just the scalar product
@@ -2291,7 +2417,7 @@ void colvar::calc_p2coor_acf(std::list &x_list,
// value of P2(0) = 1
*(acf_i++) += 1.0;
- colvarvalue::p2leg_opt(x, xs_i, x_list.end(), acf_i);
+ colvarvalue::p2leg_opt(x_now, xs_i, x_list.end(), acf_i);
acf_nframes++;
}
@@ -2316,6 +2442,9 @@ int colvar::write_acf(std::ostream &os)
case acf_p2coor:
os << "Coordinate (2nd Legendre poly)";
break;
+ case acf_notset:
+ default:
+ break;
}
if (acf_colvar_name == name) {
@@ -2420,7 +2549,7 @@ int colvar::calc_runave()
<< std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width)
<< runave << " "
<< std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width)
- << std::sqrt(runave_variance) << "\n";
+ << cvm::sqrt(runave_variance) << "\n";
}
history_add_value(runave_length, *x_history_p, x);
diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h
index a67749d577..74f7fdee51 100644
--- a/lib/colvars/colvar.h
+++ b/lib/colvars/colvar.h
@@ -92,7 +92,7 @@ public:
static std::vector cv_features;
/// \brief Implementation of the feature list accessor for colvar
- virtual const std::vector &features()
+ virtual const std::vector &features() const
{
return cv_features;
}
@@ -133,7 +133,7 @@ protected:
Here:
S(x(t)) = x
- s(t) = xr
+ s(t) = x_ext
DS = Ds = delta
*/
@@ -170,13 +170,13 @@ protected:
// Options for extended_lagrangian
/// Restraint center
- colvarvalue xr;
+ colvarvalue x_ext;
/// Previous value of the restraint center;
- colvarvalue prev_xr;
+ colvarvalue prev_x_ext;
/// Velocity of the restraint center
- colvarvalue vr;
+ colvarvalue v_ext;
/// Previous velocity of the restraint center
- colvarvalue prev_vr;
+ colvarvalue prev_v_ext;
/// Mass of the restraint center
cvm::real ext_mass;
/// Restraint force constant
@@ -273,6 +273,9 @@ public:
/// Init output flags
int init_output_flags(std::string const &conf);
+ /// \brief Initialize dependency tree
+ virtual int init_dependencies();
+
private:
/// Parse the CVC configuration for all components of a certain type
template int init_components_type(std::string const &conf,
@@ -373,7 +376,7 @@ protected:
void update_active_cvc_square_norm();
/// \brief Absolute timestep number when this colvar was last updated
- int prev_timestep;
+ cvm::step_number prev_timestep;
public:
@@ -383,32 +386,32 @@ public:
/// \brief Return the number of CVC objects with an active flag (as set by update_cvc_flags)
inline size_t num_active_cvcs() const { return n_active_cvcs; }
- /// \brief Use the internal metrics (as from \link cvc
+ /// \brief Use the internal metrics (as from \link colvar::cvc
/// \endlink objects) to calculate square distances and gradients
///
/// Handles correctly symmetries and periodic boundary conditions
cvm::real dist2(colvarvalue const &x1,
colvarvalue const &x2) const;
- /// \brief Use the internal metrics (as from \link cvc
+ /// \brief Use the internal metrics (as from \link colvar::cvc
/// \endlink objects) to calculate square distances and gradients
///
/// Handles correctly symmetries and periodic boundary conditions
colvarvalue dist2_lgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
- /// \brief Use the internal metrics (as from \link cvc
+ /// \brief Use the internal metrics (as from \link colvar::cvc
/// \endlink objects) to calculate square distances and gradients
///
/// Handles correctly symmetries and periodic boundary conditions
colvarvalue dist2_rgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
- /// \brief Use the internal metrics (as from \link cvc
+ /// \brief Use the internal metrics (as from \link colvar::cvc
/// \endlink objects) to wrap a value into a standard interval
///
/// Handles correctly symmetries and periodic boundary conditions
- void wrap(colvarvalue &x) const;
+ void wrap(colvarvalue &x_unwrapped) const;
/// Read the analysis tasks
@@ -546,6 +549,7 @@ public:
class polar_phi;
class distance_inv;
class distance_pairs;
+ class dipole_magnitude;
class angle;
class dipole_angle;
class dihedral;
@@ -574,7 +578,7 @@ public:
protected:
- /// \brief Array of \link cvc \endlink objects
+ /// \brief Array of \link colvar::cvc \endlink objects
std::vector cvcs;
/// \brief Flags to enable or disable cvcs at next colvar evaluation
@@ -619,6 +623,9 @@ public:
inline size_t n_components() const {
return cvcs.size();
}
+
+ /// \brief Get vector of vectors of atom IDs for all atom groups
+ virtual std::vector > get_atom_lists();
};
inline cvm::real const & colvar::force_constant() const
@@ -655,6 +662,8 @@ inline colvarvalue const & colvar::total_force() const
inline void colvar::add_bias_force(colvarvalue const &force)
{
+ check_enabled(f_cv_gradient,
+ std::string("applying a force to the variable \""+name+"\""));
if (cvm::debug()) {
cvm::log("Adding biasing force "+cvm::to_str(force)+" to colvar \""+name+"\".\n");
}
diff --git a/lib/colvars/colvar_UIestimator.h b/lib/colvars/colvar_UIestimator.h
index 759b8d54a0..365f46148a 100644
--- a/lib/colvars/colvar_UIestimator.h
+++ b/lib/colvars/colvar_UIestimator.h
@@ -33,24 +33,24 @@ namespace UIestimator {
public:
n_matrix() {}
- n_matrix(const std::vector & lowerboundary, // lowerboundary of x
- const std::vector & upperboundary, // upperboundary of
- const std::vector & width, // width of x
- const int y_size) { // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered
+ n_matrix(const std::vector & lowerboundary_input, // lowerboundary of x
+ const std::vector & upperboundary_input, // upperboundary of
+ const std::vector & width_input, // width of x
+ const int y_size_input) { // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered
int i;
- this->lowerboundary = lowerboundary;
- this->upperboundary = upperboundary;
- this->width = width;
- this->dimension = lowerboundary.size();
- this->y_size = y_size; // keep in mind the internal (spare) matrix is stored in diagonal form
- this->y_total_size = int(std::pow(double(y_size), double(dimension)) + EPSILON);
+ this->lowerboundary = lowerboundary_input;
+ this->upperboundary = upperboundary_input;
+ this->width = width_input;
+ this->dimension = lowerboundary_input.size();
+ this->y_size = y_size_input; // keep in mind the internal (spare) matrix is stored in diagonal form
+ this->y_total_size = int(cvm::pow(double(y_size_input), double(dimension)) + EPSILON);
// the range of the matrix is [lowerboundary, upperboundary]
x_total_size = 1;
for (i = 0; i < dimension; i++) {
- x_size.push_back(int((upperboundary[i] - lowerboundary[i]) / width[i] + EPSILON));
+ x_size.push_back(int((upperboundary_input[i] - lowerboundary_input[i]) / width_input[i] + EPSILON));
x_total_size *= x_size[i];
}
@@ -89,9 +89,10 @@ namespace UIestimator {
std::vector temp; // this vector is used in convert_x and convert_y to save computational resource
- int i, j;
-
int convert_x(const std::vector & x) { // convert real x value to its interal index
+
+ int i, j;
+
for (i = 0; i < dimension; i++) {
temp[i] = int((x[i] - lowerboundary[i]) / width[i] + EPSILON);
}
@@ -121,7 +122,7 @@ namespace UIestimator {
int index = 0;
for (i = 0; i < dimension; i++) {
if (i + 1 < dimension)
- index += temp[i] * int(std::pow(double(y_size), double(dimension - i - 1)) + EPSILON);
+ index += temp[i] * int(cvm::pow(double(y_size), double(dimension - i - 1)) + EPSILON);
else
index += temp[i];
}
@@ -139,19 +140,19 @@ namespace UIestimator {
public:
n_vector() {}
- n_vector(const std::vector & lowerboundary, // lowerboundary of x
- const std::vector & upperboundary, // upperboundary of
- const std::vector & width, // width of x
- const int y_size, // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered
+ n_vector(const std::vector & lowerboundary_input, // lowerboundary of x
+ const std::vector & upperboundary_input, // upperboundary of
+ const std::vector & width_input, // width of x
+ const int y_size_input, // size of y, for example, ysize=7, then when x=1, the distribution of y in [-2,4] is considered
const T & default_value) { // the default value of T
- this->width = width;
- this->dimension = lowerboundary.size();
+ this->width = width_input;
+ this->dimension = lowerboundary_input.size();
x_total_size = 1;
for (int i = 0; i < dimension; i++) {
- this->lowerboundary.push_back(lowerboundary[i] - (y_size - 1) / 2 * width[i] - EPSILON);
- this->upperboundary.push_back(upperboundary[i] + (y_size - 1) / 2 * width[i] + EPSILON);
+ this->lowerboundary.push_back(lowerboundary_input[i] - (y_size_input - 1) / 2 * width_input[i] - EPSILON);
+ this->upperboundary.push_back(upperboundary_input[i] + (y_size_input - 1) / 2 * width_input[i] + EPSILON);
x_size.push_back(int((this->upperboundary[i] - this->lowerboundary[i]) / this->width[i] + EPSILON));
x_total_size *= x_size[i];
@@ -215,26 +216,26 @@ namespace UIestimator {
UIestimator() {}
//called when (re)start an eabf simulation
- UIestimator(const std::vector & lowerboundary,
- const std::vector & upperboundary,
- const std::vector & width,
- const std::vector & krestr, // force constant in eABF
- const std::string & output_filename, // the prefix of output files
- const int output_freq,
- const bool restart, // whether restart from a .count and a .grad file
- const std::vector & input_filename, // the prefixes of input files
- const double temperature) {
+ UIestimator(const std::vector & lowerboundary_input,
+ const std::vector & upperboundary_input,
+ const std::vector & width_input,
+ const std::vector & krestr_input, // force constant in eABF
+ const std::string & output_filename_input, // the prefix of output files
+ const int output_freq_input,
+ const bool restart_input, // whether restart from a .count and a .grad file
+ const std::vector & input_filename_input, // the prefixes of input files
+ const double temperature_input) {
// initialize variables
- this->lowerboundary = lowerboundary;
- this->upperboundary = upperboundary;
- this->width = width;
- this->krestr = krestr;
- this->output_filename = output_filename;
- this->output_freq = output_freq;
- this->restart = restart;
- this->input_filename = input_filename;
- this->temperature = temperature;
+ this->lowerboundary = lowerboundary_input;
+ this->upperboundary = upperboundary_input;
+ this->width = width_input;
+ this->krestr = krestr_input;
+ this->output_filename = output_filename_input;
+ this->output_freq = output_freq_input;
+ this->restart = restart_input;
+ this->input_filename = input_filename_input;
+ this->temperature = temperature_input;
int i, j;
@@ -300,7 +301,7 @@ namespace UIestimator {
~UIestimator() {}
// called from MD engine every step
- bool update(const int step, std::vector x, std::vector y) {
+ bool update(cvm::step_number step, std::vector x, std::vector y) {
int i;
@@ -431,7 +432,7 @@ namespace UIestimator {
loop_flag_y[k] = loop_flag_x[k] - HALF_Y_SIZE * width[k];
}
- int j = 0;
+ j = 0;
while (j >= 0) {
norm += distribution_x_y.get_value(loop_flag_x, loop_flag_y);
for (k = 0; k < dimension; k++) {
@@ -672,7 +673,7 @@ namespace UIestimator {
}
// read input files
- void read_inputfiles(const std::vector input_filename)
+ void read_inputfiles(const std::vector filename)
{
char sharp;
double nothing;
@@ -683,11 +684,11 @@ namespace UIestimator {
std::vector position_temp(dimension, 0);
std::vector grad_temp(dimension, 0);
int count_temp = 0;
- for (i = 0; i < int(input_filename.size()); i++) {
+ for (i = 0; i < int(filename.size()); i++) {
int size = 1 , size_temp = 0;
- std::string count_filename = input_filename[i] + ".UI.count";
- std::string grad_filename = input_filename[i] + ".UI.grad";
+ std::string count_filename = filename[i] + ".UI.count";
+ std::string grad_filename = filename[i] + ".UI.grad";
std::ifstream count_file(count_filename.c_str(), std::ios::in);
std::ifstream grad_file(grad_filename.c_str(), std::ios::in);
diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp
index 3315007b54..eeb7985fec 100644
--- a/lib/colvars/colvaratoms.cpp
+++ b/lib/colvars/colvaratoms.cpp
@@ -22,7 +22,7 @@ cvm::atom::atom()
index = -1;
id = -1;
mass = 1.0;
- charge = 1.0;
+ charge = 0.0;
reset_data();
}
@@ -107,6 +107,8 @@ cvm::atom_group::~atom_group()
delete fitting_group;
fitting_group = NULL;
}
+
+ cvm::main()->unregister_named_atom_group(this);
}
@@ -183,10 +185,7 @@ int cvm::atom_group::init()
// These may be overwritten by parse(), if a name is provided
atoms.clear();
-
- // TODO: check with proxy whether atom forces etc are available
- init_ag_requires();
-
+ init_dependencies();
index = -1;
b_dummy = false;
@@ -207,8 +206,67 @@ int cvm::atom_group::init()
}
+int cvm::atom_group::init_dependencies() {
+ size_t i;
+ // Initialize static array once and for all
+ if (features().size() == 0) {
+ for (i = 0; i < f_ag_ntot; i++) {
+ modify_features().push_back(new feature);
+ }
+
+ init_feature(f_ag_active, "active", f_type_dynamic);
+ init_feature(f_ag_center, "translational fit", f_type_static);
+ init_feature(f_ag_rotate, "rotational fit", f_type_static);
+ init_feature(f_ag_fitting_group, "fitting group", f_type_static);
+ init_feature(f_ag_explicit_gradient, "explicit atom gradient", f_type_dynamic);
+ init_feature(f_ag_fit_gradients, "fit gradients", f_type_user);
+ require_feature_self(f_ag_fit_gradients, f_ag_explicit_gradient);
+
+ init_feature(f_ag_atom_forces, "atomic forces", f_type_dynamic);
+
+ // parallel calculation implies that we have at least a scalable center of mass,
+ // but f_ag_scalable is kept as a separate feature to deal with future dependencies
+ init_feature(f_ag_scalable, "scalable group calculation", f_type_static);
+ init_feature(f_ag_scalable_com, "scalable group center of mass calculation", f_type_static);
+ require_feature_self(f_ag_scalable, f_ag_scalable_com);
+
+ // check that everything is initialized
+ for (i = 0; i < colvardeps::f_ag_ntot; i++) {
+ if (is_not_set(i)) {
+ cvm::error("Uninitialized feature " + cvm::to_str(i) + " in " + description);
+ }
+ }
+ }
+
+ // Initialize feature_states for each instance
+ // default as unavailable, not enabled
+ feature_states.reserve(f_ag_ntot);
+ for (i = 0; i < colvardeps::f_ag_ntot; i++) {
+ feature_states.push_back(feature_state(false, false));
+ }
+
+ // Features that are implemented (or not) by all atom groups
+ feature_states[f_ag_active].available = true;
+ // f_ag_scalable_com is provided by the CVC iff it is COM-based
+ feature_states[f_ag_scalable_com].available = false;
+ // TODO make f_ag_scalable depend on f_ag_scalable_com (or something else)
+ feature_states[f_ag_scalable].available = true;
+ feature_states[f_ag_fit_gradients].available = true;
+ feature_states[f_ag_fitting_group].available = true;
+ feature_states[f_ag_explicit_gradient].available = true;
+
+ return COLVARS_OK;
+}
+
+
int cvm::atom_group::setup()
{
+ if (atoms_ids.size() == 0) {
+ atoms_ids.reserve(atoms.size());
+ for (cvm::atom_iter ai = atoms.begin(); ai != atoms.end(); ai++) {
+ atoms_ids.push_back(ai->id);
+ }
+ }
for (cvm::atom_iter ai = atoms.begin(); ai != atoms.end(); ai++) {
ai->update_mass();
ai->update_charge();
@@ -237,15 +295,6 @@ void cvm::atom_group::update_total_mass()
}
-void cvm::atom_group::reset_mass(std::string &name, int i, int j)
-{
- update_total_mass();
- cvm::log("Re-initialized atom group "+name+":"+cvm::to_str(i)+"/"+
- cvm::to_str(j)+". "+ cvm::to_str(atoms_ids.size())+
- " atoms: total mass = "+cvm::to_str(total_mass)+".\n");
-}
-
-
void cvm::atom_group::update_total_charge()
{
if (b_dummy) {
@@ -264,6 +313,19 @@ void cvm::atom_group::update_total_charge()
}
+void cvm::atom_group::print_properties(std::string const &colvar_name,
+ int i, int j)
+{
+ if (cvm::proxy->updated_masses() && cvm::proxy->updated_charges()) {
+ cvm::log("Re-initialized atom group for variable \""+colvar_name+"\":"+
+ cvm::to_str(i)+"/"+
+ cvm::to_str(j)+". "+ cvm::to_str(atoms_ids.size())+
+ " atoms: total mass = "+cvm::to_str(total_mass)+
+ ", total charge = "+cvm::to_str(total_charge)+".\n");
+ }
+}
+
+
int cvm::atom_group::parse(std::string const &group_conf)
{
cvm::log("Initializing atom group \""+key+"\".\n");
@@ -450,10 +512,21 @@ int cvm::atom_group::parse(std::string const &group_conf)
if (cvm::debug())
cvm::log("Done initializing atom group \""+key+"\".\n");
- cvm::log("Atom group \""+key+"\" defined, "+
- cvm::to_str(atoms_ids.size())+" atoms initialized: total mass = "+
- cvm::to_str(total_mass)+", total charge = "+
- cvm::to_str(total_charge)+".\n");
+ {
+ std::string init_msg;
+ init_msg.append("Atom group \""+key+"\" defined with "+
+ cvm::to_str(atoms_ids.size())+" atoms requested");
+ if ((cvm::proxy)->updated_masses()) {
+ init_msg.append(": total mass = "+
+ cvm::to_str(total_mass));
+ if ((cvm::proxy)->updated_charges()) {
+ init_msg.append(", total charge = "+
+ cvm::to_str(total_charge));
+ }
+ }
+ init_msg.append(".\n");
+ cvm::log(init_msg);
+ }
if (b_print_atom_ids) {
cvm::log("Internal definition of the atom group:\n");
@@ -464,7 +537,7 @@ int cvm::atom_group::parse(std::string const &group_conf)
}
-int cvm::atom_group::add_atoms_of_group(atom_group const * ag)
+int cvm::atom_group::add_atoms_of_group(atom_group const *ag)
{
std::vector const &source_ids = ag->atoms_ids;
@@ -696,6 +769,7 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf)
return INPUT_ERROR;
}
}
+ enable(f_ag_fitting_group);
}
atom_group *group_for_fit = fitting_group ? fitting_group : this;
@@ -800,24 +874,24 @@ int cvm::atom_group::create_sorted_ids()
// Sort the internal IDs
std::list sorted_atoms_ids_list;
- for (size_t i = 0; i < this->size(); i++) {
+ for (size_t i = 0; i < atoms_ids.size(); i++) {
sorted_atoms_ids_list.push_back(atoms_ids[i]);
}
sorted_atoms_ids_list.sort();
sorted_atoms_ids_list.unique();
- if (sorted_atoms_ids_list.size() != this->size()) {
+ if (sorted_atoms_ids_list.size() != atoms_ids.size()) {
return cvm::error("Error: duplicate atom IDs in atom group? (found " +
cvm::to_str(sorted_atoms_ids_list.size()) +
" unique atom IDs instead of " +
- cvm::to_str(this->size()) + ").\n", BUG_ERROR);
+ cvm::to_str(atoms_ids.size()) + ").\n", BUG_ERROR);
}
// Compute map between sorted and unsorted elements
- sorted_atoms_ids.resize(this->size());
- sorted_atoms_ids_map.resize(this->size());
+ sorted_atoms_ids.resize(atoms_ids.size());
+ sorted_atoms_ids_map.resize(atoms_ids.size());
std::list::iterator lsii = sorted_atoms_ids_list.begin();
size_t ii = 0;
- for ( ; ii < this->size(); lsii++, ii++) {
+ for ( ; ii < atoms_ids.size(); lsii++, ii++) {
sorted_atoms_ids[ii] = *lsii;
size_t const pos = std::find(atoms_ids.begin(), atoms_ids.end(), *lsii) -
atoms_ids.begin();
@@ -1038,15 +1112,15 @@ int cvm::atom_group::calc_center_of_mass()
}
-int cvm::atom_group::calc_dipole(cvm::atom_pos const &com)
+int cvm::atom_group::calc_dipole(cvm::atom_pos const &dipole_center)
{
if (b_dummy) {
- cvm::error("Error: trying to compute the dipole of an empty group.\n", INPUT_ERROR);
- return COLVARS_ERROR;
+ return cvm::error("Error: trying to compute the dipole "
+ "of a dummy group.\n", INPUT_ERROR);
}
dip.reset();
for (cvm::atom_const_iter ai = this->begin(); ai != this->end(); ai++) {
- dip += ai->charge * (ai->pos - com);
+ dip += ai->charge * (ai->pos - dipole_center);
}
return COLVARS_OK;
}
@@ -1056,13 +1130,12 @@ void cvm::atom_group::set_weighted_gradient(cvm::rvector const &grad)
{
if (b_dummy) return;
- if (is_enabled(f_ag_scalable)) {
- scalar_com_gradient = grad;
- return;
- }
+ scalar_com_gradient = grad;
- for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) {
- ai->grad = (ai->mass/total_mass) * grad;
+ if (!is_enabled(f_ag_scalable)) {
+ for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) {
+ ai->grad = (ai->mass/total_mass) * grad;
+ }
}
}
diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h
index 0b0dd62c70..9756e0e364 100644
--- a/lib/colvars/colvaratoms.h
+++ b/lib/colvars/colvaratoms.h
@@ -17,7 +17,7 @@
/// \brief Stores numeric id, mass and all mutable data for an atom,
-/// mostly used by a \link cvc \endlink
+/// mostly used by a \link colvar::cvc \endlink
///
/// This class may be used to keep atomic data such as id, mass,
/// position and collective variable derivatives) altogether.
@@ -63,7 +63,7 @@ public:
/// from the \link colvarvalue \endlink class), which is also the
/// most frequent case. For more complex types of \link
/// colvarvalue \endlink objects, atomic gradients should be
- /// defined within the specific \link cvc \endlink
+ /// defined within the specific \link colvar::cvc \endlink
/// implementation
cvm::rvector grad;
@@ -100,13 +100,19 @@ public:
/// Get the latest value of the mass
inline void update_mass()
{
- mass = (cvm::proxy)->get_atom_mass(index);
+ colvarproxy *p = cvm::proxy;
+ if (p->updated_masses()) {
+ mass = p->get_atom_mass(index);
+ }
}
/// Get the latest value of the charge
inline void update_charge()
{
- charge = (cvm::proxy)->get_atom_charge(index);
+ colvarproxy *p = cvm::proxy;
+ if (p->updated_charges()) {
+ charge = p->get_atom_charge(index);
+ }
}
/// Get the current position
@@ -145,7 +151,7 @@ public:
/// \brief Group of \link atom \endlink objects, mostly used by a
-/// \link cvc \endlink object to gather all atomic data
+/// \link colvar::cvc \endlink object to gather all atomic data
class colvarmodule::atom_group
: public colvarparse, public colvardeps
{
@@ -174,6 +180,9 @@ public:
/// \brief Set default values for common flags
int init();
+ /// \brief Initialize dependency tree
+ virtual int init_dependencies();
+
/// \brief Update data required to calculate cvc's
int setup();
@@ -198,16 +207,16 @@ public:
/// \brief Remove an atom object from this group
int remove_atom(cvm::atom_iter ai);
- /// \brief Re-initialize the total mass of a group.
+ /// \brief Print the updated the total mass and charge of a group.
/// This is needed in case the hosting MD code has an option to
/// change atom masses after their initialization.
- void reset_mass(std::string &name, int i, int j);
+ void print_properties(std::string const &colvar_name, int i, int j);
/// \brief Implementation of the feature list for atom group
static std::vector ag_features;
/// \brief Implementation of the feature list accessor for atom group
- virtual const std::vector &features()
+ virtual const std::vector &features() const
{
return ag_features;
}
@@ -347,15 +356,19 @@ public:
/// Total mass of the atom group
cvm::real total_mass;
+
+ /// Update the total mass of the atom group
void update_total_mass();
/// Total charge of the atom group
cvm::real total_charge;
+
+ /// Update the total mass of the group
void update_total_charge();
/// \brief Don't apply any force on this group (use its coordinates
/// only to calculate a colvar)
- bool noforce;
+ bool noforce;
/// \brief Get the current positions
void read_positions();
@@ -423,20 +436,32 @@ public:
/// \brief Calculate the center of mass of the atomic positions, assuming that
/// they are already pbc-wrapped
int calc_center_of_mass();
+
private:
+
/// \brief Center of mass
cvm::atom_pos com;
+
/// \brief The derivative of a scalar variable with respect to the COM
// TODO for scalable calculations of more complex variables (e.g. rotation),
// use a colvarvalue of vectors to hold the entire derivative
cvm::rvector scalar_com_gradient;
+
public:
- /// \brief Return the center of mass of the atomic positions
+
+ /// \brief Return the center of mass (COM) of the atomic positions
inline cvm::atom_pos center_of_mass() const
{
return com;
}
+ /// \brief Return previously gradient of scalar variable with respect to the
+ /// COM
+ inline cvm::rvector center_of_mass_scalar_gradient() const
+ {
+ return scalar_com_gradient;
+ }
+
/// \brief Return a copy of the current atom positions, shifted by a constant vector
std::vector positions_shifted(cvm::rvector const &shift) const;
@@ -444,10 +469,15 @@ public:
std::vector velocities() const;
///\brief Calculate the dipole of the atom group around the specified center
- int calc_dipole(cvm::atom_pos const &com);
+ int calc_dipole(cvm::atom_pos const &dipole_center);
+
private:
+
+ /// Dipole moment of the atom group
cvm::rvector dip;
+
public:
+
///\brief Return the (previously calculated) dipole of the atom group
inline cvm::rvector dipole() const
{
diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp
index 9363fcdcb6..724326d3b4 100644
--- a/lib/colvars/colvarbias.cpp
+++ b/lib/colvars/colvarbias.cpp
@@ -17,15 +17,14 @@
colvarbias::colvarbias(char const *key)
: bias_type(to_lower_cppstr(key))
{
- init_cvb_requires();
-
+ description = "uninitialized " + cvm::to_str(key) + " bias";
+ init_dependencies();
rank = 1;
has_data = false;
b_output_energy = false;
reset();
- state_file_step = 0;
- description = "uninitialized " + cvm::to_str(key) + " bias";
+ state_file_step = 0L;
}
@@ -76,6 +75,7 @@ int colvarbias::init(std::string const &conf)
cvm::error("Error: no collective variables specified.\n", INPUT_ERROR);
return INPUT_ERROR;
}
+
} else {
cvm::log("Reinitializing bias \""+name+"\".\n");
}
@@ -98,6 +98,70 @@ int colvarbias::init(std::string const &conf)
}
+int colvarbias::init_dependencies() {
+ int i;
+ if (features().size() == 0) {
+ for (i = 0; i < f_cvb_ntot; i++) {
+ modify_features().push_back(new feature);
+ }
+
+ init_feature(f_cvb_active, "active", f_type_dynamic);
+ require_feature_children(f_cvb_active, f_cv_active);
+
+ init_feature(f_cvb_awake, "awake", f_type_static);
+ require_feature_self(f_cvb_awake, f_cvb_active);
+
+ init_feature(f_cvb_apply_force, "apply force", f_type_user);
+ require_feature_children(f_cvb_apply_force, f_cv_gradient);
+
+ init_feature(f_cvb_get_total_force, "obtain total force", f_type_dynamic);
+ require_feature_children(f_cvb_get_total_force, f_cv_total_force);
+
+ init_feature(f_cvb_output_acc_work, "output accumulated work", f_type_user);
+ require_feature_self(f_cvb_output_acc_work, f_cvb_apply_force);
+
+ init_feature(f_cvb_history_dependent, "history-dependent", f_type_static);
+
+ init_feature(f_cvb_time_dependent, "time-dependent", f_type_static);
+
+ init_feature(f_cvb_scalar_variables, "require scalar variables", f_type_static);
+ require_feature_children(f_cvb_scalar_variables, f_cv_scalar);
+
+ init_feature(f_cvb_calc_pmf, "calculate a PMF", f_type_static);
+
+ init_feature(f_cvb_calc_ti_samples, "calculate TI samples", f_type_dynamic);
+ require_feature_self(f_cvb_calc_ti_samples, f_cvb_get_total_force);
+ require_feature_children(f_cvb_calc_ti_samples, f_cv_grid);
+
+ init_feature(f_cvb_write_ti_samples, "write TI samples ", f_type_user);
+ require_feature_self(f_cvb_write_ti_samples, f_cvb_calc_ti_samples);
+
+ init_feature(f_cvb_write_ti_pmf, "write TI PMF", f_type_user);
+ require_feature_self(f_cvb_write_ti_pmf, f_cvb_calc_ti_samples);
+
+ // check that everything is initialized
+ for (i = 0; i < colvardeps::f_cvb_ntot; i++) {
+ if (is_not_set(i)) {
+ cvm::error("Uninitialized feature " + cvm::to_str(i) + " in " + description);
+ }
+ }
+ }
+
+ // Initialize feature_states for each instance
+ feature_states.reserve(f_cvb_ntot);
+ for (i = 0; i < f_cvb_ntot; i++) {
+ feature_states.push_back(feature_state(true, false));
+ // Most features are available, so we set them so
+ // and list exceptions below
+ }
+
+ // only compute TI samples when deriving from colvarbias_ti
+ feature_states[f_cvb_calc_ti_samples].available = false;
+
+ return COLVARS_OK;
+}
+
+
int colvarbias::reset()
{
bias_energy = 0.0;
@@ -217,6 +281,9 @@ int colvarbias::update()
void colvarbias::communicate_forces()
{
+ if (! is_enabled(f_cvb_apply_force)) {
+ return;
+ }
size_t i = 0;
for (i = 0; i < num_variables(); i++) {
if (cvm::debug()) {
@@ -345,7 +412,8 @@ std::istream & colvarbias::read_state(std::istream &is)
(set_state_params(conf) != COLVARS_OK) ) {
cvm::error("Error: in reading state configuration for \""+bias_type+"\" bias \""+
this->name+"\" at position "+
- cvm::to_str(is.tellg())+" in stream.\n", INPUT_ERROR);
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n", INPUT_ERROR);
is.clear();
is.seekg(start_pos, std::ios::beg);
is.setstate(std::ios::failbit);
@@ -355,7 +423,8 @@ std::istream & colvarbias::read_state(std::istream &is)
if (!read_state_data(is)) {
cvm::error("Error: in reading state data for \""+bias_type+"\" bias \""+
this->name+"\" at position "+
- cvm::to_str(is.tellg())+" in stream.\n", INPUT_ERROR);
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n", INPUT_ERROR);
is.clear();
is.seekg(start_pos, std::ios::beg);
is.setstate(std::ios::failbit);
@@ -365,7 +434,8 @@ std::istream & colvarbias::read_state(std::istream &is)
if (brace != "}") {
cvm::error("Error: corrupt restart information for \""+bias_type+"\" bias \""+
this->name+"\": no matching brace at position "+
- cvm::to_str(is.tellg())+" in stream.\n");
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n");
is.setstate(std::ios::failbit);
}
@@ -381,7 +451,8 @@ std::istream & colvarbias::read_state_data_key(std::istream &is, char const *key
!(key_in == to_lower_cppstr(std::string(key))) ) {
cvm::error("Error: in reading restart configuration for "+
bias_type+" bias \""+this->name+"\" at position "+
- cvm::to_str(is.tellg())+" in stream.\n", INPUT_ERROR);
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n", INPUT_ERROR);
is.clear();
is.seekg(start_pos, std::ios::beg);
is.setstate(std::ios::failbit);
@@ -640,7 +711,7 @@ int colvarbias_ti::write_output_files()
cvm::proxy->close_output_stream(ti_count_file_name);
}
- std::string const ti_grad_file_name(ti_output_prefix+".ti.grad");
+ std::string const ti_grad_file_name(ti_output_prefix+".ti.force");
os = cvm::proxy->output_stream(ti_grad_file_name);
if (os) {
ti_avg_forces->write_multicol(*os);
diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h
index 391826e79e..eac88a7f18 100644
--- a/lib/colvars/colvarbias.h
+++ b/lib/colvars/colvarbias.h
@@ -96,6 +96,9 @@ public:
/// \brief Parse config string and (re)initialize
virtual int init(std::string const &conf);
+ /// \brief Initialize dependency tree
+ virtual int init_dependencies();
+
/// \brief Set to zero all mutable data
virtual int reset();
@@ -181,7 +184,7 @@ public:
static std::vector cvb_features;
/// \brief Implementation of the feature list accessor for colvarbias
- virtual const std::vector &features()
+ virtual const std::vector &features() const
{
return cvb_features;
}
@@ -220,7 +223,7 @@ protected:
bool has_data;
/// \brief Step number read from the last state file
- size_t state_file_step;
+ cvm::step_number state_file_step;
};
diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp
index e5edd92ae6..bac021be99 100644
--- a/lib/colvars/colvarbias_abf.cpp
+++ b/lib/colvars/colvarbias_abf.cpp
@@ -191,10 +191,10 @@ int colvarbias_abf::init(std::string const &conf)
// Projected ABF
get_keyval(conf, "pABFintegrateFreq", pabf_freq, 0);
// Parameters for integrating initial (and final) gradient data
- get_keyval(conf, "integrateInitSteps", integrate_initial_steps, 1e4);
+ get_keyval(conf, "integrateInitMaxIterations", integrate_initial_iterations, 1e4);
get_keyval(conf, "integrateInitTol", integrate_initial_tol, 1e-6);
// for updating the integrated PMF on the fly
- get_keyval(conf, "integrateSteps", integrate_steps, 100);
+ get_keyval(conf, "integrateMaxIterations", integrate_iterations, 100);
get_keyval(conf, "integrateTol", integrate_tol, 1e-4);
}
} else {
@@ -366,10 +366,10 @@ int colvarbias_abf::update()
if ( b_integrate ) {
if ( pabf_freq && cvm::step_relative() % pabf_freq == 0 ) {
cvm::real err;
- int iter = pmf->integrate(integrate_steps, integrate_tol, err);
- if ( iter == integrate_steps ) {
+ int iter = pmf->integrate(integrate_iterations, integrate_tol, err);
+ if ( iter == integrate_iterations ) {
cvm::log("Warning: PMF integration did not converge to " + cvm::to_str(integrate_tol)
- + " in " + cvm::to_str(integrate_steps)
+ + " in " + cvm::to_str(integrate_iterations)
+ " steps. Residual error: " + cvm::to_str(err));
}
pmf->set_zero_minimum(); // TODO: do this only when necessary
@@ -597,7 +597,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app
if (b_integrate) {
// Do numerical integration (to high precision) and output a PMF
cvm::real err;
- pmf->integrate(integrate_initial_steps, integrate_initial_tol, err);
+ pmf->integrate(integrate_initial_iterations, integrate_initial_tol, err);
pmf->set_zero_minimum();
std::string pmf_out_name = prefix + ".pmf";
@@ -661,7 +661,7 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app
// Do numerical integration (to high precision) and output a PMF
cvm::real err;
czar_pmf->set_div();
- czar_pmf->integrate(integrate_initial_steps, integrate_initial_tol, err);
+ czar_pmf->integrate(integrate_initial_iterations, integrate_initial_tol, err);
czar_pmf->set_zero_minimum();
std::string czar_pmf_out_name = prefix + ".czar.pmf";
diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h
index 52bf2df210..4bcc149da5 100644
--- a/lib/colvars/colvarbias_abf.h
+++ b/lib/colvars/colvarbias_abf.h
@@ -27,9 +27,13 @@ class colvarbias_abf : public colvarbias {
public:
+ /// Constructor for ABF bias
colvarbias_abf(char const *key);
+ /// Initializer for ABF bias
virtual int init(std::string const &conf);
+ /// Default destructor for ABF bias
virtual ~colvarbias_abf();
+ /// Per-timestep update of ABF bias
virtual int update();
private:
@@ -40,11 +44,17 @@ private:
/// Base filename(s) for reading previous gradient data (replaces data from restart file)
std::vector input_prefix;
+ /// Adapt the bias at each time step (as opposed to keeping it constant)?
bool update_bias;
+ /// Use normalized definition of PMF for distance functions? (flat at long distances)
+ /// by including the Jacobian term separately of the recorded PMF
bool hide_Jacobian;
+ /// Integrate gradients into a PMF on output
bool b_integrate;
+ /// Number of samples per bin before applying the full biasing force
size_t full_samples;
+ /// Number of samples per bin before applying a scaled-down biasing force
size_t min_samples;
/// frequency for updating output files
int output_freq;
@@ -52,6 +62,7 @@ private:
bool b_history_files;
/// Write CZAR output file for stratified eABF (.zgrad)
bool b_czar_window_file;
+ /// Number of timesteps between recording data in history files (if non-zero)
size_t history_freq;
/// Umbrella Integration estimator of free energy from eABF
UIestimator::UIestimator eabf_UI;
@@ -63,25 +74,30 @@ private:
/// Frequency for updating pABF PMF (if zero, pABF is not used)
int pabf_freq;
/// Max number of CG iterations for integrating PMF at startup and for file output
- int integrate_initial_steps;
+ int integrate_initial_iterations;
/// Tolerance for integrating PMF at startup and for file output
cvm::real integrate_initial_tol;
/// Max number of CG iterations for integrating PMF at on-the-fly pABF updates
- int integrate_steps;
+ int integrate_iterations;
/// Tolerance for integrating PMF at on-the-fly pABF updates
cvm::real integrate_tol;
- /// Cap the biasing force to be applied?
+ /// Cap the biasing force to be applied? (option maxForce)
bool cap_force;
+ /// Maximum force to be applied
std::vector max_force;
- // Frequency for updating 2D gradients
- int integrate_freq;
-
// Internal data and methods
- std::vector bin, force_bin, z_bin;
- gradient_t system_force, applied_force;
+ /// Current bin in sample grid
+ std::vector bin;
+ /// Current bin in force grid
+ std::vector force_bin;
+ /// Cuurent bin in "actual" coordinate, when running extended Lagrangian dynamics
+ std::vector z_bin;
+
+ /// Measured instantaneous system force
+ gradient_t system_force;
/// n-dim grid of free energy gradients
colvar_grid_gradient *gradients;
@@ -118,7 +134,7 @@ private:
// shared ABF
bool shared_on;
size_t shared_freq;
- int shared_last_step;
+ cvm::step_number shared_last_step;
// Share between replicas -- may be called independently of update
virtual int replica_share();
diff --git a/lib/colvars/colvarbias_histogram.h b/lib/colvars/colvarbias_histogram.h
index b9c1b49950..23565caa5c 100644
--- a/lib/colvars/colvarbias_histogram.h
+++ b/lib/colvars/colvarbias_histogram.h
@@ -37,7 +37,7 @@ protected:
std::string out_name, out_name_dx;
size_t output_freq;
- /// If one or more of the variables are \link type_vector \endlink, treat them as arrays of this length
+ /// If one or more of the variables are \link colvarvalue::type_vector \endlink, treat them as arrays of this length
size_t colvar_array_size;
/// If colvar_array_size is larger than 1, weigh each one by this number before accumulating the histogram
std::vector weights;
diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp
index f3ae3631a0..27781ec733 100644
--- a/lib/colvars/colvarbias_meta.cpp
+++ b/lib/colvars/colvarbias_meta.cpp
@@ -11,7 +11,6 @@
#include
#include
#include
-#include
#include
// used to set the absolute path of a replica file
@@ -39,6 +38,8 @@ colvarbias_meta::colvarbias_meta(char const *key)
new_hills_begin = hills.end();
hills_traj_os = NULL;
replica_hills_os = NULL;
+
+ ebmeta_equil_steps = 0L;
}
@@ -61,7 +62,7 @@ int colvarbias_meta::init(std::string const &conf)
enable(f_cvb_history_dependent);
}
- get_keyval(conf, "hillWidth", hill_width, std::sqrt(2.0 * PI) / 2.0);
+ get_keyval(conf, "hillWidth", hill_width, cvm::sqrt(2.0 * PI) / 2.0);
cvm::log("Half-widths of the Gaussian hills (sigma's):\n");
for (size_t i = 0; i < num_variables(); i++) {
cvm::log(variables(i)->name+std::string(": ")+
@@ -201,6 +202,7 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf)
}
target_dist = new colvar_grid_scalar();
target_dist->init_from_colvars(colvars);
+ std::string target_dist_file;
get_keyval(conf, "targetdistfile", target_dist_file);
std::ifstream targetdiststream(target_dist_file.c_str());
target_dist->read_multicol(targetdiststream);
@@ -221,9 +223,9 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf)
}
// normalize target distribution and multiply by effective volume = exp(differential entropy)
target_dist->multiply_constant(1.0/target_dist->integral());
- cvm::real volume = std::exp(target_dist->entropy());
+ cvm::real volume = cvm::exp(target_dist->entropy());
target_dist->multiply_constant(volume);
- get_keyval(conf, "ebMetaEquilSteps", ebmeta_equil_steps, 0);
+ get_keyval(conf, "ebMetaEquilSteps", ebmeta_equil_steps, ebmeta_equil_steps);
}
return COLVARS_OK;
@@ -291,7 +293,7 @@ colvarbias_meta::create_hill(colvarbias_meta::hill const &h)
// need to be computed analytically when the colvar returns
// off-grid
cvm::real const min_dist = hills_energy->bin_distance_from_boundaries(h.centers, true);
- if (min_dist < (3.0 * std::floor(hill_width)) + 1.0) {
+ if (min_dist < (3.0 * cvm::floor(hill_width)) + 1.0) {
hills_off_grid.push_back(h);
}
}
@@ -387,7 +389,7 @@ int colvarbias_meta::update_grid_params()
// first of all, expand the grids, if specified
bool changed_grids = false;
int const min_buffer =
- (3 * (size_t) std::floor(hill_width)) + 1;
+ (3 * (size_t) cvm::floor(hill_width)) + 1;
std::vector new_sizes(hills_energy->sizes());
std::vector new_lower_boundaries(hills_energy->lower_boundaries);
@@ -492,9 +494,9 @@ int colvarbias_meta::update_bias()
if (ebmeta) {
hills_scale *= 1.0/target_dist->value(target_dist->get_colvars_index());
- if(cvm::step_absolute() <= long(ebmeta_equil_steps)) {
+ if(cvm::step_absolute() <= ebmeta_equil_steps) {
cvm::real const hills_lambda =
- (cvm::real(long(ebmeta_equil_steps) - cvm::step_absolute())) /
+ (cvm::real(ebmeta_equil_steps - cvm::step_absolute())) /
(cvm::real(ebmeta_equil_steps));
hills_scale = hills_lambda + (1-hills_lambda)*hills_scale;
}
@@ -508,7 +510,7 @@ int colvarbias_meta::update_bias()
} else {
calc_hills(new_hills_begin, hills.end(), hills_energy_sum_here);
}
- hills_scale *= std::exp(-1.0*hills_energy_sum_here/(bias_temperature*cvm::boltzmann()));
+ hills_scale *= cvm::exp(-1.0*hills_energy_sum_here/(bias_temperature*cvm::boltzmann()));
}
switch (comm) {
@@ -710,7 +712,7 @@ void colvarbias_meta::calc_hills(colvarbias_meta::hill_iter h_first,
// set it to zero if the exponent is more negative than log(1.0E-05)
h->value(0.0);
} else {
- h->value(std::exp(-0.5*cv_sqdev));
+ h->value(cvm::exp(-0.5*cv_sqdev));
}
energy += h->energy();
}
@@ -904,7 +906,7 @@ void colvarbias_meta::recount_hills_off_grid(colvarbias_meta::hill_iter h_first
for (hill_iter h = h_first; h != h_last; h++) {
cvm::real const min_dist = hills_energy->bin_distance_from_boundaries(h->centers, true);
- if (min_dist < (3.0 * std::floor(hill_width)) + 1.0) {
+ if (min_dist < (3.0 * cvm::floor(hill_width)) + 1.0) {
hills_off_grid.push_back(*h);
}
}
@@ -1427,8 +1429,8 @@ std::istream & colvarbias_meta::read_hill(std::istream &is)
return is;
}
- size_t h_it;
- get_keyval(data, "step", h_it, 0, parse_silent);
+ cvm::step_number h_it;
+ get_keyval(data, "step", h_it, 0L, parse_silent);
if (h_it <= state_file_step) {
if (cvm::debug())
cvm::log("Skipping a hill older than the state file for metadynamics bias \""+
@@ -1457,7 +1459,7 @@ std::istream & colvarbias_meta::read_hill(std::istream &is)
std::vector h_widths(num_variables());
get_keyval(data, "widths", h_widths,
- std::vector(num_variables(), (std::sqrt(2.0 * PI) / 2.0)),
+ std::vector(num_variables(), (cvm::sqrt(2.0 * PI) / 2.0)),
parse_silent);
std::string h_replica = "";
@@ -1482,7 +1484,7 @@ std::istream & colvarbias_meta::read_hill(std::istream &is)
// be computed analytically
cvm::real const min_dist =
hills_energy->bin_distance_from_boundaries((hills.back()).centers, true);
- if (min_dist < (3.0 * std::floor(hill_width)) + 1.0) {
+ if (min_dist < (3.0 * cvm::floor(hill_width)) + 1.0) {
hills_off_grid.push_back(hills.back());
}
}
diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h
index 78b2d35d41..0ba2bef1c3 100644
--- a/lib/colvars/colvarbias_meta.h
+++ b/lib/colvars/colvarbias_meta.h
@@ -19,8 +19,8 @@
#include "colvargrid.h"
/// Metadynamics bias (implementation of \link colvarbias \endlink)
-class colvarbias_meta
- : public virtual colvarbias,
+class colvarbias_meta
+ : public virtual colvarbias,
public virtual colvarbias_ti
{
@@ -174,12 +174,14 @@ protected:
/// \brief Biasing temperature in well-tempered metadynamics
cvm::real bias_temperature;
- // EBmeta parameters
+ /// Ensemble-biased metadynamics (EBmeta) flag
bool ebmeta;
+
+ /// Target distribution for EBmeta
colvar_grid_scalar* target_dist;
- std::string target_dist_file;
- cvm::real target_dist_volume;
- size_t ebmeta_equil_steps;
+
+ /// Number of equilibration steps for EBmeta
+ cvm::step_number ebmeta_equil_steps;
/// \brief Try to read the restart information by allocating new
@@ -285,7 +287,7 @@ public:
friend class colvarbias_meta;
/// Time step at which this hill was added
- size_t it;
+ cvm::step_number it;
/// Identity of the replica who added this hill (only in multiple replica simulations)
std::string replica;
@@ -296,9 +298,9 @@ public:
/// replica (optional) Identity of the replica which creates the
/// hill
inline hill(cvm::real const &W_in,
- std::vector &cv,
- cvm::real const &hill_width,
- std::string const &replica_in = "")
+ std::vector &cv,
+ cvm::real const &hill_width,
+ std::string const &replica_in = "")
: sW(1.0),
W(W_in),
centers(cv.size()),
@@ -325,11 +327,11 @@ public:
/// weight Weight of the hill \param centers Center of the hill
/// \param widths Width of the hill around centers \param replica
/// (optional) Identity of the replica which creates the hill
- inline hill(size_t const &it_in,
- cvm::real const &W_in,
- std::vector const ¢ers_in,
- std::vector const &widths_in,
- std::string const &replica_in = "")
+ inline hill(cvm::step_number const &it_in,
+ cvm::real const &W_in,
+ std::vector const ¢ers_in,
+ std::vector const &widths_in,
+ std::string const &replica_in = "")
: sW(1.0),
W(W_in),
centers(centers_in),
diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp
index 2daf7a0876..90588f5a1f 100644
--- a/lib/colvars/colvarbias_restraint.cpp
+++ b/lib/colvars/colvarbias_restraint.cpp
@@ -7,8 +7,6 @@
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
-#include
-
#include "colvarmodule.h"
#include "colvarproxy.h"
#include "colvarvalue.h"
@@ -179,7 +177,7 @@ int colvarbias_restraint_k::change_configuration(std::string const &conf)
colvarbias_restraint_moving::colvarbias_restraint_moving(char const *key)
{
target_nstages = 0;
- target_nsteps = 0;
+ target_nsteps = 0L;
stage = 0;
acc_work = 0.0;
b_chg_centers = false;
@@ -241,8 +239,8 @@ int colvarbias_restraint_moving::set_state_params(std::string const &conf)
{
if (b_chg_centers || b_chg_force_k) {
if (target_nstages) {
- if (!get_keyval(conf, "stage", stage))
- cvm::error("Error: current stage is missing from the restart.\n");
+ get_keyval(conf, "stage", stage, stage,
+ colvarparse::parse_restart | colvarparse::parse_required);
}
}
return COLVARS_OK;
@@ -436,13 +434,13 @@ int colvarbias_restraint_centers_moving::set_state_params(std::string const &con
colvarbias_restraint::set_state_params(conf);
if (b_chg_centers) {
- // cvm::log ("Reading the updated restraint centers from the restart.\n");
- if (!get_keyval(conf, "centers", colvar_centers))
- cvm::error("Error: restraint centers are missing from the restart.\n");
- if (is_enabled(f_cvb_output_acc_work)) {
- if (!get_keyval(conf, "accumulatedWork", acc_work))
- cvm::error("Error: accumulatedWork is missing from the restart.\n");
- }
+ get_keyval(conf, "centers", colvar_centers, colvar_centers,
+ colvarparse::parse_restart | colvarparse::parse_required);
+ }
+
+ if (is_enabled(f_cvb_output_acc_work)) {
+ get_keyval(conf, "accumulatedWork", acc_work, acc_work,
+ colvarparse::parse_restart | colvarparse::parse_required);
}
return COLVARS_OK;
@@ -563,7 +561,7 @@ int colvarbias_restraint_k_moving::update()
lambda = 0.0;
}
force_k = starting_force_k + (target_force_k - starting_force_k)
- * std::pow(lambda, force_k_exp);
+ * cvm::pow(lambda, force_k_exp);
cvm::log("Restraint " + this->name + ", stage " + cvm::to_str(stage)
+ " : lambda = " + cvm::to_str(lambda)
+ ", k = " + cvm::to_str(force_k));
@@ -585,7 +583,7 @@ int colvarbias_restraint_k_moving::update()
for (size_t i = 0; i < num_variables(); i++) {
dU_dk += d_restraint_potential_dk(i);
}
- restraint_FE += force_k_exp * std::pow(lambda, force_k_exp - 1.0)
+ restraint_FE += force_k_exp * cvm::pow(lambda, force_k_exp - 1.0)
* (target_force_k - starting_force_k) * dU_dk;
}
@@ -608,7 +606,7 @@ int colvarbias_restraint_k_moving::update()
lambda = cvm::real(stage) / cvm::real(target_nstages);
}
force_k = starting_force_k + (target_force_k - starting_force_k)
- * std::pow(lambda, force_k_exp);
+ * cvm::pow(lambda, force_k_exp);
cvm::log("Restraint " + this->name + ", stage " + cvm::to_str(stage)
+ " : lambda = " + cvm::to_str(lambda)
+ ", k = " + cvm::to_str(force_k));
@@ -622,7 +620,7 @@ int colvarbias_restraint_k_moving::update()
lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps);
cvm::real const force_k_old = force_k;
force_k = starting_force_k + (target_force_k - starting_force_k)
- * std::pow(lambda, force_k_exp);
+ * cvm::pow(lambda, force_k_exp);
force_k_incr = force_k - force_k_old;
}
}
@@ -672,13 +670,13 @@ int colvarbias_restraint_k_moving::set_state_params(std::string const &conf)
colvarbias_restraint::set_state_params(conf);
if (b_chg_force_k) {
- // cvm::log ("Reading the updated force constant from the restart.\n");
- if (!get_keyval(conf, "forceConstant", force_k, force_k))
- cvm::error("Error: force constant is missing from the restart.\n");
- if (is_enabled(f_cvb_output_acc_work)) {
- if (!get_keyval(conf, "accumulatedWork", acc_work))
- cvm::error("Error: accumulatedWork is missing from the restart.\n");
- }
+ get_keyval(conf, "forceConstant", force_k, force_k,
+ colvarparse::parse_restart | colvarparse::parse_required);
+ }
+
+ if (is_enabled(f_cvb_output_acc_work)) {
+ get_keyval(conf, "accumulatedWork", acc_work, acc_work,
+ colvarparse::parse_restart | colvarparse::parse_required);
}
return COLVARS_OK;
@@ -719,7 +717,8 @@ std::istream & colvarbias_restraint::read_state(std::istream &is)
(set_state_params(conf) != COLVARS_OK) ) {
cvm::error("Error: in reading state configuration for \""+bias_type+"\" bias \""+
this->name+"\" at position "+
- cvm::to_str(is.tellg())+" in stream.\n", INPUT_ERROR);
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n", INPUT_ERROR);
is.clear();
is.seekg(start_pos, std::ios::beg);
is.setstate(std::ios::failbit);
@@ -729,7 +728,8 @@ std::istream & colvarbias_restraint::read_state(std::istream &is)
if (!read_state_data(is)) {
cvm::error("Error: in reading state data for \""+bias_type+"\" bias \""+
this->name+"\" at position "+
- cvm::to_str(is.tellg())+" in stream.\n", INPUT_ERROR);
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream.\n", INPUT_ERROR);
is.clear();
is.seekg(start_pos, std::ios::beg);
is.setstate(std::ios::failbit);
@@ -740,7 +740,7 @@ std::istream & colvarbias_restraint::read_state(std::istream &is)
cvm::log("brace = "+brace+"\n");
cvm::error("Error: corrupt restart information for \""+bias_type+"\" bias \""+
this->name+"\": no matching brace at position "+
- cvm::to_str(is.tellg())+" in stream.\n");
+ cvm::to_str(static_cast(is.tellg()))+" in stream.\n");
is.setstate(std::ios::failbit);
}
@@ -787,11 +787,11 @@ int colvarbias_restraint_harmonic::init(std::string const &conf)
colvarbias_restraint_k_moving::init(conf);
for (size_t i = 0; i < num_variables(); i++) {
- if (variables(i)->width != 1.0)
- cvm::log("The force constant for colvar \""+variables(i)->name+
- "\" will be rescaled to "+
- cvm::to_str(force_k / (variables(i)->width * variables(i)->width))+
- " according to the specified width.\n");
+ cvm::real const w = variables(i)->width;
+ cvm::log("The force constant for colvar \""+variables(i)->name+
+ "\" will be rescaled to "+
+ cvm::to_str(force_k/(w*w))+
+ " according to the specified width ("+cvm::to_str(w)+").\n");
}
return COLVARS_OK;
@@ -1014,7 +1014,7 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf)
INPUT_ERROR);
return INPUT_ERROR;
}
- force_k = std::sqrt(lower_wall_k * upper_wall_k);
+ force_k = cvm::sqrt(lower_wall_k * upper_wall_k);
// transform the two constants to relative values using gemetric mean as ref
// to preserve force_k if provided as single parameter
// (allow changing both via force_k)
@@ -1037,25 +1037,21 @@ int colvarbias_restraint_harmonic_walls::init(std::string const &conf)
if (lower_walls.size() > 0) {
for (i = 0; i < num_variables(); i++) {
- if (variables(i)->width != 1.0)
- cvm::log("The lower wall force constant for colvar \""+
- variables(i)->name+
- "\" will be rescaled to "+
- cvm::to_str(lower_wall_k * force_k /
- (variables(i)->width * variables(i)->width))+
- " according to the specified width.\n");
+ cvm::real const w = variables(i)->width;
+ cvm::log("The lower wall force constant for colvar \""+
+ variables(i)->name+"\" will be rescaled to "+
+ cvm::to_str(lower_wall_k * force_k / (w*w))+
+ " according to the specified width ("+cvm::to_str(w)+").\n");
}
}
if (upper_walls.size() > 0) {
for (i = 0; i < num_variables(); i++) {
- if (variables(i)->width != 1.0)
- cvm::log("The upper wall force constant for colvar \""+
- variables(i)->name+
- "\" will be rescaled to "+
- cvm::to_str(upper_wall_k * force_k /
- (variables(i)->width * variables(i)->width))+
- " according to the specified width.\n");
+ cvm::real const w = variables(i)->width;
+ cvm::log("The upper wall force constant for colvar \""+
+ variables(i)->name+"\" will be rescaled to "+
+ cvm::to_str(upper_wall_k * force_k / (w*w))+
+ " according to the specified width ("+cvm::to_str(w)+").\n");
}
}
@@ -1225,11 +1221,11 @@ int colvarbias_restraint_linear::init(std::string const &conf)
INPUT_ERROR);
return INPUT_ERROR;
}
- if (variables(i)->width != 1.0)
- cvm::log("The force constant for colvar \""+variables(i)->name+
- "\" will be rescaled to "+
- cvm::to_str(force_k / variables(i)->width)+
- " according to the specified width.\n");
+ cvm::real const w = variables(i)->width;
+ cvm::log("The force constant for colvar \""+variables(i)->name+
+ "\" will be rescaled to "+
+ cvm::to_str(force_k / w)+
+ " according to the specified width ("+cvm::to_str(w)+").\n");
}
return COLVARS_OK;
@@ -1367,6 +1363,7 @@ colvarbias_restraint_histogram::colvarbias_restraint_histogram(char const *key)
int colvarbias_restraint_histogram::init(std::string const &conf)
{
colvarbias::init(conf);
+ enable(f_cvb_apply_force);
get_keyval(conf, "lowerBoundary", lower_boundary, lower_boundary);
get_keyval(conf, "upperBoundary", upper_boundary, upper_boundary);
@@ -1390,7 +1387,7 @@ int colvarbias_restraint_histogram::init(std::string const &conf)
cvm::real const nbins = (upper_boundary - lower_boundary) / width;
int const nbins_round = (int)(nbins);
- if (std::fabs(nbins - cvm::real(nbins_round)) > 1.0E-10) {
+ if (cvm::fabs(nbins - cvm::real(nbins_round)) > 1.0E-10) {
cvm::log("Warning: grid interval ("+
cvm::to_str(lower_boundary, cvm::cv_width, cvm::cv_prec)+" - "+
cvm::to_str(upper_boundary, cvm::cv_width, cvm::cv_prec)+
@@ -1440,7 +1437,7 @@ int colvarbias_restraint_histogram::init(std::string const &conf)
}
}
cvm::real const ref_integral = ref_p.sum() * width;
- if (std::fabs(ref_integral - 1.0) > 1.0e-03) {
+ if (cvm::fabs(ref_integral - 1.0) > 1.0e-03) {
cvm::log("Reference distribution not normalized, normalizing to unity.\n");
ref_p /= ref_integral;
}
@@ -1471,7 +1468,7 @@ int colvarbias_restraint_histogram::update()
vector_size += variables(icv)->value().size();
}
- cvm::real const norm = 1.0/(std::sqrt(2.0*PI)*gaussian_width*vector_size);
+ cvm::real const norm = 1.0/(cvm::sqrt(2.0*PI)*gaussian_width*vector_size);
// calculate the histogram
p.reset();
@@ -1482,7 +1479,7 @@ int colvarbias_restraint_histogram::update()
size_t igrid;
for (igrid = 0; igrid < p.size(); igrid++) {
cvm::real const x_grid = (lower_boundary + (igrid+0.5)*width);
- p[igrid] += norm * std::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
+ p[igrid] += norm * cvm::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
(2.0 * gaussian_width * gaussian_width));
}
} else if (cv.type() == colvarvalue::type_vector) {
@@ -1492,7 +1489,7 @@ int colvarbias_restraint_histogram::update()
size_t igrid;
for (igrid = 0; igrid < p.size(); igrid++) {
cvm::real const x_grid = (lower_boundary + (igrid+0.5)*width);
- p[igrid] += norm * std::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
+ p[igrid] += norm * cvm::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
(2.0 * gaussian_width * gaussian_width));
}
}
@@ -1523,7 +1520,7 @@ int colvarbias_restraint_histogram::update()
for (igrid = 0; igrid < p.size(); igrid++) {
cvm::real const x_grid = (lower_boundary + (igrid+0.5)*width);
force += force_k_cv * p_diff[igrid] *
- norm * std::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
+ norm * cvm::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
(2.0 * gaussian_width * gaussian_width)) *
(-1.0 * (x_grid - cv_value) / (gaussian_width * gaussian_width));
}
@@ -1536,7 +1533,7 @@ int colvarbias_restraint_histogram::update()
for (igrid = 0; igrid < p.size(); igrid++) {
cvm::real const x_grid = (lower_boundary + (igrid+0.5)*width);
force += force_k_cv * p_diff[igrid] *
- norm * std::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
+ norm * cvm::exp(-1.0 * (x_grid - cv_value) * (x_grid - cv_value) /
(2.0 * gaussian_width * gaussian_width)) *
(-1.0 * (x_grid - cv_value) / (gaussian_width * gaussian_width));
}
@@ -1550,7 +1547,7 @@ int colvarbias_restraint_histogram::update()
}
-std::ostream & colvarbias_restraint_histogram::write_restart(std::ostream &os)
+int colvarbias_restraint_histogram::write_output_files()
{
if (b_write_histogram) {
std::string file_name(cvm::output_prefix()+"."+this->name+".hist.dat");
@@ -1558,6 +1555,9 @@ std::ostream & colvarbias_restraint_histogram::write_restart(std::ostream &os)
*os << "# " << cvm::wrap_string(variables(0)->name, cvm::cv_width)
<< " " << "p(" << cvm::wrap_string(variables(0)->name, cvm::cv_width-3)
<< ")\n";
+
+ os->setf(std::ios::fixed, std::ios::floatfield);
+
size_t igrid;
for (igrid = 0; igrid < p.size(); igrid++) {
cvm::real const x_grid = (lower_boundary + (igrid+1)*width);
@@ -1572,13 +1572,7 @@ std::ostream & colvarbias_restraint_histogram::write_restart(std::ostream &os)
}
cvm::proxy->close_output_stream(file_name);
}
- return os;
-}
-
-
-std::istream & colvarbias_restraint_histogram::read_restart(std::istream &is)
-{
- return is;
+ return COLVARS_OK;
}
diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h
index 3ee999c262..6493f7f16b 100644
--- a/lib/colvars/colvarbias_restraint.h
+++ b/lib/colvars/colvarbias_restraint.h
@@ -132,7 +132,7 @@ protected:
/// \brief Number of steps required to reach the target force constant
/// or restraint centers
- long target_nsteps;
+ cvm::step_number target_nsteps;
/// \brief Accumulated work (computed when outputAccumulatedWork == true)
cvm::real acc_work;
@@ -328,8 +328,7 @@ public:
virtual int update();
- virtual std::istream & read_restart(std::istream &is);
- virtual std::ostream & write_restart(std::ostream &os);
+ virtual int write_output_files();
virtual std::ostream & write_traj_label(std::ostream &os);
virtual std::ostream & write_traj(std::ostream &os);
diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp
index cb272eed05..3075ed82ca 100644
--- a/lib/colvars/colvarcomp.cpp
+++ b/lib/colvars/colvarcomp.cpp
@@ -20,7 +20,8 @@ colvar::cvc::cvc()
b_periodic(false),
b_try_scalable(true)
{
- init_cvc_requires();
+ description = "uninitialized colvar component";
+ init_dependencies();
sup_coeff = 1.0;
period = 0.0;
wrap_center = 0.0;
@@ -33,7 +34,8 @@ colvar::cvc::cvc(std::string const &conf)
b_periodic(false),
b_try_scalable(true)
{
- init_cvc_requires();
+ description = "uninitialized colvar component";
+ init_dependencies();
sup_coeff = 1.0;
period = 0.0;
wrap_center = 0.0;
@@ -176,6 +178,100 @@ cvm::atom_group *colvar::cvc::parse_group(std::string const &conf,
}
+int colvar::cvc::init_dependencies() {
+ size_t i;
+ // Initialize static array once and for all
+ if (features().size() == 0) {
+ for (i = 0; i < colvardeps::f_cvc_ntot; i++) {
+ modify_features().push_back(new feature);
+ }
+
+ init_feature(f_cvc_active, "active", f_type_dynamic);
+// The dependency below may become useful if we use dynamic atom groups
+// require_feature_children(f_cvc_active, f_ag_active);
+
+ init_feature(f_cvc_scalar, "scalar", f_type_static);
+
+ init_feature(f_cvc_gradient, "gradient", f_type_dynamic);
+
+ init_feature(f_cvc_explicit_gradient, "explicit gradient", f_type_static);
+ require_feature_children(f_cvc_explicit_gradient, f_ag_explicit_gradient);
+
+ init_feature(f_cvc_inv_gradient, "inverse gradient", f_type_dynamic);
+ require_feature_self(f_cvc_inv_gradient, f_cvc_gradient);
+
+ init_feature(f_cvc_debug_gradient, "debug gradient", f_type_user);
+ require_feature_self(f_cvc_debug_gradient, f_cvc_gradient);
+ require_feature_self(f_cvc_debug_gradient, f_cvc_explicit_gradient);
+
+ init_feature(f_cvc_Jacobian, "Jacobian derivative", f_type_dynamic);
+ require_feature_self(f_cvc_Jacobian, f_cvc_inv_gradient);
+
+ init_feature(f_cvc_com_based, "depends on group centers of mass", f_type_static);
+
+ init_feature(f_cvc_pbc_minimum_image, "use minimum-image distances with PBCs", f_type_user);
+
+ // Compute total force on first site only to avoid unwanted
+ // coupling to other colvars (see e.g. Ciccotti et al., 2005)
+ init_feature(f_cvc_one_site_total_force, "compute total force from one group", f_type_user);
+ require_feature_self(f_cvc_one_site_total_force, f_cvc_com_based);
+
+ init_feature(f_cvc_scalable, "scalable calculation", f_type_static);
+ require_feature_self(f_cvc_scalable, f_cvc_scalable_com);
+
+ init_feature(f_cvc_scalable_com, "scalable calculation of centers of mass", f_type_static);
+ require_feature_self(f_cvc_scalable_com, f_cvc_com_based);
+
+
+ // TODO only enable this when f_ag_scalable can be turned on for a pre-initialized group
+ // require_feature_children(f_cvc_scalable, f_ag_scalable);
+ // require_feature_children(f_cvc_scalable_com, f_ag_scalable_com);
+
+ // check that everything is initialized
+ for (i = 0; i < colvardeps::f_cvc_ntot; i++) {
+ if (is_not_set(i)) {
+ cvm::error("Uninitialized feature " + cvm::to_str(i) + " in " + description);
+ }
+ }
+ }
+
+ // Initialize feature_states for each instance
+ // default as available, not enabled
+ // except dynamic features which default as unavailable
+ feature_states.reserve(f_cvc_ntot);
+ for (i = 0; i < colvardeps::f_cvc_ntot; i++) {
+ bool avail = is_dynamic(i) ? false : true;
+ feature_states.push_back(feature_state(avail, false));
+ }
+
+ // Features that are implemented by all cvcs by default
+ // Each cvc specifies what other features are available
+ feature_states[f_cvc_active].available = true;
+ feature_states[f_cvc_gradient].available = true;
+
+ // CVCs are enabled from the start - get disabled based on flags
+ enable(f_cvc_active);
+ // feature_states[f_cvc_active].enabled = true;
+
+ // Explicit gradients are implemented in mosts CVCs. Exceptions must be specified explicitly.
+ // feature_states[f_cvc_explicit_gradient].enabled = true;
+ enable(f_cvc_explicit_gradient);
+
+ // Use minimum-image distances by default
+ // feature_states[f_cvc_pbc_minimum_image].enabled = true;
+ enable(f_cvc_pbc_minimum_image);
+
+ // Features that are implemented by default if their requirements are
+ feature_states[f_cvc_one_site_total_force].available = true;
+
+ // Features That are implemented only for certain simulation engine configurations
+ feature_states[f_cvc_scalable_com].available = (cvm::proxy->scalable_group_coms() == COLVARS_OK);
+ feature_states[f_cvc_scalable].available = feature_states[f_cvc_scalable_com].available;
+
+ return COLVARS_OK;
+}
+
+
int colvar::cvc::setup()
{
description = "cvc " + name;
@@ -192,6 +288,7 @@ colvar::cvc::~cvc()
}
}
+
void colvar::cvc::read_data()
{
size_t ig;
@@ -214,6 +311,66 @@ void colvar::cvc::read_data()
}
+std::vector > colvar::cvc::get_atom_lists()
+{
+ std::vector > lists;
+
+ std::vector::iterator agi = atom_groups.begin();
+ for ( ; agi != atom_groups.end(); ++agi) {
+ (*agi)->create_sorted_ids();
+ lists.push_back((*agi)->sorted_ids());
+ if ((*agi)->is_enabled(f_ag_fitting_group) && (*agi)->is_enabled(f_ag_fit_gradients)) {
+ cvm::atom_group &fg = *((*agi)->fitting_group);
+ fg.create_sorted_ids();
+ lists.push_back(fg.sorted_ids());
+ }
+ }
+ return lists;
+}
+
+
+void colvar::cvc::collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients)
+{
+ // Coefficient: d(a * x^n) = a * n * x^(n-1) * dx
+ cvm::real coeff = sup_coeff * cvm::real(sup_np) *
+ cvm::integer_power(value().real_value, sup_np-1);
+
+ for (size_t j = 0; j < atom_groups.size(); j++) {
+
+ cvm::atom_group &ag = *(atom_groups[j]);
+
+ // If necessary, apply inverse rotation to get atomic
+ // gradient in the laboratory frame
+ if (ag.b_rotate) {
+ cvm::rotation const rot_inv = ag.rot.inverse();
+
+ for (size_t k = 0; k < ag.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ ag[k].id) - atom_ids.begin();
+ atomic_gradients[a] += coeff * rot_inv.rotate(ag[k].grad);
+ }
+
+ } else {
+
+ for (size_t k = 0; k < ag.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ ag[k].id) - atom_ids.begin();
+ atomic_gradients[a] += coeff * ag[k].grad;
+ }
+ }
+ if (ag.is_enabled(f_ag_fitting_group) && ag.is_enabled(f_ag_fit_gradients)) {
+ cvm::atom_group const &fg = *(ag.fitting_group);
+ for (size_t k = 0; k < fg.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ fg[k].id) - atom_ids.begin();
+ // fit gradients are in the unrotated (simulation) frame
+ atomic_gradients[a] += coeff * fg.fit_gradients[k];
+ }
+ }
+ }
+}
+
+
void colvar::cvc::calc_force_invgrads()
{
cvm::error("Error: calculation of inverse gradients is not implemented "
@@ -306,8 +463,8 @@ void colvar::cvc::debug_gradients()
cvm::log("dx(interp) = "+cvm::to_str(dx_pred,
21, 14)+"\n");
cvm::log("|dx(actual) - dx(interp)|/|dx(actual)| = "+
- cvm::to_str(std::fabs(x_1 - x_0 - dx_pred) /
- std::fabs(x_1 - x_0), 12, 5)+"\n");
+ cvm::to_str(cvm::fabs(x_1 - x_0 - dx_pred) /
+ cvm::fabs(x_1 - x_0), 12, 5)+"\n");
}
}
@@ -341,8 +498,8 @@ void colvar::cvc::debug_gradients()
cvm::log("dx(interp) = "+cvm::to_str (dx_pred,
21, 14)+"\n");
cvm::log ("|dx(actual) - dx(interp)|/|dx(actual)| = "+
- cvm::to_str(std::fabs (x_1 - x_0 - dx_pred) /
- std::fabs (x_1 - x_0),
+ cvm::to_str(cvm::fabs (x_1 - x_0 - dx_pred) /
+ cvm::fabs (x_1 - x_0),
12, 5)+
".\n");
}
@@ -378,7 +535,7 @@ colvarvalue colvar::cvc::dist2_rgrad(colvarvalue const &x1,
}
-void colvar::cvc::wrap(colvarvalue &x) const
+void colvar::cvc::wrap(colvarvalue &x_unwrapped) const
{
return;
}
diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h
index 1a6df3771e..f615680ba6 100644
--- a/lib/colvars/colvarcomp.h
+++ b/lib/colvars/colvarcomp.h
@@ -27,12 +27,12 @@
/// \brief Colvar component (base class for collective variables)
///
-/// A \link cvc \endlink object (or an object of a
+/// A \link colvar::cvc \endlink object (or an object of a
/// cvc-derived class) implements the calculation of a collective
/// variable, its gradients and any other related physical quantities
/// that depend on microscopic degrees of freedom.
///
-/// No restriction is set to what kind of calculation a \link cvc \endlink
+/// No restriction is set to what kind of calculation a \link colvar::cvc \endlink
/// object performs (usually an analytical function of atomic coordinates).
/// The only constraints are that: \par
///
@@ -42,9 +42,9 @@
/// alike, and allows an automatic selection of the applicable algorithms.
///
/// - The object provides an implementation \link apply_force() \endlink to
-/// apply forces to atoms. Typically, one or more \link cvm::atom_group
+/// apply forces to atoms. Typically, one or more \link colvarmodule::atom_group
/// \endlink objects are used, but this is not a requirement for as long as
-/// the \link cvc \endlink object communicates with the simulation program.
+/// the \link colvar::cvc \endlink object communicates with the simulation program.
///
/// If you wish to implement a new collective variable component, you
/// should write your own class by inheriting directly from \link
@@ -75,9 +75,9 @@ public:
/// \brief Description of the type of collective variable
///
/// Normally this string is set by the parent \link colvar \endlink
- /// object within its constructor, when all \link cvc \endlink
+ /// object within its constructor, when all \link colvar::cvc \endlink
/// objects are initialized; therefore the main "config string"
- /// constructor does not need to define it. If a \link cvc
+ /// constructor does not need to define it. If a \link colvar::cvc
/// \endlink is initialized and/or a different constructor is used,
/// this variable definition should be set within the constructor.
std::string function_type;
@@ -109,6 +109,9 @@ public:
/// cvc \endlink
virtual int init(std::string const &conf);
+ /// \brief Initialize dependency tree
+ virtual int init_dependencies();
+
/// \brief Within the constructor, make a group parse its own
/// options from the provided configuration string
/// Returns reference to new group
@@ -122,7 +125,7 @@ public:
/// \brief After construction, set data related to dependency handling
int setup();
- /// \brief Default constructor (used when \link cvc \endlink
+ /// \brief Default constructor (used when \link colvar::cvc \endlink
/// objects are declared within other ones)
cvc();
@@ -133,7 +136,7 @@ public:
static std::vector cvc_features;
/// \brief Implementation of the feature list accessor for colvar
- virtual const std::vector &features()
+ virtual const std::vector &features() const
{
return cvc_features;
}
@@ -148,6 +151,9 @@ public:
cvc_features.clear();
}
+ /// \brief Get vector of vectors of atom IDs for all atom groups
+ virtual std::vector > get_atom_lists();
+
/// \brief Obtain data needed for the calculation for the backend
virtual void read_data();
@@ -164,6 +170,10 @@ public:
/// \brief Calculate finite-difference gradients alongside the analytical ones, for each Cartesian component
virtual void debug_gradients();
+ /// \brief Calculate atomic gradients and add them to the corresponding item in gradient vector
+ /// May be overridden by CVCs that do not store their gradients in the classic way, see dihedPC
+ virtual void collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients);
+
/// \brief Calculate the total force from the system using the
/// inverse atomic gradients
virtual void calc_force_invgrads();
@@ -237,7 +247,7 @@ public:
colvarvalue const &x2) const;
/// \brief Wrap value (for periodic/symmetric cvcs)
- virtual void wrap(colvarvalue &x) const;
+ virtual void wrap(colvarvalue &x_unwrapped) const;
/// \brief Pointers to all atom groups, to let colvars collect info
/// e.g. atomic gradients
@@ -246,7 +256,7 @@ public:
/// \brief Store a pointer to new atom group, and list as child for dependencies
inline void register_atom_group(cvm::atom_group *ag) {
atom_groups.push_back(ag);
- add_child((colvardeps *) ag);
+ add_child(ag);
}
/// \brief Whether or not this CVC will be computed in parallel whenever possible
@@ -415,7 +425,7 @@ public:
virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
/// \brief Redefined to make use of the user-provided period
- virtual void wrap(colvarvalue &x) const;
+ virtual void wrap(colvarvalue &x_unwrapped) const;
};
@@ -474,7 +484,7 @@ public:
virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
/// Redefined to handle the 2*PI periodicity
- virtual void wrap(colvarvalue &x) const;
+ virtual void wrap(colvarvalue &x_unwrapped) const;
};
@@ -559,6 +569,35 @@ public:
+/// \brief Colvar component: dipole magnitude of a molecule
+class colvar::dipole_magnitude
+ : public colvar::cvc
+{
+protected:
+ /// Dipole atom group
+ cvm::atom_group *atoms;
+ cvm::atom_pos dipoleV;
+public:
+ /// Initialize by parsing the configuration
+ dipole_magnitude (std::string const &conf);
+ dipole_magnitude (cvm::atom const &a1);
+ dipole_magnitude();
+ virtual inline ~dipole_magnitude() {}
+ virtual void calc_value();
+ virtual void calc_gradients();
+ //virtual void calc_force_invgrads();
+ //virtual void calc_Jacobian_derivative();
+ virtual void apply_force (colvarvalue const &force);
+ virtual cvm::real dist2 (colvarvalue const &x1,
+ colvarvalue const &x2) const;
+ virtual colvarvalue dist2_lgrad (colvarvalue const &x1,
+ colvarvalue const &x2) const;
+ virtual colvarvalue dist2_rgrad (colvarvalue const &x1,
+ colvarvalue const &x2) const;
+};
+
+
+
/// \brief Colvar component: Radius of gyration of an atom group
/// (colvarvalue::type_scalar type, range [0:*))
class colvar::gyration
@@ -818,7 +857,7 @@ public:
virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
/// Redefined to handle the 2*PI periodicity
- virtual void wrap(colvarvalue &x) const;
+ virtual void wrap(colvarvalue &x_unwrapped) const;
};
@@ -1002,7 +1041,7 @@ public:
cvm::atom const &donor,
cvm::real r0, int en, int ed);
h_bond();
- virtual ~h_bond();
+ virtual ~h_bond() {}
virtual void calc_value();
virtual void calc_gradients();
virtual void apply_force(colvarvalue const &force);
@@ -1090,6 +1129,8 @@ public:
virtual ~alpha_angles();
void calc_value();
void calc_gradients();
+ /// Re-implementation of cvc::collect_gradients() to carry over atomic gradients of sub-cvcs
+ void collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients);
void apply_force(colvarvalue const &force);
virtual cvm::real dist2(colvarvalue const &x1,
colvarvalue const &x2) const;
@@ -1120,6 +1161,8 @@ public:
virtual ~dihedPC();
void calc_value();
void calc_gradients();
+ /// Re-implementation of cvc::collect_gradients() to carry over atomic gradients of sub-cvcs
+ void collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients);
void apply_force(colvarvalue const &force);
virtual cvm::real dist2(colvarvalue const &x1,
colvarvalue const &x2) const;
@@ -1159,6 +1202,7 @@ public:
orientation(std::string const &conf);
orientation();
+ virtual int init(std::string const &conf);
virtual ~orientation() {}
virtual void calc_value();
virtual void calc_gradients();
@@ -1183,6 +1227,7 @@ public:
orientation_angle(std::string const &conf);
orientation_angle();
+ virtual int init(std::string const &conf);
virtual ~orientation_angle() {}
virtual void calc_value();
virtual void calc_gradients();
@@ -1207,6 +1252,7 @@ public:
orientation_proj(std::string const &conf);
orientation_proj();
+ virtual int init(std::string const &conf);
virtual ~orientation_proj() {}
virtual void calc_value();
virtual void calc_gradients();
@@ -1234,6 +1280,7 @@ public:
tilt(std::string const &conf);
tilt();
+ virtual int init(std::string const &conf);
virtual ~tilt() {}
virtual void calc_value();
virtual void calc_gradients();
@@ -1261,6 +1308,7 @@ public:
spin_angle(std::string const &conf);
spin_angle();
+ virtual int init(std::string const &conf);
virtual ~spin_angle() {}
virtual void calc_value();
virtual void calc_gradients();
@@ -1275,7 +1323,7 @@ public:
virtual colvarvalue dist2_rgrad(colvarvalue const &x1,
colvarvalue const &x2) const;
/// Redefined to handle the 2*PI periodicity
- virtual void wrap(colvarvalue &x) const;
+ virtual void wrap(colvarvalue &x_unwrapped) const;
};
diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp
index 9f879a4c41..97fb23b181 100644
--- a/lib/colvars/colvarcomp_angles.cpp
+++ b/lib/colvars/colvarcomp_angles.cpp
@@ -11,9 +11,6 @@
#include "colvar.h"
#include "colvarcomp.h"
-#include
-
-
colvar::angle::angle(std::string const &conf)
: cvc(conf)
@@ -77,14 +74,14 @@ void colvar::angle::calc_value()
cvm::real const cos_theta = (r21*r23)/(r21l*r23l);
- x.real_value = (180.0/PI) * std::acos(cos_theta);
+ x.real_value = (180.0/PI) * cvm::acos(cos_theta);
}
void colvar::angle::calc_gradients()
{
cvm::real const cos_theta = (r21*r23)/(r21l*r23l);
- cvm::real const dxdcos = -1.0 / std::sqrt(1.0 - cos_theta*cos_theta);
+ cvm::real const dxdcos = -1.0 / cvm::sqrt(1.0 - cos_theta*cos_theta);
dxdr1 = (180.0/PI) * dxdcos *
(1.0/r21l) * ( r23/r23l + (-1.0) * cos_theta * r21/r21l );
@@ -126,7 +123,7 @@ void colvar::angle::calc_Jacobian_derivative()
// det(J) = (2 pi) r^2 * sin(theta)
// hence Jd = cot(theta)
const cvm::real theta = x.real_value * PI / 180.0;
- jd = PI / 180.0 * (theta != 0.0 ? std::cos(theta) / std::sin(theta) : 0.0);
+ jd = PI / 180.0 * (theta != 0.0 ? cvm::cos(theta) / cvm::sin(theta) : 0.0);
}
@@ -202,7 +199,7 @@ void colvar::dipole_angle::calc_value()
cvm::real const cos_theta = (r21*r23)/(r21l*r23l);
- x.real_value = (180.0/PI) * std::acos(cos_theta);
+ x.real_value = (180.0/PI) * cvm::acos(cos_theta);
}
//to be implemented
@@ -212,7 +209,7 @@ void colvar::dipole_angle::calc_value()
void colvar::dipole_angle::calc_gradients()
{
cvm::real const cos_theta = (r21*r23)/(r21l*r23l);
- cvm::real const dxdcos = -1.0 / std::sqrt(1.0 - cos_theta*cos_theta);
+ cvm::real const dxdcos = -1.0 / cvm::sqrt(1.0 - cos_theta*cos_theta);
dxdr1 = (180.0/PI) * dxdcos *
(1.0/r21l)* (r23/r23l + (-1.0) * cos_theta * r21/r21l );
@@ -346,7 +343,7 @@ void colvar::dihedral::calc_value()
cvm::real const cos_phi = n1 * n2;
cvm::real const sin_phi = n1 * r34 * r23.norm();
- x.real_value = (180.0/PI) * std::atan2(sin_phi, cos_phi);
+ x.real_value = (180.0/PI) * cvm::atan2(sin_phi, cos_phi);
this->wrap(x);
}
@@ -368,7 +365,7 @@ void colvar::dihedral::calc_gradients()
rB = 1.0/rB;
B *= rB;
- if (std::fabs(sin_phi) > 0.1) {
+ if (cvm::fabs(sin_phi) > 0.1) {
rA = 1.0/rA;
A *= rA;
cvm::rvector const dcosdA = rA*(cos_phi*A-B);
@@ -440,8 +437,8 @@ void colvar::dihedral::calc_force_invgrads()
cvm::real const dot1 = u23 * u12;
cvm::real const dot4 = u23 * u34;
- cvm::real const fact1 = d12 * std::sqrt(1.0 - dot1 * dot1);
- cvm::real const fact4 = d34 * std::sqrt(1.0 - dot4 * dot4);
+ cvm::real const fact1 = d12 * cvm::sqrt(1.0 - dot1 * dot1);
+ cvm::real const fact4 = d34 * cvm::sqrt(1.0 - dot4 * dot4);
group1->read_total_forces();
if (is_enabled(f_cvc_one_site_total_force)) {
@@ -508,19 +505,17 @@ colvarvalue colvar::dihedral::dist2_rgrad(colvarvalue const &x1,
}
-void colvar::dihedral::wrap(colvarvalue &x) const
+void colvar::dihedral::wrap(colvarvalue &x_unwrapped) const
{
- if ((x.real_value - wrap_center) >= 180.0) {
- x.real_value -= 360.0;
+ if ((x_unwrapped.real_value - wrap_center) >= 180.0) {
+ x_unwrapped.real_value -= 360.0;
return;
}
- if ((x.real_value - wrap_center) < -180.0) {
- x.real_value += 360.0;
+ if ((x_unwrapped.real_value - wrap_center) < -180.0) {
+ x_unwrapped.real_value += 360.0;
return;
}
-
- return;
}
@@ -548,8 +543,8 @@ void colvar::polar_theta::calc_value()
cvm::rvector pos = atoms->center_of_mass();
r = atoms->center_of_mass().norm();
// Internal values of theta and phi are radians
- theta = (r > 0.) ? std::acos(pos.z / r) : 0.;
- phi = std::atan2(pos.y, pos.x);
+ theta = (r > 0.) ? cvm::acos(pos.z / r) : 0.;
+ phi = cvm::atan2(pos.y, pos.x);
x.real_value = (180.0/PI) * theta;
}
@@ -560,9 +555,9 @@ void colvar::polar_theta::calc_gradients()
atoms->set_weighted_gradient(cvm::rvector(0., 0., 0.));
else
atoms->set_weighted_gradient(cvm::rvector(
- (180.0/PI) * std::cos(theta) * std::cos(phi) / r,
- (180.0/PI) * std::cos(theta) * std::sin(phi) / r,
- (180.0/PI) * -std::sin(theta) / r));
+ (180.0/PI) * cvm::cos(theta) * cvm::cos(phi) / r,
+ (180.0/PI) * cvm::cos(theta) * cvm::sin(phi) / r,
+ (180.0/PI) * -cvm::sin(theta) / r));
}
@@ -602,8 +597,8 @@ void colvar::polar_phi::calc_value()
cvm::rvector pos = atoms->center_of_mass();
r = atoms->center_of_mass().norm();
// Internal values of theta and phi are radians
- theta = (r > 0.) ? std::acos(pos.z / r) : 0.;
- phi = std::atan2(pos.y, pos.x);
+ theta = (r > 0.) ? cvm::acos(pos.z / r) : 0.;
+ phi = cvm::atan2(pos.y, pos.x);
x.real_value = (180.0/PI) * phi;
}
@@ -611,8 +606,8 @@ void colvar::polar_phi::calc_value()
void colvar::polar_phi::calc_gradients()
{
atoms->set_weighted_gradient(cvm::rvector(
- (180.0/PI) * -std::sin(phi) / (r*std::sin(theta)),
- (180.0/PI) * std::cos(phi) / (r*std::sin(theta)),
+ (180.0/PI) * -cvm::sin(phi) / (r*cvm::sin(theta)),
+ (180.0/PI) * cvm::cos(phi) / (r*cvm::sin(theta)),
0.));
}
@@ -653,15 +648,15 @@ colvarvalue colvar::polar_phi::dist2_rgrad(colvarvalue const &x1,
}
-void colvar::polar_phi::wrap(colvarvalue &x) const
+void colvar::polar_phi::wrap(colvarvalue &x_unwrapped) const
{
- if ((x.real_value - wrap_center) >= 180.0) {
- x.real_value -= 360.0;
+ if ((x_unwrapped.real_value - wrap_center) >= 180.0) {
+ x_unwrapped.real_value -= 360.0;
return;
}
- if ((x.real_value - wrap_center) < -180.0) {
- x.real_value += 360.0;
+ if ((x_unwrapped.real_value - wrap_center) < -180.0) {
+ x_unwrapped.real_value += 360.0;
return;
}
diff --git a/lib/colvars/colvarcomp_coordnums.cpp b/lib/colvars/colvarcomp_coordnums.cpp
index ec53391ef5..059b0c825b 100644
--- a/lib/colvars/colvarcomp_coordnums.cpp
+++ b/lib/colvars/colvarcomp_coordnums.cpp
@@ -7,8 +7,6 @@
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
-#include
-
#include "colvarmodule.h"
#include "colvarparse.h"
#include "colvaratoms.h"
@@ -102,6 +100,12 @@ colvar::coordnum::coordnum(std::string const &conf)
group1 = parse_group(conf, "group1");
group2 = parse_group(conf, "group2");
+ if (group1 == NULL || group2 == NULL) {
+ cvm::error("Error: failed to initialize atom groups.\n",
+ INPUT_ERROR);
+ return;
+ }
+
if (int atom_number = cvm::atom_group::overlap(*group1, *group2)) {
cvm::error("Error: group1 and group2 share a common atom (number: " +
cvm::to_str(atom_number) + ")\n", INPUT_ERROR);
@@ -408,12 +412,6 @@ colvar::h_bond::h_bond()
}
-colvar::h_bond::~h_bond()
-{
- delete atom_groups[0];
-}
-
-
void colvar::h_bond::calc_value()
{
int const flags = coordnum::ef_null;
@@ -655,8 +653,6 @@ colvar::groupcoordnum::groupcoordnum()
void colvar::groupcoordnum::calc_value()
{
- cvm::rvector const r0_vec(0.0); // TODO enable the flag?
-
// create fake atoms to hold the com coordinates
cvm::atom group1_com_atom;
cvm::atom group2_com_atom;
@@ -680,8 +676,6 @@ void colvar::groupcoordnum::calc_value()
void colvar::groupcoordnum::calc_gradients()
{
- cvm::rvector const r0_vec(0.0); // TODO enable the flag?
-
cvm::atom group1_com_atom;
cvm::atom group2_com_atom;
group1_com_atom.pos = group1->center_of_mass();
diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp
index a2b1a5cd23..d9cd9d55e4 100644
--- a/lib/colvars/colvarcomp_distances.cpp
+++ b/lib/colvars/colvarcomp_distances.cpp
@@ -7,8 +7,6 @@
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
-#include
-
#include "colvarmodule.h"
#include "colvarvalue.h"
#include "colvarparse.h"
@@ -102,7 +100,7 @@ colvar::distance_vec::distance_vec(std::string const &conf)
{
function_type = "distance_vec";
enable(f_cvc_com_based);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_3vector);
}
@@ -112,7 +110,7 @@ colvar::distance_vec::distance_vec()
{
function_type = "distance_vec";
enable(f_cvc_com_based);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_3vector);
}
@@ -320,7 +318,7 @@ cvm::real colvar::distance_z::dist2(colvarvalue const &x1,
{
cvm::real diff = x1.real_value - x2.real_value;
if (b_periodic) {
- cvm::real shift = std::floor(diff/period + 0.5);
+ cvm::real shift = cvm::floor(diff/period + 0.5);
diff -= shift * period;
}
return diff * diff;
@@ -332,7 +330,7 @@ colvarvalue colvar::distance_z::dist2_lgrad(colvarvalue const &x1,
{
cvm::real diff = x1.real_value - x2.real_value;
if (b_periodic) {
- cvm::real shift = std::floor(diff/period + 0.5);
+ cvm::real shift = cvm::floor(diff/period + 0.5);
diff -= shift * period;
}
return 2.0 * diff;
@@ -344,22 +342,23 @@ colvarvalue colvar::distance_z::dist2_rgrad(colvarvalue const &x1,
{
cvm::real diff = x1.real_value - x2.real_value;
if (b_periodic) {
- cvm::real shift = std::floor(diff/period + 0.5);
+ cvm::real shift = cvm::floor(diff/period + 0.5);
diff -= shift * period;
}
return (-2.0) * diff;
}
-void colvar::distance_z::wrap(colvarvalue &x) const
+void colvar::distance_z::wrap(colvarvalue &x_unwrapped) const
{
if (!b_periodic) {
// don't wrap if the period has not been set
return;
}
- cvm::real shift = std::floor((x.real_value - wrap_center) / period + 0.5);
- x.real_value -= shift * period;
+ cvm::real shift =
+ cvm::floor((x_unwrapped.real_value - wrap_center) / period + 0.5);
+ x_unwrapped.real_value -= shift * period;
return;
}
@@ -481,7 +480,7 @@ colvar::distance_dir::distance_dir(std::string const &conf)
{
function_type = "distance_dir";
enable(f_cvc_com_based);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_unit3vector);
}
@@ -491,7 +490,7 @@ colvar::distance_dir::distance_dir()
{
function_type = "distance_dir";
enable(f_cvc_com_based);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_unit3vector);
}
@@ -629,7 +628,7 @@ void colvar::distance_inv::calc_value()
}
x.real_value *= 1.0 / cvm::real(group1->size() * group2->size());
- x.real_value = std::pow(x.real_value, -1.0/cvm::real(exponent));
+ x.real_value = cvm::pow(x.real_value, -1.0/cvm::real(exponent));
cvm::real const dxdsum = (-1.0/(cvm::real(exponent))) *
cvm::integer_power(x.real_value, exponent+1) /
@@ -671,7 +670,7 @@ colvar::distance_pairs::distance_pairs(std::string const &conf)
group2 = parse_group(conf, "group2");
x.type(colvarvalue::type_vector);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.vector1d_value.resize(group1->size() * group2->size());
}
@@ -679,7 +678,7 @@ colvar::distance_pairs::distance_pairs(std::string const &conf)
colvar::distance_pairs::distance_pairs()
{
function_type = "distance_pairs";
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_vector);
}
@@ -747,6 +746,63 @@ void colvar::distance_pairs::apply_force(colvarvalue const &force)
+colvar::dipole_magnitude::dipole_magnitude(std::string const &conf)
+ : cvc(conf)
+{
+ function_type = "dipole_magnitude";
+ atoms = parse_group(conf, "atoms");
+ init_total_force_params(conf);
+ x.type(colvarvalue::type_scalar);
+}
+
+
+colvar::dipole_magnitude::dipole_magnitude(cvm::atom const &a1)
+{
+ atoms = new cvm::atom_group(std::vector(1, a1));
+ register_atom_group(atoms);
+ x.type(colvarvalue::type_scalar);
+}
+
+
+colvar::dipole_magnitude::dipole_magnitude()
+{
+ function_type = "dipole_magnitude";
+ x.type(colvarvalue::type_scalar);
+}
+
+
+void colvar::dipole_magnitude::calc_value()
+{
+ cvm::atom_pos const atomsCom = atoms->center_of_mass();
+ atoms->calc_dipole(atomsCom);
+ dipoleV = atoms->dipole();
+ x.real_value = dipoleV.norm();
+}
+
+
+void colvar::dipole_magnitude::calc_gradients()
+{
+ cvm::real const aux1 = atoms->total_charge/atoms->total_mass;
+ cvm::atom_pos const dipVunit = dipoleV.unit();
+
+ for (cvm::atom_iter ai = atoms->begin(); ai != atoms->end(); ai++) {
+ ai->grad = (ai->charge - aux1*ai->mass) * dipVunit;
+ }
+}
+
+
+void colvar::dipole_magnitude::apply_force(colvarvalue const &force)
+{
+ if (!atoms->noforce) {
+ atoms->apply_colvar_force(force.real_value);
+ }
+}
+
+
+simple_scalar_dist_functions(dipole_magnitude)
+
+
+
colvar::gyration::gyration(std::string const &conf)
: cvc(conf)
{
@@ -782,7 +838,7 @@ void colvar::gyration::calc_value()
for (cvm::atom_iter ai = atoms->begin(); ai != atoms->end(); ai++) {
x.real_value += (ai->pos).norm2();
}
- x.real_value = std::sqrt(x.real_value / cvm::real(atoms->size()));
+ x.real_value = cvm::sqrt(x.real_value / cvm::real(atoms->size()));
}
@@ -1029,7 +1085,7 @@ void colvar::rmsd::calc_value()
x.real_value += ((*atoms)[ia].pos - ref_pos[ia]).norm2();
}
x.real_value /= cvm::real(atoms->size()); // MSD
- x.real_value = std::sqrt(x.real_value);
+ x.real_value = cvm::sqrt(x.real_value);
}
@@ -1405,7 +1461,7 @@ void colvar::eigenvector::calc_Jacobian_derivative()
}
}
- jd.real_value = sum * std::sqrt(eigenvec_invnorm2);
+ jd.real_value = sum * cvm::sqrt(eigenvec_invnorm2);
}
@@ -1436,7 +1492,7 @@ colvar::cartesian::cartesian(std::string const &conf)
}
x.type(colvarvalue::type_vector);
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.vector1d_value.resize(atoms->size() * axes.size());
}
diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp
index 91e47f13d9..b9f9c60cdb 100644
--- a/lib/colvars/colvarcomp_protein.cpp
+++ b/lib/colvars/colvarcomp_protein.cpp
@@ -7,8 +7,6 @@
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
-#include
-
#include "colvarmodule.h"
#include "colvarvalue.h"
#include "colvarparse.h"
@@ -27,7 +25,7 @@ colvar::alpha_angles::alpha_angles(std::string const &conf)
cvm::log("Initializing alpha_angles object.\n");
function_type = "alpha_angles";
- enable(f_cvc_implicit_gradient);
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
std::string segment_id;
@@ -118,7 +116,7 @@ colvar::alpha_angles::alpha_angles()
: cvc()
{
function_type = "alpha_angles";
- enable(f_cvc_implicit_gradient);
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -133,6 +131,8 @@ colvar::alpha_angles::~alpha_angles()
delete hb.back();
hb.pop_back();
}
+ // Our references to atom groups have become invalid now that children cvcs are deleted
+ atom_groups.clear();
}
@@ -191,6 +191,58 @@ void colvar::alpha_angles::calc_gradients()
}
+void colvar::alpha_angles::collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients)
+{
+ cvm::real cvc_coeff = sup_coeff * cvm::real(sup_np) * cvm::integer_power(value().real_value, sup_np-1);
+
+ if (theta.size()) {
+ cvm::real const theta_norm = (1.0-hb_coeff) / cvm::real(theta.size());
+
+ for (size_t i = 0; i < theta.size(); i++) {
+ cvm::real const t = ((theta[i])->value().real_value-theta_ref)/theta_tol;
+ cvm::real const f = ( (1.0 - (t*t)) /
+ (1.0 - (t*t*t*t)) );
+ cvm::real const dfdt =
+ 1.0/(1.0 - (t*t*t*t)) *
+ ( (-2.0 * t) + (-1.0*f)*(-4.0 * (t*t*t)) );
+
+ // Coeficient of this CVC's gradient in the colvar gradient, times coefficient of this
+ // angle's gradient in the CVC's gradient
+ cvm::real const coeff = cvc_coeff * theta_norm * dfdt * (1.0/theta_tol);
+
+ for (size_t j = 0; j < theta[i]->atom_groups.size(); j++) {
+ cvm::atom_group &ag = *(theta[i]->atom_groups[j]);
+ for (size_t k = 0; k < ag.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ ag[k].id) - atom_ids.begin();
+ atomic_gradients[a] += coeff * ag[k].grad;
+ }
+ }
+ }
+ }
+
+ if (hb.size()) {
+
+ cvm::real const hb_norm = hb_coeff / cvm::real(hb.size());
+
+ for (size_t i = 0; i < hb.size(); i++) {
+ // Coeficient of this CVC's gradient in the colvar gradient, times coefficient of this
+ // hbond's gradient in the CVC's gradient
+ cvm::real const coeff = cvc_coeff * 0.5 * hb_norm;
+
+ for (size_t j = 0; j < hb[i]->atom_groups.size(); j++) {
+ cvm::atom_group &ag = *(hb[i]->atom_groups[j]);
+ for (size_t k = 0; k < ag.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ ag[k].id) - atom_ids.begin();
+ atomic_gradients[a] += coeff * ag[k].grad;
+ }
+ }
+ }
+ }
+}
+
+
void colvar::alpha_angles::apply_force(colvarvalue const &force)
{
@@ -242,7 +294,8 @@ colvar::dihedPC::dihedPC(std::string const &conf)
cvm::log("Initializing dihedral PC object.\n");
function_type = "dihedPC";
- enable(f_cvc_implicit_gradient);
+ // Supported through references to atom groups of children cvcs
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
std::string segment_id;
@@ -372,7 +425,8 @@ colvar::dihedPC::dihedPC()
: cvc()
{
function_type = "dihedPC";
- enable(f_cvc_implicit_gradient);
+ // Supported through references to atom groups of children cvcs
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -383,6 +437,8 @@ colvar::dihedPC::~dihedPC()
delete theta.back();
theta.pop_back();
}
+ // Our references to atom groups have become invalid now that children cvcs are deleted
+ atom_groups.clear();
}
@@ -392,8 +448,8 @@ void colvar::dihedPC::calc_value()
for (size_t i = 0; i < theta.size(); i++) {
theta[i]->calc_value();
cvm::real const t = (PI / 180.) * theta[i]->value().real_value;
- x.real_value += coeffs[2*i ] * std::cos(t)
- + coeffs[2*i+1] * std::sin(t);
+ x.real_value += coeffs[2*i ] * cvm::cos(t)
+ + coeffs[2*i+1] * cvm::sin(t);
}
}
@@ -406,12 +462,35 @@ void colvar::dihedPC::calc_gradients()
}
+void colvar::dihedPC::collect_gradients(std::vector const &atom_ids, std::vector &atomic_gradients)
+{
+ cvm::real cvc_coeff = sup_coeff * cvm::real(sup_np) * cvm::integer_power(value().real_value, sup_np-1);
+ for (size_t i = 0; i < theta.size(); i++) {
+ cvm::real const t = (PI / 180.) * theta[i]->value().real_value;
+ cvm::real const dcosdt = - (PI / 180.) * cvm::sin(t);
+ cvm::real const dsindt = (PI / 180.) * cvm::cos(t);
+ // Coeficient of this dihedPC's gradient in the colvar gradient, times coefficient of this
+ // dihedral's gradient in the dihedPC's gradient
+ cvm::real const coeff = cvc_coeff * (coeffs[2*i] * dcosdt + coeffs[2*i+1] * dsindt);
+
+ for (size_t j = 0; j < theta[i]->atom_groups.size(); j++) {
+ cvm::atom_group &ag = *(theta[i]->atom_groups[j]);
+ for (size_t k = 0; k < ag.size(); k++) {
+ size_t a = std::lower_bound(atom_ids.begin(), atom_ids.end(),
+ ag[k].id) - atom_ids.begin();
+ atomic_gradients[a] += coeff * ag[k].grad;
+ }
+ }
+ }
+}
+
+
void colvar::dihedPC::apply_force(colvarvalue const &force)
{
for (size_t i = 0; i < theta.size(); i++) {
cvm::real const t = (PI / 180.) * theta[i]->value().real_value;
- cvm::real const dcosdt = - (PI / 180.) * std::sin(t);
- cvm::real const dsindt = (PI / 180.) * std::cos(t);
+ cvm::real const dcosdt = - (PI / 180.) * cvm::sin(t);
+ cvm::real const dsindt = (PI / 180.) * cvm::cos(t);
theta[i]->apply_force((coeffs[2*i ] * dcosdt +
coeffs[2*i+1] * dsindt) * force);
diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp
index 498ef7c2f5..3c8d0b4af6 100644
--- a/lib/colvars/colvarcomp_rotations.cpp
+++ b/lib/colvars/colvarcomp_rotations.cpp
@@ -7,8 +7,6 @@
// If you wish to distribute your changes, please submit them to the
// Colvars repository at GitHub.
-#include
-
#include "colvarmodule.h"
#include "colvarvalue.h"
#include "colvarparse.h"
@@ -18,21 +16,27 @@
colvar::orientation::orientation(std::string const &conf)
- : cvc(conf)
+ : cvc()
{
function_type = "orientation";
- atoms = parse_group(conf, "atoms");
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_quaternion);
+ init(conf);
+}
+
+int colvar::orientation::init(std::string const &conf)
+{
+ int error_code = cvc::init(conf);
+
+ atoms = parse_group(conf, "atoms");
ref_pos.reserve(atoms->size());
if (get_keyval(conf, "refPositions", ref_pos, ref_pos)) {
cvm::log("Using reference positions from input file.\n");
if (ref_pos.size() != atoms->size()) {
- cvm::error("Error: reference positions do not "
- "match the number of requested atoms.\n");
- return;
+ return cvm::error("Error: reference positions do not "
+ "match the number of requested atoms.\n", INPUT_ERROR);
}
}
@@ -46,9 +50,8 @@ colvar::orientation::orientation(std::string const &conf)
// use PDB flags if column is provided
bool found = get_keyval(conf, "refPositionsColValue", file_col_value, 0.0);
if (found && file_col_value==0.0) {
- cvm::error("Error: refPositionsColValue, "
- "if provided, must be non-zero.\n");
- return;
+ return cvm::error("Error: refPositionsColValue, "
+ "if provided, must be non-zero.\n", INPUT_ERROR);
}
}
@@ -59,9 +62,8 @@ colvar::orientation::orientation(std::string const &conf)
}
if (!ref_pos.size()) {
- cvm::error("Error: must define a set of "
- "reference coordinates.\n");
- return;
+ return cvm::error("Error: must define a set of "
+ "reference coordinates.\n", INPUT_ERROR);
}
@@ -85,6 +87,7 @@ colvar::orientation::orientation(std::string const &conf)
rot.request_group2_gradients(atoms->size());
}
+ return error_code;
}
@@ -92,7 +95,7 @@ colvar::orientation::orientation()
: cvc()
{
function_type = "orientation";
- enable(f_cvc_implicit_gradient);
+ disable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_quaternion);
}
@@ -158,10 +161,18 @@ colvarvalue colvar::orientation::dist2_rgrad(colvarvalue const &x1,
colvar::orientation_angle::orientation_angle(std::string const &conf)
- : orientation(conf)
+ : orientation()
{
function_type = "orientation_angle";
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
+ init(conf);
+}
+
+
+int colvar::orientation_angle::init(std::string const &conf)
+{
+ return orientation::init(conf);
}
@@ -169,6 +180,7 @@ colvar::orientation_angle::orientation_angle()
: orientation()
{
function_type = "orientation_angle";
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -180,9 +192,9 @@ void colvar::orientation_angle::calc_value()
rot.calc_optimal_rotation(ref_pos, atoms->positions_shifted(-1.0 * atoms_cog));
if ((rot.q).q0 >= 0.0) {
- x.real_value = (180.0/PI) * 2.0 * std::acos((rot.q).q0);
+ x.real_value = (180.0/PI) * 2.0 * cvm::acos((rot.q).q0);
} else {
- x.real_value = (180.0/PI) * 2.0 * std::acos(-1.0 * (rot.q).q0);
+ x.real_value = (180.0/PI) * 2.0 * cvm::acos(-1.0 * (rot.q).q0);
}
}
@@ -191,7 +203,7 @@ void colvar::orientation_angle::calc_gradients()
{
cvm::real const dxdq0 =
( ((rot.q).q0 * (rot.q).q0 < 1.0) ?
- ((180.0 / PI) * (-2.0) / std::sqrt(1.0 - ((rot.q).q0 * (rot.q).q0))) :
+ ((180.0 / PI) * (-2.0) / cvm::sqrt(1.0 - ((rot.q).q0 * (rot.q).q0))) :
0.0 );
for (size_t ia = 0; ia < atoms->size(); ia++) {
@@ -214,10 +226,18 @@ simple_scalar_dist_functions(orientation_angle)
colvar::orientation_proj::orientation_proj(std::string const &conf)
- : orientation(conf)
+ : orientation()
{
function_type = "orientation_proj";
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
+ init(conf);
+}
+
+
+int colvar::orientation_proj::init(std::string const &conf)
+{
+ return orientation::init(conf);
}
@@ -225,6 +245,7 @@ colvar::orientation_proj::orientation_proj()
: orientation()
{
function_type = "orientation_proj";
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -261,18 +282,28 @@ simple_scalar_dist_functions(orientation_proj)
colvar::tilt::tilt(std::string const &conf)
- : orientation(conf)
+ : orientation()
{
function_type = "tilt";
+ enable(f_cvc_explicit_gradient);
+ x.type(colvarvalue::type_scalar);
+ init(conf);
+}
+
+
+int colvar::tilt::init(std::string const &conf)
+{
+ int error_code = COLVARS_OK;
+
+ error_code |= orientation::init(conf);
get_keyval(conf, "axis", axis, cvm::rvector(0.0, 0.0, 1.0));
-
if (axis.norm2() != 1.0) {
axis /= axis.norm();
cvm::log("Normalizing rotation axis to "+cvm::to_str(axis)+".\n");
}
- x.type(colvarvalue::type_scalar);
+ return error_code;
}
@@ -280,6 +311,7 @@ colvar::tilt::tilt()
: orientation()
{
function_type = "tilt";
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -322,20 +354,30 @@ simple_scalar_dist_functions(tilt)
colvar::spin_angle::spin_angle(std::string const &conf)
- : orientation(conf)
+ : orientation()
{
function_type = "spin_angle";
+ period = 360.0;
+ b_periodic = true;
+ enable(f_cvc_explicit_gradient);
+ x.type(colvarvalue::type_scalar);
+ init(conf);
+}
+
+
+int colvar::spin_angle::init(std::string const &conf)
+{
+ int error_code = COLVARS_OK;
+
+ error_code |= orientation::init(conf);
get_keyval(conf, "axis", axis, cvm::rvector(0.0, 0.0, 1.0));
-
if (axis.norm2() != 1.0) {
axis /= axis.norm();
cvm::log("Normalizing rotation axis to "+cvm::to_str(axis)+".\n");
}
- period = 360.0;
- b_periodic = true;
- x.type(colvarvalue::type_scalar);
+ return error_code;
}
@@ -345,6 +387,7 @@ colvar::spin_angle::spin_angle()
function_type = "spin_angle";
period = 360.0;
b_periodic = true;
+ enable(f_cvc_explicit_gradient);
x.type(colvarvalue::type_scalar);
}
@@ -410,15 +453,15 @@ colvarvalue colvar::spin_angle::dist2_rgrad(colvarvalue const &x1,
}
-void colvar::spin_angle::wrap(colvarvalue &x) const
+void colvar::spin_angle::wrap(colvarvalue &x_unwrapped) const
{
- if ((x.real_value - wrap_center) >= 180.0) {
- x.real_value -= 360.0;
+ if ((x_unwrapped.real_value - wrap_center) >= 180.0) {
+ x_unwrapped.real_value -= 360.0;
return;
}
- if ((x.real_value - wrap_center) < -180.0) {
- x.real_value += 360.0;
+ if ((x_unwrapped.real_value - wrap_center) < -180.0) {
+ x_unwrapped.real_value += 360.0;
return;
}
diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp
index d20ee6e55c..276f2b39e7 100644
--- a/lib/colvars/colvardeps.cpp
+++ b/lib/colvars/colvardeps.cpp
@@ -122,12 +122,7 @@ bool colvardeps::get_keyval_feature(colvarparse *cvp,
int colvardeps::enable(int feature_id,
bool dry_run /* default: false */,
- // dry_run: fail silently, do not enable if available
- // flag is passed recursively to deps of this feature
bool toplevel /* default: true */)
-// toplevel: false if this is called as part of a chain of dependency resolution
-// this is used to diagnose failed dependencies by displaying the full stack
-// only the toplevel dependency will throw a fatal error
{
int res;
size_t i, j;
@@ -143,8 +138,7 @@ int colvardeps::enable(int feature_id,
if (fs->enabled) {
if (!(dry_run || toplevel)) {
- // This is a dependency
- // Prevent disabling this feature as long
+ // This is a dependency: prevent disabling this feature as long
// as requirement is enabled
fs->ref_count++;
if (cvm::debug())
@@ -173,7 +167,10 @@ int colvardeps::enable(int feature_id,
if (!toplevel && !is_dynamic(feature_id)) {
if (!dry_run) {
cvm::log(feature_type_descr + " feature \"" + f->description
- + "\" may not be enabled as a dependency in " + description + ".\n");
+ + "\" cannot be enabled automatically in " + description + ".");
+ if (is_user(feature_id)) {
+ cvm::log("Try setting it manually.\n");
+ }
}
return COLVARS_ERROR;
}
@@ -354,6 +351,7 @@ int colvardeps::disable(int feature_id) {
return COLVARS_OK;
}
+
int colvardeps::decr_ref_count(int feature_id) {
int &rc = feature_states[feature_id].ref_count;
feature *f = features()[feature_id];
@@ -379,324 +377,52 @@ int colvardeps::decr_ref_count(int feature_id) {
return COLVARS_OK;
}
-void colvardeps::init_feature(int feature_id, const char *description, feature_type type) {
- modify_features()[feature_id]->description = description;
+
+void colvardeps::init_feature(int feature_id, const char *description_in, feature_type type) {
+ modify_features()[feature_id]->description = description_in;
modify_features()[feature_id]->type = type;
}
-// Shorthand macros for describing dependencies
-#define f_req_self(f, g) features()[f]->requires_self.push_back(g)
-// This macro ensures that exclusions are symmetric
-#define f_req_exclude(f, g) features()[f]->requires_exclude.push_back(g); \
- features()[g]->requires_exclude.push_back(f)
-#define f_req_children(f, g) features()[f]->requires_children.push_back(g)
-#define f_req_alt2(f, g, h) features()[f]->requires_alt.push_back(std::vector(2));\
- features()[f]->requires_alt.back()[0] = g; \
- features()[f]->requires_alt.back()[1] = h
-#define f_req_alt3(f, g, h, i) features()[f]->requires_alt.push_back(std::vector(3));\
- features()[f]->requires_alt.back()[0] = g; \
- features()[f]->requires_alt.back()[1] = h; \
- features()[f]->requires_alt.back()[2] = i
-#define f_req_alt4(f, g, h, i, j) features()[f]->requires_alt.push_back(std::vector(4));\
- features()[f]->requires_alt.back()[0] = g; \
- features()[f]->requires_alt.back()[1] = h; \
- features()[f]->requires_alt.back()[2] = i; \
- features()[f]->requires_alt.back()[3] = j
-void colvardeps::init_cvb_requires() {
- int i;
- if (features().size() == 0) {
- for (i = 0; i < f_cvb_ntot; i++) {
- modify_features().push_back(new feature);
- }
-
- init_feature(f_cvb_active, "active", f_type_dynamic);
- f_req_children(f_cvb_active, f_cv_active);
-
- init_feature(f_cvb_awake, "awake", f_type_static);
- f_req_self(f_cvb_awake, f_cvb_active);
-
- init_feature(f_cvb_apply_force, "apply force", f_type_user);
- f_req_children(f_cvb_apply_force, f_cv_gradient);
-
- init_feature(f_cvb_get_total_force, "obtain total force", f_type_dynamic);
- f_req_children(f_cvb_get_total_force, f_cv_total_force);
-
- init_feature(f_cvb_output_acc_work, "output accumulated work", f_type_user);
- f_req_self(f_cvb_output_acc_work, f_cvb_apply_force);
-
- init_feature(f_cvb_history_dependent, "history-dependent", f_type_static);
-
- init_feature(f_cvb_time_dependent, "time-dependent", f_type_static);
-
- init_feature(f_cvb_scalar_variables, "require scalar variables", f_type_static);
- f_req_children(f_cvb_scalar_variables, f_cv_scalar);
-
- init_feature(f_cvb_calc_pmf, "calculate a PMF", f_type_static);
-
- init_feature(f_cvb_calc_ti_samples, "calculate TI samples", f_type_dynamic);
- f_req_self(f_cvb_calc_ti_samples, f_cvb_get_total_force);
- f_req_children(f_cvb_calc_ti_samples, f_cv_grid);
-
- init_feature(f_cvb_write_ti_samples, "write TI samples ", f_type_user);
- f_req_self(f_cvb_write_ti_samples, f_cvb_calc_ti_samples);
-
- init_feature(f_cvb_write_ti_pmf, "write TI PMF", f_type_user);
- f_req_self(f_cvb_write_ti_pmf, f_cvb_calc_ti_samples);
- }
-
- // Initialize feature_states for each instance
- feature_states.reserve(f_cvb_ntot);
- for (i = 0; i < f_cvb_ntot; i++) {
- feature_states.push_back(feature_state(true, false));
- // Most features are available, so we set them so
- // and list exceptions below
- }
-
- // only compute TI samples when deriving from colvarbias_ti
- feature_states[f_cvb_calc_ti_samples].available = false;
+// Shorthand functions for describing dependencies
+void colvardeps::require_feature_self(int f, int g) {
+ features()[f]->requires_self.push_back(g);
}
-void colvardeps::init_cv_requires() {
- size_t i;
- if (features().size() == 0) {
- for (i = 0; i < f_cv_ntot; i++) {
- modify_features().push_back(new feature);
- }
-
- init_feature(f_cv_active, "active", f_type_dynamic);
- // Do not require f_cvc_active in children, as some components may be disabled
- // Colvars must be either a linear combination, or scalar (and polynomial) or scripted/custom
- f_req_alt4(f_cv_active, f_cv_scalar, f_cv_linear, f_cv_scripted, f_cv_custom_function);
-
- init_feature(f_cv_awake, "awake", f_type_static);
- f_req_self(f_cv_awake, f_cv_active);
-
- init_feature(f_cv_gradient, "gradient", f_type_dynamic);
- f_req_children(f_cv_gradient, f_cvc_gradient);
-
- init_feature(f_cv_collect_gradient, "collect gradient", f_type_dynamic);
- f_req_self(f_cv_collect_gradient, f_cv_gradient);
- f_req_self(f_cv_collect_gradient, f_cv_scalar);
- // The following exlusion could be lifted by implementing the feature
- f_req_exclude(f_cv_collect_gradient, f_cv_scripted);
-
- init_feature(f_cv_fdiff_velocity, "velocity from finite differences", f_type_dynamic);
-
- // System force: either trivial (spring force); through extended Lagrangian, or calculated explicitly
- init_feature(f_cv_total_force, "total force", f_type_dynamic);
- f_req_alt2(f_cv_total_force, f_cv_extended_Lagrangian, f_cv_total_force_calc);
-
- // Deps for explicit total force calculation
- init_feature(f_cv_total_force_calc, "total force calculation", f_type_dynamic);
- f_req_self(f_cv_total_force_calc, f_cv_scalar);
- f_req_self(f_cv_total_force_calc, f_cv_linear);
- f_req_children(f_cv_total_force_calc, f_cvc_inv_gradient);
- f_req_self(f_cv_total_force_calc, f_cv_Jacobian);
-
- init_feature(f_cv_Jacobian, "Jacobian derivative", f_type_dynamic);
- f_req_self(f_cv_Jacobian, f_cv_scalar);
- f_req_self(f_cv_Jacobian, f_cv_linear);
- f_req_children(f_cv_Jacobian, f_cvc_Jacobian);
-
- init_feature(f_cv_hide_Jacobian, "hide Jacobian force", f_type_user);
- f_req_self(f_cv_hide_Jacobian, f_cv_Jacobian); // can only hide if calculated
-
- init_feature(f_cv_extended_Lagrangian, "extended Lagrangian", f_type_user);
- f_req_self(f_cv_extended_Lagrangian, f_cv_scalar);
- f_req_self(f_cv_extended_Lagrangian, f_cv_gradient);
-
- init_feature(f_cv_Langevin, "Langevin dynamics", f_type_user);
- f_req_self(f_cv_Langevin, f_cv_extended_Lagrangian);
-
- init_feature(f_cv_linear, "linear", f_type_static);
-
- init_feature(f_cv_scalar, "scalar", f_type_static);
-
- init_feature(f_cv_output_energy, "output energy", f_type_user);
-
- init_feature(f_cv_output_value, "output value", f_type_user);
-
- init_feature(f_cv_output_velocity, "output velocity", f_type_user);
- f_req_self(f_cv_output_velocity, f_cv_fdiff_velocity);
-
- init_feature(f_cv_output_applied_force, "output applied force", f_type_user);
-
- init_feature(f_cv_output_total_force, "output total force", f_type_user);
- f_req_self(f_cv_output_total_force, f_cv_total_force);
-
- init_feature(f_cv_subtract_applied_force, "subtract applied force from total force", f_type_user);
- f_req_self(f_cv_subtract_applied_force, f_cv_total_force);
-
- init_feature(f_cv_lower_boundary, "lower boundary", f_type_user);
- f_req_self(f_cv_lower_boundary, f_cv_scalar);
-
- init_feature(f_cv_upper_boundary, "upper boundary", f_type_user);
- f_req_self(f_cv_upper_boundary, f_cv_scalar);
-
- init_feature(f_cv_grid, "grid", f_type_dynamic);
- f_req_self(f_cv_grid, f_cv_lower_boundary);
- f_req_self(f_cv_grid, f_cv_upper_boundary);
-
- init_feature(f_cv_runave, "running average", f_type_user);
-
- init_feature(f_cv_corrfunc, "correlation function", f_type_user);
-
- init_feature(f_cv_scripted, "scripted", f_type_user);
-
- init_feature(f_cv_custom_function, "custom function", f_type_user);
- f_req_exclude(f_cv_custom_function, f_cv_scripted);
-
- init_feature(f_cv_periodic, "periodic", f_type_static);
- f_req_self(f_cv_periodic, f_cv_scalar);
- init_feature(f_cv_scalar, "scalar", f_type_static);
- init_feature(f_cv_linear, "linear", f_type_static);
- init_feature(f_cv_homogeneous, "homogeneous", f_type_static);
-
- // because total forces are obtained from the previous time step,
- // we cannot (currently) have colvar values and total forces for the same timestep
- init_feature(f_cv_multiple_ts, "multiple timestep colvar");
- f_req_exclude(f_cv_multiple_ts, f_cv_total_force_calc);
- }
-
- // Initialize feature_states for each instance
- feature_states.reserve(f_cv_ntot);
- for (i = 0; i < f_cv_ntot; i++) {
- feature_states.push_back(feature_state(true, false));
- // Most features are available, so we set them so
- // and list exceptions below
- }
-
- feature_states[f_cv_fdiff_velocity].available =
- cvm::main()->proxy->simulation_running();
+// Ensure that exclusions are symmetric
+void colvardeps::exclude_feature_self(int f, int g) {
+ features()[f]->requires_exclude.push_back(g);
+ features()[g]->requires_exclude.push_back(f);
}
-void colvardeps::init_cvc_requires() {
- size_t i;
- // Initialize static array once and for all
- if (features().size() == 0) {
- for (i = 0; i < colvardeps::f_cvc_ntot; i++) {
- modify_features().push_back(new feature);
- }
-
- init_feature(f_cvc_active, "active", f_type_dynamic);
-// The dependency below may become useful if we use dynamic atom groups
-// f_req_children(f_cvc_active, f_ag_active);
-
- init_feature(f_cvc_scalar, "scalar", f_type_static);
-
- init_feature(f_cvc_gradient, "gradient", f_type_dynamic);
-
- init_feature(f_cvc_implicit_gradient, "implicit gradient", f_type_static);
- f_req_children(f_cvc_implicit_gradient, f_ag_implicit_gradient);
-
- init_feature(f_cvc_inv_gradient, "inverse gradient", f_type_dynamic);
- f_req_self(f_cvc_inv_gradient, f_cvc_gradient);
-
- init_feature(f_cvc_debug_gradient, "debug gradient", f_type_user);
- f_req_self(f_cvc_debug_gradient, f_cvc_gradient);
- f_req_exclude(f_cvc_debug_gradient, f_cvc_implicit_gradient);
-
- init_feature(f_cvc_Jacobian, "Jacobian derivative", f_type_dynamic);
- f_req_self(f_cvc_Jacobian, f_cvc_inv_gradient);
-
- init_feature(f_cvc_com_based, "depends on group centers of mass", f_type_static);
-
- // init_feature(f_cvc_pbc_minimum_image, "use minimum-image distances with PBCs", f_type_user);
-
- // Compute total force on first site only to avoid unwanted
- // coupling to other colvars (see e.g. Ciccotti et al., 2005)
- init_feature(f_cvc_one_site_total_force, "compute total force from one group", f_type_user);
- f_req_self(f_cvc_one_site_total_force, f_cvc_com_based);
-
- init_feature(f_cvc_scalable, "scalable calculation", f_type_static);
- f_req_self(f_cvc_scalable, f_cvc_scalable_com);
-
- init_feature(f_cvc_scalable_com, "scalable calculation of centers of mass", f_type_static);
- f_req_self(f_cvc_scalable_com, f_cvc_com_based);
-
-
- // TODO only enable this when f_ag_scalable can be turned on for a pre-initialized group
- // f_req_children(f_cvc_scalable, f_ag_scalable);
- // f_req_children(f_cvc_scalable_com, f_ag_scalable_com);
- }
-
- // Initialize feature_states for each instance
- // default as available, not enabled
- // except dynamic features which default as unavailable
- feature_states.reserve(f_cvc_ntot);
- for (i = 0; i < colvardeps::f_cvc_ntot; i++) {
- bool avail = is_dynamic(i) ? false : true;
- feature_states.push_back(feature_state(avail, false));
- }
-
- // CVCs are enabled from the start - get disabled based on flags
- feature_states[f_cvc_active].enabled = true;
-
- // Features that are implemented by all cvcs by default
- // Each cvc specifies what other features are available
- feature_states[f_cvc_active].available = true;
- feature_states[f_cvc_gradient].available = true;
-
- // Use minimum-image distances by default
- feature_states[f_cvc_pbc_minimum_image].enabled = true;
-
- // Features that are implemented by default if their requirements are
- feature_states[f_cvc_one_site_total_force].available = true;
-
- // Features That are implemented only for certain simulation engine configurations
- feature_states[f_cvc_scalable_com].available = (cvm::proxy->scalable_group_coms() == COLVARS_OK);
- feature_states[f_cvc_scalable].available = feature_states[f_cvc_scalable_com].available;
+void colvardeps::require_feature_children(int f, int g) {
+ features()[f]->requires_children.push_back(g);
}
-void colvardeps::init_ag_requires() {
- size_t i;
- // Initialize static array once and for all
- if (features().size() == 0) {
- for (i = 0; i < f_ag_ntot; i++) {
- modify_features().push_back(new feature);
- }
+void colvardeps::require_feature_alt(int f, int g, int h) {
+ features()[f]->requires_alt.push_back(std::vector(2));
+ features()[f]->requires_alt.back()[0] = g;
+ features()[f]->requires_alt.back()[1] = h;
+}
- init_feature(f_ag_active, "active", f_type_dynamic);
- init_feature(f_ag_center, "translational fit", f_type_static);
- init_feature(f_ag_rotate, "rotational fit", f_type_static);
- init_feature(f_ag_fitting_group, "reference positions group", f_type_static);
- init_feature(f_ag_implicit_gradient, "implicit atom gradient", f_type_dynamic);
- init_feature(f_ag_fit_gradients, "fit gradients", f_type_user);
- f_req_exclude(f_ag_fit_gradients, f_ag_implicit_gradient);
- init_feature(f_ag_atom_forces, "atomic forces", f_type_dynamic);
+void colvardeps::require_feature_alt(int f, int g, int h, int i) {
+ features()[f]->requires_alt.push_back(std::vector(3));
+ features()[f]->requires_alt.back()[0] = g;
+ features()[f]->requires_alt.back()[1] = h;
+ features()[f]->requires_alt.back()[2] = i;
+}
- // parallel calculation implies that we have at least a scalable center of mass,
- // but f_ag_scalable is kept as a separate feature to deal with future dependencies
- init_feature(f_ag_scalable, "scalable group calculation", f_type_static);
- init_feature(f_ag_scalable_com, "scalable group center of mass calculation", f_type_static);
- f_req_self(f_ag_scalable, f_ag_scalable_com);
-// init_feature(f_ag_min_msd_fit, "minimum MSD fit")
-// f_req_self(f_ag_min_msd_fit, f_ag_center)
-// f_req_self(f_ag_min_msd_fit, f_ag_rotate)
-// f_req_exclude(f_ag_min_msd_fit, f_ag_fitting_group)
- }
-
- // Initialize feature_states for each instance
- // default as unavailable, not enabled
- feature_states.reserve(f_ag_ntot);
- for (i = 0; i < colvardeps::f_ag_ntot; i++) {
- feature_states.push_back(feature_state(false, false));
- }
-
- // Features that are implemented (or not) by all atom groups
- feature_states[f_ag_active].available = true;
- // f_ag_scalable_com is provided by the CVC iff it is COM-based
- feature_states[f_ag_scalable_com].available = false;
- // TODO make f_ag_scalable depend on f_ag_scalable_com (or something else)
- feature_states[f_ag_scalable].available = true;
- feature_states[f_ag_fit_gradients].available = true;
- feature_states[f_ag_implicit_gradient].available = true;
+void colvardeps::require_feature_alt(int f, int g, int h, int i, int j) {
+ features()[f]->requires_alt.push_back(std::vector(4));
+ features()[f]->requires_alt.back()[0] = g;
+ features()[f]->requires_alt.back()[1] = h;
+ features()[f]->requires_alt.back()[2] = i;
+ features()[f]->requires_alt.back()[3] = j;
}
@@ -720,7 +446,7 @@ void colvardeps::print_state() {
void colvardeps::add_child(colvardeps *child) {
children.push_back(child);
- child->parents.push_back((colvardeps *)this);
+ child->parents.push_back(this);
// Solve dependencies of already enabled parent features
// in the new child
diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h
index 940eefb01b..198a24f330 100644
--- a/lib/colvars/colvardeps.h
+++ b/lib/colvars/colvardeps.h
@@ -23,7 +23,11 @@
/// 3. Static features are static properties of the object, determined
/// programatically at initialization time.
///
-/// In all classes, feature 0 is active. When an object is inactivated
+/// The following diagram summarizes the dependency tree at the bias, colvar, and colvarcomp levels.
+/// Isolated and atom group features are not shown to save space.
+/// @image html deps_2019.svg
+///
+/// In all classes, feature 0 is `active`. When an object is inactivated
/// all its children dependencies are dereferenced (free_children_deps)
/// While the object is inactive, no dependency solving is done on children
/// it is done when the object is activated back (restore_children_deps)
@@ -72,7 +76,6 @@ protected:
/// Unused by lower-level objects (cvcs and atom groups)
int time_step_factor;
-private:
/// List of the states of all features
std::vector feature_states;
@@ -89,14 +92,14 @@ public:
inline int get_time_step_factor() const {return time_step_factor;}
/// Pair a numerical feature ID with a description and type
- void init_feature(int feature_id, const char *description, feature_type type = f_type_not_set);
+ void init_feature(int feature_id, const char *description, feature_type type);
/// Describes a feature and its dependencies
/// used in a static array within each subclass
class feature {
public:
- feature() {}
+ feature() : type(f_type_not_set) {}
~feature() {}
std::string description; // Set by derived object initializer
@@ -126,6 +129,7 @@ public:
feature_type type;
};
+ inline bool is_not_set(int id) { return features()[id]->type == f_type_not_set; }
inline bool is_dynamic(int id) { return features()[id]->type == f_type_dynamic; }
inline bool is_static(int id) { return features()[id]->type == f_type_static; }
inline bool is_user(int id) { return features()[id]->type == f_type_user; }
@@ -135,7 +139,7 @@ public:
// with a non-static array
// Intermediate classes (colvarbias and colvarcomp, which are also base classes)
// implement this as virtual to allow overriding
- virtual const std::vector&features() = 0;
+ virtual const std::vector &features() const = 0;
virtual std::vector&modify_features() = 0;
void add_child(colvardeps *child);
@@ -188,10 +192,12 @@ protected:
public:
- /// enable a feature and recursively solve its dependencies
- /// for proper reference counting, one should not add
- /// spurious calls to enable()
- /// dry_run is set to true to recursively test if a feature is available, without enabling it
+ /// Enable a feature and recursively solve its dependencies.
+ /// For accurate reference counting, do not add spurious calls to enable()
+ /// \param dry_run Recursively test if a feature is available, without enabling it
+ /// \param toplevel False if this is called as part of a chain of dependency resolution.
+ /// This is used to diagnose failed dependencies by displaying the full stack:
+ /// only the toplevel dependency will throw a fatal error.
int enable(int f, bool dry_run = false, bool toplevel = true);
/// Disable a feature, decrease the reference count of its dependencies
@@ -318,8 +324,8 @@ public:
f_cvc_active,
f_cvc_scalar,
f_cvc_gradient,
- /// \brief CVC doesn't calculate and store explicit atom gradients
- f_cvc_implicit_gradient,
+ /// \brief CVC calculates and stores explicit atom gradients
+ f_cvc_explicit_gradient,
f_cvc_inv_gradient,
/// \brief If enabled, calc_gradients() will call debug_gradients() for every group needed
f_cvc_debug_gradient,
@@ -341,7 +347,7 @@ public:
/// ie. not using refpositionsgroup
// f_ag_min_msd_fit,
/// \brief Does not have explicit atom gradients from parent CVC
- f_ag_implicit_gradient,
+ f_ag_explicit_gradient,
f_ag_fit_gradients,
f_ag_atom_forces,
f_ag_scalable,
@@ -349,13 +355,39 @@ public:
f_ag_ntot
};
- void init_cvb_requires();
- void init_cv_requires();
- void init_cvc_requires();
- void init_ag_requires();
+ /// Initialize dependency tree for object of a derived class
+ virtual int init_dependencies() = 0;
+
+ /// Make feature f require feature g within the same object
+ void require_feature_self(int f, int g);
+
+ /// Make features f and g mutually exclusive within the same object
+ void exclude_feature_self(int f, int g);
+
+ /// Make feature f require feature g within children
+ void require_feature_children(int f, int g);
+
+ /// Make feature f require either g or h within the same object
+ void require_feature_alt(int f, int g, int h);
+
+ /// Make feature f require any of g, h, or i within the same object
+ void require_feature_alt(int f, int g, int h, int i);
+
+ /// Make feature f require any of g, h, i, or j within the same object
+ void require_feature_alt(int f, int g, int h, int i, int j);
/// \brief print all enabled features and those of children, for debugging
void print_state();
+
+ /// \brief Check that a feature is enabled, raising BUG_ERROR if not
+ inline void check_enabled(int f, std::string const &reason) const
+ {
+ if (! is_enabled(f)) {
+ cvm::error("Error: "+reason+" requires that the feature \""+
+ features()[f]->description+"\" is active.\n", BUG_ERROR);
+ }
+ }
+
};
#endif
diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp
index 407b336afd..dc1a709edb 100644
--- a/lib/colvars/colvargrid.cpp
+++ b/lib/colvars/colvargrid.cpp
@@ -109,7 +109,7 @@ cvm::real colvar_grid_scalar::entropy() const
{
cvm::real sum = 0.0;
for (size_t i = 0; i < nt; i++) {
- sum += -1.0 * data[i] * std::log(data[i]);
+ sum += -1.0 * data[i] * cvm::logn(data[i]);
}
cvm::real bin_volume = 1.0;
for (size_t id = 0; id < widths.size(); id++) {
diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h
index 9a0fe4c8ec..2ba0566e49 100644
--- a/lib/colvars/colvargrid.h
+++ b/lib/colvars/colvargrid.h
@@ -12,7 +12,6 @@
#include
#include
-#include
#include "colvar.h"
#include "colvarmodule.h"
@@ -53,7 +52,7 @@ protected:
std::vector cv;
/// Do we request actual value (for extended-system colvars)?
- std::vector actual_value;
+ std::vector use_actual_value;
/// Get the low-level index corresponding to an index
inline size_t address(std::vector const &ix) const
@@ -136,8 +135,8 @@ public:
inline void request_actual_value(bool b = true)
{
size_t i;
- for (i = 0; i < actual_value.size(); i++) {
- actual_value[i] = b;
+ for (i = 0; i < use_actual_value.size(); i++) {
+ use_actual_value[i] = b;
}
}
@@ -215,7 +214,7 @@ public:
mult(g.mult),
data(),
cv(g.cv),
- actual_value(g.actual_value),
+ use_actual_value(g.use_actual_value),
lower_boundaries(g.lower_boundaries),
upper_boundaries(g.upper_boundaries),
periodic(g.periodic),
@@ -290,13 +289,13 @@ public:
periodic.push_back(cv[i]->periodic_boundaries());
// By default, get reported colvar value (for extended Lagrangian colvars)
- actual_value.push_back(false);
+ use_actual_value.push_back(false);
// except if a colvar is specified twice in a row
// then the first instance is the actual value
// For histograms of extended-system coordinates
if (i > 0 && cv[i-1] == cv[i]) {
- actual_value[i-1] = true;
+ use_actual_value[i-1] = true;
}
if (margin) {
@@ -319,8 +318,7 @@ public:
return this->setup();
}
- int init_from_boundaries(T const &t = T(),
- size_t const &mult_i = 1)
+ int init_from_boundaries()
{
if (cvm::debug()) {
cvm::log("Configuring grid dimensions from colvars boundaries.\n");
@@ -337,7 +335,7 @@ public:
lower_boundaries[i].real_value ) / widths[i];
int nbins_round = (int)(nbins+0.5);
- if (std::fabs(nbins - cvm::real(nbins_round)) > 1.0E-10) {
+ if (cvm::fabs(nbins - cvm::real(nbins_round)) > 1.0E-10) {
cvm::log("Warning: grid interval("+
cvm::to_str(lower_boundaries[i], cvm::cv_width, cvm::cv_prec)+" - "+
cvm::to_str(upper_boundaries[i], cvm::cv_width, cvm::cv_prec)+
@@ -392,20 +390,20 @@ public:
/// \brief Report the bin corresponding to the current value of variable i
inline int current_bin_scalar(int const i) const
{
- return value_to_bin_scalar(actual_value[i] ? cv[i]->actual_value() : cv[i]->value(), i);
+ return value_to_bin_scalar(use_actual_value[i] ? cv[i]->actual_value() : cv[i]->value(), i);
}
/// \brief Report the bin corresponding to the current value of variable i
/// and assign first or last bin if out of boundaries
inline int current_bin_scalar_bound(int const i) const
{
- return value_to_bin_scalar_bound(actual_value[i] ? cv[i]->actual_value() : cv[i]->value(), i);
+ return value_to_bin_scalar_bound(use_actual_value[i] ? cv[i]->actual_value() : cv[i]->value(), i);
}
/// \brief Report the bin corresponding to the current value of item iv in variable i
inline int current_bin_scalar(int const i, int const iv) const
{
- return value_to_bin_scalar(actual_value[i] ?
+ return value_to_bin_scalar(use_actual_value[i] ?
cv[i]->actual_value().vector1d_value[iv] :
cv[i]->value().vector1d_value[iv], i);
}
@@ -414,14 +412,14 @@ public:
/// the provided value is in
inline int value_to_bin_scalar(colvarvalue const &value, const int i) const
{
- return (int) std::floor( (value.real_value - lower_boundaries[i].real_value) / widths[i] );
+ return (int) cvm::floor( (value.real_value - lower_boundaries[i].real_value) / widths[i] );
}
/// \brief Use the lower boundary and the width to report which bin
/// the provided value is in and assign first or last bin if out of boundaries
inline int value_to_bin_scalar_bound(colvarvalue const &value, const int i) const
{
- int bin_index = std::floor( (value.real_value - lower_boundaries[i].real_value) / widths[i] );
+ int bin_index = cvm::floor( (value.real_value - lower_boundaries[i].real_value) / widths[i] );
if (bin_index < 0) bin_index=0;
if (bin_index >=int(nx[i])) bin_index=int(nx[i])-1;
return (int) bin_index;
@@ -432,7 +430,7 @@ public:
colvarvalue const &new_offset,
cvm::real const &new_width) const
{
- return (int) std::floor( (value.real_value - new_offset.real_value) / new_width );
+ return (int) cvm::floor( (value.real_value - new_offset.real_value) / new_width );
}
/// \brief Use the two boundaries and the width to report the
@@ -611,8 +609,8 @@ public:
if (periodic[i]) continue;
- cvm::real dl = std::sqrt(cv[i]->dist2(values[i], lower_boundaries[i])) / widths[i];
- cvm::real du = std::sqrt(cv[i]->dist2(values[i], upper_boundaries[i])) / widths[i];
+ cvm::real dl = cvm::sqrt(cv[i]->dist2(values[i], lower_boundaries[i])) / widths[i];
+ cvm::real du = cvm::sqrt(cv[i]->dist2(values[i], upper_boundaries[i])) / widths[i];
if (values[i].real_value < lower_boundaries[i])
dl *= -1.0;
@@ -841,7 +839,7 @@ public:
if (nd < lower_boundaries.size()) nd = lower_boundaries.size();
- if (! actual_value.size()) actual_value.assign(nd, false);
+ if (! use_actual_value.size()) use_actual_value.assign(nd, false);
if (! periodic.size()) periodic.assign(nd, false);
if (! widths.size()) widths.assign(nd, 1.0);
@@ -849,7 +847,7 @@ public:
if (old_nx.size()) {
for (size_t i = 0; i < nd; i++) {
if ( (old_nx[i] != nx[i]) ||
- (std::sqrt(cv[i]->dist2(old_lb[i],
+ (cvm::sqrt(cv[i]->dist2(old_lb[i],
lower_boundaries[i])) > 1.0E-10) ) {
new_params = true;
}
@@ -874,11 +872,11 @@ public:
void check_consistency()
{
for (size_t i = 0; i < nd; i++) {
- if ( (std::sqrt(cv[i]->dist2(cv[i]->lower_boundary,
+ if ( (cvm::sqrt(cv[i]->dist2(cv[i]->lower_boundary,
lower_boundaries[i])) > 1.0E-10) ||
- (std::sqrt(cv[i]->dist2(cv[i]->upper_boundary,
+ (cvm::sqrt(cv[i]->dist2(cv[i]->upper_boundary,
upper_boundaries[i])) > 1.0E-10) ||
- (std::sqrt(cv[i]->dist2(cv[i]->width,
+ (cvm::sqrt(cv[i]->dist2(cv[i]->width,
widths[i])) > 1.0E-10) ) {
cvm::error("Error: restart information for a grid is "
"inconsistent with that of its colvars.\n");
@@ -896,11 +894,11 @@ public:
// we skip dist2(), because periodicities and the like should
// matter: boundaries should be EXACTLY the same (otherwise,
// map_grid() should be used)
- if ( (std::fabs(other_grid.lower_boundaries[i] -
+ if ( (cvm::fabs(other_grid.lower_boundaries[i] -
lower_boundaries[i]) > 1.0E-10) ||
- (std::fabs(other_grid.upper_boundaries[i] -
+ (cvm::fabs(other_grid.upper_boundaries[i] -
upper_boundaries[i]) > 1.0E-10) ||
- (std::fabs(other_grid.widths[i] -
+ (cvm::fabs(other_grid.widths[i] -
widths[i]) > 1.0E-10) ||
(data.size() != other_grid.data.size()) ) {
cvm::error("Error: inconsistency between "
@@ -1036,11 +1034,11 @@ public:
std::istream & read_multicol(std::istream &is, bool add = false)
{
// Data in the header: nColvars, then for each
- // xiMin, dXi, nPoints, periodic
+ // xiMin, dXi, nPoints, periodic flag
std::string hash;
cvm::real lower, width, x;
- size_t n, periodic;
+ size_t n, periodic_flag;
bool remap;
std::vector new_value;
std::vector nx_read;
@@ -1053,7 +1051,8 @@ public:
if ( !(is >> hash) || (hash != "#") ) {
cvm::error("Error reading grid at position "+
- cvm::to_str(is.tellg())+" in stream(read \"" + hash + "\")\n");
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream(read \"" + hash + "\")\n");
return is;
}
@@ -1075,15 +1074,16 @@ public:
for (size_t i = 0; i < nd; i++ ) {
if ( !(is >> hash) || (hash != "#") ) {
cvm::error("Error reading grid at position "+
- cvm::to_str(is.tellg())+" in stream(read \"" + hash + "\")\n");
+ cvm::to_str(static_cast(is.tellg()))+
+ " in stream(read \"" + hash + "\")\n");
return is;
}
- is >> lower >> width >> nx_read[i] >> periodic;
+ is >> lower >> width >> nx_read[i] >> periodic_flag;
- if ( (std::fabs(lower - lower_boundaries[i].real_value) > 1.0e-10) ||
- (std::fabs(width - widths[i] ) > 1.0e-10) ||
+ if ( (cvm::fabs(lower - lower_boundaries[i].real_value) > 1.0e-10) ||
+ (cvm::fabs(width - widths[i] ) > 1.0e-10) ||
(nx_read[i] != nx[i]) ) {
cvm::log("Warning: reading from different grid definition (colvar "
+ cvm::to_str(i+1) + "); remapping data on new grid.\n");
@@ -1246,7 +1246,7 @@ public:
if (A0 * A1 == 0) {
return 0.; // can't handle empty bins
} else {
- return (std::log((cvm::real)A1) - std::log((cvm::real)A0))
+ return (cvm::logn((cvm::real)A1) - cvm::logn((cvm::real)A0))
/ (widths[n] * 2.);
}
} else if (ix[n] > 0 && ix[n] < nx[n]-1) { // not an edge
@@ -1258,7 +1258,7 @@ public:
if (A0 * A1 == 0) {
return 0.; // can't handle empty bins
} else {
- return (std::log((cvm::real)A1) - std::log((cvm::real)A0))
+ return (cvm::logn((cvm::real)A1) - cvm::logn((cvm::real)A0))
/ (widths[n] * 2.);
}
} else {
@@ -1271,8 +1271,8 @@ public:
if (A0 * A1 * A2 == 0) {
return 0.; // can't handle empty bins
} else {
- return (-1.5 * std::log((cvm::real)A0) + 2. * std::log((cvm::real)A1)
- - 0.5 * std::log((cvm::real)A2)) * increment / widths[n];
+ return (-1.5 * cvm::logn((cvm::real)A0) + 2. * cvm::logn((cvm::real)A1)
+ - 0.5 * cvm::logn((cvm::real)A2)) * increment / widths[n];
}
}
}
diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp
index d88a97a441..baffc25c28 100644
--- a/lib/colvars/colvarmodule.cpp
+++ b/lib/colvars/colvarmodule.cpp
@@ -28,6 +28,8 @@
colvarmodule::colvarmodule(colvarproxy *proxy_in)
{
depth_s = 0;
+ log_level_ = 10;
+
cv_traj_os = NULL;
if (proxy == NULL) {
@@ -152,12 +154,12 @@ int colvarmodule::read_config_string(std::string const &config_str)
{
cvm::log(cvm::line_marker);
cvm::log("Reading new configuration:\n");
- std::istringstream config_s(config_str);
+ std::istringstream new_config_s(config_str);
// strip the comments away
std::string conf = "";
std::string line;
- while (parse->read_config_line(config_s, line)) {
+ while (parse->read_config_line(new_config_s, line)) {
// Delete lines that contain only white space after removing comments
if (line.find_first_not_of(colvarparse::white_space) != std::string::npos)
conf.append(line+"\n");
@@ -255,13 +257,16 @@ int colvarmodule::append_new_config(std::string const &new_conf)
int colvarmodule::parse_global_params(std::string const &conf)
{
- colvarmodule *cvm = cvm::main();
+ // TODO document and then echo this keyword
+ parse->get_keyval(conf, "logLevel", log_level_, log_level_,
+ colvarparse::parse_silent);
{
std::string index_file_name;
size_t pos = 0;
while (parse->key_lookup(conf, "indexFile", &index_file_name, &pos)) {
- cvm->read_index_file(index_file_name.c_str());
+ cvm::log("# indexFile = \""+index_file_name+"\"\n");
+ read_index_file(index_file_name.c_str());
index_file_name.clear();
}
}
@@ -580,6 +585,24 @@ cvm::atom_group *colvarmodule::atom_group_by_name(std::string const &name)
}
+void colvarmodule::register_named_atom_group(atom_group *ag) {
+ named_atom_groups.push_back(ag);
+}
+
+
+void colvarmodule::unregister_named_atom_group(cvm::atom_group *ag)
+{
+ for (std::vector::iterator agi = named_atom_groups.begin();
+ agi != named_atom_groups.end();
+ agi++) {
+ if (*agi == ag) {
+ named_atom_groups.erase(agi);
+ break;
+ }
+ }
+}
+
+
int colvarmodule::change_configuration(std::string const &bias_name,
std::string const &conf)
{
@@ -1034,9 +1057,6 @@ int colvarmodule::analyze()
cvm::log("colvarmodule::analyze(), step = "+cvm::to_str(it)+".\n");
}
- if (cvm::step_relative() == 0)
- cvm::log("Performing analysis.\n");
-
// perform colvar-specific analysis
for (std::vector::iterator cvi = variables_active()->begin();
cvi != variables_active()->end();
@@ -1089,7 +1109,6 @@ int colvarmodule::end_of_step()
int colvarmodule::setup()
{
if (this->size() == 0) return cvm::get_error();
- // loop over all components of all colvars to reset masses of all groups
for (std::vector::iterator cvi = variables()->begin();
cvi != variables()->end(); cvi++) {
(*cvi)->setup();
@@ -1248,13 +1267,13 @@ std::istream & colvarmodule::read_restart(std::istream &is)
std::string restart_conf;
if (is >> colvarparse::read_block("configuration", restart_conf)) {
parse->get_keyval(restart_conf, "step",
- it_restart, (size_t) 0,
- colvarparse::parse_silent);
+ it_restart, static_cast(0),
+ colvarparse::parse_restart);
it = it_restart;
std::string restart_version;
parse->get_keyval(restart_conf, "version",
restart_version, std::string(""),
- colvarparse::parse_silent);
+ colvarparse::parse_restart);
if (restart_version.size() && (restart_version != std::string(COLVARS_VERSION))) {
cvm::log("This state file was generated with version "+restart_version+"\n");
}
@@ -1600,14 +1619,16 @@ std::ostream & colvarmodule::write_traj(std::ostream &os)
}
-void cvm::log(std::string const &message)
+void cvm::log(std::string const &message, int min_log_level)
{
+ if (cvm::log_level() < min_log_level) return;
// allow logging when the module is not fully initialized
size_t const d = (cvm::main() != NULL) ? depth() : 0;
- if (d > 0)
+ if (d > 0) {
proxy->log((std::string(2*d, ' '))+message);
- else
+ } else {
proxy->log(message);
+ }
}
@@ -1915,14 +1936,190 @@ int cvm::replica_comm_send(char* msg_data, int msg_len, int dest_rep)
+template std::string _to_str(T const &x,
+ size_t width, size_t prec)
+{
+ std::ostringstream os;
+ if (width) os.width(width);
+ if (prec) {
+ os.setf(std::ios::scientific, std::ios::floatfield);
+ os.precision(prec);
+ }
+ os << x;
+ return os.str();
+}
+
+
+template std::string _to_str_vector(std::vector const &x,
+ size_t width, size_t prec)
+{
+ if (!x.size()) return std::string("");
+ std::ostringstream os;
+ if (prec) {
+ os.setf(std::ios::scientific, std::ios::floatfield);
+ }
+ os << "{ ";
+ if (width) os.width(width);
+ if (prec) os.precision(prec);
+ os << x[0];
+ for (size_t i = 1; i < x.size(); i++) {
+ os << ", ";
+ if (width) os.width(width);
+ if (prec) os.precision(prec);
+ os << x[i];
+ }
+ os << " }";
+ return os.str();
+}
+
+
+
+std::string colvarmodule::to_str(std::string const &x)
+{
+ return std::string("\"")+x+std::string("\"");
+}
+
+std::string colvarmodule::to_str(char const *x)
+{
+ return std::string("\"")+std::string(x)+std::string("\"");
+}
+
+std::string colvarmodule::to_str(bool x)
+{
+ return (x ? "on" : "off");
+}
+
+std::string colvarmodule::to_str(int const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(size_t const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(long int const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(step_number const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(cvm::real const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(cvm::rvector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(cvm::quaternion const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(colvarvalue const &x,
+ size_t width, size_t prec)
+{
+ return _to_str(x, width, prec);
+}
+
+std::string colvarmodule::to_str(cvm::vector1d const &x,
+ size_t width, size_t prec)
+{
+ return _to_str< cvm::vector1d >(x, width, prec);
+}
+
+std::string colvarmodule::to_str(cvm::matrix2d const &x,
+ size_t width, size_t prec)
+{
+ return _to_str< cvm::matrix2d >(x, width, prec);
+}
+
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+std::string colvarmodule::to_str(std::vector const &x,
+ size_t width, size_t prec)
+{
+ return _to_str_vector(x, width, prec);
+}
+
+
+std::string cvm::wrap_string(std::string const &s, size_t nchars)
+{
+ if (!s.size()) {
+ return std::string(nchars, ' ');
+ } else {
+ return ( (s.size() <= nchars) ?
+ (s+std::string(nchars-s.size(), ' ')) :
+ (std::string(s, 0, nchars)) );
+ }
+}
+
+
// shared pointer to the proxy object
colvarproxy *colvarmodule::proxy = NULL;
// static runtime data
cvm::real colvarmodule::debug_gradients_step_size = 1.0e-07;
int colvarmodule::errorCode = 0;
-long colvarmodule::it = 0;
-long colvarmodule::it_restart = 0;
+int colvarmodule::log_level_ = 10;
+cvm::step_number colvarmodule::it = 0;
+cvm::step_number colvarmodule::it_restart = 0;
size_t colvarmodule::restart_out_freq = 0;
size_t colvarmodule::cv_traj_freq = 0;
bool colvarmodule::use_scripted_forces = false;
diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h
index 99b797627e..30620a2527 100644
--- a/lib/colvars/colvarmodule.h
+++ b/lib/colvars/colvarmodule.h
@@ -10,6 +10,8 @@
#ifndef COLVARMODULE_H
#define COLVARMODULE_H
+#include
+
#include "colvars_version.h"
#ifndef COLVARS_DEBUG
@@ -55,6 +57,7 @@ class colvar;
class colvarbias;
class colvarproxy;
class colvarscript;
+class colvarvalue;
/// \brief Collective variables module (main class)
@@ -88,10 +91,16 @@ public:
// TODO colvarscript should be unaware of colvarmodule's internals
friend class colvarscript;
+ /// Use a 64-bit integer to store the step number
+ typedef long long step_number;
+
/// Defining an abstract real number allows to switch precision
typedef double real;
- /// Override std::pow with a product for n integer
+
+ // Math functions
+
+ /// Override the STL pow() with a product for n integer
static inline real integer_power(real const &x, int const n)
{
// Original code: math_special.h in LAMMPS
@@ -105,8 +114,68 @@ public:
return (n > 0) ? yy : 1.0/yy;
}
- /// Residue identifier
- typedef int residue_id;
+ /// Reimplemented to work around MS compiler issues
+ static inline real pow(real const &x, real const &y)
+ {
+ return ::pow(static_cast(x), static_cast(y));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real floor(real const &x)
+ {
+ return ::floor(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real fabs(real const &x)
+ {
+ return ::fabs(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real sqrt(real const &x)
+ {
+ return ::sqrt(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real sin(real const &x)
+ {
+ return ::sin(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real cos(real const &x)
+ {
+ return ::cos(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real acos(real const &x)
+ {
+ return ::acos(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real atan2(real const &x, real const &y)
+ {
+ return ::atan2(static_cast(x), static_cast(y));
+ }
+
+ /// Reimplemented to work around MS compiler issues
+ static inline real exp(real const &x)
+ {
+ return ::exp(static_cast(x));
+ }
+
+ /// Reimplemented to work around MS compiler issues. Note: log() is
+ /// currently defined as the text logging function, but this can be changed
+ /// at a later time
+ static inline real logn(real const &x)
+ {
+ return ::log(static_cast(x));
+ }
+
class rvector;
template class vector1d;
@@ -114,6 +183,10 @@ public:
class quaternion;
class rotation;
+
+ /// Residue identifier
+ typedef int residue_id;
+
/// \brief Atom position (different type name from rvector, to make
/// possible future PBC-transparent implementations)
typedef rvector atom_pos;
@@ -150,19 +223,19 @@ public:
/// Current step number
- static long it;
+ static step_number it;
/// Starting step number for this run
- static long it_restart;
+ static step_number it_restart;
/// Return the current step number from the beginning of this run
- static inline long step_relative()
+ static inline step_number step_relative()
{
return it - it_restart;
}
/// Return the current step number from the beginning of the whole
/// calculation
- static inline long step_absolute()
+ static inline step_number step_absolute()
{
return it;
}
@@ -203,9 +276,10 @@ private:
std::vector named_atom_groups;
public:
/// Register a named atom group into named_atom_groups
- inline void register_named_atom_group(atom_group * ag) {
- named_atom_groups.push_back(ag);
- }
+ void register_named_atom_group(atom_group *ag);
+
+ /// Remove a named atom group from named_atom_groups
+ void unregister_named_atom_group(atom_group *ag);
/// Array of collective variables
std::vector *variables();
@@ -254,8 +328,7 @@ public:
/// \brief How many objects are configured yet?
size_t size() const;
- /// \brief Constructor \param config_name Configuration file name
- /// \param restart_name (optional) Restart file name
+ /// \brief Constructor
colvarmodule(colvarproxy *proxy);
/// Destructor
@@ -265,6 +338,7 @@ public:
int reset();
/// Open a config file, load its contents, and pass it to config_string()
+ /// \param config_file_name Configuration file name
int read_config_file(char const *config_file_name);
/// \brief Parse a config string assuming it is a complete configuration
@@ -431,26 +505,92 @@ public:
long traj_read_begin,
long traj_read_end);
- /// Quick conversion of an object to a string
- template static std::string to_str(T const &x,
- size_t const &width = 0,
- size_t const &prec = 0);
- /// Quick conversion of a vector of objects to a string
- template static std::string to_str(std::vector const &x,
- size_t const &width = 0,
- size_t const &prec = 0);
+ /// Convert to string for output purposes
+ static std::string to_str(char const *s);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::string const &s);
+
+ /// Convert to string for output purposes
+ static std::string to_str(bool x);
+
+ /// Convert to string for output purposes
+ static std::string to_str(int const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(size_t const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(long int const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(step_number const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(real const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(rvector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(quaternion const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(colvarvalue const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(vector1d const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(matrix2d const &x,
+ size_t width = 0, size_t prec = 0);
+
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
+ /// Convert to string for output purposes
+ static std::string to_str(std::vector const &x,
+ size_t width = 0, size_t prec = 0);
+
/// Reduce the number of characters in a string
- static inline std::string wrap_string(std::string const &s,
- size_t const &nchars)
- {
- if (!s.size())
- return std::string(nchars, ' ');
- else
- return ( (s.size() <= size_t(nchars)) ?
- (s+std::string(nchars-s.size(), ' ')) :
- (std::string(s, 0, nchars)) );
- }
+ static std::string wrap_string(std::string const &s,
+ size_t nchars);
/// Number of characters to represent a time step
static size_t const it_width;
@@ -485,7 +625,9 @@ public:
static void request_total_force();
/// Print a message to the main log
- static void log(std::string const &message);
+ /// \param message Message to print
+ /// \param min_log_level Only print if cvm::log_level() >= min_log_level
+ static void log(std::string const &message, int min_log_level = 10);
/// Print a message to the main log and exit with error code
static int fatal_error(std::string const &message);
@@ -493,6 +635,50 @@ public:
/// Print a message to the main log and set global error code
static int error(std::string const &message, int code = COLVARS_ERROR);
+private:
+
+ /// Level of logging requested by the user
+ static int log_level_;
+
+public:
+
+ /// Level of logging requested by the user
+ static inline int log_level()
+ {
+ return log_level_;
+ }
+
+ /// Level at which initialization messages are logged
+ static inline int log_init_messages()
+ {
+ return 1;
+ }
+
+ /// Level at which a keyword's user-provided value is logged
+ static inline int log_user_params()
+ {
+ return 2;
+ }
+
+ /// Level at which a keyword's default value is logged
+ static inline int log_default_params()
+ {
+ return 3;
+ }
+
+ /// Level at which output-file operations are logged
+ static inline int log_output_files()
+ {
+ return 4;
+ }
+
+ /// Level at which input-file operations (configuration, state) are logged
+ static inline int log_input_files()
+ {
+ return 5;
+ }
+
+
// Replica exchange commands.
static bool replica_enabled();
static int replica_index();
@@ -630,41 +816,4 @@ std::ostream & operator << (std::ostream &os, cvm::rvector const &v);
std::istream & operator >> (std::istream &is, cvm::rvector &v);
-template std::string cvm::to_str(T const &x,
- size_t const &width,
- size_t const &prec) {
- std::ostringstream os;
- if (width) os.width(width);
- if (prec) {
- os.setf(std::ios::scientific, std::ios::floatfield);
- os.precision(prec);
- }
- os << x;
- return os.str();
-}
-
-
-template std::string cvm::to_str(std::vector const &x,
- size_t const &width,
- size_t const &prec) {
- if (!x.size()) return std::string("");
- std::ostringstream os;
- if (prec) {
- os.setf(std::ios::scientific, std::ios::floatfield);
- }
- os << "{ ";
- if (width) os.width(width);
- if (prec) os.precision(prec);
- os << x[0];
- for (size_t i = 1; i < x.size(); i++) {
- os << ", ";
- if (width) os.width(width);
- if (prec) os.precision(prec);
- os << x[i];
- }
- os << " }";
- return os.str();
-}
-
-
#endif
diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp
index d8b3a359cd..10dce911ee 100644
--- a/lib/colvars/colvarparse.cpp
+++ b/lib/colvars/colvarparse.cpp
@@ -10,6 +10,7 @@
#include
#include
+#include
#include "colvarmodule.h"
#include "colvarvalue.h"
@@ -20,15 +21,21 @@
char const * const colvarparse::white_space = " \t";
-// definition of single-value keyword parsers
+namespace {
-template bool colvarparse::_get_keyval_scalar_(std::string const &conf,
- char const *key,
- TYPE &value,
- TYPE const &def_value,
- Parse_Mode const parse_mode)
+ // Avoid having to put the bool assignment in the template :-(
+ void set_bool(void *p, bool val)
+ {
+ bool *v = reinterpret_cast(p);
+ *v = val;
+ }
+
+}
+
+
+bool colvarparse::get_key_string_value(std::string const &conf,
+ char const *key, std::string &data)
{
- std::string data;
bool b_found = false, b_found_any = false;
size_t save_pos = 0, found_count = 0;
@@ -48,29 +55,163 @@ template bool colvarparse::_get_keyval_scalar_(std::string const
std::string(key)+"\".\n", INPUT_ERROR);
}
+ return b_found_any;
+}
+
+
+template
+void colvarparse::mark_key_set_user(std::string const &key_str,
+ TYPE const &value,
+ Parse_Mode const &parse_mode)
+{
+ key_set_modes[to_lower_cppstr(key_str)] = key_set_user;
+ if (parse_mode & parse_echo) {
+ cvm::log("# "+key_str+" = "+cvm::to_str(value)+"\n",
+ cvm::log_user_params());
+ }
+}
+
+
+template
+void colvarparse::mark_key_set_default(std::string const &key_str,
+ TYPE const &def_value,
+ Parse_Mode const &parse_mode)
+{
+ key_set_modes[to_lower_cppstr(key_str)] = key_set_default;
+ if (parse_mode & parse_echo_default) {
+ cvm::log("# "+key_str+" = "+cvm::to_str(def_value)+
+ " [default]\n", cvm::log_default_params());
+ }
+}
+
+
+void colvarparse::error_key_required(std::string const &key_str,
+ Parse_Mode const &parse_mode)
+{
+ if (key_already_set(key_str)) {
+ return;
+ }
+ if (parse_mode & parse_restart) {
+ cvm::error("Error: keyword \""+key_str+
+ "\" is missing from the restart.\n", INPUT_ERROR);
+ } else {
+ cvm::error("Error: keyword \""+key_str+
+ "\" is required.\n", INPUT_ERROR);
+ }
+}
+
+
+template
+int colvarparse::_get_keyval_scalar_value_(std::string const &key_str,
+ std::string const &data,
+ TYPE &value,
+ TYPE const &def_value)
+{
+ std::istringstream is(data);
+ size_t value_count = 0;
+ TYPE x(def_value);
+
+ while (is >> x) {
+ value = x;
+ value_count++;
+ }
+
+ if (value_count == 0) {
+ return cvm::error("Error: in parsing \""+
+ key_str+"\".\n", INPUT_ERROR);
+ }
+
+ if (value_count > 1) {
+ return cvm::error("Error: multiple values "
+ "are not allowed for keyword \""+
+ key_str+"\".\n", INPUT_ERROR);
+ }
+
+ return COLVARS_OK;
+}
+
+
+template<>
+int colvarparse::_get_keyval_scalar_value_(std::string const &key_str,
+ std::string const &data,
+ bool &value,
+ bool const &def_value)
+{
+ if ( (data == std::string("on")) ||
+ (data == std::string("yes")) ||
+ (data == std::string("true")) ) {
+ set_bool(reinterpret_cast(&value), true);
+ } else if ( (data == std::string("off")) ||
+ (data == std::string("no")) ||
+ (data == std::string("false")) ) {
+ set_bool(reinterpret_cast(&value), false);
+ } else {
+ return cvm::error("Error: boolean values only are allowed "
+ "for \""+key_str+"\".\n", INPUT_ERROR);
+ }
+ return COLVARS_OK;
+}
+
+
+template
+int colvarparse::_get_keyval_scalar_novalue_(std::string const &key_str,
+ TYPE &value,
+ Parse_Mode const &parse_mode)
+{
+ return cvm::error("Error: improper or missing value "
+ "for \""+key_str+"\".\n", INPUT_ERROR);
+}
+
+template<>
+int colvarparse::_get_keyval_scalar_novalue_(std::string const &key_str,
+ bool &value,
+ Parse_Mode const &parse_mode)
+{
+ set_bool(reinterpret_cast(&value), true);
+ mark_key_set_user(key_str, value, parse_mode);
+ return COLVARS_OK;
+}
+
+
+template
+bool colvarparse::_get_keyval_scalar_(std::string const &conf,
+ char const *key,
+ TYPE &value,
+ TYPE const &def_value,
+ Parse_Mode const &parse_mode)
+{
+ std::string const key_str(key);
+
+ std::string data;
+ bool const b_found_any = get_key_string_value(conf, key, data);
+
if (data.size()) {
- std::istringstream is(data);
- TYPE x(def_value);
- if (is >> x) {
- value = x;
+
+ _get_keyval_scalar_value_(key_str, data, value, def_value);
+
+ mark_key_set_user(key_str, value, parse_mode);
+
+ } else { // No string value
+
+ if (b_found_any) {
+
+ _get_keyval_scalar_novalue_(key_str, value, parse_mode);
+
} else {
- cvm::error("Error: in parsing \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- cvm::to_str(value)+"\n");
- }
- } else {
- if (b_found_any) {
- cvm::error("Error: improper or missing value "
- "for \""+std::string(key)+"\".\n", INPUT_ERROR);
- }
- value = def_value;
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- cvm::to_str(def_value)+" [default]\n");
+ if (parse_mode & parse_required) {
+ if (cvm::debug()) {
+ cvm::log("get_keyval, parse_required = "+cvm::to_str(parse_mode & parse_required)+
+ "\n");
+ }
+ error_key_required(key_str, parse_mode);
+ return false;
+ }
+
+ if ( (parse_mode & parse_override) || !(key_already_set(key)) ) {
+ value = def_value;
+ mark_key_set_default(key_str, value, parse_mode);
+ }
}
}
@@ -78,96 +219,17 @@ template bool colvarparse::_get_keyval_scalar_(std::string const
}
-bool colvarparse::_get_keyval_scalar_string_(std::string const &conf,
- char const *key,
- std::string &value,
- std::string const &def_value,
- Parse_Mode const parse_mode)
+template
+bool colvarparse::_get_keyval_vector_(std::string const &conf,
+ char const *key,
+ std::vector &values,
+ std::vector const &def_values,
+ Parse_Mode const &parse_mode)
{
+ std::string const key_str(key);
+
std::string data;
- bool b_found = false, b_found_any = false;
- size_t save_pos = 0, found_count = 0;
-
- do {
- std::string data_this = "";
- b_found = key_lookup(conf, key, &data_this, &save_pos);
- if (b_found) {
- if (!b_found_any)
- b_found_any = true;
- found_count++;
- data = data_this;
- }
- } while (b_found);
-
- if (found_count > 1) {
- cvm::error("Error: found more than one instance of \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
-
- if (data.size()) {
- std::istringstream is(data);
- size_t data_count = 0;
- std::string x(def_value);
- while (is >> x) {
- value = x;
- data_count++;
- }
- if (data_count == 0)
- cvm::error("Error: in parsing \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- if (data_count > 1) {
- cvm::error("Error: multiple values "
- "are not allowed for keyword \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = \""+
- cvm::to_str(value)+"\"\n");
- }
- } else {
-
- if (b_found_any) {
- cvm::error("Error: improper or missing value "
- "for \""+std::string(key)+"\".\n", INPUT_ERROR);
- }
- value = def_value;
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = \""+
- cvm::to_str(def_value)+"\" [default]\n");
- }
- }
-
- return b_found_any;
-}
-
-
-// multiple-value keyword parsers
-
-template bool colvarparse::_get_keyval_vector_(std::string const &conf,
- char const *key,
- std::vector &values,
- std::vector const &def_values,
- Parse_Mode const parse_mode)
-{
- std::string data;
- bool b_found = false, b_found_any = false;
- size_t save_pos = 0, found_count = 0;
-
- do {
- std::string data_this = "";
- b_found = key_lookup(conf, key, &data_this, &save_pos);
- if (b_found) {
- if (!b_found_any)
- b_found_any = true;
- found_count++;
- data = data_this;
- }
- } while (b_found);
-
- if (found_count > 1) {
- cvm::error("Error: found more than one instance of \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
+ bool const b_found_any = get_key_string_value(conf, key, data);
if (data.size()) {
std::istringstream is(data);
@@ -175,10 +237,11 @@ template bool colvarparse::_get_keyval_vector_(std::string const
if (values.size() == 0) {
std::vector x;
- if (def_values.size())
+ if (def_values.size()) {
x = def_values;
- else
+ } else {
x.assign(1, TYPE());
+ }
for (size_t i = 0;
( is >> x[ ((i bool colvarparse::_get_keyval_vector_(std::string const
values[i] = x;
} else {
cvm::error("Error: in parsing \""+
- std::string(key)+"\".\n", INPUT_ERROR);
+ key_str+"\".\n", INPUT_ERROR);
}
}
}
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- cvm::to_str(values)+"\n");
- }
+ mark_key_set_user< std::vector >(key_str, values, parse_mode);
} else {
if (b_found_any) {
cvm::error("Error: improper or missing values for \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
+ key_str+"\".\n", INPUT_ERROR);
+ } else {
- for (size_t i = 0; i < values.size(); i++)
- values[i] = def_values[ (i > def_values.size()) ? 0 : i ];
+ if ((values.size() > 0) && (values.size() != def_values.size())) {
+ cvm::error("Error: the number of default values for \""+
+ key_str+"\" is different from the number of "
+ "current values.\n", BUG_ERROR);
+ }
+
+ if (parse_mode & parse_required) {
+ error_key_required(key_str, parse_mode);
+ return false;
+ }
+
+ if ( (parse_mode & parse_override) || !(key_already_set(key)) ) {
+ for (size_t i = 0; i < values.size(); i++) {
+ values[i] = def_values[i];
+ }
+ mark_key_set_default< std::vector >(key_str, def_values,
+ parse_mode);
+ }
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- cvm::to_str(def_values)+" [default]\n");
}
}
@@ -255,13 +328,22 @@ bool colvarparse::get_keyval(std::string const &conf,
return _get_keyval_scalar_(conf, key, value, def_value, parse_mode);
}
+bool colvarparse::get_keyval(std::string const &conf,
+ char const *key,
+ cvm::step_number &value,
+ cvm::step_number const &def_value,
+ Parse_Mode const parse_mode)
+{
+ return _get_keyval_scalar_(conf, key, value, def_value, parse_mode);
+}
+
bool colvarparse::get_keyval(std::string const &conf,
char const *key,
std::string &value,
std::string const &def_value,
Parse_Mode const parse_mode)
{
- return _get_keyval_scalar_string_(conf, key, value, def_value, parse_mode);
+ return _get_keyval_scalar_(conf, key, value, def_value, parse_mode);
}
bool colvarparse::get_keyval(std::string const &conf,
@@ -300,66 +382,13 @@ bool colvarparse::get_keyval(std::string const &conf,
return _get_keyval_scalar_(conf, key, value, def_value, parse_mode);
}
-
bool colvarparse::get_keyval(std::string const &conf,
char const *key,
bool &value,
bool const &def_value,
Parse_Mode const parse_mode)
{
- std::string data;
- bool b_found = false, b_found_any = false;
- size_t save_pos = 0, found_count = 0;
-
- do {
- std::string data_this = "";
- b_found = key_lookup(conf, key, &data_this, &save_pos);
- if (b_found) {
- if (!b_found_any)
- b_found_any = true;
- found_count++;
- data = data_this;
- }
- } while (b_found);
-
- if (found_count > 1) {
- cvm::error("Error: found more than one instance of \""+
- std::string(key)+"\".\n", INPUT_ERROR);
- }
-
- if (data.size()) {
- if ( (data == std::string("on")) ||
- (data == std::string("yes")) ||
- (data == std::string("true")) ) {
- value = true;
- } else if ( (data == std::string("off")) ||
- (data == std::string("no")) ||
- (data == std::string("false")) ) {
- value = false;
- } else
- cvm::error("Error: boolean values only are allowed "
- "for \""+std::string(key)+"\".\n", INPUT_ERROR);
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- (value ? "on" : "off")+"\n");
- }
- } else {
-
- if (b_found_any) {
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = on\n");
- }
- value = true;
- } else {
- value = def_value;
- if (parse_mode != parse_silent) {
- cvm::log("# "+std::string(key)+" = "+
- (def_value ? "on" : "off")+" [default]\n");
- }
- }
- }
-
- return b_found_any;
+ return _get_keyval_scalar_(conf, key, value, def_value, parse_mode);
}
@@ -440,15 +469,27 @@ bool colvarparse::get_keyval(std::string const &conf,
void colvarparse::add_keyword(char const *key)
{
- for (std::list::iterator ki = allowed_keywords.begin();
- ki != allowed_keywords.end(); ki++) {
- if (to_lower_cppstr(std::string(key)) == *ki)
- return;
+ std::string const key_str_lower(to_lower_cppstr(std::string(key)));
+
+ if (key_set_modes.find(key_str_lower) != key_set_modes.end()) {
+ return;
}
- // not found in the list
- // if (cvm::debug())
- // cvm::log("Registering a new keyword, \""+std::string (key)+"\".\n");
- allowed_keywords.push_back(to_lower_cppstr(std::string(key)));
+
+ key_set_modes[key_str_lower] = key_not_set;
+
+ allowed_keywords.push_back(key_str_lower);
+}
+
+
+bool colvarparse::key_already_set(std::string const &key_str)
+{
+ std::string const key_str_lower(to_lower_cppstr(key_str));
+
+ if (key_set_modes.find(key_str_lower) == key_set_modes.end()) {
+ return false;
+ }
+
+ return (key_set_modes[key_str_lower] > 0);
}
@@ -457,6 +498,10 @@ void colvarparse::strip_values(std::string &conf)
size_t offset = 0;
data_begin_pos.sort();
data_end_pos.sort();
+ std::list::iterator data_begin_pos_last = std::unique(data_begin_pos.begin(), data_begin_pos.end());
+ data_begin_pos.erase(data_begin_pos_last, data_begin_pos.end());
+ std::list |