+++ /dev/null
-language: cpp
-
-before_install:
- - echo "yes" | sudo add-apt-repository ppa:kalakris/cmake #https://github.com/travis-ci/travis-ci/issues/2212
- - sudo apt-get update
- - sudo apt-get install libfftw3-dev libopenmpi-dev libx11-dev zlib1g-dev libgsl0-dev libxml2-dev libblas-dev liblapack-dev libboost-dev cmake
-
-env:
- matrix:
- - GMX_DOUBLE=OFF GMX_MPI=OFF
- - GMX_DOUBLE=OFF GMX_MPI=ON
- - GMX_DOUBLE=ON GMX_MPI=OFF
- - GMX_DOUBLE=ON GMX_MPI=ON
-
-script:
- - mkdir build && pushd build && cmake -DGMX_DOUBLE=$GMX_DOUBLE -DGMX_MPI=$GMX_MPI .. && make -j4
-
-compiler:
- - clang
- - gcc
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
# To help us fund GROMACS development, we humbly ask that you cite
# the research papers on the package. Check out http://www.gromacs.org.
-cmake_minimum_required(VERSION 3.4.3)
+cmake_minimum_required(VERSION 3.9.6)
# CMake modules/macros are in a subdirectory to keep this file cleaner
# This needs to be set before project() in order to pick up toolchain files
mark_as_advanced(GMX_STDLIB_CXX_FLAGS)
mark_as_advanced(GMX_STDLIB_LIBRARIES)
-########################################################################
-# Detect CXX11 support and flags
-########################################################################
-# The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
-# are used with permission from CMake v3.0.0 so that GROMACS can detect
-# invalid options with the Intel Compilers, and we have added a line
-# to detect warnings with the Fujitsu compilers on K computer and ICC.
-# CMake-3.0 also has a bug where the FAIL_REGEX pattern for AIX contains
-# a semicolon. Since this is also used as a separator in lists inside CMake,
-# that string ends up being split into two separate patterns, and the last
-# part is just a single word that also matches other messages. We solved this
-# by replacing the semicolon with a period that matches any character.
-#
-# These files should be removed from the source tree when a CMake version that
-# includes the features in question becomes required for building GROMACS.
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
message("CMAKE_SHARED_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
endif()
-if(NOT GMX_OPENMP)
- #Unset all OpenMP flags in case OpenMP was disabled either by the user
- #or because it was only partially detected (e.g. only for C but not C++ compiler)
- unset(OpenMP_C_FLAGS CACHE)
- unset(OpenMP_CXX_FLAGS CACHE)
-else()
- set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
- set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
-endif()
-
-
########################################################################
# Specify install locations
########################################################################
14. lmfit
15. clFFT
16. Guidelines Support Library (GSL)
+17. P0009 reference implementation (Sandia Corporation)
Our chosen method for packaging distributions (CPack) only permits a
package to have a single license file, so we are unfortunately forced
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
--
+
+17. P0009 reference implementation (Sandia Corporation)
+=======================================================
+
+ Files: src/gromacs/mdspan/*
+
+ Kokkos v. 2.0
+ Copyright (2014) Sandia Corporation
+
+Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+the U.S. Government retains certain rights in this software.
+
+Kokkos is licensed under 3-clause BSD terms of use:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the Corporation nor the names of the
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Questions? Contact Christian R. Trott (crtrott@sandia.gov)
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
# Test older gcc
# Test oldest supported CUDA
+# Test oldest supported cmake
# Test oldest supported Ubuntu
# Test MPI with CUDA
# Test MPI with gcc
-# Test cmake version from before new FindCUDA support (in 3.8)
# Test MPMD PME with library MPI
-# Test recent cmake (3.7+), to cover minor FindCUDA changes from 3.7.0
-gcc-4.8 gpuhw=nvidia cuda-7.0 cmake-3.8.1 mpi npme=1 nranks=2 openmp
+gcc-4.8 gpuhw=nvidia cuda-7.0 cmake-3.9.6 mpi npme=1 nranks=2 openmp
# Test non-default use of mdrun -gpu_id
# Test newest gcc supported by newest CUDA at time of release
# Test thread-MPI with CUDA
-# Test older cmake version (< 3.7)
# Test SIMD implementation of pair search for GPU code-path
-gcc-7 gpuhw=nvidia gpu_id=1 cuda-10.0 thread-mpi openmp cmake-3.6.1 release-with-assert simd=avx2_256
+gcc-7 gpuhw=nvidia gpu_id=1 cuda-10.0 thread-mpi openmp cmake-3.10.0 release-with-assert simd=avx2_256
# Test with libcxx
# Test with ThreadSanitizer + OpenMP + SIMD
# Test fftpack fallback
gcc-8 double x11 no-tng fftpack simd=sse4.1
-# Test oldest supported cmake
# Test older clang
# Test clang in double precision
# Test without OpenMP
# Test thread-MPI
# Test AVX_128_FMA SIMD + Double (Important for Simd4N=Simd4 and sizeof(SimdInt32)!=4*GMX_SIMD_REAL_WIDTH)
# Test with TNG support
-clang-3.4 double simd=avx_128_fma thread-mpi no-openmp fftpack cmake-3.4.3 tng
+clang-3.4 double simd=avx_128_fma thread-mpi no-openmp fftpack cmake-3.11.4 tng
# Test newest clang at time of release
# Test with AddressSanitizer (without OpenMP, see below)
clang-7 no-openmp asan cmake-3.11.4
-# Test newest cmake at time of release
-# Test with clang-tidy (without OpenMP, cmake>=3.6)
+# Test with clang-tidy (without OpenMP)
clang-7 no-openmp cmake-3.12.1 tidy
# Test oldest supported MSVC on Windows
gcc-8 openmp simd=avx2_256 gpuhw=amd opencl-1.2 clFFT-2.14 buildfftw
# TODO
+# Test newest cmake at time of release
# Add OpenMP support to ASAN build (but libomp.so in clang-4 reports leaks, so might need a suitable build or suppression)
# Test hwloc-2 support
# Test newest supported LTS Ubuntu
# Test oldest supported gcc at time of release
# Test mpi support
# Test mdrun-only build
-gcc-4.8 mpi mdrun-only release cmake-3.8.1
+gcc-4.8 mpi mdrun-only release cmake-3.9.6
# Test static linking with gcc
# Test newest gcc at time of release
# Test static linking with clang
# Test double precision
# Test newest supported clang version
-clang-5 static double release cmake-3.6.1
+clang-5 static double release cmake-3.10.0
# Test with GPU support
# Test with newest CUDA at time of release
+++ /dev/null
-# - Check whether the C compiler supports a given flag.
-# CHECK_C_COMPILER_FLAG(<flag> <var>)
-# <flag> - the compiler flag
-# <var> - variable to store the result
-# This internally calls the check_c_source_compiles macro.
-# See help for CheckCSourceCompiles for a listing of variables
-# that can modify the build.
-
-#=============================================================================
-# Copyright 2006-2011 Kitware, Inc.
-# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
-# Copyright 2011 Matthias Kretz <kretz@kde.org>
-#
-# ORIGINAL Copyright notice (from Copyright.txt):
-#
-# CMake - Cross Platform Makefile Generator
-# Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# * Neither the names of Kitware, Inc., the Insight Software Consortium,
-# nor the names of their contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-INCLUDE(CheckCSourceCompiles)
-
-MACRO (CHECK_C_COMPILER_FLAG _FLAG _RESULT)
- SET(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
- SET(CMAKE_REQUIRED_FLAGS "${_FLAG}")
- CHECK_C_SOURCE_COMPILES("int main(void) { return 0; }" ${_RESULT}
- # Some compilers do not fail with a bad flag
- FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU
- FAIL_REGEX "unrecognized .*option" # GNU
- FAIL_REGEX "unknown .*option" # Clang
- FAIL_REGEX "ignoring unknown option" # MSVC
- FAIL_REGEX "warning D9002" # MSVC, any lang
- FAIL_REGEX "option.*not supported" # Intel
- FAIL_REGEX "invalid argument .*option" # Intel
- FAIL_REGEX "ignoring option .*argument required" # Intel
- FAIL_REGEX "[Uu]nknown option" # HP
- FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro
- FAIL_REGEX "command option .* is not recognized" # XL
- FAIL_REGEX "command option .* contains an incorrect subargument" # XL
- FAIL_REGEX "not supported in this configuration. ignored" # AIX
- FAIL_REGEX "File with unknown suffix passed to linker" # PGI
- FAIL_REGEX "WARNING: unknown flag:" # Open64
- FAIL_REGEX "Incorrect command line option:" # Borland
- FAIL_REGEX "Warning: illegal option" # SunStudio 12
- FAIL_REGEX "[Ww]arning: Invalid" # Fujitsu
- )
- SET (CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
-ENDMACRO (CHECK_C_COMPILER_FLAG)
+++ /dev/null
-# - Check whether the CXX compiler supports a given flag.
-# CHECK_CXX_COMPILER_FLAG(<flag> <var>)
-# <flag> - the compiler flag
-# <var> - variable to store the result
-# This internally calls the check_cxx_source_compiles macro. See help
-# for CheckCXXSourceCompiles for a listing of variables that can
-# modify the build.
-
-#=============================================================================
-# Copyright 2006-2010 Kitware, Inc.
-# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
-# Copyright 2011 Matthias Kretz <kretz@kde.org>
-#
-# ORIGINAL Copyright notice (from Copyright.txt):
-#
-# CMake - Cross Platform Makefile Generator
-# Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# * Neither the names of Kitware, Inc., the Insight Software Consortium,
-# nor the names of their contributors may be used to endorse or promote
-# products derived from this software without specific prior written
-# permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-INCLUDE(CheckCXXSourceCompiles)
-
-MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT)
- SET(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
- SET(CMAKE_REQUIRED_FLAGS "${_FLAG}")
- CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT}
- # Some compilers do not fail with a bad flag
- FAIL_REGEX "command line option .* is valid for .* but not for C\\\\+\\\\+" # GNU
- FAIL_REGEX "unrecognized .*option" # GNU
- FAIL_REGEX "unknown .*option" # Clang
- FAIL_REGEX "ignoring unknown option" # MSVC
- FAIL_REGEX "warning D9002" # MSVC, any lang
- FAIL_REGEX "option.*not supported" # Intel
- FAIL_REGEX "invalid argument .*option" # Intel
- FAIL_REGEX "ignoring option .*argument required" # Intel
- FAIL_REGEX "ignoring option .*argument is of wrong type" # Intel
- FAIL_REGEX "[Uu]nknown option" # HP
- FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro
- FAIL_REGEX "command option .* is not recognized" # XL
- FAIL_REGEX "command option .* contains an incorrect subargument" # XL
- FAIL_REGEX "not supported in this configuration. ignored" # AIX
- FAIL_REGEX "File with unknown suffix passed to linker" # PGI
- FAIL_REGEX "WARNING: unknown flag:" # Open64
- FAIL_REGEX "Incorrect command line option:" # Borland
- FAIL_REGEX "Warning: illegal option" # SunStudio 12
- FAIL_REGEX "[Ww]arning: Invalid" # Fujitsu
- )
- SET (CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
-ENDMACRO (CHECK_CXX_COMPILER_FLAG)
-
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2016,2018, by the GROMACS development team, led by
+# Copyright (c) 2016,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
# We should do OpenMP detection if we get here
# OpenMP check must come before other CFLAGS!
find_package(OpenMP)
- if(OPENMP_FOUND)
- # CMake on Windows doesn't support linker flags passed to target_link_libraries
- # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
- if(NOT (WIN32 AND NOT MINGW))
- if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
- set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
- set(OpenMP_SHARED_LINKER_FLAGS "")
- else()
- # Only set a linker flag if the user didn't set them manually
- if(NOT DEFINED OpenMP_LINKER_FLAGS)
- set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
- endif()
- if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
- set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
- endif()
- endif()
- endif()
- if(MINGW)
- #GCC Bug 48659
- set(OpenMP_C_FLAGS "${OpenMP_C_FLAGS} -mstackrealign")
- endif()
- else()
+ if(NOT OPENMP_FOUND)
message(WARNING
"The compiler you are using does not support OpenMP parallelism. This might hurt your performance a lot, in particular with GPUs. Try using a more recent version, or a different compiler. For now, we are proceeding by turning off OpenMP.")
set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
# GROMACS 2016 2
# GROMACS 2018 3
# GROMACS 2019 4
+# GROMACS 2020 5
# LIBRARY_SOVERSION_MINOR so minor version for the built libraries.
# Should be increased for each release that changes only the implementation.
# In GROMACS, the typical policy is to increase it for each patch version
# The GROMACS convention is that these are the version number of the next
# release that is going to be made from this branch.
-set(GMX_VERSION_MAJOR 2019)
-set(GMX_VERSION_PATCH 1)
+set(GMX_VERSION_MAJOR 2020)
+set(GMX_VERSION_PATCH 0)
# The suffix, on the other hand, is used mainly for betas and release
# candidates, where it signifies the most recent such release from
# this branch; it will be empty before the first such release, as well
# here. The important thing is to minimize the chance of third-party
# code being able to dynamically link with a version of libgromacs
# that might not work.
-set(LIBRARY_SOVERSION_MAJOR 4)
+set(LIBRARY_SOVERSION_MAJOR 5)
set(LIBRARY_SOVERSION_MINOR 0)
set(LIBRARY_VERSION ${LIBRARY_SOVERSION_MAJOR}.${LIBRARY_SOVERSION_MINOR}.0)
endif()
set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
-set(REGRESSIONTEST_BRANCH "refs/heads/release-2019")
+set(REGRESSIONTEST_BRANCH "refs/heads/master")
# Run the regressiontests packaging job with the correct pakage
# version string, and the release box checked, in order to have it
# build the regressiontests tarball with all the right naming. The
# naming affects the md5sum that has to go here, and if it isn't right
# release workflow will report a failure.
-set(REGRESSIONTEST_MD5SUM "1271a74bfe91028b7f184866d5aee98e" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
+set(REGRESSIONTEST_MD5SUM "3d06d41e07f523d70ae575b9ad75c670" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
math(EXPR GMX_VERSION_NUMERIC
"${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
how-to/visualize.rst
install-guide/index.rst
release-notes/index.rst
+ release-notes/highlights.rst
+ release-notes/features.rst
+ release-notes/performance.rst
+ release-notes/tools.rst
+ release-notes/bugs-fixed.rst
+ release-notes/removed-functionality.rst
+ release-notes/deprecated-functionality.rst
+ release-notes/portability.rst
+ release-notes/miscellaneous.rst
release-notes/2019/2019.1.rst
release-notes/2019/major/highlights.rst
release-notes/2019/major/features.rst
add_custom_target(install-guide
COMMAND
${SPHINX_EXECUTABLE}
- -q -E -b text
+ -q -b text
-w sphinx-install.log
-d ${CMAKE_CURRENT_BINARY_DIR}/install-guide/_doctrees
-c ${SPHINX_INPUT_DIR}
add_custom_target(webpage-sphinx
DEPENDS sphinx-programs
DEPENDS sphinx-input
- DEPENDS sphinx-image-conversion
+ DEPENDS sphinx-image-conversion
+ DEPENDS manual
COMMAND
${CMAKE_COMMAND} -E make_directory ${SPHINX_INPUT_DIR}/_static
COMMAND
${SPHINX_EXECUTABLE}
- -q -E -b html
+ -q -b html
-w sphinx-html.log
-d "${SPHINX_CACHE_DIR}"
"${SPHINX_INPUT_DIR}"
add_custom_target(man
COMMAND
${SPHINX_EXECUTABLE}
- -q -E -b man
+ -q -b man
-w sphinx-man.log
-d ${SPHINX_CACHE_DIR}
-t do_man
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
DEPENDS sphinx-programs sphinx-input
COMMAND
${SPHINX_EXECUTABLE}
- -q -E -b latex
+ -q -b latex
-w sphinx-latex.log
-d "${SPHINX_CACHE_DIR}"
"${SPHINX_INPUT_DIR}"
-.. _anticipated-changes:
-
Changes anticipated to GROMACS 2019 functionality
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--- /dev/null
+Removed functionality
+^^^^^^^^^^^^^^^^^^^^^
+
+gmx anadock
+"""""""""""
+The gmx anadock tool was removed since it does not belong in gromacs
+(it analyzes AutoDock outputs).
+
+gmx dyndom
+""""""""""
+The gmx dyndom tool was removed since it does not belong in gromacs
+(it analyzes DynDom outputs).
+
+gmx morph
+"""""""""
+The gmx morph tool was removed since it yields non-physical structures
+that can easily be done by a script.
--- /dev/null
+Bugs fixed
+^^^^^^^^^^
--- /dev/null
+.. _anticipated-changes:
+
+Changes anticipated to |Gromacs| NEXT functionality
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Functionality deprecated in |Gromacs| NEXT
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Functionality deprecated in |Gromacs| 2019
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Generation of virtual sites to replace aromatic rings in standard residues
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+These are thought to produce artefacts under some circumstances
+(unpublished results), were never well tested, are not widely used,
+and we need to simplify pdb2gmx.
+
+``gmx mdrun -gcom``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+This feature sometimes overrides the effects of various .mdp settings
+in a way that is difficult to understand and report. A user who wants
+to do communication between PP ranks less often should choose their
+``nst*`` mdp options accordingly.
+
+Benchmarking options only available with ``gmx benchmark``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+Options such as ``-confout``, ``-resethway``, ``-resetstep`` are not
+intended for use by regular mdrun users, so making them only available
+with a dedicated tool is more clear. Also, this permits us to customize
+defaults for e.g. writing files at the end of a simulation part in ways
+that suit the respective mdrun and benchmark use cases, so ``-confout``
+will no longer be required.
+
+``gmx mdrun -nsteps``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+The number of simulation steps described by the .tpr file can be
+changed with ``gmx convert-tpr``, or altered in .mdp file before the
+call to ``gmx grompp``. The convenience of this mdrun option was
+outweighted by the doubtful quality of its implementation, no clear
+record in the log file, and lack of maintenance.
+
+Functionality deprecated before |Gromacs| 2019
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+This functionality has been declared as deprecated in previous versions
+of |Gromacs|, but has not yet been removed.
+
+The group cutoff scheme
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+All remaining aspects of the group cutoff scheme will be removed, once
+a few remaining features (e.g. tabulated interactions, energy-group
+exclusions, and vacuum simulations) are available with the Verlet
+scheme. Deprecated in GROMACS 5.1
--- /dev/null
+New and improved features
+^^^^^^^^^^^^^^^^^^^^^^^^^
--- /dev/null
+Highlights
+^^^^^^^^^^
+
+|Gromacs| NEXT was released on INSERT DATE HERE. Patch releases may
+have been made since then, please use the updated versions! Here are
+some highlights of what you can expect, along with more detail in the
+links below!
+
+As always, we've got several useful performance improvements, with or
+without GPUs, all enabled and automated by default. We are extremely
+interested in your feedback on how well this worked on your
+simulations and hardware. They are:
+
+* Cool quotes autogenerator
functionality supported, whereas patch releases contain only fixes for
issues identified in the corresponding major releases.
-Two versions of |Gromacs| are under active maintenance, the 2019
-series and the 2018 series. In the latter, only highly conservative
+Two versions of |Gromacs| are under active maintenance, the NEXT
+series and the 2019 series. In the latter, only highly conservative
fixes will be made, and only to address issues that affect scientific
correctness. Naturally, some of those releases will be made after the
-year 2018 ends, but we keep 2018 in the name so users understand how
+year 2019 ends, but we keep 2018 in the name so users understand how
up to date their version is. Such fixes will also be incorporated into
-the 2019 release series, as appropriate. Around the time the 2020
-release is made, the 2018 series will no longer be maintained.
+the NEXT release series, as appropriate. Around the time the NEXT+1
+release is made, the 2019 series will no longer be maintained.
Where issue numbers are reported in these release notes, more details
can be found at https://redmine.gromacs.org at that issue number.
+|Gromacs| NEXT series
+---------------------
+
+.. toctree::
+ :maxdepth: 1
+
+ highlights
+ features
+ performance
+ tools
+ bugs-fixed
+ deprecated-functionality
+ removed-functionality
+ portability
+ miscellaneous
+
+
|Gromacs| 2019 series
---------------------
--- /dev/null
+Miscellaneous
+^^^^^^^^^^^^^
+
+grompp now warns if macros in mdp "define" field are unused in topology
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+Macros defined in the mdp (with e.g. -DPOSRES) now cause a warning
+in grompp if they are not encountered while parsing the topology file
+
+:issue:`1975`
--- /dev/null
+Performance improvements
+^^^^^^^^^^^^^^^^^^^^^^^^
--- /dev/null
+Portability
+^^^^^^^^^^^
--- /dev/null
+Removed functionality
+^^^^^^^^^^^^^^^^^^^^^
--- /dev/null
+Improvements to |Gromacs| tools
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
``GMX_NOOPTIMIZEDKERNELS``
deprecated, use ``GMX_DISABLE_SIMD_KERNELS`` instead.
-``GMX_NO_ALLVSALL``
- disables optimized all-vs-all kernels.
-
``GMX_NO_CART_REORDER``
used in initializing domain decomposition communicators. Rank reordering
is default, but can be switched off with this environment variable.
integrators, the leap-frog :mdp-value:`integrator=md` integrator
only supports 1. Data for the NH chain variables is not printed
to the :ref:`edr` file by default, but can be turned on with the
- :mdp:`print-nose-hoover-chains` option.
+ :mdp:`print-nose-hoover-chain-variables` option.
.. mdp:: print-nose-hoover-chain-variables
E(t) = E0 exp ( -(t-t0)\ :sup:`2`/(2 sigma\ :sup:`2`) ) cos(omega (t-t0))
For example, the four parameters for direction x are set in the
- three fields of :mdp:`electric-field-x` (and similar for y and z)
+ three fields of ``electric-field-x`` (and similar for y and z)
like
electric-field-x = E0 omega t0 sigma
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
if(NOT CLANG_TIDY_EXE)
message(FATAL_ERROR "clang-tidy not found.")
endif()
- if(CMAKE_VERSION VERSION_LESS "3.6")
- message(FATAL_ERROR "clang-tidy support requires cmake 3.6.")
- endif()
endif()
#####
# release string. For roadmap details, see https://redmine.gromacs.org/issues/2585
set(GMXAPI_MAJOR 0)
set(GMXAPI_MINOR 0)
-set(GMXAPI_PATCH 7)
+set(GMXAPI_PATCH 8)
set(GMXAPI_RELEASE ${GMXAPI_MAJOR}.${GMXAPI_MINOR}.${GMXAPI_PATCH})
###############################
* a microstate for gmxapi interfaces.
*/
- // Note: these output options normalize the file names, but not their
- // paths. gmxapi 0.0.7 changes working directory for each session, so the
- // relative paths are appropriate, but a near-future version will avoid
- // changing directories once the process starts and manage file paths explicitly.
- using gmxapi::c_majorVersion;
- using gmxapi::c_minorVersion;
- using gmxapi::c_patchVersion;
- static_assert(!(c_majorVersion != 0 || c_minorVersion != 0 || c_patchVersion > 7),
- "Developer notice: check assumptions about working directory and relative file paths for this "
- "software version.");
-
// Set input TPR name
mdArgs_.emplace_back("-s");
mdArgs_.emplace_back(filename);
+
// Set checkpoint file name
mdArgs_.emplace_back("-cpi");
mdArgs_.emplace_back("state.cpt");
+ /* Note: we normalize the checkpoint file name, but not its full path.
+ * Through version 0.0.8, gmxapi clients change working directory
+ * for each session, so relative path(s) below are appropriate.
+ * A future gmxapi version should avoid changing directories once the
+ * process starts and instead manage files (paths) in an absolute and
+ * immutable way, with abstraction provided through the Context chain-of-responsibility.
+ * TODO: API abstractions for initializing simulations that may be new or partially complete.
+ * Reference gmxapi milestone 13 at https://redmine.gromacs.org/issues/2585
+ */
// Create a mock argv. Note that argv[0] is expected to hold the program name.
const int offset = 1;
gmx::LogFilePtr logFilehandle,
gmx_multisim_t * multiSim)
{
- using gmx::compat::make_unique;
// We should be able to get a communicator (or subcommunicator) through the
// Context.
- std::unique_ptr<SessionImpl> impl = make_unique<SessionImpl>(std::move(context),
- std::move(runnerBuilder),
- simulationContext,
- std::move(logFilehandle),
- multiSim);
- return impl;
+ return gmx::compat::make_unique<SessionImpl>(std::move(context),
+ std::move(runnerBuilder),
+ simulationContext,
+ std::move(logFilehandle),
+ multiSim);
}
SessionImpl::SessionImpl(std::shared_ptr<ContextImpl> context,
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2018, by the GROMACS development team, led by
+# Copyright (c) 2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2018, by the GROMACS development team, led by
+# Copyright (c) 2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
"Expected MD5 hash for the file at GMX_BUILD_OWN_FFTW_URL")
mark_as_advanced(GMX_BUILD_OWN_FFTW_URL GMX_BUILD_OWN_FFTW_MD5)
-# ExternalProject at least up to CMake 3.0 prints a confusing error message if
-# download fails when MD5 verification is enabled. So we manage the download
-# ourselves so that MD5 sum is not verified there, and then pass a local file
-# as the URL to ExternalProject. This way, ExternalProject still verifies the
-# MD5 sum with a proper message if that fails.
-# TODO remove this when we require CMake 3.5+
-set(url "${GMX_BUILD_OWN_FFTW_URL}")
-# Determine whether we are actually downloading (this matches the conditions in
-# ExternalProject). ExternalProject works as expected if passed a local file.
-set(is_download TRUE)
-if (IS_DIRECTORY "${url}" OR "${url}" MATCHES "^file://" OR NOT "${url}" MATCHES "^[a-z]+://")
- set(is_download FALSE)
-endif()
-if (is_download)
- # For simplicity, don't try to extract the file name from the URL, but use
- # a hard-coded value.
- set(remote_url "${GMX_BUILD_OWN_FFTW_URL}")
- set(local_path "${CMAKE_CURRENT_BINARY_DIR}/fftw.tar.gz")
- set(url ${local_path})
- # Write a script to do our own download step (mimics what ExternalProject
- # would do, but without MD5 sum verification at this step).
- set(download_script ${CMAKE_CURRENT_BINARY_DIR}/fftw-download.cmake)
- configure_file(fftw-download.cmake.cmakein ${download_script} @ONLY)
-endif()
-
# The actual build target.
set(EXTERNAL_FFTW_BUILD_TARGET fftwBuild)
include(ExternalProject)
ExternalProject_add(${EXTERNAL_FFTW_BUILD_TARGET}
- URL "${url}" URL_MD5 ${GMX_BUILD_OWN_FFTW_MD5}
+ URL "${GMX_BUILD_OWN_FFTW_URL}"
+ URL_MD5 ${GMX_BUILD_OWN_FFTW_MD5}
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --libdir=<INSTALL_DIR>/lib --disable-fortran
${GMX_BUILD_OWN_FFTW_SHARED_FLAG} ${GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION}
${GMX_BUILD_OWN_FFTW_PREC}
${GMX_BUILD_OWN_FFTW_TARGET_HOST})
-# Add a custom step to do our own download if that is necessary.
-if (is_download)
- ExternalProject_add_step(${EXTERNAL_FFTW_BUILD_TARGET} pre-download
- COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/fftw-download.cmake
- DEPENDERS download)
-endif()
-
ExternalProject_get_property(${EXTERNAL_FFTW_BUILD_TARGET} INSTALL_DIR)
string(REGEX REPLACE "fftw" "fftw3" FFTW_LIBNAME ${LOWERFFTW})
+++ /dev/null
-# Custom download script for Gromacs external FFTW build.
-
-# Mimics a similar script generated by CMake ExternalProject package, but
-# does not verify the MD5 sum (which would give confusing error messages if the
-# download fails).
-message(STATUS "downloading...
- src='@remote_url@'
- dest='@local_path@'")
-file(DOWNLOAD "@remote_url@" "@local_path@"
- SHOW_PROGRESS STATUS status LOG log)
-list(GET status 0 status_code)
-list(GET status 1 status_string)
-if (NOT status_code EQUAL 0)
- message(FATAL_ERROR "error: downloading '@remote_url@' failed
- status_code: ${status_code}
- status_string: ${status_string}
- log: ${log}")
-endif()
-message(STATUS "downloading... done")
add_subdirectory(math)
add_subdirectory(mdrun)
add_subdirectory(mdrunutility)
+add_subdirectory(mdspan)
add_subdirectory(mdtypes)
add_subdirectory(onlinehelp)
add_subdirectory(options)
PUBLIC
${GMX_PUBLIC_LIBRARIES}
)
+if (GMX_OPENMP)
+ target_link_libraries(libgromacs PUBLIC OpenMP::OpenMP_CXX)
+endif()
set_target_properties(libgromacs PROPERTIES
OUTPUT_NAME "gromacs${GMX_LIBS_SUFFIX}"
SOVERSION ${LIBRARY_SOVERSION_MAJOR}
VERSION ${LIBRARY_VERSION}
- COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+ )
gmx_manage_lmfit()
target_link_libraries(libgromacs PRIVATE lmfit)
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2005,2006,2007,2008,2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2005 - 2014, The GROMACS development team.
+ * Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
void dd_make_local_cgs(struct gmx_domdec_t *dd, t_block *lcgs);
/*! \brief Generate the local topology and virtual site data */
-void dd_make_local_top(struct gmx_domdec_t *dd, struct gmx_domdec_zones_t *zones,
- int npbcdim, matrix box,
- rvec cellsize_min, const ivec npulse,
- t_forcerec *fr,
- rvec *cgcm_or_x,
- gmx_vsite_t *vsite,
- const gmx_mtop_t *top, gmx_localtop_t *ltop);
+void dd_make_local_top(struct gmx_domdec_t *dd,
+ struct gmx_domdec_zones_t *zones,
+ int npbcdim,
+ matrix box,
+ rvec cellsize_min,
+ const ivec npulse,
+ t_forcerec *fr,
+ rvec *cgcm_or_x,
+ gmx_vsite_t *vsite,
+ const gmx_mtop_t &top,
+ gmx_localtop_t *ltop);
/*! \brief Sort ltop->ilist when we are doing free energy. */
void dd_sort_local_top(gmx_domdec_t *dd, const t_mdatoms *mdatoms,
gmx_localtop_t *ltop);
-/*! \brief Construct local topology */
-gmx_localtop_t *dd_init_local_top(const gmx_mtop_t *top_global);
+/*! \brief Initialize local topology
+ *
+ * \param[in] top_global Reference to global topology.
+ * \param[in,out] top Pointer to new local topology
+ */
+void dd_init_local_top(const gmx_mtop_t &top_global,
+ gmx_localtop_t *top);
/*! \brief Construct local state */
void dd_init_local_state(struct gmx_domdec_t *dd,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2006 - 2014, The GROMACS development team.
+ * Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
t_forcerec *fr,
rvec *cgcm_or_x,
gmx_vsite_t *vsite,
- const gmx_mtop_t *mtop, gmx_localtop_t *ltop)
+ const gmx_mtop_t &mtop, gmx_localtop_t *ltop)
{
gmx_bool bRCheckMB, bRCheck2B;
real rc = -1;
}
dd->nbonded_local =
- make_local_bondeds_excls(dd, zones, mtop, fr->cginfo,
+ make_local_bondeds_excls(dd, zones, &mtop, fr->cginfo,
bRCheckMB, rcheck, bRCheck2B, rc,
dd->localAtomGroupFromAtom.data(),
pbc_null, cgcm_or_x,
dd->nbonded_local += nexcl;
}
- ltop->atomtypes = mtop->atomtypes;
+ ltop->atomtypes = mtop.atomtypes;
}
void dd_sort_local_top(gmx_domdec_t *dd, const t_mdatoms *mdatoms,
}
}
-gmx_localtop_t *dd_init_local_top(const gmx_mtop_t *top_global)
+void dd_init_local_top(const gmx_mtop_t &top_global,
+ gmx_localtop_t *top)
{
- gmx_localtop_t *top;
-
- snew(top, 1);
-
/* TODO: Get rid of the const casts below, e.g. by using a reference */
- top->idef.ntypes = top_global->ffparams.numTypes();
- top->idef.atnr = top_global->ffparams.atnr;
- top->idef.functype = const_cast<t_functype *>(top_global->ffparams.functype.data());
- top->idef.iparams = const_cast<t_iparams *>(top_global->ffparams.iparams.data());
- top->idef.fudgeQQ = top_global->ffparams.fudgeQQ;
+ top->idef.ntypes = top_global.ffparams.numTypes();
+ top->idef.atnr = top_global.ffparams.atnr;
+ top->idef.functype = const_cast<t_functype *>(top_global.ffparams.functype.data());
+ top->idef.iparams = const_cast<t_iparams *>(top_global.ffparams.iparams.data());
+ top->idef.fudgeQQ = top_global.ffparams.fudgeQQ;
top->idef.cmap_grid = new gmx_cmap_t;
- *top->idef.cmap_grid = top_global->ffparams.cmap_grid;
-
- top->idef.ilsort = ilsortUNKNOWN;
+ *top->idef.cmap_grid = top_global.ffparams.cmap_grid;
- return top;
+ top->idef.ilsort = ilsortUNKNOWN;
+ top->useInDomainDecomp_ = true;
}
void dd_init_local_state(gmx_domdec_t *dd,
gmx_bool bMasterState,
int nstglobalcomm,
t_state *state_global,
- const gmx_mtop_t *top_global,
+ const gmx_mtop_t &top_global,
const t_inputrec *ir,
t_state *state_local,
PaddedVector<gmx::RVec> *f,
true, xGlobal,
&ddbox);
- distributeState(mdlog, dd, *top_global, state_global, ddbox, state_local, f);
+ distributeState(mdlog, dd, top_global, state_global, ddbox, state_local, f);
dd_make_local_cgs(dd, &top_local->cgs);
if (dd->splitConstraints || dd->splitSettles)
{
/* Only for inter-cg constraints we need special code */
- n = dd_make_local_constraints(dd, n, top_global, fr->cginfo,
+ n = dd_make_local_constraints(dd, n, &top_global, fr->cginfo,
constr, ir->nProjOrder,
top_local->idef.il);
}
if (comm->nstDDDump > 0 && step % comm->nstDDDump == 0)
{
dd_move_x(dd, state_local->box, state_local->x, nullWallcycle);
- write_dd_pdb("dd_dump", step, "dump", top_global, cr,
+ write_dd_pdb("dd_dump", step, "dump", &top_global, cr,
-1, state_local->x.rvec_array(), state_local->box);
}
if (comm->DD_debug > 0)
{
/* Set the env var GMX_DD_DEBUG if you suspect corrupted indices */
- check_index_consistency(dd, top_global->natoms, ncg_mtop(top_global),
+ check_index_consistency(dd, top_global.natoms, ncg_mtop(&top_global),
"after partitioning");
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
gmx_bool bMasterState,
int nstglobalcomm,
t_state *state_global,
- const gmx_mtop_t *top_global,
+ const gmx_mtop_t &top_global,
const t_inputrec *ir,
t_state *state_local,
PaddedVector<gmx::RVec> *f,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
struct PmeGpuStaging
{
//! Host-side force buffer
- gmx::HostVector<gmx::RVec> h_forces;
+ gmx::PaddedHostVector<gmx::RVec> h_forces;
/*! \brief Virial and energy intermediate host-side buffer. Size is PME_GPU_VIRIAL_AND_ENERGY_COUNT. */
float *h_virialAndEnergy;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{ "no", "box size", "domain decompostion", "PME grid restriction", "maximum allowed grid scaling" };
struct pme_load_balancing_t {
- gmx_bool bSepPMERanks; /**< do we have separate PME ranks? */
- gmx_bool bActive; /**< is PME tuning active? */
- int64_t step_rel_stop; /**< stop the tuning after this value of step_rel */
- gmx_bool bTriggerOnDLB; /**< trigger balancing only on DD DLB */
- gmx_bool bBalance; /**< are we in the balancing phase, i.e. trying different setups? */
- int nstage; /**< the current maximum number of stages */
-
- real cut_spacing; /**< the minimum cutoff / PME grid spacing ratio */
- real rcut_vdw; /**< Vdw cutoff (does not change) */
- real rcut_coulomb_start; /**< Initial electrostatics cutoff */
- real rbufOuter_coulomb; /**< the outer pairlist buffer size */
- real rbufOuter_vdw; /**< the outer pairlist buffer size */
- real rbufInner_coulomb; /**< the inner pairlist buffer size */
- real rbufInner_vdw; /**< the inner pairlist buffer size */
- matrix box_start; /**< the initial simulation box */
- int n; /**< the count of setup as well as the allocation size */
- pme_setup_t *setup; /**< the PME+cutoff setups */
- int cur; /**< the inex (in setup) of the current setup */
- int fastest; /**< index of the fastest setup up till now */
- int lower_limit; /**< don't go below this setup index */
- int start; /**< start of setup index range to consider in stage>0 */
- int end; /**< end of setup index range to consider in stage>0 */
- int elimited; /**< was the balancing limited, uses enum above */
- int cutoff_scheme; /**< Verlet or group cut-offs */
-
- int stage; /**< the current stage */
-
- int cycles_n; /**< step cycle counter cummulative count */
- double cycles_c; /**< step cycle counter cummulative cycles */
+ gmx_bool bSepPMERanks; /**< do we have separate PME ranks? */
+ gmx_bool bActive; /**< is PME tuning active? */
+ int64_t step_rel_stop; /**< stop the tuning after this value of step_rel */
+ gmx_bool bTriggerOnDLB; /**< trigger balancing only on DD DLB */
+ gmx_bool bBalance; /**< are we in the balancing phase, i.e. trying different setups? */
+ int nstage; /**< the current maximum number of stages */
+
+ real cut_spacing; /**< the minimum cutoff / PME grid spacing ratio */
+ real rcut_vdw; /**< Vdw cutoff (does not change) */
+ real rcut_coulomb_start; /**< Initial electrostatics cutoff */
+ real rbufOuter_coulomb; /**< the outer pairlist buffer size */
+ real rbufOuter_vdw; /**< the outer pairlist buffer size */
+ real rbufInner_coulomb; /**< the inner pairlist buffer size */
+ real rbufInner_vdw; /**< the inner pairlist buffer size */
+ matrix box_start; /**< the initial simulation box */
+ std::vector<pme_setup_t> setup; /**< the PME+cutoff setups */
+ int cur; /**< the index (in setup) of the current setup */
+ int fastest; /**< index of the fastest setup up till now */
+ int lower_limit; /**< don't go below this setup index */
+ int start; /**< start of setup index range to consider in stage>0 */
+ int end; /**< end of setup index range to consider in stage>0 */
+ int elimited; /**< was the balancing limited, uses enum above */
+ int cutoff_scheme; /**< Verlet or group cut-offs */
+
+ int stage; /**< the current stage */
+
+ int cycles_n; /**< step cycle counter cummulative count */
+ double cycles_c; /**< step cycle counter cummulative cycles */
};
/* TODO The code in this file should call this getter, rather than
return pme_lb != nullptr && pme_lb->bActive;
}
+// TODO Return a unique_ptr to pme_load_balancing_t
void pme_loadbal_init(pme_load_balancing_t **pme_lb_p,
t_commrec *cr,
const gmx::MDLogger &mdlog,
// This is checked by grompp, but it doesn't hurt to check again.
GMX_RELEASE_ASSERT(!(EEL_PME(ir.coulombtype) && EVDW_PME(ir.vdwtype) && ir.rcoulomb != ir.rvdw), "With Coulomb and LJ PME, rcoulomb should be equal to rvdw");
- snew(pme_lb, 1);
+ pme_lb = new pme_load_balancing_t;
pme_lb->bSepPMERanks = !thisRankHasDuty(cr, DUTY_PME);
EwaldBoxZScaler boxScaler(ir);
boxScaler.scaleBox(box, pme_lb->box_start);
- pme_lb->n = 1;
- snew(pme_lb->setup, pme_lb->n);
+ pme_lb->setup.resize(1);
pme_lb->rcut_vdw = ic.rvdw;
pme_lb->rcut_coulomb_start = ir.rcoulomb;
int pme_order,
const gmx_domdec_t *dd)
{
- pme_setup_t *set;
real fac, sp;
real tmpr_coulomb, tmpr_vdw;
int d;
bool grid_ok;
/* Try to add a new setup with next larger cut-off to the list */
- pme_lb->n++;
- srenew(pme_lb->setup, pme_lb->n);
- set = &pme_lb->setup[pme_lb->n-1];
- set->pmedata = nullptr;
+ pme_setup_t set;
+
+ set.pmedata = nullptr;
NumPmeDomains numPmeDomains = getNumPmeDomains(dd);
*/
if (fac > 2.1)
{
- pme_lb->n--;
-
return FALSE;
}
fac *= 1.01;
- clear_ivec(set->grid);
+ clear_ivec(set.grid);
sp = calcFftGrid(nullptr, pme_lb->box_start,
fac*pme_lb->setup[pme_lb->cur].spacing,
minimalPmeGridSize(pme_order),
- &set->grid[XX],
- &set->grid[YY],
- &set->grid[ZZ]);
+ &set.grid[XX],
+ &set.grid[YY],
+ &set.grid[ZZ]);
/* As here we can't easily check if one of the PME ranks
* uses threading, we do a conservative grid check.
* per PME rank along x, which is not a strong restriction.
*/
grid_ok = gmx_pme_check_restrictions(pme_order,
- set->grid[XX], set->grid[YY], set->grid[ZZ],
+ set.grid[XX], set.grid[YY], set.grid[ZZ],
numPmeDomains.x,
true,
false);
}
while (sp <= 1.001*pme_lb->setup[pme_lb->cur].spacing || !grid_ok);
- set->rcut_coulomb = pme_lb->cut_spacing*sp;
- if (set->rcut_coulomb < pme_lb->rcut_coulomb_start)
+ set.rcut_coulomb = pme_lb->cut_spacing*sp;
+ if (set.rcut_coulomb < pme_lb->rcut_coulomb_start)
{
/* This is unlikely, but can happen when e.g. continuing from
* a checkpoint after equilibration where the box shrank a lot.
* We want to avoid rcoulomb getting smaller than rvdw
* and there might be more issues with decreasing rcoulomb.
*/
- set->rcut_coulomb = pme_lb->rcut_coulomb_start;
+ set.rcut_coulomb = pme_lb->rcut_coulomb_start;
}
if (pme_lb->cutoff_scheme == ecutsVERLET)
{
/* Never decrease the Coulomb and VdW list buffers */
- set->rlistOuter = std::max(set->rcut_coulomb + pme_lb->rbufOuter_coulomb,
- pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw);
- set->rlistInner = std::max(set->rcut_coulomb + pme_lb->rbufInner_coulomb,
- pme_lb->rcut_vdw + pme_lb->rbufInner_vdw);
+ set.rlistOuter = std::max(set.rcut_coulomb + pme_lb->rbufOuter_coulomb,
+ pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw);
+ set.rlistInner = std::max(set.rcut_coulomb + pme_lb->rbufInner_coulomb,
+ pme_lb->rcut_vdw + pme_lb->rbufInner_vdw);
}
else
{
/* TODO Remove these lines and pme_lb->cutoff_scheme */
- tmpr_coulomb = set->rcut_coulomb + pme_lb->rbufOuter_coulomb;
+ tmpr_coulomb = set.rcut_coulomb + pme_lb->rbufOuter_coulomb;
tmpr_vdw = pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw;
/* Two (known) bugs with cutoff-scheme=group here:
* - This modification of rlist results in incorrect DD comunication.
* - We should set fr->bTwinRange = (fr->rlistlong > fr->rlist).
*/
- set->rlistOuter = std::min(tmpr_coulomb, tmpr_vdw);
- set->rlistInner = set->rlistOuter;
+ set.rlistOuter = std::min(tmpr_coulomb, tmpr_vdw);
+ set.rlistInner = set.rlistOuter;
}
- set->spacing = sp;
+ set.spacing = sp;
/* The grid efficiency is the size wrt a grid with uniform x/y/z spacing */
- set->grid_efficiency = 1;
+ set.grid_efficiency = 1;
for (d = 0; d < DIM; d++)
{
- set->grid_efficiency *= (set->grid[d]*sp)/norm(pme_lb->box_start[d]);
+ set.grid_efficiency *= (set.grid[d]*sp)/norm(pme_lb->box_start[d]);
}
/* The Ewald coefficient is inversly proportional to the cut-off */
- set->ewaldcoeff_q =
- pme_lb->setup[0].ewaldcoeff_q*pme_lb->setup[0].rcut_coulomb/set->rcut_coulomb;
+ set.ewaldcoeff_q =
+ pme_lb->setup[0].ewaldcoeff_q*pme_lb->setup[0].rcut_coulomb/set.rcut_coulomb;
/* We set ewaldcoeff_lj in set, even when LJ-PME is not used */
- set->ewaldcoeff_lj =
- pme_lb->setup[0].ewaldcoeff_lj*pme_lb->setup[0].rcut_coulomb/set->rcut_coulomb;
+ set.ewaldcoeff_lj =
+ pme_lb->setup[0].ewaldcoeff_lj*pme_lb->setup[0].rcut_coulomb/set.rcut_coulomb;
- set->count = 0;
- set->cycles = 0;
+ set.count = 0;
+ set.cycles = 0;
if (debug)
{
fprintf(debug, "PME loadbal: grid %d %d %d, coulomb cutoff %f\n",
- set->grid[XX], set->grid[YY], set->grid[ZZ], set->rcut_coulomb);
+ set.grid[XX], set.grid[YY], set.grid[ZZ], set.rcut_coulomb);
}
+ pme_lb->setup.push_back(set);
return TRUE;
}
}
else
{
- return pme_lb->n;
+ return pme_lb->setup.size();
}
}
* maxRelativeSlowdownAccepted times the fastest setup.
*/
pme_lb->start = pme_lb->lower_limit;
- while (pme_lb->start + 1 < pme_lb->n &&
+ while (pme_lb->start + 1 < static_cast<int>(pme_lb->setup.size()) &&
(pme_lb->setup[pme_lb->start].count == 0 ||
pme_lb->setup[pme_lb->start].cycles >
pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted))
}
/* Decrease end only with setups that we timed and that are slow. */
- pme_lb->end = pme_lb->n;
+ pme_lb->end = pme_lb->setup.size();
if (pme_lb->setup[pme_lb->end - 1].count > 0 &&
pme_lb->setup[pme_lb->end - 1].cycles >
pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted)
if (pme_lb->stage == 0 && pme_lb->cur > 0 &&
cycles > pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted)
{
- pme_lb->n = pme_lb->cur + 1;
+ pme_lb->setup.resize(pme_lb->cur + 1);
/* Done with scanning, go to stage 1 */
switch_to_stage1(pme_lb);
}
do
{
- if (pme_lb->cur+1 < pme_lb->n)
+ if (pme_lb->cur+1 < static_cast<int>(pme_lb->setup.size()))
{
/* We had already generated the next setup */
OK = TRUE;
/* We hit the upper limit for the cut-off,
* the setup should not go further than cur.
*/
- pme_lb->n = pme_lb->cur + 1;
+ pme_lb->setup.resize(pme_lb->cur + 1);
print_loadbal_limited(fp_err, fp_log, step, pme_lb);
/* Switch to the next stage */
switch_to_stage1(pme_lb);
print_pme_loadbal_settings(pme_lb, fplog, mdlog, bNonBondedOnGPU);
}
- /* TODO: Here we should free all pointers in pme_lb,
- * but as it contains pme data structures,
- * we need to first make pme.c free all data.
- */
+ delete pme_lb;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
int peerRankId; /**< The peer PP rank id */
//@{
/**< Vectors of A- and B-state parameters used to transfer vectors to PME ranks */
- gmx::HostVector<real> chargeA;
- std::vector<real> chargeB;
- std::vector<real> sqrt_c6A;
- std::vector<real> sqrt_c6B;
- std::vector<real> sigmaA;
- std::vector<real> sigmaB;
+ gmx::PaddedHostVector<real> chargeA;
+ std::vector<real> chargeB;
+ std::vector<real> sqrt_c6A;
+ std::vector<real> sqrt_c6B;
+ std::vector<real> sigmaA;
+ std::vector<real> sigmaB;
//@}
- gmx::HostVector<gmx::RVec> x; /**< Vector of atom coordinates to transfer to PME ranks */
- std::vector<gmx::RVec> f; /**< Vector of atom forces received from PME ranks */
+ gmx::HostVector<gmx::RVec> x; /**< Vector of atom coordinates to transfer to PME ranks */
+ std::vector<gmx::RVec> f; /**< Vector of atom forces received from PME ranks */
//@{
/**< Vectors of MPI objects used in non-blocking communication between multiple PP ranks per PME rank */
std::vector<MPI_Request> req;
{
pme_pp->sigmaB.resize(nat);
}
- pme_pp->x.resizeWithPadding(nat);
+ pme_pp->x.resize(nat);
pme_pp->f.resize(nat);
/* maxshift is sent when the charges are sent */
//TODO this should be set properly by gmx_pme_recv_coeffs_coords,
// or maybe use inputrecDynamicBox(ir), at the very least - change this when this codepath is tested!
pme_gpu_prepare_computation(pme, boxChanged, box, wcycle, pmeFlags);
- pme_gpu_launch_spread(pme, pme_pp->x.rvec_array(), wcycle);
+ pme_gpu_launch_spread(pme, as_rvec_array(pme_pp->x.data()), wcycle);
pme_gpu_launch_complex_transforms(pme, wcycle);
pme_gpu_launch_gather(pme, wcycle, PmeForceOutputHandling::Set);
output = pme_gpu_wait_finish_task(pme, pmeFlags, wcycle);
}
else
{
- gmx_pme_do(pme, 0, natoms, pme_pp->x.rvec_array(), as_rvec_array(pme_pp->f.data()),
+ gmx_pme_do(pme, 0, natoms, as_rvec_array(pme_pp->x.data()), as_rvec_array(pme_pp->f.data()),
pme_pp->chargeA.data(), pme_pp->chargeB.data(),
pme_pp->sqrt_c6A.data(), pme_pp->sqrt_c6B.data(),
pme_pp->sigmaA.data(), pme_pp->sigmaB.data(), box,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
static const char *eioNames[eioNR] =
{
- "REAL", "INT", "GMX_STE_T", "UCHAR", "NUCHAR", "USHORT", "RVEC", "NRVEC",
- "IVEC", "STRING"
+ "REAL", "FLOAT", "DOUBLE", "INT", "INT64",
+ "UCHAR", "NUCHAR", "USHORT",
+ "RVEC", "NRVEC", "IVEC", "STRING"
};
void gmx_fio_setprecision(t_fileio *fio, gmx_bool bDouble)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
void write_hconf_mtop(FILE *out, const char *title, gmx_mtop_t *mtop,
const rvec *x, const rvec *v, const matrix box)
{
- int i, resnr;
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
- char *atomname, *resname;
-
fprintf(out, "%s\n", (title && title[0]) ? title : gmx::bromacs().c_str());
fprintf(out, "%5d\n", mtop->natoms);
- const char *format = get_hconf_format(v != nullptr);
+ const char *format = get_hconf_format(v != nullptr);
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- gmx_mtop_atomloop_all_names(aloop, &atomname, &resnr, &resname);
+ int i = atomP.globalAtomNumber();
+ int residueNumber = atomP.residueNumber();
+ const char *atomName = atomP.atomName();
+ const char *residueName = atomP.residueName();
fprintf(out, "%5d%-5.5s%5.5s%5d",
- resnr%100000, resname, atomname, (i+1)%100000);
+ residueNumber%100000, residueName, atomName, (i+1)%100000);
/* next fprintf uses built format string */
if (v)
{
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
"CONECT"
};
-
#define REMARK_SIM_BOX "REMARK THIS IS A SIMULATION BOX"
static void xlate_atomname_pdb2gmx(char *name)
gmx_conect conect, gmx_bool bTerSepChains,
bool usePqrFormat)
{
- gmx_conect_t *gc = static_cast<gmx_conect_t *>(conect);
- int i, ii;
- int resind, resnr;
- enum PDB_record type;
- unsigned char resic, ch;
- char altloc;
- real occup, bfac;
- gmx_bool bOccup;
- int chainnum, lastchainnum;
- gmx_residuetype_t*rt;
- const char *p_restype;
- const char *p_lastrestype;
-
- gmx_residuetype_init(&rt);
+ gmx_conect_t *gc = static_cast<gmx_conect_t *>(conect);
+ enum PDB_record type;
+ char altloc;
+ real occup, bfac;
+ gmx_bool bOccup;
+
fprintf(out, "TITLE %s\n", (title && title[0]) ? title : gmx::bromacs().c_str());
if (box && ( (norm2(box[XX]) != 0.0f) || (norm2(box[YY]) != 0.0f) || (norm2(box[ZZ]) != 0.0f) ) )
* otherwise set them all to one
*/
bOccup = TRUE;
- for (ii = 0; (ii < nindex) && bOccup; ii++)
+ for (int ii = 0; (ii < nindex) && bOccup; ii++)
{
- i = index[ii];
+ int i = index[ii];
bOccup = bOccup && (atoms->pdbinfo[i].occup == 0.0);
}
}
fprintf(out, "MODEL %8d\n", model_nr > 0 ? model_nr : 1);
- lastchainnum = -1;
- p_restype = nullptr;
+ int lastchainnum = -1;
+ std::string prevRestype;
+ std::string lastRestype;
- for (ii = 0; ii < nindex; ii++)
+ ResidueType rt;
+ for (int ii = 0; ii < nindex; ii++)
{
- i = index[ii];
- resind = atoms->atom[i].resind;
- chainnum = atoms->resinfo[resind].chainnum;
- p_lastrestype = p_restype;
- gmx_residuetype_get_type(rt, *atoms->resinfo[resind].name, &p_restype);
+ int i = index[ii];
+ int resind = atoms->atom[i].resind;
+ int chainnum = atoms->resinfo[resind].chainnum;
+ lastRestype = prevRestype;
+ prevRestype = rt.typeNameForIndexedResidue(*atoms->resinfo[resind].name);
/* Add a TER record if we changed chain, and if either the previous or this chain is protein/DNA/RNA. */
if (bTerSepChains && ii > 0 && chainnum != lastchainnum)
{
/* Only add TER if the previous chain contained protein/DNA/RNA. */
- if (gmx_residuetype_is_protein(rt, p_lastrestype) || gmx_residuetype_is_dna(rt, p_lastrestype) || gmx_residuetype_is_rna(rt, p_lastrestype))
+ if (rt.namedResidueHasType(lastRestype, "Protein") ||
+ rt.namedResidueHasType(lastRestype, "DNA") ||
+ rt.namedResidueHasType(lastRestype, "RNA"))
{
fprintf(out, "TER\n");
}
/* rename HG12 to 2HG1, etc. */
nm = xlate_atomname_gmx2pdb(nm);
- resnr = atoms->resinfo[resind].nr;
- resic = atoms->resinfo[resind].ic;
+ int resnr = atoms->resinfo[resind].nr;
+ unsigned char resic = atoms->resinfo[resind].ic;
+ unsigned char ch;
if (chainid != ' ')
{
ch = chainid;
if (nullptr != gc)
{
/* Write conect records */
- for (i = 0; (i < gc->nconect); i++)
+ for (int i = 0; (i < gc->nconect); i++)
{
fprintf(out, "CONECT%5d%5d\n", gc->conect[i].ai+1, gc->conect[i].aj+1);
}
}
-
- gmx_residuetype_destroy(rt);
}
void write_pdbfile(FILE *out, const char *title, const t_atoms *atoms, const rvec x[],
}
}
-void get_pdb_atomnumber(const t_atoms *atoms, gmx_atomprop_t aps)
+void get_pdb_atomnumber(const t_atoms *atoms, AtomProperties *aps)
{
int i, atomnumber, len;
size_t k;
- char anm[6], anm_copy[6], *ptr;
+ char anm[6], anm_copy[6];
char nc = '\0';
real eval;
if ((anm[0] != ' ') && ((len <= 2) || !std::isdigit(anm[2])))
{
anm_copy[2] = nc;
- if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+ if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
{
atomnumber = gmx::roundToInt(eval);
atomNumberSet = true;
else
{
anm_copy[1] = nc;
- if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+ if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
{
atomnumber = gmx::roundToInt(eval);
atomNumberSet = true;
}
anm_copy[0] = anm[k];
anm_copy[1] = nc;
- if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+ if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
{
atomnumber = gmx::roundToInt(eval);
atomNumberSet = true;
}
}
+ std::string buf;
if (atomNumberSet)
{
atoms->atom[i].atomnumber = atomnumber;
- ptr = gmx_atomprop_element(aps, atomnumber);
+ buf = aps->elementFromAtomNumber(atomnumber);
if (debug)
{
fprintf(debug, "Atomnumber for atom '%s' is %d\n",
anm, atomnumber);
}
}
- else
- {
- ptr = nullptr;
- }
- std::strncpy(atoms->atom[i].elem, ptr == nullptr ? "" : ptr, 4);
+ buf.resize(3);
+ std::strncpy(atoms->atom[i].elem, buf.c_str(), 4);
}
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/real.h"
-struct gmx_atomprop;
+class AtomProperties;
struct t_atoms;
struct t_symtab;
struct t_topology;
* which may be useful for visualization purposes.
*/
-void get_pdb_atomnumber(const t_atoms *atoms, struct gmx_atomprop *aps);
+void get_pdb_atomnumber(const t_atoms *atoms, AtomProperties *aps);
/* Routine to extract atomic numbers from the atom names */
int read_pdbfile(FILE *in, char *title, int *model_nr,
{
for (int atomIndex = 0; atomIndex < atoms.nr; atomIndex++, i++)
{
- if (getGroupType(&mtop->groups, gtype, i) != 0)
+ if (getGroupType(mtop->groups, gtype, i) != 0)
{
return FALSE;
}
char *res_name;
int res_id;
- if (getGroupType(&mtop->groups, egcCompressedX, i) != 0)
+ if (getGroupType(mtop->groups, egcCompressedX, i) != 0)
{
continue;
}
int atom1, atom2;
atom1 = ilist.iatoms[l] + atom_offset;
atom2 = ilist.iatoms[l + 1] + atom_offset;
- if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0 &&
- getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0 &&
+ getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
{
tng_molecule_bond_add(tng, mol, ilist.iatoms[l],
ilist.iatoms[l + 1], &tngBond);
atom1 = ilist.iatoms[l] + atom_offset;
atom2 = ilist.iatoms[l + 1] + atom_offset;
atom3 = ilist.iatoms[l + 2] + atom_offset;
- if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0)
{
- if (getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
{
tng_molecule_bond_add(tng, mol, atom1,
atom2, &tngBond);
}
- if (getGroupType(&mtop->groups, egcCompressedX, atom3) == 0)
+ if (getGroupType(mtop->groups, egcCompressedX, atom3) == 0)
{
tng_molecule_bond_add(tng, mol, atom1,
atom3, &tngBond);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2009,2010,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "config.h"
+#include "gromacs/utility/path.h"
+#include "gromacs/utility/stringutil.h"
+
/* Derived from PluginMgr.C and catdcd.c */
/* PluginMgr.C: Copyright: */
static int load_vmd_library(const char *fn, gmx_vmdplugin_t *vmdplugin)
{
- char pathname[GMX_PATH_MAX];
- const char *pathenv;
- const char *err;
- int ret = 0;
- char pathenv_buffer[GMX_PATH_MAX];
+ const char *err;
+ int ret = 0;
#if !GMX_NATIVE_WINDOWS
- glob_t globbuf;
- const char *defpath_suffix = "/plugins/*/molfile";
- const char *defpathenv = GMX_VMD_PLUGIN_PATH;
+ glob_t globbuf;
+ const std::string defpath_suffix = "/plugins/*/molfile";
+ const std::string defpathenv = GMX_VMD_PLUGIN_PATH;
#else
- WIN32_FIND_DATA ffd;
- HANDLE hFind = INVALID_HANDLE_VALUE;
- char progfolder[GMX_PATH_MAX];
- char defpathenv[GMX_PATH_MAX];
- const char *defpath_suffix = "\\plugins\\WIN32\\molfile";
+ WIN32_FIND_DATA ffd;
+ HANDLE hFind = INVALID_HANDLE_VALUE;
+ char progfolder[GMX_PATH_MAX];
+ std::string defpath_suffix = "\\plugins\\WIN32\\molfile";
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progfolder);
- sprintf(defpathenv, "%s\\University of Illinois\\VMD\\plugins\\WIN32\\molfile", progfolder);
+ std::string defpathenv = gmx::formatString("%s\\University of Illinois\\VMD\\plugins\\WIN32\\molfile", progfolder);
#endif
vmdplugin->api = nullptr;
* plugins, then an implicit run-time path, and finally for one
* given at configure time. This last might be hard-coded to the
* default for VMD installs. */
- pathenv = getenv("VMD_PLUGIN_PATH");
- if (pathenv == nullptr)
+ std::string pathenv = getenv("VMD_PLUGIN_PATH");
+ if (pathenv.empty())
{
pathenv = getenv("VMDDIR");
- if (nullptr == pathenv)
+ if (pathenv.empty())
{
printf("\nNeither VMD_PLUGIN_PATH or VMDDIR set. ");
- printf("Using default location:\n%s\n", defpathenv);
+ printf("Using default location:\n%s\n", defpathenv.c_str());
pathenv = defpathenv;
}
else
{
printf("\nVMD_PLUGIN_PATH no set, but VMDDIR is set. ");
-#ifdef _MSC_VER
- _snprintf_s(pathenv_buffer, sizeof(pathenv_buffer), _TRUNCATE, "%s%s", pathenv, defpath_suffix);
-#else
- snprintf(pathenv_buffer, sizeof(pathenv_buffer), "%s%s", pathenv, defpath_suffix);
-#endif
- printf("Using semi-default location:\n%s\n", pathenv_buffer);
- pathenv = pathenv_buffer;
+ pathenv = gmx::Path::join(pathenv, defpath_suffix);
+ printf("Using semi-default location:\n%s\n", pathenv.c_str());
}
}
- strncpy(pathname, pathenv, sizeof(pathname));
#if !GMX_NATIVE_WINDOWS
- strcat(pathname, "/*.so");
- glob(pathname, 0, nullptr, &globbuf);
+ std::string pathname = gmx::Path::join (pathenv, "/*.so");
+ glob(pathname.c_str(), 0, nullptr, &globbuf);
if (globbuf.gl_pathc == 0)
{
printf("\nNo VMD Plugins found\n"
}
globfree(&globbuf);
#else
- strcat(pathname, "\\*.so");
- hFind = FindFirstFile(pathname, &ffd);
+ std::string pathname = gmx::Path::join(pathenv, "\\*.so");
+ hFind = FindFirstFile(pathname.c_str(), &ffd);
if (INVALID_HANDLE_VALUE == hFind)
{
printf("\nNo VMD Plugins found\n");
}
do
{
- char filename[GMX_PATH_MAX];
- sprintf(filename, "%s\\%s", pathenv, ffd.cFileName);
- ret |= load_sharedlibrary_plugins(filename, vmdplugin);
+ std::string filename = gmx::Path::join(pathenv, ffd.cFileName);
+ ret |= load_sharedlibrary_plugins(filename.c_str(), vmdplugin);
}
while (FindNextFile(hFind, &ffd ) != 0 && vmdplugin->api == NULL);
FindClose(hFind);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
t_dlist *mk_dlist(FILE *log,
const t_atoms *atoms, int *nlist,
gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bHChi,
- int maxchi, int r0, gmx_residuetype_t *rt)
+ int maxchi, int r0, ResidueType *rt)
{
int i, j, ii;
t_dihatms atm, prev;
{
nc[6]++;
}
- dl[nl].index = gmx_residuetype_get_index(rt, thisres);
+ dl[nl].index = rt->indexFromResidueName(thisres);
/* Prevent seg fault from unknown residues. If one adds a custom residue to
* residuetypes.dat but somehow loses it, changes it, or does analysis on
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef _gmx_ana_h
#define _gmx_ana_h
-int
-gmx_anadock(int argc, char *argv[]);
-
int
gmx_analyze(int argc, char *argv[]);
int
gmx_dyecoupl(int argc, char *argv[]);
-int
-gmx_dyndom(int argc, char *argv[]);
-
-int
-gmx_editconf(int argc, char *argv[]);
-
int
gmx_eneconv(int argc, char *argv[]);
int
gmx_filter(int argc, char *argv[]);
-int
-gmx_genion(int argc, char *argv[]);
-
-int
-gmx_genpr(int argc, char *argv[]);
-
int
gmx_gyrate(int argc, char *argv[]);
int
gmx_msd(int argc, char *argv[]);
-int
-gmx_morph(int argc, char *argv[]);
-
int
gmx_nmeig(int argc, char *argv[]);
+++ /dev/null
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
- * and including many others, as listed in the AUTHORS file in the
- * top-level source directory and at http://www.gromacs.org.
- *
- * GROMACS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * GROMACS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GROMACS; if not, see
- * http://www.gnu.org/licenses, or write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * If you want to redistribute modifications to GROMACS, please
- * consider that scientific software is very special. Version
- * control is crucial - bugs must be traceable. We will be happy to
- * consider code for inclusion in the official distribution, but
- * derived work must not be called official GROMACS. Details are found
- * in the README & COPYING files - if they are missing, get the
- * official version at http://www.gromacs.org.
- *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the research papers on the package. Check out http://www.gromacs.org.
- */
-#include "gmxpre.h"
-
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-
-#include <string>
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/xvgr.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/vec.h"
-#include "gromacs/statistics/statistics.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/cstringutil.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/futil.h"
-#include "gromacs/utility/path.h"
-#include "gromacs/utility/pleasecite.h"
-#include "gromacs/utility/smalloc.h"
-
-static const char *etitles[] = { "E-docked", "Free Energy" };
-
-typedef struct {
- real edocked, efree;
- int index, cluster_id;
- t_atoms atoms;
- rvec *x;
- int ePBC;
- matrix box;
-} t_pdbfile;
-
-static t_pdbfile *read_pdbf(const char *fn)
-{
- t_pdbfile *pdbf;
- double e;
- FILE *fp;
-
- snew(pdbf, 1);
- t_topology top;
- read_tps_conf(fn, &top, &pdbf->ePBC, &pdbf->x, nullptr, pdbf->box, FALSE);
- pdbf->atoms = top.atoms;
- fp = gmx_ffopen(fn, "r");
- char buf[256], *ptr;
- while ((ptr = fgets2(buf, 255, fp)) != nullptr)
- {
- if (std::strstr(buf, "Intermolecular") != nullptr)
- {
- ptr = std::strchr(buf, '=');
- sscanf(ptr+1, "%lf", &e);
- pdbf->edocked = e;
- }
- else if (std::strstr(buf, "Estimated Free") != nullptr)
- {
- ptr = std::strchr(buf, '=');
- sscanf(ptr+1, "%lf", &e);
- pdbf->efree = e;
- }
- }
- gmx_ffclose(fp);
-
- return pdbf;
-}
-
-static t_pdbfile **read_em_all(const std::string &fn, int *npdbf)
-{
- t_pdbfile **pdbf = nullptr;
- int i, maxpdbf;
- gmx_bool bExist;
-
- maxpdbf = 100;
- snew(pdbf, maxpdbf);
- i = 0;
- do
- {
- auto newFilename = gmx::Path::concatenateBeforeExtension(fn, gmx::formatString("_%d", i+1));
- if ((bExist = gmx_fexist(newFilename)))
- {
- pdbf[i] = read_pdbf(newFilename.c_str());
- pdbf[i]->index = i+1;
- i++;
- if (i >= maxpdbf)
- {
- maxpdbf += 100;
- srenew(pdbf, maxpdbf);
- }
- }
- }
- while (bExist);
-
- *npdbf = i;
-
- printf("Found %d pdb files\n", i);
-
- return pdbf;
-}
-
-static gmx_bool bFreeSort = FALSE;
-
-static int pdbf_comp(const void *a, const void *b)
-{
- const t_pdbfile *pa, *pb;
- real x;
- int dc;
-
- pa = *static_cast<t_pdbfile *const*>(a);
- pb = *static_cast<t_pdbfile *const*>(b);
-
- dc = pa->cluster_id - pb->cluster_id;
-
- if (dc == 0)
- {
- if (bFreeSort)
- {
- x = pa->efree - pb->efree;
- }
- else
- {
- x = pa->edocked - pb->edocked;
- }
-
- if (x < 0)
- {
- return -1;
- }
- else if (x > 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- else
- {
- return dc;
- }
-}
-
-static void analyse_em_all(int npdb, t_pdbfile *pdbf[], const char *edocked,
- const char *efree, const gmx_output_env_t *oenv)
-{
- FILE *fp;
- int i;
-
- for (int freeSort = 0; freeSort < 2; freeSort++)
- {
- bFreeSort = (freeSort == 1);
- qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
- fp = xvgropen(bFreeSort ? efree : edocked,
- etitles[bFreeSort], "()", "E (kJ/mol)", oenv);
- for (i = 0; (i < npdb); i++)
- {
- fprintf(fp, "%12lf\n", bFreeSort ? pdbf[i]->efree : pdbf[i]->edocked);
- }
- xvgrclose(fp);
- }
-}
-
-static void clust_stat(FILE *fp, int start, int end, t_pdbfile *pdbf[])
-{
- int i;
- gmx_stats_t ed, ef;
- real aver, sigma;
-
- ed = gmx_stats_init();
- ef = gmx_stats_init();
- for (i = start; (i < end); i++)
- {
- gmx_stats_add_point(ed, i-start, pdbf[i]->edocked, 0, 0);
- gmx_stats_add_point(ef, i-start, pdbf[i]->efree, 0, 0);
- }
- gmx_stats_get_ase(ed, &aver, &sigma, nullptr);
- fprintf(fp, " <%12s> = %8.3f (+/- %6.3f)\n", etitles[FALSE], aver, sigma);
- gmx_stats_get_ase(ef, &aver, &sigma, nullptr);
- fprintf(fp, " <%12s> = %8.3f (+/- %6.3f)\n", etitles[TRUE], aver, sigma);
- gmx_stats_free(ed);
- gmx_stats_free(ef);
-}
-
-static real rmsd_dist(t_pdbfile *pa, t_pdbfile *pb, gmx_bool bRMSD)
-{
- int i;
- real rmsd;
- rvec acm, bcm, dx;
-
- if (bRMSD)
- {
- rmsd = 0;
- for (i = 0; (i < pa->atoms.nr); i++)
- {
- rvec_sub(pa->x[i], pb->x[i], dx);
- rmsd += iprod(dx, dx);
- }
- rmsd = std::sqrt(rmsd/pa->atoms.nr);
- }
- else
- {
- clear_rvec(acm);
- clear_rvec(bcm);
- for (i = 0; (i < pa->atoms.nr); i++)
- {
- rvec_inc(acm, pa->x[i]);
- rvec_inc(bcm, pb->x[i]);
- }
- rvec_sub(acm, bcm, dx);
- for (i = 0; (i < DIM); i++)
- {
- dx[i] /= pa->atoms.nr;
- }
- rmsd = norm(dx);
- }
- return rmsd;
-}
-
-static void line(FILE *fp)
-{
- fprintf(fp, " - - - - - - - - - -\n");
-}
-
-static void cluster_em_all(FILE *fp, int npdb, t_pdbfile *pdbf[],
- gmx_bool bFree, gmx_bool bRMSD, real cutoff)
-{
- int i, j, k;
- int *cndx, ncluster;
- real rmsd;
-
- bFreeSort = bFree;
- qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
-
- fprintf(fp, "Statistics over all structures:\n");
- clust_stat(fp, 0, npdb, pdbf);
- line(fp);
-
- /* Index to first structure in a cluster */
- snew(cndx, npdb);
- ncluster = 1;
-
- for (i = 1; (i < npdb); i++)
- {
- for (j = 0; (j < ncluster); j++)
- {
- rmsd = rmsd_dist(pdbf[cndx[j]], pdbf[i], bRMSD);
- if (rmsd <= cutoff)
- {
- /* Structure i is in cluster j */
- pdbf[i]->cluster_id = pdbf[cndx[j]]->cluster_id;
- break;
- }
- }
- if (j == ncluster)
- {
- /* New cluster! Cool! */
- cndx[ncluster] = i;
- pdbf[i]->cluster_id = ncluster;
- ncluster++;
- }
- }
- cndx[ncluster] = npdb;
- qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
-
- j = 0;
- cndx[j++] = 0;
- for (i = 1; (i < npdb); i++)
- {
- if (pdbf[i]->cluster_id != pdbf[i-1]->cluster_id)
- {
- cndx[j++] = i;
- }
- }
- cndx[j] = npdb;
- if (j != ncluster)
- {
- gmx_fatal(FARGS, "Consistency error: j = %d, ncluster = %d", j, ncluster);
- }
-
- fprintf(fp, "I found %d clusters based on %s and %s with a %.3f nm cut-off\n",
- ncluster, etitles[bFree], bRMSD ? "RMSD" : "distance", cutoff);
- line(fp);
- for (j = 0; (j < ncluster); j++)
- {
- fprintf(fp, "Cluster: %3d %s: %10.5f kJ/mol %3d elements\n",
- j, etitles[bFree],
- bFree ? pdbf[cndx[j]]->efree : pdbf[cndx[j]]->edocked,
- cndx[j+1]-cndx[j]);
- clust_stat(fp, cndx[j], cndx[j+1], pdbf);
- for (k = cndx[j]; (k < cndx[j+1]); k++)
- {
- fprintf(fp, " %3d", pdbf[k]->index);
- }
- fprintf(fp, "\n");
- line(fp);
- }
- sfree(cndx);
-}
-
-int gmx_anadock(int argc, char *argv[])
-{
- const char *desc[] = {
- "[THISMODULE] analyses the results of an Autodock run and clusters the",
- "structures together, based on distance or RMSD. The docked energy",
- "and free energy estimates are analysed, and for each cluster the",
- "energy statistics are printed.[PAR]",
- "An alternative approach to this is to cluster the structures first",
- "using [gmx-cluster] and then sort the clusters on either lowest",
- "energy or average energy."
- };
- t_filenm fnm[] = {
- { efPDB, "-f", nullptr, ffREAD },
- { efXVG, "-od", "edocked", ffWRITE },
- { efXVG, "-of", "efree", ffWRITE },
- { efLOG, "-g", "anadock", ffWRITE }
- };
- gmx_output_env_t *oenv;
-#define NFILE asize(fnm)
- static gmx_bool bFree = FALSE, bRMS = TRUE;
- static real cutoff = 0.2;
- t_pargs pa[] = {
- { "-free", FALSE, etBOOL, {&bFree},
- "Use Free energy estimate from autodock for sorting the classes" },
- { "-rms", FALSE, etBOOL, {&bRMS},
- "Cluster on RMS or distance" },
- { "-cutoff", FALSE, etREAL, {&cutoff},
- "Maximum RMSD/distance for belonging to the same cluster" }
- };
-#define NPA asize(pa)
-
- FILE *fp;
- t_pdbfile **pdbf = nullptr;
- int npdbf;
-
- if (!parse_common_args(&argc, argv, 0, NFILE, fnm, NPA, pa, asize(desc), desc, 0,
- nullptr, &oenv))
- {
- return 0;
- }
-
- fp = gmx_ffopen(opt2fn("-g", NFILE, fnm), "w");
- please_cite(stdout, "Hetenyi2002b");
- please_cite(fp, "Hetenyi2002b");
-
- pdbf = read_em_all(opt2fn("-f", NFILE, fnm), &npdbf);
-
- analyse_em_all(npdbf, pdbf, opt2fn("-od", NFILE, fnm), opt2fn("-of", NFILE, fnm),
- oenv);
-
- cluster_em_all(fp, npdbf, pdbf, bFree, bRMS, cutoff);
-
- gmx_ffclose(fp);
-
- return 0;
-}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
return j;
}
-static void histogramming(FILE *log, int nbin, gmx_residuetype_t *rt,
+static void histogramming(FILE *log, int nbin, ResidueType *rt,
int nf, int maxchi, real **dih,
int nlist, t_dlist dlist[],
const int index[],
const char *residue_name;
int rt_size;
- rt_size = gmx_residuetype_get_size(rt);
+ rt_size = rt->numberOfEntries();
if (bSSHisto)
{
fp = gmx_ffopen(ssdump, "r");
normalize_histo(nbin, his_aa[Dih][i], (360.0/nbin), normhisto);
}
- residue_name = gmx_residuetype_get_name(rt, i);
+ residue_name = rt->nameFromResidueIndex(i).c_str();
switch (Dih)
{
case edPhi:
gmx_bool bDo_rt, bDo_oh, bDo_ot, bDo_jc;
real dt = 0, traj_t_ns;
gmx_output_env_t *oenv;
- gmx_residuetype_t *rt;
int isize, *index;
int ndih, nactdih, nf;
}
fprintf(log, "Title: %s\n", *top->name);
- gmx_residuetype_init(&rt);
- dlist = mk_dlist(log, &atoms, &nlist, bPhi, bPsi, bChi, bHChi, maxchi, r0, rt);
+ ResidueType rt;
+ dlist = mk_dlist(log, &atoms, &nlist, bPhi, bPsi, bChi, bHChi, maxchi, r0, &rt);
fprintf(stderr, "%d residues with dihedrals found\n", nlist);
if (nlist == 0)
}
/* Histogramming & J coupling constants & calc of S2 order params */
- histogramming(log, nbin, rt, nf, maxchi, dih, nlist, dlist, index,
+ histogramming(log, nbin, &rt, nf, maxchi, dih, nlist, dlist, index,
bPhi, bPsi, bOmega, bChi,
bNormHisto, bSSHisto, ftp2fn(efDAT, NFILE, fnm), bfac_max, &atoms,
bDo_jc, opt2fn("-jc", NFILE, fnm), oenv);
do_view(oenv, opt2fn("-corr", NFILE, fnm), "-nxy");
}
- gmx_residuetype_destroy(rt);
-
return 0;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/topology/index.h"
#include "gromacs/topology/mtop_util.h"
#include "gromacs/topology/topology.h"
+#include "gromacs/trajectoryanalysis/topologyinformation.h"
#include "gromacs/utility/arraysize.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/futil.h"
};
FILE *out = nullptr, *aver = nullptr, *numv = nullptr, *maxxv = nullptr, *xvg = nullptr;
- t_tpxheader header;
- gmx_mtop_t mtop;
- rvec *xtop;
- gmx_localtop_t *top;
- t_atoms *atoms = nullptr;
+ gmx_localtop_t top;
t_fcdata fcd;
t_nrnb nrnb;
t_graph *g;
- int ntopatoms, natoms, i, j, kkk;
+ int i, j, kkk;
t_trxstatus *status;
real t;
rvec *x, *xav = nullptr;
init5(ntop);
}
- t_inputrec irInstance;
- t_inputrec *ir = &irInstance;
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
- read_tpxheader(ftp2fn(efTPR, NFILE, fnm), &header, FALSE);
- snew(xtop, header.natoms);
- read_tpx(ftp2fn(efTPR, NFILE, fnm), ir, box, &ntopatoms, xtop, nullptr, &mtop);
+ gmx::TopologyInformation topInfo;
+ topInfo.fillFromInputFile(ftp2fn(efTPR, NFILE, fnm));
+ int ntopatoms = topInfo.mtop()->natoms;
+ AtomsDataPtr atoms;
bPDB = opt2bSet("-q", NFILE, fnm);
if (bPDB)
{
ind_fit[kkk] = kkk;
}
- snew(atoms, 1);
- *atoms = gmx_mtop_global_atoms(&mtop);
+ atoms = topInfo.copyAtoms();
if (atoms->pdbinfo == nullptr)
{
atoms->havePdbInfo = TRUE;
}
- top = gmx_mtop_generate_local_top(&mtop, ir->efep != efepNO);
+ gmx_mtop_generate_local_top(*topInfo.mtop(), &top, ir->efep != efepNO);
g = nullptr;
pbc_null = nullptr;
}
else
{
- g = mk_graph(fplog, &top->idef, 0, mtop.natoms, FALSE, FALSE);
+ g = mk_graph(fplog, &top.idef, 0, ntopatoms, FALSE, FALSE);
}
}
}
ir->dr_tau = 0.0;
- init_disres(fplog, &mtop, ir, nullptr, nullptr, &fcd, nullptr, FALSE);
+ init_disres(fplog, topInfo.mtop(), ir, nullptr, nullptr, &fcd, nullptr, FALSE);
- natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &t, &x, box);
+ int natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &t, &x, box);
snew(f, 5*natoms);
init_dr_res(&dr, fcd.disres.nres);
"Largest Violation", "Time (ps)", "nm", oenv);
}
- auto mdAtoms = gmx::makeMDAtoms(fplog, mtop, *ir, false);
- atoms2md(&mtop, ir, -1, nullptr, mtop.natoms, mdAtoms.get());
+ auto mdAtoms = gmx::makeMDAtoms(fplog, *topInfo.mtop(), *ir, false);
+ atoms2md(topInfo.mtop(), ir, -1, nullptr, ntopatoms, mdAtoms.get());
update_mdatoms(mdAtoms->mdatoms(), ir->fepvals->init_lambda);
init_nrnb(&nrnb);
if (ir->ePBC != epbcNONE)
{
- gpbc = gmx_rmpbc_init(&top->idef, ir->ePBC, natoms);
+ gpbc = gmx_rmpbc_init(&top.idef, ir->ePBC, natoms);
}
j = 0;
}
my_clust = clust->inv_clust[j];
range_check(my_clust, 0, clust->clust->nr);
- check_viol(fplog, &(top->idef.il[F_DISRES]),
- top->idef.iparams,
+ check_viol(fplog, &(top.idef.il[F_DISRES]),
+ top.idef.iparams,
x, f, pbc_null, g, dr_clust, my_clust, isize, index, vvindex, &fcd);
}
else
{
- check_viol(fplog, &(top->idef.il[F_DISRES]),
- top->idef.iparams,
+ check_viol(fplog, &(top.idef.il[F_DISRES]),
+ top.idef.iparams,
x, f, pbc_null, g, &dr, 0, isize, index, vvindex, &fcd);
}
if (bPDB)
if (clust)
{
- dump_clust_stats(fplog, fcd.disres.nres, &(top->idef.il[F_DISRES]),
- top->idef.iparams, clust->clust, dr_clust,
+ dump_clust_stats(fplog, fcd.disres.nres, &(top.idef.il[F_DISRES]),
+ top.idef.iparams, clust->clust, dr_clust,
clust->grpname, isize, index);
}
else
{
- dump_stats(fplog, j, fcd.disres.nres, &(top->idef.il[F_DISRES]),
- top->idef.iparams, &dr, isize, index,
- bPDB ? atoms : nullptr);
+ dump_stats(fplog, j, fcd.disres.nres, &(top.idef.il[F_DISRES]),
+ top.idef.iparams, &dr, isize, index,
+ bPDB ? atoms.get() : nullptr);
if (bPDB)
{
write_sto_conf(opt2fn("-q", NFILE, fnm),
"Coloured by average violation in Angstrom",
- atoms, xav, nullptr, ir->ePBC, box);
+ atoms.get(), xav, nullptr, ir->ePBC, box);
}
dump_disre_matrix(opt2fn_null("-x", NFILE, fnm), &dr, fcd.disres.nres,
- j, &top->idef, &mtop, max_dr, nlevels, bThird);
+ j, &top.idef, topInfo.mtop(), max_dr, nlevels, bThird);
xvgrclose(out);
xvgrclose(aver);
xvgrclose(numv);
+++ /dev/null
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
- * and including many others, as listed in the AUTHORS file in the
- * top-level source directory and at http://www.gromacs.org.
- *
- * GROMACS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * GROMACS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GROMACS; if not, see
- * http://www.gnu.org/licenses, or write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * If you want to redistribute modifications to GROMACS, please
- * consider that scientific software is very special. Version
- * control is crucial - bugs must be traceable. We will be happy to
- * consider code for inclusion in the official distribution, but
- * derived work must not be called official GROMACS. Details are found
- * in the README & COPYING files - if they are missing, get the
- * official version at http://www.gromacs.org.
- *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the research papers on the package. Check out http://www.gromacs.org.
- */
-#include "gmxpre.h"
-
-#include <cmath>
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/trxio.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/3dtransforms.h"
-#include "gromacs/math/units.h"
-#include "gromacs/math/vec.h"
-#include "gromacs/topology/atoms.h"
-#include "gromacs/topology/index.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/smalloc.h"
-
-static void rot_conf(t_atoms *atoms, const rvec x[], const rvec v[], real trans, real angle,
- rvec head, rvec tail, int isize, const int index[],
- rvec xout[], rvec vout[])
-{
- rvec arrow, xcm;
- real theta, phi, arrow_len;
- mat4 Rx, Ry, Rz, Rinvy, Rinvz, Mtot;
- mat4 temp1, temp2, temp3;
- vec4 xv;
- int i, ai;
-
- rvec_sub(tail, head, arrow);
- arrow_len = norm(arrow);
- if (debug)
- {
- fprintf(debug, "Arrow vector: %10.4f %10.4f %10.4f\n",
- arrow[XX], arrow[YY], arrow[ZZ]);
- fprintf(debug, "Effective translation %g nm\n", trans);
- }
- if (arrow_len == 0.0)
- {
- gmx_fatal(FARGS, "Arrow vector not given");
- }
-
- /* Copy all aoms to output */
- for (i = 0; (i < atoms->nr); i++)
- {
- copy_rvec(x[i], xout[i]);
- copy_rvec(v[i], vout[i]);
- }
-
- /* Compute center of mass and move atoms there */
- clear_rvec(xcm);
- for (i = 0; (i < isize); i++)
- {
- rvec_inc(xcm, x[index[i]]);
- }
- for (i = 0; (i < DIM); i++)
- {
- xcm[i] /= isize;
- }
- if (debug)
- {
- fprintf(debug, "Center of mass: %10.4f %10.4f %10.4f\n",
- xcm[XX], xcm[YY], xcm[ZZ]);
- }
- for (i = 0; (i < isize); i++)
- {
- rvec_sub(x[index[i]], xcm, xout[index[i]]);
- }
-
- /* Compute theta and phi that describe the arrow */
- theta = std::acos(arrow[ZZ]/arrow_len);
- phi = std::atan2(arrow[YY]/arrow_len, arrow[XX]/arrow_len);
- if (debug)
- {
- fprintf(debug, "Phi = %.1f, Theta = %.1f\n", RAD2DEG*phi, RAD2DEG*theta);
- }
-
- /* Now the total rotation matrix: */
- /* Rotate a couple of times */
- gmx_mat4_init_rotation(ZZ, -phi, Rz);
- gmx_mat4_init_rotation(YY, M_PI/2-theta, Ry);
- gmx_mat4_init_rotation(XX, angle*DEG2RAD, Rx);
- Rx[WW][XX] = trans;
- gmx_mat4_init_rotation(YY, theta-M_PI/2, Rinvy);
- gmx_mat4_init_rotation(ZZ, phi, Rinvz);
-
- gmx_mat4_mmul(temp1, Ry, Rz);
- gmx_mat4_mmul(temp2, Rinvy, Rx);
- gmx_mat4_mmul(temp3, temp2, temp1);
- gmx_mat4_mmul(Mtot, Rinvz, temp3);
-
- if (debug)
- {
- gmx_mat4_print(debug, "Rz", Rz);
- gmx_mat4_print(debug, "Ry", Ry);
- gmx_mat4_print(debug, "Rx", Rx);
- gmx_mat4_print(debug, "Rinvy", Rinvy);
- gmx_mat4_print(debug, "Rinvz", Rinvz);
- gmx_mat4_print(debug, "Mtot", Mtot);
- }
-
- for (i = 0; (i < isize); i++)
- {
- ai = index[i];
- gmx_mat4_transform_point(Mtot, xout[ai], xv);
- rvec_add(xv, xcm, xout[ai]);
- gmx_mat4_transform_point(Mtot, v[ai], xv);
- copy_rvec(xv, vout[ai]);
- }
-}
-
-int gmx_dyndom(int argc, char *argv[])
-{
- const char *desc[] = {
- "[THISMODULE] reads a [REF].pdb[ref] file output from DynDom",
- "(http://www.cmp.uea.ac.uk/dyndom/).",
- "It reads the coordinates, the coordinates of the rotation axis,",
- "and an index file containing the domains.",
- "Furthermore, it takes the first and last atom of the arrow file",
- "as command line arguments (head and tail) and",
- "finally it takes the translation vector (given in DynDom info file)",
- "and the angle of rotation (also as command line arguments). If the angle",
- "determined by DynDom is given, one should be able to recover the",
- "second structure used for generating the DynDom output.",
- "Because of limited numerical accuracy this should be verified by",
- "computing an all-atom RMSD (using [gmx-confrms]) rather than by file",
- "comparison (using diff).[PAR]",
- "The purpose of this program is to interpolate and extrapolate the",
- "rotation as found by DynDom. As a result unphysical structures with",
- "long or short bonds, or overlapping atoms may be produced. Visual",
- "inspection, and energy minimization may be necessary to",
- "validate the structure."
- };
- static real trans0 = 0;
- static rvec head = { 0, 0, 0 };
- static rvec tail = { 0, 0, 0 };
- static real angle0 = 0, angle1 = 0, maxangle = 0;
- static int label = 0, nframes = 11;
- t_pargs pa[] = {
- { "-firstangle", FALSE, etREAL, {&angle0},
- "Angle of rotation about rotation vector" },
- { "-lastangle", FALSE, etREAL, {&angle1},
- "Angle of rotation about rotation vector" },
- { "-nframe", FALSE, etINT, {&nframes},
- "Number of steps on the pathway" },
- { "-maxangle", FALSE, etREAL, {&maxangle},
- "DymDom dtermined angle of rotation about rotation vector" },
- { "-trans", FALSE, etREAL, {&trans0},
- "Translation (Angstrom) along rotation vector (see DynDom info file)" },
- { "-head", FALSE, etRVEC, {head},
- "First atom of the arrow vector" },
- { "-tail", FALSE, etRVEC, {tail},
- "Last atom of the arrow vector" }
- };
- int i, j, natoms, isize;
- t_trxstatus *status;
- int *index = nullptr, *index_all;
- char *grpname;
- real angle, trans;
- rvec *x, *v, *xout, *vout;
- matrix box;
- gmx_output_env_t *oenv;
-
- t_filenm fnm[] = {
- { efPDB, "-f", "dyndom", ffREAD },
- { efTRO, "-o", "rotated", ffWRITE },
- { efNDX, "-n", "domains", ffREAD }
- };
-#define NFILE asize(fnm)
-
- if (!parse_common_args(&argc, argv, 0, NFILE, fnm, asize(pa), pa,
- asize(desc), desc, 0, nullptr, &oenv))
- {
- return 0;
- }
-
- if (maxangle == 0)
- {
- gmx_fatal(FARGS, "maxangle not given");
- }
-
- t_topology *top;
- snew(top, 1);
- read_tps_conf(opt2fn("-f", NFILE, fnm), top, nullptr, &x, &v, box, FALSE);
- t_atoms &atoms = top->atoms;
- if (atoms.pdbinfo == nullptr)
- {
- snew(atoms.pdbinfo, atoms.nr);
- }
- atoms.havePdbInfo = TRUE;
- natoms = atoms.nr;
- snew(xout, natoms);
- snew(vout, natoms);
-
- printf("Select group to rotate:\n");
- rd_index(ftp2fn(efNDX, NFILE, fnm), 1, &isize, &index, &grpname);
- printf("Going to rotate %s containing %d atoms\n", grpname, isize);
-
- snew(index_all, atoms.nr);
- for (i = 0; (i < atoms.nr); i++)
- {
- index_all[i] = i;
- }
-
- status = open_trx(opt2fn("-o", NFILE, fnm), "w");
-
- label = 'A';
- for (i = 0; (i < nframes); i++, label++)
- {
- angle = angle0 + (i*(angle1-angle0))/(nframes-1);
- trans = trans0*0.1*angle/maxangle;
- printf("Frame: %2d (label %c), angle: %8.3f deg., trans: %8.3f nm\n",
- i, label, angle, trans);
- rot_conf(&atoms, x, v, trans, angle, head, tail, isize, index, xout, vout);
-
- if (label > 'Z')
- {
- label -= 26;
- }
- for (j = 0; (j < atoms.nr); j++)
- {
- atoms.resinfo[atoms.atom[j].resind].chainid = label;
- }
-
- write_trx(status, atoms.nr, index_all, &atoms, i, angle, box, xout, vout, nullptr);
- }
- close_trx(status);
-
- return 0;
-}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
xvgrclose(res);
}
- sfree(x0);
+ if (x0)
+ {
+ sfree(x0);
+ }
+
+ int freeLeg = bMat ? (ng == 1 ? 1 : (ng*(ng-1))/2) : ng - 1;
+ for (int i = 0; i < freeLeg; i++)
+ {
+ sfree(leg[i]);
+ }
+ sfree(leg);
}
static int find_residues(const t_atoms *atoms, int n, const int index[], int **resindex)
"Also [gmx-distance] and [gmx-pairdist] calculate distances."
};
- static gmx_bool bMat = FALSE, bPI = FALSE, bSplit = FALSE, bMax = FALSE, bPBC = TRUE;
- static gmx_bool bGroup = FALSE;
- static real rcutoff = 0.6;
- static int ng = 1;
- static gmx_bool bEachResEachTime = FALSE, bPrintResName = FALSE;
+ gmx_bool bMat = FALSE, bPI = FALSE, bSplit = FALSE, bMax = FALSE, bPBC = TRUE;
+ gmx_bool bGroup = FALSE;
+ real rcutoff = 0.6;
+ int ng = 1;
+ gmx_bool bEachResEachTime = FALSE, bPrintResName = FALSE;
t_pargs pa[] = {
{ "-matrix", FALSE, etBOOL, {&bMat},
"Calculate half a matrix of group-group distances" },
gmx_output_env_t *oenv;
t_topology *top = nullptr;
int ePBC = -1;
- rvec *x;
+ rvec *x = nullptr;
matrix box;
gmx_bool bTop = FALSE;
do_view(oenv, numfnm, "-nxy");
}
+ output_env_done(oenv);
+ done_top(top);
+ for (int i = 0; i < ng; i++)
+ {
+ sfree(index[i]);
+ }
+ sfree(index);
+ sfree(gnx);
+ sfree(x);
+ sfree(grpname);
+ sfree(top);
+
return 0;
}
+++ /dev/null
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
- * and including many others, as listed in the AUTHORS file in the
- * top-level source directory and at http://www.gromacs.org.
- *
- * GROMACS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * GROMACS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GROMACS; if not, see
- * http://www.gnu.org/licenses, or write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * If you want to redistribute modifications to GROMACS, please
- * consider that scientific software is very special. Version
- * control is crucial - bugs must be traceable. We will be happy to
- * consider code for inclusion in the official distribution, but
- * derived work must not be called official GROMACS. Details are found
- * in the README & COPYING files - if they are missing, get the
- * official version at http://www.gromacs.org.
- *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the research papers on the package. Check out http://www.gromacs.org.
- */
-#include "gmxpre.h"
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/commandline/viewit.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/trxio.h"
-#include "gromacs/fileio/xvgr.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/do_fit.h"
-#include "gromacs/topology/atoms.h"
-#include "gromacs/topology/index.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/cstringutil.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/smalloc.h"
-
-static real dointerp(int n, rvec x1[], rvec x2[], rvec xx[],
- int I, int N, real first, real last)
-{
- int i, j;
- double fac, fac0, fac1;
-
- fac = first + (I*(last-first))/(N-1);
- fac0 = 1-fac;
- fac1 = fac;
- for (i = 0; (i < n); i++)
- {
- for (j = 0; (j < DIM); j++)
- {
- xx[i][j] = fac0*x1[i][j] + fac1*x2[i][j];
- }
- }
-
- return fac;
-}
-
-int gmx_morph(int argc, char *argv[])
-{
- const char *desc[] = {
- "[THISMODULE] does a linear interpolation of conformations in order to",
- "create intermediates. Of course these are completely unphysical, but",
- "that you may try to justify yourself. Output is in the form of a ",
- "generic trajectory. The number of intermediates can be controlled with",
- "the [TT]-ninterm[tt] flag. The first and last flag correspond to the way of",
- "interpolating: 0 corresponds to input structure 1 while",
- "1 corresponds to input structure 2.",
- "If you specify [TT]-first[tt] < 0 or [TT]-last[tt] > 1 extrapolation will be",
- "on the path from input structure x[SUB]1[sub] to x[SUB]2[sub]. In general, the coordinates",
- "of the intermediate x(i) out of N total intermediates correspond to:[PAR]",
- "x(i) = x[SUB]1[sub] + (first+(i/(N-1))*(last-first))*(x[SUB]2[sub]-x[SUB]1[sub])[PAR]",
- "Finally the RMSD with respect to both input structures can be computed",
- "if explicitly selected ([TT]-or[tt] option). In that case, an index file may be",
- "read to select the group from which the RMS is computed."
- };
- t_filenm fnm[] = {
- { efSTX, "-f1", "conf1", ffREAD },
- { efSTX, "-f2", "conf2", ffREAD },
- { efTRX, "-o", "interm", ffWRITE },
- { efXVG, "-or", "rms-interm", ffOPTWR },
- { efNDX, "-n", "index", ffOPTRD }
- };
-#define NFILE asize(fnm)
- static int ninterm = 11;
- static real first = 0.0;
- static real last = 1.0;
- static gmx_bool bFit = TRUE;
- t_pargs pa [] = {
- { "-ninterm", FALSE, etINT, {&ninterm},
- "Number of intermediates" },
- { "-first", FALSE, etREAL, {&first},
- "Corresponds to first generated structure (0 is input x[SUB]1[sub], see above)" },
- { "-last", FALSE, etREAL, {&last},
- "Corresponds to last generated structure (1 is input x[SUB]2[sub], see above)" },
- { "-fit", FALSE, etBOOL, {&bFit},
- "Do a least squares fit of the second to the first structure before interpolating" }
- };
- const char *leg[] = { "Ref = 1\\Sst\\N conf", "Ref = 2\\Snd\\N conf" };
- FILE *fp = nullptr;
- int i, isize, is_lsq, nat1, nat2;
- t_trxstatus *status;
- int *index, *index_lsq, *index_all, *dummy;
- rvec *x1, *x2, *xx;
- matrix box;
- real rms1, rms2, fac, *mass;
- char *grpname;
- gmx_bool bRMS;
- gmx_output_env_t *oenv;
-
- if (!parse_common_args(&argc, argv, PCA_CAN_VIEW,
- NFILE, fnm, asize(pa), pa, asize(desc), desc,
- 0, nullptr, &oenv))
- {
- return 0;
- }
-
- t_topology *top;
- snew(top, 1);
- read_tps_conf(opt2fn("-f1", NFILE, fnm), top, nullptr, &x1, nullptr, box, FALSE);
- nat1 = top->atoms.nr;
- read_tps_conf(opt2fn("-f2", NFILE, fnm), top, nullptr, &x2, nullptr, box, FALSE);
- nat2 = top->atoms.nr;
- if (nat1 != nat2)
- {
- gmx_fatal(FARGS, "Number of atoms in first structure is %d, in second %d",
- nat1, nat2);
- }
- snew(xx, nat1);
- t_atoms &atoms = top->atoms;
-
- snew(mass, nat1);
- snew(index_all, nat1);
- for (i = 0; (i < nat1); i++)
- {
- mass[i] = 1;
- index_all[i] = i;
- }
- if (bFit)
- {
- printf("Select group for LSQ superposition:\n");
- get_index(&atoms, opt2fn_null("-n", NFILE, fnm), 1, &is_lsq, &index_lsq,
- &grpname);
- reset_x(is_lsq, index_lsq, nat1, index_all, x1, mass);
- reset_x(is_lsq, index_lsq, nat1, index_all, x2, mass);
- do_fit(nat1, mass, x1, x2);
- }
-
- bRMS = opt2bSet("-or", NFILE, fnm);
- if (bRMS)
- {
- fp = xvgropen(opt2fn("-or", NFILE, fnm), "RMSD", "Conf", "(nm)", oenv);
- xvgr_legend(fp, asize(leg), leg, oenv);
- printf("Select group for RMSD calculation:\n");
- get_index(&atoms, opt2fn_null("-n", NFILE, fnm), 1, &isize, &index, &grpname);
- printf("You selected group %s, containing %d atoms\n", grpname, isize);
- rms1 = rmsdev_ind(isize, index, mass, x1, x2);
- fprintf(stderr, "RMSD between input conformations is %g nm\n", rms1);
- }
-
- snew(dummy, nat1);
- for (i = 0; (i < nat1); i++)
- {
- dummy[i] = i;
- }
- status = open_trx(ftp2fn(efTRX, NFILE, fnm), "w");
-
- for (i = 0; (i < ninterm); i++)
- {
- fac = dointerp(nat1, x1, x2, xx, i, ninterm, first, last);
- write_trx(status, nat1, dummy, &atoms, i, fac, box, xx, nullptr, nullptr);
- if (bRMS)
- {
- rms1 = rmsdev_ind(isize, index, mass, x1, xx);
- rms2 = rmsdev_ind(isize, index, mass, x2, xx);
- fprintf(fp, "%10g %10g %10g\n", fac, rms1, rms2);
- }
- }
-
- close_trx(status);
-
- if (bRMS)
- {
- xvgrclose(fp);
- do_view(oenv, opt2fn("-or", NFILE, fnm), "-nxy");
- }
-
- return 0;
-}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/commandline/pargs.h"
#include "gromacs/commandline/viewit.h"
+#include "gromacs/compat/make_unique.h"
#include "gromacs/fileio/confio.h"
#include "gromacs/fileio/trxio.h"
#include "gromacs/fileio/xvgr.h"
#include "gromacs/math/functions.h"
#include "gromacs/math/utilities.h"
#include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
#include "gromacs/pbcutil/rmpbc.h"
#include "gromacs/statistics/statistics.h"
#include "gromacs/topology/index.h"
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/smalloc.h"
-#define FACTOR 1000.0 /* Convert nm^2/ps to 10e-5 cm^2/s */
+static constexpr double diffusionConversionFactor = 1000.0; /* Convert nm^2/ps to 10e-5 cm^2/s */
/* NORMAL = total diffusion coefficient (default). X,Y,Z is diffusion
coefficient in X,Y,Z direction. LATERAL is diffusion coefficient in
plane perpendicular to axis
NOT_USED, NORMAL, X, Y, Z, LATERAL
} msd_type;
-typedef struct {
- real t0; /* start time and time increment between */
- real delta_t; /* time between restart points */
- real beginfit, /* the begin/end time for fits as reals between */
- endfit; /* 0 and 1 */
- real dim_factor; /* the dimensionality factor for the diffusion
- constant */
- real **data; /* the displacement data. First index is the group
- number, second is frame number */
- real *time; /* frame time */
- real *mass; /* masses for mass-weighted msd */
- matrix **datam;
- rvec **x0; /* original positions */
- rvec *com; /* center of mass correction for each frame */
- gmx_stats_t **lsq; /* fitting stats for individual molecule msds */
- msd_type type; /* the type of msd to calculate (lateral, etc.)*/
- int axis; /* the axis along which to calculate */
- int ncoords;
- int nrestart; /* number of restart points */
- int nmol; /* number of molecules (for bMol) */
- int nframes; /* number of frames */
- int nlast;
- int ngrp; /* number of groups to use for msd calculation */
- int *n_offs;
- int **ndata; /* the number of msds (particles/mols) per data
- point. */
-} t_corr;
-
-typedef real t_calc_func (t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
- const rvec dcom, gmx_bool bTen, matrix mat);
-
-static real thistime(t_corr *curr)
-{
- return curr->time[curr->nframes];
-}
-
-static int in_data(t_corr *curr, int nx00)
-{
- return curr->nframes-curr->n_offs[nx00];
-}
-
-static t_corr *init_corr(int nrgrp, int type, int axis, real dim_factor,
- int nmol, gmx_bool bTen, gmx_bool bMass, real dt, const t_topology *top,
- real beginfit, real endfit)
-{
- t_corr *curr;
- int i;
-
- snew(curr, 1);
- curr->type = static_cast<msd_type>(type);
- curr->axis = axis;
- curr->ngrp = nrgrp;
- curr->nrestart = 0;
- curr->delta_t = dt;
- curr->beginfit = (1 - 2*GMX_REAL_EPS)*beginfit;
- curr->endfit = (1 + 2*GMX_REAL_EPS)*endfit;
- curr->x0 = nullptr;
- curr->n_offs = nullptr;
- curr->nframes = 0;
- curr->nlast = 0;
- curr->dim_factor = dim_factor;
-
- snew(curr->ndata, nrgrp);
- snew(curr->data, nrgrp);
- if (bTen)
+// TODO : Group related fields into a struct
+struct t_corr {
+ real t0; /* start time and time increment between */
+ real delta_t; /* time between restart points */
+ real beginfit, /* the begin/end time for fits as reals between */
+ endfit; /* 0 and 1 */
+ real dim_factor; /* the dimensionality factor for the diffusion
+ constant */
+ std::vector< std::vector<real> > data; /* the displacement data. First index is the group
+ number, second is frame number */
+ std::vector<real> time; /* frame time */
+ std::vector<real> mass; /* masses for mass-weighted msd */
+ matrix **datam;
+ std::vector< std::vector<gmx::RVec> > x0; /* original positions */
+ std::vector<gmx::RVec> com; /* center of mass correction for each frame */
+ gmx_stats_t **lsq; /* fitting stats for individual molecule msds */
+ msd_type type; /* the type of msd to calculate (lateral, etc.)*/
+ int axis; /* the axis along which to calculate */
+ int ncoords;
+ int nrestart; /* number of restart points */
+ int nmol; /* number of molecules (for bMol) */
+ int nframes; /* number of frames */
+ int nlast;
+ int ngrp; /* number of groups to use for msd calculation */
+ std::vector<int> n_offs;
+ std::vector< std::vector<int> > ndata; /* the number of msds (particles/mols) per data
+ point. */
+ t_corr(int nrgrp, int type, int axis, real dim_factor, int nrmol,
+ gmx_bool bTen, gmx_bool bMass, real dt, const t_topology *top,
+ real beginfit, real endfit) :
+ t0(0),
+ delta_t(dt),
+ beginfit((1 - 2*GMX_REAL_EPS)*beginfit),
+ endfit((1 + 2*GMX_REAL_EPS)*endfit),
+ dim_factor(dim_factor),
+ data(nrgrp, std::vector<real>()),
+ datam(nullptr),
+ lsq(nullptr),
+ type(static_cast<msd_type>(type)),
+ axis(axis),
+ ncoords(0),
+ nrestart(0),
+ nmol(nrmol),
+ nframes(0),
+ nlast(0),
+ ngrp(nrgrp),
+ ndata(nrgrp, std::vector<int>())
{
- snew(curr->datam, nrgrp);
- }
- for (i = 0; (i < nrgrp); i++)
- {
- curr->ndata[i] = nullptr;
- curr->data[i] = nullptr;
+
if (bTen)
{
- curr->datam[i] = nullptr;
+ snew(datam, nrgrp);
+ for (int i = 0; i < nrgrp; i++)
+ {
+ datam[i] = nullptr;
+ }
}
- }
- curr->time = nullptr;
- curr->lsq = nullptr;
- curr->nmol = nmol;
- if (curr->nmol > 0)
- {
- snew(curr->mass, curr->nmol);
- for (i = 0; i < curr->nmol; i++)
+
+ if (nmol > 0)
{
- curr->mass[i] = 1;
+ mass.resize(nmol, 1);
+ }
+ else
+ {
+ if (bMass)
+ {
+ const t_atoms *atoms = &top->atoms;
+ mass.resize(atoms->nr);
+ for (int i = 0; (i < atoms->nr); i++)
+ {
+ mass[i] = atoms->atom[i].m;
+ }
+ }
}
}
- else
+ ~t_corr()
{
- if (bMass)
+ for (int i = 0; i < nrestart; i++)
{
- const t_atoms *atoms = &top->atoms;
- snew(curr->mass, atoms->nr);
- for (i = 0; (i < atoms->nr); i++)
+ for (int j = 0; j < nmol; j++)
{
- curr->mass[i] = atoms->atom[i].m;
+ gmx_stats_free(lsq[i][j]);
}
}
+ sfree(lsq);
}
+};
+
+typedef real t_calc_func (t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
+ const rvec dcom, gmx_bool bTen, matrix mat);
- return curr;
+static real thistime(t_corr *curr)
+{
+ return curr->time[curr->nframes];
+}
+
+static int in_data(t_corr *curr, int nx00)
+{
+ return curr->nframes-curr->n_offs[nx00];
}
static void corr_print(t_corr *curr, gmx_bool bTen, const char *fn, const char *title,
{
if ((thistime(curr) >= (curr->nlast*curr->delta_t)) && (nr == 0))
{
- std::memcpy(curr->x0[curr->nlast], xc, curr->ncoords*sizeof(xc[0]));
+ std::memcpy(curr->x0[curr->nlast].data()->as_vec(), xc, curr->ncoords*sizeof(xc[0]));
curr->n_offs[curr->nlast] = curr->nframes;
copy_rvec(com, curr->com[curr->nlast]);
curr->nlast++;
}
}
-/* the non-mass-weighted mean-squared displacement calcuation */
+/* the non-mass-weighted mean-squared displacement calculation */
static real calc1_norm(t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
const rvec dcom, gmx_bool bTen, matrix mat)
{
const char *fn_pdb, const int *molindex, const t_topology *top,
rvec *x, int ePBC, matrix box, const gmx_output_env_t *oenv)
{
-#define NDIST 100
FILE *out;
gmx_stats_t lsq1;
int i, j;
t_pdbinfo *pdbinfo = nullptr;
const int *mol2a = nullptr;
- out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D", oenv);
+ out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D (1e-5 cm^2/s)", oenv);
if (fn_pdb)
{
}
gmx_stats_get_ab(lsq1, elsqWEIGHT_NONE, &a, &b, nullptr, nullptr, nullptr, nullptr);
gmx_stats_free(lsq1);
- D = a*FACTOR/curr->dim_factor;
+ D = a*diffusionConversionFactor/curr->dim_factor;
if (D < 0)
{
D = 0;
*/
static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int ePBC,
gmx_bool bMol, int gnx[], int *index[],
- t_calc_func *calc1, gmx_bool bTen, int *gnx_com, int *index_com[],
+ t_calc_func *calc1, gmx_bool bTen, gmx::ArrayRef<const int> gnx_com, int *index_com[],
real dt, real t_pdb, rvec **x_pdb, matrix box_pdb,
const gmx_output_env_t *oenv)
{
#ifdef DEBUG
fprintf(stderr, "Read %d atoms for first frame\n", natoms);
#endif
- if ((gnx_com != nullptr) && natoms < top->atoms.nr)
+ if ((!gnx_com.empty()) && natoms < top->atoms.nr)
{
fprintf(stderr, "WARNING: The trajectory only contains part of the system (%d of %d atoms) and therefore the COM motion of only this part of the system will be removed\n", natoms, top->atoms.nr);
}
// if com is requested, the data structure needs to be large enough to do this
// to prevent overflow
- if (bMol && !gnx_com)
+ if (bMol && gnx_com.empty())
{
curr->ncoords = curr->nmol;
snew(xa[0], curr->ncoords);
{
curr->nrestart++;
- srenew(curr->x0, curr->nrestart);
- snew(curr->x0[curr->nrestart-1], curr->ncoords);
- srenew(curr->com, curr->nrestart);
- srenew(curr->n_offs, curr->nrestart);
+ curr->x0.resize(curr->nrestart);
+ curr->x0[curr->nrestart-1].resize(curr->ncoords);
+ curr->com.resize(curr->nrestart);
+ curr->n_offs.resize(curr->nrestart);
srenew(curr->lsq, curr->nrestart);
snew(curr->lsq[curr->nrestart-1], curr->nmol);
for (i = 0; i < curr->nmol; i++)
{
for (i = 0; (i < curr->ngrp); i++)
{
- curr->ndata[i] = nullptr;
- curr->data[i] = nullptr;
if (bTen)
{
curr->datam[i] = nullptr;
}
}
- curr->time = nullptr;
}
maxframes += 10;
for (i = 0; (i < curr->ngrp); i++)
{
- srenew(curr->ndata[i], maxframes);
- srenew(curr->data[i], maxframes);
+ curr->ndata[i].resize(maxframes);
+ curr->data[i].resize(maxframes);
if (bTen)
{
srenew(curr->datam[i], maxframes);
}
}
}
- srenew(curr->time, maxframes);
+ curr->time.resize(maxframes);
}
/* set the time */
}
/* calculate the center of mass */
- if (gnx_com)
+ if (!gnx_com.empty())
{
calc_com(bMol, gnx_com[0], index_com[0], xa[cur], xa[prev], box,
&top->atoms, com);
for (i = 0; (i < curr->ngrp); i++)
{
/* calculate something useful, like mean square displacements */
- calc_corr(curr, i, gnx[i], index[i], xa[cur], (gnx_com != nullptr), com,
+ calc_corr(curr, i, gnx[i], index[i], xa[cur], (!gnx_com.empty()), com,
calc1, bTen);
}
cur = prev;
int type, real dim_factor, int axis,
real dt, real beginfit, real endfit, const gmx_output_env_t *oenv)
{
- t_corr *msd;
- int *gnx; /* the selected groups' sizes */
- int **index; /* selected groups' indices */
- char **grpname;
- int i, i0, i1, j, N, nat_trx;
- real *DD, *SigmaD, a, a2, b, r, chi2;
- rvec *x = nullptr;
- matrix box;
- int *gnx_com = nullptr; /* the COM removal group size */
- int **index_com = nullptr; /* the COM removal group atom indices */
- char **grpname_com = nullptr; /* the COM removal group name */
-
- snew(gnx, nrgrp);
+ std::unique_ptr<t_corr> msd;
+ std::vector<int> gnx, gnx_com; /* the selected groups' sizes */
+ int **index; /* selected groups' indices */
+ char **grpname;
+ int i, i0, i1, j, N, nat_trx;
+ std::vector<real> SigmaD, DD;
+ real a, a2, b, r, chi2;
+ rvec *x = nullptr;
+ matrix box;
+ int **index_com = nullptr; /* the COM removal group atom indices */
+ char **grpname_com = nullptr; /* the COM removal group name */
+
+ gnx.resize(nrgrp);
snew(index, nrgrp);
snew(grpname, nrgrp);
fprintf(stderr, "\nSelect a group to calculate mean squared displacement for:\n");
- get_index(&top->atoms, ndx_file, nrgrp, gnx, index, grpname);
+ get_index(&top->atoms, ndx_file, nrgrp, gnx.data(), index, grpname);
if (bRmCOMM)
{
- snew(gnx_com, 1);
+ gnx_com.resize(1);
snew(index_com, 1);
snew(grpname_com, 1);
fprintf(stderr, "\nNow select a group for center of mass removal:\n");
- get_index(&top->atoms, ndx_file, 1, gnx_com, index_com, grpname_com);
+ get_index(&top->atoms, ndx_file, 1, gnx_com.data(), index_com, grpname_com);
}
if (mol_file)
index_atom2mol(&gnx[0], index[0], &top->mols);
}
- msd = init_corr(nrgrp, type, axis, dim_factor,
- mol_file == nullptr ? 0 : gnx[0], bTen, bMW, dt, top,
- beginfit, endfit);
+ msd = gmx::compat::make_unique<t_corr>(nrgrp, type, axis, dim_factor,
+ mol_file == nullptr ? 0 : gnx[0],
+ bTen, bMW, dt, top, beginfit, endfit);
nat_trx =
- corr_loop(msd, trx_file, top, ePBC, mol_file ? gnx[0] != 0 : false, gnx, index,
+ corr_loop(msd.get(), trx_file, top, ePBC, mol_file ? gnx[0] != 0 : false, gnx.data(), index,
(mol_file != nullptr) ? calc1_mol : (bMW ? calc1_mw : calc1_norm),
bTen, gnx_com, index_com, dt, t_pdb,
pdb_file ? &x : nullptr, box, oenv);
{
snew(top->atoms.pdbinfo, top->atoms.nr);
}
- printmol(msd, mol_file, pdb_file, index[0], top, x, ePBC, box, oenv);
+ printmol(msd.get(), mol_file, pdb_file, index[0], top, x, ePBC, box, oenv);
top->atoms.nr = i;
}
- DD = nullptr;
- SigmaD = nullptr;
-
if (beginfit == -1)
{
i0 = gmx::roundToInt(0.1*(msd->nframes - 1));
}
else
{
- snew(DD, msd->ngrp);
- snew(SigmaD, msd->ngrp);
+ DD.resize(msd->ngrp);
+ SigmaD.resize(msd->ngrp);
for (j = 0; j < msd->ngrp; j++)
{
if (N >= 4)
SigmaD[j] = 0;
}
lsq_y_ax_b(N, &(msd->time[i0]), &(msd->data[j][i0]), &(DD[j]), &b, &r, &chi2);
- DD[j] *= FACTOR/msd->dim_factor;
- SigmaD[j] *= FACTOR/msd->dim_factor;
+ DD[j] *= diffusionConversionFactor/msd->dim_factor;
+ SigmaD[j] *= diffusionConversionFactor/msd->dim_factor;
if (DD[j] > 0.01 && DD[j] < 1e4)
{
fprintf(stdout, "D[%10s] %.4f (+/- %.4f) 1e-5 cm^2/s\n",
}
}
/* Print mean square displacement */
- corr_print(msd, bTen, msd_file,
+ corr_print(msd.get(), bTen, msd_file,
"Mean Square Displacement",
"MSD (nm\\S2\\N)",
- msd->time[msd->nframes-1], beginfit, endfit, DD, SigmaD, grpname, oenv);
+ msd->time[msd->nframes-1], beginfit, endfit, DD.data(), SigmaD.data(), grpname, oenv);
}
int gmx_msd(int argc, char *argv[])
&top, ePBC, bTen, bMW, bRmCOMM, type, dim_factor, axis, dt, beginfit, endfit,
oenv);
+ done_top(&top);
view_all(oenv, NFILE, fnm);
return 0;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/topology/mtop_lookup.h"
#include "gromacs/topology/mtop_util.h"
#include "gromacs/topology/topology.h"
+#include "gromacs/trajectoryanalysis/topologyinformation.h"
#include "gromacs/utility/arraysize.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
done_top_mtop(&top, &mtop);
}
-static int get_bounds(const char *topnm,
- real **bounds, int **index, int **dr_pair, int *npairs,
- gmx_mtop_t *mtop, gmx_localtop_t **ltop, t_inputrec *ir)
+static int get_bounds(real **bounds, int **index, int **dr_pair, int *npairs,
+ gmx_localtop_t *top)
{
- gmx_localtop_t *top;
t_functype *functype;
t_iparams *ip;
- int natoms, i, j, k, type, ftype, natom;
+ int i, j, k, type, ftype, natom;
t_ilist *disres;
t_iatom *iatom;
real *b;
int *ind, *pair;
int nb, label1;
- matrix box;
-
- read_tpx(topnm, ir, box, &natoms, nullptr, nullptr, mtop);
- snew(*ltop, 1);
- top = gmx_mtop_generate_local_top(mtop, ir->efep != efepNO);
- *ltop = top;
functype = top->idef.functype;
ip = top->idef.iparams;
};
FILE /* *out = NULL,*/ *out_disre = nullptr, *fp_pairs = nullptr, *fort = nullptr, *fodt = nullptr, *foten = nullptr;
- ener_file_t fp;
- int timecheck = 0;
- gmx_mtop_t mtop;
- gmx_localtop_t *top = nullptr;
- gmx_enxnm_t *enm = nullptr;
- t_enxframe fr;
- int nre, teller, teller_disre;
- int nor = 0, nex = 0, norfr = 0, enx_i = 0;
- real *bounds = nullptr, *violaver = nullptr, *oobs = nullptr, *orient = nullptr, *odrms = nullptr;
- int *index = nullptr, *pair = nullptr, norsel = 0, *orsel = nullptr, *or_label = nullptr;
- int nbounds = 0, npairs;
- gmx_bool bDisRe, bDRAll, bORA, bORT, bODA, bODR, bODT, bORIRE, bOTEN;
- gmx_bool bCont;
- double sumaver, sumt;
- int *set = nullptr, i, j, k, nset, sss;
- char **pairleg, **odtleg, **otenleg;
- char **leg = nullptr;
- const char *anm_j, *anm_k, *resnm_j, *resnm_k;
- int resnr_j, resnr_k;
- const char *orinst_sub = "@ subtitle \"instantaneous\"\n";
- char buf[256];
- gmx_output_env_t *oenv;
- t_enxblock *blk_disre = nullptr;
- int ndisre = 0;
-
- t_filenm fnm[] = {
+ ener_file_t fp;
+ int timecheck = 0;
+ gmx_localtop_t top;
+ gmx_enxnm_t *enm = nullptr;
+ t_enxframe fr;
+ int nre, teller, teller_disre;
+ int nor = 0, nex = 0, norfr = 0, enx_i = 0;
+ real *bounds = nullptr, *violaver = nullptr, *oobs = nullptr, *orient = nullptr, *odrms = nullptr;
+ int *index = nullptr, *pair = nullptr, norsel = 0, *orsel = nullptr, *or_label = nullptr;
+ int nbounds = 0, npairs;
+ gmx_bool bDisRe, bDRAll, bORA, bORT, bODA, bODR, bODT, bORIRE, bOTEN;
+ gmx_bool bCont;
+ double sumaver, sumt;
+ int *set = nullptr, i, j, k, nset, sss;
+ char **pairleg, **odtleg, **otenleg;
+ char **leg = nullptr;
+ const char *anm_j, *anm_k, *resnm_j, *resnm_k;
+ int resnr_j, resnr_k;
+ const char *orinst_sub = "@ subtitle \"instantaneous\"\n";
+ char buf[256];
+ gmx_output_env_t *oenv;
+ t_enxblock *blk_disre = nullptr;
+ int ndisre = 0;
+
+ t_filenm fnm[] = {
{ efEDR, "-f", nullptr, ffREAD },
{ efEDR, "-f2", nullptr, ffOPTRD },
{ efTPR, "-s", nullptr, ffOPTRD },
{ efXVG, "-oten", "oriten", ffOPTWR }
};
#define NFILE asize(fnm)
- int npargs;
+ int npargs;
npargs = asize(pa);
if (!parse_common_args(&argc, argv,
do_enxnms(fp, &nre, &enm);
free_enxnms(nre, enm);
- t_inputrec irInstance;
- t_inputrec *ir = &irInstance;
+ t_inputrec irInstance;
+ t_inputrec *ir = &irInstance;
init_enxframe(&fr);
-
+ gmx::TopologyInformation topInfo;
if (!bDisRe)
{
if (bORIRE || bOTEN)
}
else
{
- nbounds = get_bounds(ftp2fn(efTPR, NFILE, fnm), &bounds, &index, &pair, &npairs,
- &mtop, &top, ir);
+ {
+ topInfo.fillFromInputFile(ftp2fn(efTPR, NFILE, fnm));
+ gmx_mtop_generate_local_top(*topInfo.mtop(), &top, ir->efep != efepNO);
+ }
+ nbounds = get_bounds(&bounds, &index, &pair, &npairs,
+ &top);
snew(violaver, npairs);
out_disre = xvgropen(opt2fn("-o", NFILE, fnm), "Sum of Violations",
"Time (ps)", "nm", oenv);
t_iatom *fa;
t_iparams *ip;
- fa = top->idef.il[F_DISRES].iatoms;
- ip = top->idef.iparams;
+ fa = top.idef.il[F_DISRES].iatoms;
+ ip = top.idef.iparams;
if (blk_disre->nsub != 2 ||
(blk_disre->sub[0].nr != blk_disre->sub[1].nr) )
{
}
ndisre = blk_disre->sub[0].nr;
- if (ndisre != top->idef.il[F_DISRES].nr/3)
+ if (ndisre != top.idef.il[F_DISRES].nr/3)
{
gmx_fatal(FARGS, "Number of disre pairs in the energy file (%d) does not match the number in the run input file (%d)\n",
- ndisre, top->idef.il[F_DISRES].nr/3);
+ ndisre, top.idef.il[F_DISRES].nr/3);
}
snew(pairleg, ndisre);
int molb = 0;
snew(pairleg[i], 30);
j = fa[3*i+1];
k = fa[3*i+2];
- mtopGetAtomAndResidueName(&mtop, j, &molb, &anm_j, &resnr_j, &resnm_j, nullptr);
- mtopGetAtomAndResidueName(&mtop, k, &molb, &anm_k, &resnr_k, &resnm_k, nullptr);
+ mtopGetAtomAndResidueName(topInfo.mtop(), j, &molb, &anm_j, &resnr_j, &resnm_j, nullptr);
+ mtopGetAtomAndResidueName(topInfo.mtop(), k, &molb, &anm_k, &resnr_k, &resnm_k, nullptr);
sprintf(pairleg[i], "%d %s %d %s (%d)",
resnr_j, anm_j, resnr_k, anm_k,
ip[fa[3*i]].disres.label);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
static int prepare_x_q(real *q[], rvec *x[], const gmx_mtop_t *mtop, const rvec x_orig[], t_commrec *cr)
{
- int i;
int nq; /* number of charged particles */
- gmx_mtop_atomloop_all_t aloop;
if (MASTER(cr))
snew(*x, mtop->natoms);
nq = 0;
- aloop = gmx_mtop_atomloop_all_init(mtop);
- const t_atom *atom;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- if (is_charge(atom->q))
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ if (is_charge(local.q))
{
- (*q)[nq] = atom->q;
+ (*q)[nq] = local.q;
(*x)[nq][XX] = x_orig[i][XX];
(*x)[nq][YY] = x_orig[i][YY];
(*x)[nq][ZZ] = x_orig[i][ZZ];
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/topology/index.h"
struct gmx_output_env_t;
-struct gmx_residuetype_t;
+class ResidueType;
/* must correspond with 'leg' g_chi.c:727 */
enum {
t_dlist *mk_dlist(FILE *log,
const t_atoms *atoms, int *nlist,
gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bHChi,
- int maxchi, int r0, struct gmx_residuetype_t *rt);
+ int maxchi, int r0, ResidueType *rt);
void pr_dlist(FILE *fp, int nl, t_dlist dl[], real dt, int printtype,
gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bOmega, int maxchi);
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
entropy.cpp
gmx_traj.cpp
gmx_trjconv.cpp
+ gmx_mindist.cpp
gmx_msd.cpp
)
gmx_register_gtest_test(GmxAnaTest ${exename} INTEGRATION_TEST)
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Tests for gmx mindist.
+ *
+ * \author Kevin Boyd <kevin.boyd@uconn.edu>
+ */
+
+#include "gmxpre.h"
+
+#include <cstdio>
+#include <cstdlib>
+
+#include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/utility/futil.h"
+#include "gromacs/utility/path.h"
+#include "gromacs/utility/textreader.h"
+
+#include "testutils/cmdlinetest.h"
+#include "testutils/refdata.h"
+#include "testutils/stdiohelper.h"
+#include "testutils/testfilemanager.h"
+#include "testutils/textblockmatchers.h"
+#include "testutils/xvgtest.h"
+
+namespace
+{
+
+using gmx::test::CommandLine;
+using gmx::test::XvgMatch;
+using gmx::test::StdioTestHelper;
+
+class MindistTest : public gmx::test::CommandLineTestBase
+{
+ public:
+ MindistTest()
+ {
+ setInputFile("-f", "mindist_coords.gro");
+ setInputFile("-s", "mindist_coords.gro");
+ setInputFile("-n", "mindist.ndx");
+ }
+
+ void runTest(const CommandLine &args, const char * stringForStdin)
+ {
+ StdioTestHelper stdioHelper(&fileManager());
+ stdioHelper.redirectStringToStdin(stringForStdin);
+
+ CommandLine &cmdline = commandLine();
+ cmdline.merge(args);
+ ASSERT_EQ(0, gmx_mindist(cmdline.argc(), cmdline.argv()));
+ checkOutputFiles();
+ }
+};
+
+/* mindist_coords.pdb has 3 beads spaced out in a 5 nm box, with the same yz coordinates
+ * and x coordinates of 1, 4, and 4.5. Indices are as follows
+ * index 0 : atom 1
+ * index 1 : atom 2
+ * index 2 : atom 3
+ * index 3 : atoms (1 ,2)
+ * index 4 : atoms (2, 3)
+ * index 5 : atoms (1, 2, 3)
+ */
+
+// Mindist between beads 0 and 1 should = 2 (across periodic boundaries)
+TEST_F(MindistTest, mindistWorksWithSingleAtoms)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist"
+ };
+ const char * const stdIn = "0 1";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+// Mindist between group (0, 1) and bead 2 should = 0.5
+TEST_F(MindistTest, mindistWorksWithMultipleAtoms)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist"
+ };
+ const char * const stdIn = "2 3";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Should have 0 contacts with default cutoff */
+TEST_F(MindistTest, mindistDoesNotPickUpContacts)
+{
+ setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+ const char * const cmdline[] = {
+ "mindist"
+ };
+ const char * const stdIn = "0 1";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Should pick up one contact with 2.5 nm cutoff */
+TEST_F(MindistTest, mindistPicksUpContacts)
+{
+ setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-d", "2.5",
+ };
+ const char * const stdIn = "0 1";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+TEST_F(MindistTest, ngWorks)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-ng", "2",
+ };
+ const char * const stdIn = "0 1 2";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+// 2 contacts within this cutoff, but only one should be reported
+TEST_F(MindistTest, groupWorks)
+{
+ setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-group", "-d", "3"
+ };
+ const char * const stdIn = "3, 2";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+// Maximum distance between group (1, 2) and atom 3
+TEST_F(MindistTest, maxDistWorks)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-max"
+ };
+ const char * const stdIn = "2 3";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Particles 1 and 2 are 2 nm away through pbc, but
+ should be 3 nm away with no pbc */
+TEST_F(MindistTest, noPbcWorks)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-nopbc"
+ };
+ const char * const stdIn = "0 1";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+// Group (1, 2), each res compared to particle 3
+TEST_F(MindistTest, resPerTimeWorks)
+{
+ setOutputFile("-or", "respertime.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-respertime"
+ };
+ const char * const stdIn = "3 2";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+TEST_F(MindistTest, matrixWorks)
+{
+ setOutputFile("-od", "mindist.xvg", XvgMatch());
+ const char *const cmdline[] = {
+ "mindist", "-matrix"
+ };
+ const char * const stdIn = "5";
+ runTest(CommandLine(cmdline), stdIn);
+}
+
+// TODO test periodic image - needs a tpr?
+
+} //namespace
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gmxpre.h"
+#include <cstdio>
+#include <cstdlib>
+
#include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/gmxpreprocess/grompp.h"
#include "gromacs/utility/futil.h"
+#include "gromacs/utility/path.h"
#include "gromacs/utility/textreader.h"
#include "testutils/cmdlinetest.h"
}
};
+class MsdMolTest : public gmx::test::CommandLineTestBase
+{
+ public:
+ MsdMolTest()
+ {
+ double tolerance = 1e-5;
+ XvgMatch xvg;
+ XvgMatch &toler = xvg.tolerance(gmx::test::relativeToleranceAsFloatingPoint(1, tolerance));
+ setOutputFile("-mol", "msdmol.xvg", toler);
+ }
+
+ void runTest(const CommandLine &args, const char *ndxfile,
+ const std::string &simulationName)
+ {
+ setInputFile("-f", simulationName + ".pdb");
+ std::string tpr = fileManager().getTemporaryFilePath(".tpr");
+ std::string mdp = fileManager().getTemporaryFilePath(".mdp");
+ FILE *fp = fopen(mdp.c_str(), "w");
+ fprintf(fp, "cutoff-scheme = verlet\n");
+ fprintf(fp, "rcoulomb = 0.85\n");
+ fprintf(fp, "rvdw = 0.85\n");
+ fprintf(fp, "rlist = 0.85\n");
+ fclose(fp);
+
+ // Prepare a .tpr file
+ {
+ CommandLine caller;
+ auto simDB = gmx::test::TestFileManager::getTestSimulationDatabaseDirectory();
+ auto base = gmx::Path::join(simDB, simulationName);
+ caller.append("grompp");
+ caller.addOption("-maxwarn", 0);
+ caller.addOption("-f", mdp.c_str());
+ std::string gro = (base + ".pdb");
+ caller.addOption("-c", gro.c_str());
+ std::string top = (base + ".top");
+ caller.addOption("-p", top.c_str());
+ std::string ndx = (base + ".ndx");
+ caller.addOption("-n", ndx.c_str());
+ caller.addOption("-o", tpr.c_str());
+ ASSERT_EQ(0, gmx_grompp(caller.argc(), caller.argv()));
+ }
+ // Run the MSD analysis
+ {
+ setInputFile("-n", ndxfile);
+ CommandLine &cmdline = commandLine();
+ cmdline.merge(args);
+ cmdline.addOption("-s", tpr.c_str());
+ ASSERT_EQ(0, gmx_msd(cmdline.argc(), cmdline.argv()));
+ checkOutputFiles();
+ }
+ }
+};
+
/* msd_traj.xtc contains a 10 frame (1 ps per frame) simulation
* containing 3 atoms, with different starting positions but identical
* displacements. The displacements are calculated to yield the following
};
runTest(CommandLine(cmdline));
}
+
+// Test the diffusion per molecule output, mass weighted
+TEST_F(MsdMolTest, diffMolMassWeighted)
+{
+ const char *const cmdline[] = {
+ "msd", "-trestart", "200"
+ };
+ runTest(CommandLine(cmdline), "spc5.ndx", "spc5");
+}
+
+// Test the diffusion per molecule output, non-mass weighted
+TEST_F(MsdMolTest, diffMolNonMassWeighted)
+{
+ const char *const cmdline[] = {
+ "msd", "-trestart", "200", "-mw", "no"
+ };
+ runTest(CommandLine(cmdline), "spc5.ndx", "spc5");
+}
+
+// Test the diffusion per molecule output, with selection
+TEST_F(MsdMolTest, diffMolSelected)
+{
+ const char *const cmdline[] = {
+ "msd", "-trestart", "200"
+ };
+ runTest(CommandLine(cmdline), "spc5_3.ndx", "spc5");
+}
+
} //namespace
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-on">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 3 nm"
+xaxis label "Time (ps)"
+yaxis label "Number"
+TYPE xy
+s0 legend "atoms12-atom3"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>1</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atoms123-atoms123"
+s1 legend "atoms123-atoms123"
+s2 legend "atoms123-atoms123"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">4</Int>
+ <Real>0.000000e+00</Real>
+ <Real>2.000000e+00</Real>
+ <Real>1.500000e+00</Real>
+ <Real>5.000000e-01</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Maximum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atom3-atoms12"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>1.500000e+00</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-on">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 0.6 nm"
+xaxis label "Time (ps)"
+yaxis label "Number"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>0</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-on">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 2.5 nm"
+xaxis label "Time (ps)"
+yaxis label "Number"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>1</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atom3-atoms12"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>5.000000e-01</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>2.000000e+00</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+s1 legend "atom1-atom3"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">3</Int>
+ <Real>0.000000e+00</Real>
+ <Real>2.000000e+00</Real>
+ <Real>1.500000e+00</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-od">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0.000000e+00</Real>
+ <Real>3.000000e+00</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-or">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis label "Time (ps)"
+yaxis label "Distance (nm)"
+TYPE xy
+s0 legend "atoms12-atom3"
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">3</Int>
+ <Real>0.000000e+00</Real>
+ <Real>1.5</Real>
+ <Real>0.5</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-mol">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis label "Molecule"
+yaxis label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0</Real>
+ <Real>0.747088</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>1</Real>
+ <Real>0.129497</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>2</Real>
+ <Real>1.00167</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>3</Real>
+ <Real>21.2013</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>4</Real>
+ <Real>9.28605</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-mol">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis label "Molecule"
+yaxis label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0</Real>
+ <Real>0.747088</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>1</Real>
+ <Real>0.129497</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>2</Real>
+ <Real>1.00167</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>3</Real>
+ <Real>21.2013</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>4</Real>
+ <Real>9.28605</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <OutputFiles Name="Files">
+ <File Name="-mol">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis label "Molecule"
+yaxis label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>0</Real>
+ <Real>0.747088</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>1</Real>
+ <Real>0.129497</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>2</Real>
+ <Real>21.2013</Real>
+ </Sequence>
+ </XvgData>
+ </File>
+ </OutputFiles>
+</ReferenceData>
void done_commrec(t_commrec *cr)
{
- if (nullptr != cr->dd)
+ if (MASTER(cr))
{
- // TODO: implement
- // done_domdec(cr->dd);
+ if (nullptr != cr->dd)
+ {
+ // TODO: implement
+ // done_domdec(cr->dd);
+ }
+ done_mpi_in_place_buf(cr->mpb);
}
- done_mpi_in_place_buf(cr->mpb);
sfree(cr);
}
+++ /dev/null
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2009, The GROMACS Development Team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
- * and including many others, as listed in the AUTHORS file in the
- * top-level source directory and at http://www.gromacs.org.
- *
- * GROMACS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * GROMACS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GROMACS; if not, see
- * http://www.gnu.org/licenses, or write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * If you want to redistribute modifications to GROMACS, please
- * consider that scientific software is very special. Version
- * control is crucial - bugs must be traceable. We will be happy to
- * consider code for inclusion in the official distribution, but
- * derived work must not be called official GROMACS. Details are found
- * in the README & COPYING files - if they are missing, get the
- * official version at http://www.gromacs.org.
- *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the research papers on the package. Check out http://www.gromacs.org.
- */
-#include "gmxpre.h"
-
-#include "nb_kernel_allvsall.h"
-
-#include "config.h"
-
-#include <cmath>
-
-#include "gromacs/gmxlib/nrnb.h"
-#include "gromacs/math/functions.h"
-#include "gromacs/topology/block.h"
-#include "gromacs/utility/real.h"
-#include "gromacs/utility/smalloc.h"
-
-typedef struct
-{
- real ** pvdwparam;
- int * jindex;
- int ** exclusion_mask;
-}
-gmx_allvsall_data_t;
-
-static int
-calc_maxoffset(int i, int natoms)
-{
- int maxoffset;
-
- if ((natoms % 2) == 1)
- {
- /* Odd number of atoms, easy */
- maxoffset = natoms/2;
- }
- else if ((natoms % 4) == 0)
- {
- /* Multiple of four is hard */
- if (i < natoms/2)
- {
- if ((i % 2) == 0)
- {
- maxoffset = natoms/2;
- }
- else
- {
- maxoffset = natoms/2-1;
- }
- }
- else
- {
- if ((i % 2) == 1)
- {
- maxoffset = natoms/2;
- }
- else
- {
- maxoffset = natoms/2-1;
- }
- }
- }
- else
- {
- /* natoms/2 = odd */
- if ((i % 2) == 0)
- {
- maxoffset = natoms/2;
- }
- else
- {
- maxoffset = natoms/2-1;
- }
- }
-
- return maxoffset;
-}
-
-
-static void
-setup_exclusions_and_indices(gmx_allvsall_data_t * aadata,
- const t_blocka * excl,
- int natoms)
-{
- int i, j, k, iexcl;
- int nj0, nj1;
- int max_offset;
- int max_excl_offset;
-
- /* This routine can appear to be a bit complex, but it is mostly book-keeping.
- * To enable the fast all-vs-all kernel we need to be able to stream through all coordinates
- * whether they should interact or not.
- *
- * To avoid looping over the exclusions, we create a simple mask that is 1 if the interaction
- * should be present, otherwise 0. Since exclusions typically only occur when i & j are close,
- * we create a jindex array with three elements per i atom: the starting point, the point to
- * which we need to check exclusions, and the end point.
- * This way we only have to allocate a short exclusion mask per i atom.
- */
-
- /* Allocate memory for our modified jindex array */
- snew(aadata->jindex, 3*natoms);
-
- /* Pointer to lists with exclusion masks */
- snew(aadata->exclusion_mask, natoms);
-
- for (i = 0; i < natoms; i++)
- {
- /* Start */
- aadata->jindex[3*i] = i+1;
- max_offset = calc_maxoffset(i, natoms);
-
- /* Exclusions */
- nj0 = excl->index[i];
- nj1 = excl->index[i+1];
-
- /* first check the max range */
- max_excl_offset = -1;
-
- for (j = nj0; j < nj1; j++)
- {
- iexcl = excl->a[j];
-
- k = iexcl - i;
-
- if (k+natoms <= max_offset)
- {
- k += natoms;
- }
-
- max_excl_offset = (k > max_excl_offset) ? k : max_excl_offset;
- }
-
- max_excl_offset = (max_offset < max_excl_offset) ? max_offset : max_excl_offset;
-
- aadata->jindex[3*i+1] = i+1+max_excl_offset;
-
-
- snew(aadata->exclusion_mask[i], max_excl_offset);
- /* Include everything by default */
- for (j = 0; j < max_excl_offset; j++)
- {
- /* Use all-ones to mark interactions that should be present, compatible with SSE */
- aadata->exclusion_mask[i][j] = 0xFFFFFFFF;
- }
-
- /* Go through exclusions again */
- for (j = nj0; j < nj1; j++)
- {
- iexcl = excl->a[j];
-
- k = iexcl - i;
-
- if (k+natoms <= max_offset)
- {
- k += natoms;
- }
-
- if (k > 0 && k <= max_excl_offset)
- {
- /* Excluded, kill it! */
- aadata->exclusion_mask[i][k-1] = 0;
- }
- }
-
- /* End */
- aadata->jindex[3*i+2] = i+1+max_offset;
- }
-}
-
-static void
-setup_aadata(gmx_allvsall_data_t ** p_aadata,
- const t_blocka * excl,
- int natoms,
- const int * type,
- int ntype,
- const real * pvdwparam)
-{
- int i, j, idx;
- gmx_allvsall_data_t *aadata;
- real *p;
-
- snew(aadata, 1);
- *p_aadata = aadata;
-
- /* Generate vdw params */
- snew(aadata->pvdwparam, ntype);
-
- for (i = 0; i < ntype; i++)
- {
- snew(aadata->pvdwparam[i], 2*natoms);
- p = aadata->pvdwparam[i];
-
- /* Lets keep it simple and use multiple steps - first create temp. c6/c12 arrays */
- for (j = 0; j < natoms; j++)
- {
- idx = i*ntype+type[j];
- p[2*j] = pvdwparam[2*idx];
- p[2*j+1] = pvdwparam[2*idx+1];
- }
- }
-
- setup_exclusions_and_indices(aadata, excl, natoms);
-}
-
-
-
-void
-nb_kernel_allvsall(t_nblist gmx_unused * nlist,
- rvec * xx,
- rvec * ff,
- struct t_forcerec * fr,
- t_mdatoms * mdatoms,
- nb_kernel_data_t * kernel_data,
- t_nrnb * nrnb)
-{
- gmx_allvsall_data_t *aadata;
- int natoms;
- int ni0, ni1;
- int nj0, nj1, nj2;
- int i, j, k;
- real * charge;
- int * type;
- real facel;
- real * pvdw;
- int ggid;
- int * mask;
-
- real ix, iy, iz, iq;
- real fix, fiy, fiz;
- real jx, jy, jz, qq;
- real dx, dy, dz;
- real tx, ty, tz;
- real rsq, rinv, rinvsq, rinvsix;
- real vcoul, vctot;
- real c6, c12, Vvdw6, Vvdw12, Vvdwtot;
- real fscal;
- const t_blocka *excl;
- real * f;
- real * x;
- real * Vvdw;
- real * Vc;
-
- x = xx[0];
- f = ff[0];
- charge = mdatoms->chargeA;
- type = mdatoms->typeA;
- facel = fr->ic->epsfac;
- natoms = mdatoms->nr;
- ni0 = 0;
- ni1 = mdatoms->homenr;
- aadata = reinterpret_cast<gmx_allvsall_data_t *>(fr->AllvsAll_work);
- excl = kernel_data->exclusions;
-
- Vc = kernel_data->energygrp_elec;
- Vvdw = kernel_data->energygrp_vdw;
-
- if (aadata == nullptr)
- {
- setup_aadata(&aadata, excl, natoms, type, fr->ntype, fr->nbfp);
- fr->AllvsAll_work = aadata;
- }
-
- for (i = ni0; i < ni1; i++)
- {
- /* We assume shifts are NOT used for all-vs-all interactions */
-
- /* Load i atom data */
- ix = x[3*i];
- iy = x[3*i+1];
- iz = x[3*i+2];
- iq = facel*charge[i];
-
- pvdw = aadata->pvdwparam[type[i]];
-
- /* Zero the potential energy for this list */
- Vvdwtot = 0.0;
- vctot = 0.0;
-
- /* Clear i atom forces */
- fix = 0.0;
- fiy = 0.0;
- fiz = 0.0;
-
- /* Load limits for loop over neighbors */
- nj0 = aadata->jindex[3*i];
- nj1 = aadata->jindex[3*i+1];
- nj2 = aadata->jindex[3*i+2];
-
- mask = aadata->exclusion_mask[i];
-
- /* Prologue part, including exclusion mask */
- for (j = nj0; j < nj1; j++, mask++)
- {
- if (*mask != 0)
- {
- k = j%natoms;
-
- /* load j atom coordinates */
- jx = x[3*k];
- jy = x[3*k+1];
- jz = x[3*k+2];
-
- /* Calculate distance */
- dx = ix - jx;
- dy = iy - jy;
- dz = iz - jz;
- rsq = dx*dx+dy*dy+dz*dz;
-
- /* Calculate 1/r and 1/r2 */
- rinv = 1.0/sqrt(rsq);
- rinvsq = rinv*rinv;
-
- /* Load parameters for j atom */
- qq = iq*charge[k];
- c6 = pvdw[2*k];
- c12 = pvdw[2*k+1];
-
- /* Coulomb interaction */
- vcoul = qq*rinv;
- vctot = vctot+vcoul;
-
- /* Lennard-Jones interaction */
- rinvsix = rinvsq*rinvsq*rinvsq;
- Vvdw6 = c6*rinvsix;
- Vvdw12 = c12*rinvsix*rinvsix;
- Vvdwtot = Vvdwtot+Vvdw12-Vvdw6;
- fscal = (vcoul+12.0*Vvdw12-6.0*Vvdw6)*rinvsq;
-
- /* Calculate temporary vectorial force */
- tx = fscal*dx;
- ty = fscal*dy;
- tz = fscal*dz;
-
- /* Increment i atom force */
- fix = fix + tx;
- fiy = fiy + ty;
- fiz = fiz + tz;
-
- /* Decrement j atom force */
- f[3*k] = f[3*k] - tx;
- f[3*k+1] = f[3*k+1] - ty;
- f[3*k+2] = f[3*k+2] - tz;
- }
- /* Inner loop uses 38 flops/iteration */
- }
-
- /* Main part, no exclusions */
- for (j = nj1; j < nj2; j++)
- {
- k = j%natoms;
-
- /* load j atom coordinates */
- jx = x[3*k];
- jy = x[3*k+1];
- jz = x[3*k+2];
-
- /* Calculate distance */
- dx = ix - jx;
- dy = iy - jy;
- dz = iz - jz;
- rsq = dx*dx+dy*dy+dz*dz;
-
- /* Calculate 1/r and 1/r2 */
- rinv = 1.0/sqrt(rsq);
- rinvsq = rinv*rinv;
-
- /* Load parameters for j atom */
- qq = iq*charge[k];
- c6 = pvdw[2*k];
- c12 = pvdw[2*k+1];
-
- /* Coulomb interaction */
- vcoul = qq*rinv;
- vctot = vctot+vcoul;
-
- /* Lennard-Jones interaction */
- rinvsix = rinvsq*rinvsq*rinvsq;
- Vvdw6 = c6*rinvsix;
- Vvdw12 = c12*rinvsix*rinvsix;
- Vvdwtot = Vvdwtot+Vvdw12-Vvdw6;
- fscal = (vcoul+12.0*Vvdw12-6.0*Vvdw6)*rinvsq;
-
- /* Calculate temporary vectorial force */
- tx = fscal*dx;
- ty = fscal*dy;
- tz = fscal*dz;
-
- /* Increment i atom force */
- fix = fix + tx;
- fiy = fiy + ty;
- fiz = fiz + tz;
-
- /* Decrement j atom force */
- f[3*k] = f[3*k] - tx;
- f[3*k+1] = f[3*k+1] - ty;
- f[3*k+2] = f[3*k+2] - tz;
-
- /* Inner loop uses 38 flops/iteration */
- }
-
- f[3*i] += fix;
- f[3*i+1] += fiy;
- f[3*i+2] += fiz;
-
- /* Add potential energies to the group for this list */
- ggid = 0;
-
- Vc[ggid] = Vc[ggid] + vctot;
- Vvdw[ggid] = Vvdw[ggid] + Vvdwtot;
-
- /* Outer loop uses 6 flops/iteration */
- }
-
- /* 12 flops per outer iteration
- * 19 flops per inner iteration
- */
- inc_nrnb(nrnb, eNR_NBKERNEL_ELEC_VDW_VF, (ni1-ni0)*12 + gmx::exactDiv(natoms*(natoms-1), 2)*19);
-}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
kernel_data.lambda = lambda;
kernel_data.dvdl = dvdl;
- if (fr->bAllvsAll)
- {
- gmx_incons("All-vs-all kernels have not been implemented in version 4.6");
- }
-
if (eNL >= 0)
{
i0 = eNL;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{ "NB Generic kernel", 1 },
{ "NB Generic charge grp kernel", 1 },
{ "NB Free energy kernel", 1 },
- { "NB All-vs-all", 1 },
{ "Pair Search distance check", 9 }, /* nbnxn pair dist. check */
/* nbnxn kernel flops are based on inner-loops without exclusion checks.
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
eNR_NBKERNEL_FREE_ENERGY, /* Add other generic kernels _before_ the free energy one */
eNR_NBKERNEL_TOTAL_NR,
- eNR_NBKERNEL_ALLVSALL = eNR_NBKERNEL_TOTAL_NR, // Reuse the symbolic constant that indicates the last kernel
- eNR_NBNXN_DIST2,
+ eNR_NBNXN_DIST2 = eNR_NBKERNEL_TOTAL_NR, // Reuse the symbolic constant that indicates the last kernel
eNR_NBNXN_LJ_RF, eNR_NBNXN_LJ_RF_E,
eNR_NBNXN_LJ_TAB, eNR_NBNXN_LJ_TAB_E,
eNR_NBNXN_LJ_EWALD, eNR_NBNXN_LJ_EWALD_E,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_ADD_PAR_H
#define GMX_GMXPREPROCESS_ADD_PAR_H
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/pdb2top.h"
#include "gromacs/utility/real.h"
+struct t_params;
+struct t_restp;
+
void add_param(t_params *ps, int ai, int aj, const real *c, char *s);
void add_imp_param(t_params *ps, int ai, int aj, int ak, int al,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/compat/make_unique.h"
#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/topio.h"
#include "gromacs/gmxpreprocess/toputil.h"
#include "gromacs/math/functions.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_CONVPARM_H
#define GMX_GMXPREPROCESS_CONVPARM_H
-#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/utility/real.h"
struct gmx_mtop_t;
+struct t_molinfo;
+struct t_params;
void convert_params(int atnr, t_params nbtypes[],
t_molinfo *mi,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
#include "gmxpre.h"
+#include "editconf.h"
+
#include <cmath>
#include <cstring>
#include <algorithm>
+#include <string>
#include "gromacs/commandline/pargs.h"
#include "gromacs/commandline/viewit.h"
#include "gromacs/fileio/pdbio.h"
#include "gromacs/fileio/tpxio.h"
#include "gromacs/fileio/trxio.h"
-#include "gromacs/gmxana/gmx_ana.h"
#include "gromacs/gmxana/princ.h"
#include "gromacs/gmxlib/conformation-utilities.h"
#include "gromacs/math/functions.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strdb.h"
-
-static real calc_mass(t_atoms *atoms, gmx_bool bGetMass, gmx_atomprop_t aps)
+static real calc_mass(t_atoms *atoms, gmx_bool bGetMass, AtomProperties *aps)
{
real tmass;
int i;
{
if (bGetMass)
{
- gmx_atomprop_query(aps, epropMass,
- *atoms->resinfo[atoms->atom[i].resind].name,
- *atoms->atomname[i], &(atoms->atom[i].m));
+ aps->setAtomProperty(epropMass,
+ std::string(*atoms->resinfo[atoms->atom[i].resind].name),
+ std::string(*atoms->atomname[i]), &(atoms->atom[i].m));
}
tmass += atoms->atom[i].m;
}
gmx_bool bIndex, bSetSize, bSetAng, bDist, bSetCenter, bAlign;
gmx_bool bHaveV, bScale, bRho, bTranslate, bRotate, bCalcGeom, bCalcDiam;
real diam = 0, mass = 0, d, vdw;
- gmx_atomprop_t aps;
gmx_conect conect;
gmx_output_env_t *oenv;
t_filenm fnm[] =
outftp = fn2ftp(outfile);
inftp = fn2ftp(infile);
- aps = gmx_atomprop_init();
+ AtomProperties aps;
if (bMead && bGrasp)
{
if (fn2ftp(infile) == efPDB)
{
- get_pdb_atomnumber(&atoms, aps);
+ get_pdb_atomnumber(&atoms, &aps);
}
printf("Read %d atoms\n", atoms.nr);
/* Get the element numbers if available in a pdb file */
if (fn2ftp(infile) == efPDB)
{
- get_pdb_atomnumber(&atoms, aps);
+ get_pdb_atomnumber(&atoms, &aps);
}
if (ePBC != epbcNONE)
/* Determine the Van der Waals radius from the force field */
if (bReadVDW)
{
- if (!gmx_atomprop_query(aps, epropVDW,
- *top->atoms.resinfo[top->atoms.atom[i].resind].name,
- *top->atoms.atomname[i], &vdw))
+ if (!aps.setAtomProperty(epropVDW,
+ *top->atoms.resinfo[top->atoms.atom[i].resind].name,
+ *top->atoms.atomname[i], &vdw))
{
vdw = rvdw;
}
if (bRho || bOrient || bAlign)
{
- mass = calc_mass(&atoms, !fn2bTPX(infile), aps);
+ mass = calc_mass(&atoms, !fn2bTPX(infile), &aps);
}
if (bOrient)
write_sto_conf(outfile, *top_tmp->name, &atoms, x, bHaveV ? v : nullptr, ePBC, box);
}
}
- gmx_atomprop_destroy(aps);
-
do_view(oenv, outfile, nullptr);
return 0;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* To help us fund GROMACS development, we humbly ask that you cite
* the research papers on the package. Check out http://www.gromacs.org.
*/
-#ifndef _NB_KERNEL_ALLVSALL_H
-#define _NB_KERNEL_ALLVSALL_H
+#ifndef GMX_GMXPREPROCESS_EDITCONF_H
+#define GMX_GMXPREPROCESS_EDITCONF_H
-#include "config.h"
-
-#include "gromacs/gmxlib/nrnb.h"
-#include "gromacs/gmxlib/nonbonded/nb_kernel.h"
-#include "gromacs/math/vectypes.h"
-#include "gromacs/mdtypes/mdatom.h"
-#include "gromacs/mdtypes/nblist.h"
-
-void
-nb_kernel_allvsall(t_nblist * nlist,
- rvec * x,
- rvec * f,
- struct t_forcerec * fr,
- t_mdatoms * mdatoms,
- nb_kernel_data_t * kernel_data,
- t_nrnb * nrnb);
+int gmx_editconf(int argc, char *argv[]);
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_FFLIBUTIL_H
#define GMX_GMXPREPROCESS_FFLIBUTIL_H
-#include <stdio.h>
+#include <cstdio>
#include <string>
#include <vector>
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/fileio/confio.h"
#include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pgutil.h"
#include "gromacs/gmxpreprocess/resall.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_GEN_AD_H
#define GMX_GMXPREPROCESS_GEN_AD_H
-#include "gromacs/gmxpreprocess/gpp_nextnb.h"
-#include "gromacs/gmxpreprocess/resall.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+struct t_atoms;
+struct t_excls;
+struct t_hackblock;
+struct t_nextnb;
+struct t_params;
+struct t_restp;
void generate_excls(t_nextnb *nnb, int nrexcl, t_excls excls[]);
void clean_excls(t_nextnb *nnb, int nrexcl, t_excls excls[]);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
static void low_mspeed(real tempi,
gmx_mtop_t *mtop, rvec v[], gmx::ThreeFry2x64<> * rng)
{
- int i, m, nrdf;
- real boltz, sd;
- real ekin, temp, mass, scal;
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
+ int nrdf;
+ real boltz;
+ real ekin, temp;
gmx::TabulatedNormalDistribution<real> normalDist;
boltz = BOLTZ*tempi;
ekin = 0.0;
nrdf = 0;
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- mass = atom->m;
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ real mass = local.m;
if (mass > 0)
{
rng->restart(i, 0);
- sd = std::sqrt(boltz/mass);
- for (m = 0; (m < DIM); m++)
+ real sd = std::sqrt(boltz/mass);
+ for (int m = 0; (m < DIM); m++)
{
v[i][m] = sd*normalDist(*rng);
ekin += 0.5*mass*v[i][m]*v[i][m];
temp = (2.0*ekin)/(nrdf*BOLTZ);
if (temp > 0)
{
- scal = std::sqrt(tempi/temp);
- for (i = 0; (i < mtop->natoms); i++)
+ real scal = std::sqrt(tempi/temp);
+ for (int i = 0; (i < mtop->natoms); i++)
{
- for (m = 0; (m < DIM); m++)
+ for (int m = 0; (m < DIM); m++)
{
v[i][m] *= scal;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxpreprocess/add_par.h"
#include "gromacs/gmxpreprocess/fflibutil.h"
#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/resall.h"
#include "gromacs/gmxpreprocess/toputil.h"
#define OPENDIR '[' /* starting sign for directive */
#define CLOSEDIR ']' /* ending sign for directive */
-typedef struct {
+struct t_vsiteconf
+{
char atomtype[MAXNAME]; /* Type for the XH3/XH2 atom */
bool isplanar; /* If true, the atomtype above and the three connected
* ones are in a planar geometry. The two next entries
int nhydrogens; /* number of connected hydrogens */
char nextheavytype[MAXNAME]; /* Type for the heavy atom bonded to XH2/XH3 */
char dummymass[MAXNAME]; /* The type of MNH* or MCH3* dummy mass to use */
-} t_vsiteconf;
+};
/* Structure to represent average bond and angles values in vsite aromatic
* forcefield; many forcefields (like Amber, OPLS) have some inherent strain in
* 5-rings (i.e. the sum of angles is !=540, but impropers keep it planar)
*/
-typedef struct {
+struct t_vsitetop
+{
char resname[MAXNAME];
int nbonds;
int nangles;
- struct vsitetop_bond {
+ struct vsitetop_bond
+ {
char atom1[MAXNAME];
char atom2[MAXNAME];
float value;
} *bond; /* list of bonds */
- struct vsitetop_angle {
+ struct vsitetop_angle
+ {
char atom1[MAXNAME];
char atom2[MAXNAME];
char atom3[MAXNAME];
float value;
} *angle; /* list of angles */
-} t_vsitetop;
+};
enum {
}
static int get_atype(int atom, t_atoms *at, int nrtp, t_restp rtp[],
- gmx_residuetype_t *rt)
+ ResidueType *rt)
{
int type;
bool bNterm;
{
/* get type from rtp */
rtpp = get_restp(*(at->resinfo[at->atom[atom].resind].name), nrtp, rtp);
- bNterm = gmx_residuetype_is_protein(rt, *(at->resinfo[at->atom[atom].resind].name)) &&
+ bNterm = rt->namedResidueHasType(*(at->resinfo[at->atom[atom].resind].name), "Protein") &&
(at->atom[atom].resind == 0);
j = search_jtype(rtpp, *(at->atomname[atom]), bNterm);
type = rtpp->atom[j].type;
return type;
}
-static int vsite_nm2type(const char *name, gpp_atomtype_t atype)
+static int vsite_nm2type(const char *name, gpp_atomtype *atype)
{
int tp;
}
static real get_amass(int atom, t_atoms *at, int nrtp, t_restp rtp[],
- gmx_residuetype_t *rt)
+ ResidueType *rt)
{
real mass;
bool bNterm;
{
/* get mass from rtp */
rtpp = get_restp(*(at->resinfo[at->atom[atom].resind].name), nrtp, rtp);
- bNterm = gmx_residuetype_is_protein(rt, *(at->resinfo[at->atom[atom].resind].name)) &&
+ bNterm = rt->namedResidueHasType(*(at->resinfo[at->atom[atom].resind].name), "Protein") &&
(at->atom[atom].resind == 0);
j = search_jtype(rtpp, *(at->atomname[atom]), bNterm);
mass = rtpp->atom[j].m;
}
-static int gen_vsites_trp(gpp_atomtype_t atype, rvec *newx[],
+static int gen_vsites_trp(gpp_atomtype *atype, rvec *newx[],
t_atom *newatom[], char ***newatomname[],
int *o2n[], int *newvsite_type[], int *newcgnr[],
t_symtab *symtab, int *nadd, rvec x[], int *cgnr[],
}
-static int gen_vsites_tyr(gpp_atomtype_t atype, rvec *newx[],
+static int gen_vsites_tyr(gpp_atomtype *atype, rvec *newx[],
t_atom *newatom[], char ***newatomname[],
int *o2n[], int *newvsite_type[], int *newcgnr[],
t_symtab *symtab, int *nadd, rvec x[], int *cgnr[],
static char atomnamesuffix[] = "1234";
-void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
+void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype *atype,
t_atoms *at, t_symtab *symtab, rvec *x[],
t_params plist[], int *vsite_type[], int *cgnr[],
real mHmult, bool bVsiteAromatics,
char *resnm = nullptr;
int nvsiteconf, nvsitetop, cmplength;
bool isN, planarN, bFound;
- gmx_residuetype_t*rt;
t_vsiteconf *vsiteconflist;
/* pointer to a list of CH3/NH3/NH2 configuration entries.
/* make index to tell which residues were already processed */
snew(bResProcessed, at->nres);
- gmx_residuetype_init(&rt);
+ ResidueType rt;
/* generate vsite constructions */
/* loop over all atoms */
* N-terminus that must be treated first.
*/
if (bVsiteAromatics &&
- !strcmp(*(at->atomname[i]), "CA") &&
+ (strcmp(*(at->atomname[i]), "CA") == 0) &&
!bResProcessed[resind] &&
- gmx_residuetype_is_protein(rt, *(at->resinfo[resind].name)) )
+ rt.namedResidueHasType(*(at->resinfo[resind].name), "Protein") )
{
/* mark this residue */
bResProcessed[resind] = TRUE;
count_bonds(i, &plist[F_BONDS], at->atomname,
&nrbonds, &nrHatoms, Hatoms, &Heavy, &nrheavies, heavies);
/* get Heavy atom type */
- tpHeavy = get_atype(Heavy, at, nrtp, rtp, rt);
+ tpHeavy = get_atype(Heavy, at, nrtp, rtp, &rt);
strcpy(tpname, get_atomtype_name(tpHeavy, atype));
bWARNING = FALSE;
}
/* get dummy mass type from first char of heavy atom type (N or C) */
- strcpy(nexttpname, get_atomtype_name(get_atype(heavies[0], at, nrtp, rtp, rt), atype));
+ strcpy(nexttpname, get_atomtype_name(get_atype(heavies[0], at, nrtp, rtp, &rt), atype));
ch = get_dummymass_name(vsiteconflist, nvsiteconf, tpname, nexttpname);
if (ch == nullptr)
/* get atom masses, and set Heavy and Hatoms mass to zero */
for (j = 0; j < nrHatoms; j++)
{
- mHtot += get_amass(Hatoms[j], at, nrtp, rtp, rt);
+ mHtot += get_amass(Hatoms[j], at, nrtp, rtp, &rt);
at->atom[Hatoms[j]].m = at->atom[Hatoms[j]].mB = 0;
}
- mtot = mHtot + get_amass(Heavy, at, nrtp, rtp, rt);
+ mtot = mHtot + get_amass(Heavy, at, nrtp, rtp, &rt);
at->atom[Heavy].m = at->atom[Heavy].mB = 0;
if (mHmult != 1.0)
{
} /* for i < at->nr */
- gmx_residuetype_destroy(rt);
-
if (debug)
{
fprintf(debug, "Before inserting new atoms:\n");
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_GEN_VSITE_H
#define GMX_GMXPREPROCESS_GEN_VSITE_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include "gromacs/math/vectypes.h"
#include "gromacs/utility/real.h"
+struct gpp_atomtype;
+struct t_atoms;
+struct t_params;
+struct t_restp;
+struct t_symtab;
+
/* stuff for pdb2gmx */
-void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
- t_atoms *at, struct t_symtab *symtab, rvec *x[],
+void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype *atype,
+ t_atoms *at, t_symtab *symtab, rvec *x[],
t_params plist[], int *dummy_type[], int *cgnr[],
real mHmult, bool bVSiteAromatics,
const char *ffdir);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxlib/network.h"
#include "gromacs/gmxpreprocess/calch.h"
#include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pgutil.h"
#include "gromacs/gmxpreprocess/resall.h"
#include "gromacs/gmxpreprocess/ter_db.h"
#include "gromacs/math/vec.h"
+#include "gromacs/topology/atoms.h"
#include "gromacs/topology/symtab.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_GENHYDRO_H
#define GMX_GMXPREPROCESS_GENHYDRO_H
-#include "gromacs/fileio/pdbio.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include "gromacs/math/vectypes.h"
+
+struct t_atoms;
+struct t_hack;
+struct t_hackblock;
int add_h(t_atoms **pdbaptr, rvec *xptr[],
int nah, t_hackblock ah[],
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
#include "gmxpre.h"
+#include "genion.h"
+
#include <cctype>
#include <cmath>
#include <cstdlib>
#include "gromacs/commandline/pargs.h"
#include "gromacs/fileio/confio.h"
-#include "gromacs/gmxana/gmx_ana.h"
#include "gromacs/math/units.h"
#include "gromacs/math/utilities.h"
#include "gromacs/math/vec.h"
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+#ifndef GMX_GMXPREPROCESS_GENION_H
+#define GMX_GMXPREPROCESS_GENION_H
+
+int gmx_genion(int argc, char *argv[]);
+
+#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
#include "gmxpre.h"
+#include "genrestr.h"
+
#include <cmath>
#include <cstring>
#include "gromacs/commandline/pargs.h"
#include "gromacs/fileio/confio.h"
-#include "gromacs/gmxana/gmx_ana.h"
#include "gromacs/math/vec.h"
#include "gromacs/topology/index.h"
#include "gromacs/topology/topology.h"
#include "gromacs/utility/futil.h"
#include "gromacs/utility/smalloc.h"
-int gmx_genpr(int argc, char *argv[])
+int gmx_genrestr(int argc, char *argv[])
{
const char *desc[] = {
"[THISMODULE] produces an #include file for a topology containing",
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+#ifndef GMX_GMXPREPROCESS_GENPR_H
+#define GMX_GMXPREPROCESS_GENPR_H
+
+int gmx_genrestr(int argc, char *argv[]);
+
+#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <algorithm>
#include <memory>
+#include <unordered_set>
#include <sys/types.h>
#include "gromacs/utility/arrayref.h"
{
std::shared_ptr < std::vector < t_define>> defines;
std::shared_ptr < std::vector < std::string>> includes;
-
- FILE *fp = nullptr;
- std::string path;
- std::string cwd;
- std::string fn;
- std::string line;
- int line_nr;
- std::vector<int> ifdefs;
- struct gmx_cpp *child = nullptr;
- struct gmx_cpp *parent = nullptr;
+ std::unordered_set<std::string> unmatched_defines;
+ FILE *fp = nullptr;
+ std::string path;
+ std::string cwd;
+ std::string fn;
+ std::string line;
+ int line_nr;
+ std::vector<int> ifdefs;
+ struct gmx_cpp *child = nullptr;
+ struct gmx_cpp *parent = nullptr;
};
static bool is_word_end(char c)
{
std::string buf = cppopts[i] + 2;
buf.resize(ptr - cppopts[i] - 2);
-
add_define(cpp->defines.get(), buf, ptr + 1);
+ cpp->unmatched_defines.insert(buf);
+
}
else
{
add_define(cpp->defines.get(), cppopts[i] + 2, "");
+ cpp->unmatched_defines.insert(cppopts[i] + 2);
}
}
i++;
{
if (define.name == dval)
{
+ // erase from unmatched_defines in original handle
+ gmx_cpp_t root = handle;
+ while (root->parent != nullptr)
+ {
+ root = root->parent;
+ }
+ root->unmatched_defines.erase(dval);
+
found = true;
break;
}
}
if (nn > 0)
{
+ // Need to erase unmatched define in original handle
+ gmx_cpp_t root = handle;
+ while (root->parent != nullptr)
+ {
+ root = root->parent;
+ }
+ root->unmatched_defines.erase(define.name);
+
std::string name;
const char *ptr = buf;
const char *ptr2;
return gmx_strdup(buf);
}
+
+std::string checkAndWarnForUnusedDefines(const gmx_cpp &handle)
+{
+ std::string warning;
+ if (!handle.unmatched_defines.empty())
+ {
+ warning = "The following macros were defined in the 'define' mdp field with the -D prefix, but "
+ "were not used in the topology:\n";
+ for (auto &str : handle.unmatched_defines)
+ {
+ warning += (" " + str + "\n");
+ }
+ warning += "If you haven't made a spelling error, either use the macro you defined, "
+ "or don't define the macro";
+ }
+ return warning;
+}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
char *cpp_error(gmx_cpp_t *handlep, int status);
+/* Returns warning message if strings defined in mdp define section (e.g. -DFLEXIBLE)
+ * were not not found when processing the topology */
+std::string checkAndWarnForUnusedDefines(const gmx_cpp &handle);
+
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cmath>
#include <cstring>
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/topdirs.h"
#include "gromacs/gmxpreprocess/toputil.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
-typedef struct gpp_atomtype {
+struct gpp_atomtype
+{
int nr; /* The number of atomtypes */
t_atom *atom; /* Array of atoms */
char ***atomname; /* Names of the atomtypes */
t_param *nb; /* Nonbonded force default params */
int *bondatomtype; /* The bond_atomtype for each atomtype */
int *atomnumber; /* Atomic number, used for QM/MM */
-} t_gpp_atomtype;
+};
-int get_atomtype_type(const char *str, gpp_atomtype_t ga)
+int get_atomtype_type(const char *str, gpp_atomtype *ga)
{
int i;
return NOTSET;
}
-int get_atomtype_ntypes(gpp_atomtype_t ga)
+int get_atomtype_ntypes(gpp_atomtype *ga)
{
return ga->nr;
}
-char *get_atomtype_name(int nt, gpp_atomtype_t ga)
+char *get_atomtype_name(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return *(ga->atomname[nt]);
}
-real get_atomtype_massA(int nt, gpp_atomtype_t ga)
+real get_atomtype_massA(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->atom[nt].m;
}
-real get_atomtype_massB(int nt, gpp_atomtype_t ga)
+real get_atomtype_massB(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->atom[nt].mB;
}
-real get_atomtype_qA(int nt, gpp_atomtype_t ga)
+real get_atomtype_qA(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->atom[nt].q;
}
-real get_atomtype_qB(int nt, gpp_atomtype_t ga)
+real get_atomtype_qB(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->atom[nt].qB;
}
-int get_atomtype_ptype(int nt, gpp_atomtype_t ga)
+int get_atomtype_ptype(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->bondatomtype[nt];
}
-int get_atomtype_atomnumber(int nt, gpp_atomtype_t ga)
+int get_atomtype_atomnumber(int nt, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->atomnumber[nt];
}
-real get_atomtype_nbparam(int nt, int param, gpp_atomtype_t ga)
+real get_atomtype_nbparam(int nt, int param, gpp_atomtype *ga)
{
if ((nt < 0) || (nt >= ga->nr))
{
return ga->nb[nt].c[param];
}
-gpp_atomtype_t init_atomtype()
+gpp_atomtype *init_atomtype()
{
- gpp_atomtype_t ga;
+ gpp_atomtype *ga;
snew(ga, 1);
return ga;
}
-int set_atomtype(int nt, gpp_atomtype_t ga, t_symtab *tab,
+int set_atomtype(int nt, gpp_atomtype *ga, t_symtab *tab,
t_atom *a, const char *name, t_param *nb,
int bondatomtype, int atomnumber)
{
return nt;
}
-int add_atomtype(gpp_atomtype_t ga, t_symtab *tab,
+int add_atomtype(gpp_atomtype *ga, t_symtab *tab,
t_atom *a, const char *name, t_param *nb,
int bondatomtype, int atomnumber)
{
}
}
-void print_at (FILE * out, gpp_atomtype_t ga)
+void print_at (FILE * out, gpp_atomtype *ga)
{
int i;
t_atom *atom = ga->atom;
t_param *nb = ga->nb;
- fprintf (out, "[ %s ]\n", dir2str(d_atomtypes));
+ fprintf (out, "[ %s ]\n", dir2str(Directive::d_atomtypes));
fprintf (out, "; %6s %8s %8s %8s %12s %12s\n",
"type", "mass", "charge", "particle", "c6", "c12");
for (i = 0; (i < ga->nr); i++)
fprintf (out, "\n");
}
-void done_atomtype(gpp_atomtype_t ga)
+void done_atomtype(gpp_atomtype *ga)
{
sfree(ga->atom);
sfree(ga->atomname);
sfree(ga);
}
-static int search_atomtypes(gpp_atomtype_t ga, int *n, int typelist[],
+static int search_atomtypes(gpp_atomtype *ga, int *n, int typelist[],
int thistype,
t_param param[], int ftype)
{
void renum_atype(t_params plist[], gmx_mtop_t *mtop,
int *wall_atomtype,
- gpp_atomtype_t ga, bool bVerbose)
+ gpp_atomtype *ga, bool bVerbose)
{
int i, j, k, l, mi, mj, nat, nrfp, ftype, ntype;
t_atoms *atoms;
sfree(typelist);
}
-void copy_atomtype_atomtypes(gpp_atomtype_t ga, t_atomtypes *atomtypes)
+void copy_atomtype_atomtypes(gpp_atomtype *ga, t_atomtypes *atomtypes)
{
int i, ntype;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_GPP_ATOMTYPE_H
#define GMX_GMXPREPROCESS_GPP_ATOMTYPE_H
-#include <stdio.h>
+#include <cstdio>
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/utility/real.h"
struct gmx_mtop_t;
-
-typedef struct gpp_atomtype *gpp_atomtype_t;
-
-int get_atomtype_type(const char *str, gpp_atomtype_t at);
+struct gpp_atomtype;
+struct t_atom;
+struct t_atomtypes;
+struct t_param;
+struct t_params;
+struct t_symtab;
+
+int get_atomtype_type(const char *str, gpp_atomtype *at);
/* Return atomtype corresponding to case-insensitive str
or NOTSET if not found */
-int get_atomtype_ntypes(gpp_atomtype_t at);
+int get_atomtype_ntypes(gpp_atomtype *at);
/* Return number of atomtypes */
-char *get_atomtype_name(int nt, gpp_atomtype_t at);
+char *get_atomtype_name(int nt, gpp_atomtype *at);
/* Return name corresponding to atomtype nt, or NULL if not found */
-real get_atomtype_massA(int nt, gpp_atomtype_t at);
-real get_atomtype_massB(int nt, gpp_atomtype_t at);
-real get_atomtype_qA(int nt, gpp_atomtype_t at);
-real get_atomtype_qB(int nt, gpp_atomtype_t at);
-int get_atomtype_ptype(int nt, gpp_atomtype_t at);
+real get_atomtype_massA(int nt, gpp_atomtype *at);
+real get_atomtype_massB(int nt, gpp_atomtype *at);
+real get_atomtype_qA(int nt, gpp_atomtype *at);
+real get_atomtype_qB(int nt, gpp_atomtype *at);
+int get_atomtype_ptype(int nt, gpp_atomtype *at);
int get_atomtype_batype(int nt, const gpp_atomtype* at);
-int get_atomtype_atomnumber(int nt, gpp_atomtype_t at);
+int get_atomtype_atomnumber(int nt, gpp_atomtype *at);
/* Return the above variable for atomtype nt, or NOTSET if not found */
-real get_atomtype_nbparam(int nt, int param, gpp_atomtype_t at);
+real get_atomtype_nbparam(int nt, int param, gpp_atomtype *at);
/* Similar to the previous but returns the paramth parameter or NOTSET */
-gpp_atomtype_t init_atomtype();
+gpp_atomtype *init_atomtype();
/* Return a new atomtype structure */
-void done_atomtype(gpp_atomtype_t at);
+void done_atomtype(gpp_atomtype *at);
/* Free the memory in the structure */
-int set_atomtype(int nt, gpp_atomtype_t at, struct t_symtab *tab,
+int set_atomtype(int nt, gpp_atomtype *at, t_symtab *tab,
t_atom *a, const char *name, t_param *nb,
int bondatomtype, int atomnumber);
/* Set the values of an existing atom type nt. Returns nt on success or
NOTSET on error. */
-int add_atomtype(gpp_atomtype_t at, struct t_symtab *tab,
+int add_atomtype(gpp_atomtype *at, t_symtab *tab,
t_atom *a, const char *name, t_param *nb,
int bondatomtype, int atomnumber);
/* Add a complete new atom type to an existing atomtype structure. Returns
the number of the atom type. */
-void print_at (FILE * out, gpp_atomtype_t at);
+void print_at (FILE * out, gpp_atomtype *at);
/* Print an atomtype record to a text file */
void renum_atype(t_params plist[], gmx_mtop_t *mtop,
int *wall_atomtype,
- gpp_atomtype_t at, bool bVerbose);
+ gpp_atomtype *at, bool bVerbose);
-void copy_atomtype_atomtypes(gpp_atomtype_t atype, t_atomtypes *atypes);
+void copy_atomtype_atomtypes(gpp_atomtype *atype, t_atomtypes *atypes);
/* Copy from one structure to another */
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/smalloc.h"
-typedef struct {
+struct gpp_bond_atomtype
+{
int nr; /* The number of atomtypes */
char ***atomname; /* Names of the atomtypes */
-} gpp_bond_atomtype;
+};
-int get_bond_atomtype_type(char *str, t_bond_atomtype at)
+int get_bond_atomtype_type(const char *str, gpp_bond_atomtype *at)
{
- gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
- int i;
-
- for (i = 0; (i < ga->nr); i++)
+ for (int i = 0; (i < at->nr); i++)
{
/* Atom types are always case sensitive */
- if (strcmp(str, *(ga->atomname[i])) == 0)
+ if (strcmp(str, *(at->atomname[i])) == 0)
{
return i;
}
return NOTSET;
}
-char *get_bond_atomtype_name(int nt, t_bond_atomtype at)
+char *get_bond_atomtype_name(int nt, gpp_bond_atomtype *at)
{
- gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
- if ((nt < 0) || (nt >= ga->nr))
+ if ((nt < 0) || (nt >= at->nr))
{
return nullptr;
}
- return *(ga->atomname[nt]);
+ return *(at->atomname[nt]);
}
-t_bond_atomtype init_bond_atomtype()
+gpp_bond_atomtype *init_bond_atomtype()
{
gpp_bond_atomtype *ga;
snew(ga, 1);
- return reinterpret_cast<t_bond_atomtype>(ga);
+ return ga;
}
-void add_bond_atomtype(t_bond_atomtype at, t_symtab *tab,
+void add_bond_atomtype(gpp_bond_atomtype *at, t_symtab *tab,
char *name)
{
- gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
- ga->nr++;
- srenew(ga->atomname, ga->nr);
- ga->atomname[ga->nr-1] = put_symtab(tab, name);
+ at->nr++;
+ srenew(at->atomname, at->nr);
+ at->atomname[at->nr-1] = put_symtab(tab, name);
}
-void done_bond_atomtype(t_bond_atomtype *at)
+void done_bond_atomtype(gpp_bond_atomtype **at)
{
- gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(*at);
-
- sfree(ga->atomname);
- ga->nr = 0;
- sfree(ga);
+ sfree((*at)->atomname);
+ (*at)->nr = 0;
+ sfree(*at);
*at = nullptr;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* the research papers on the package. Check out http://www.gromacs.org.
*/
-#ifndef GMX_GMXPREPROCESS_GPP_BONDATOMTYPE_H
-#define GMX_GMXPREPROCESS_GPP_BONDATOMTYPE_H
+#ifndef GMX_GMXPREPROCESS_GPP_BOND_ATOMTYPE_H
+#define GMX_GMXPREPROCESS_GPP_BOND_ATOMTYPE_H
-#include <stdio.h>
+#include <cstdio>
-typedef struct gpp_bondatomtype *t_bond_atomtype;
+struct gpp_bond_atomtype;
+struct t_symtab;
-int get_bond_atomtype_type(char *str, t_bond_atomtype at);
+int get_bond_atomtype_type(const char *str, gpp_bond_atomtype *at);
/* Return atomtype corresponding to case-insensitive str
or NOTSET if not found */
-char *get_bond_atomtype_name(int nt, t_bond_atomtype at);
+char *get_bond_atomtype_name(int nt, gpp_bond_atomtype *at);
/* Return name corresponding to atomtype nt, or NULL if not found */
-t_bond_atomtype init_bond_atomtype();
+gpp_bond_atomtype *init_bond_atomtype();
/* Return a new atomtype structure */
-void done_bond_atomtype(t_bond_atomtype *at);
+void done_bond_atomtype(gpp_bond_atomtype **at);
/* Free the memory in the structure */
-void add_bond_atomtype(t_bond_atomtype at, struct t_symtab *tab,
+void add_bond_atomtype(gpp_bond_atomtype *at, t_symtab *tab,
char *name);
/* Add a complete new atom type to an existing atomtype structure */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cstdlib>
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/toputil.h"
#include "gromacs/topology/ifunc.h"
#include "gromacs/utility/fatalerror.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_GPP_NEXTNB_H
#define GMX_GMXPREPROCESS_GPP_NEXTNB_H
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+struct t_blocka;
+struct t_params;
-typedef struct {
+struct t_nextnb
+{
int nr; /* nr atoms (0 <= i < nr) (atoms->nr) */
int nrex; /* with nrex lists of neighbours */
/* respectively containing zeroth, first */
int **nrexcl; /* with (0 <= nrx < nrexcl[i][nre]) neigbours */
/* per list stored in one 2d array of lists */
int ***a; /* like this: a[i][nre][nrx] */
-} t_nextnb;
+};
void init_nnb(t_nextnb *nnb, int nr, int nrex);
/* Initiate the arrays for nnb (see above) */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/real.h"
-struct t_block;
-struct t_blocka;
-
#define MAXSLEN 32
-typedef struct {
- bool bSet; /* Has this combination been set */
- real c[4]; /* The non-bonded parameters */
-} t_nbparam;
-/* The t_nbparam struct is used to temporary store the explicit
- * non-bonded parameter combinations, which will be copied to t_params.
- */
-
-typedef struct {
+struct t_param
+{
int a[MAXATOMLIST]; /* The atom list (eg. bonds: particle */
/* i = a[0] (ai), j = a[1] (aj)) */
real c[MAXFORCEPARAM]; /* Force parameters (eg. b0 = c[0]) */
char s[MAXSLEN]; /* A string (instead of parameters), *
* read from the .rtp file in pdb2gmx */
const int &ai() const { return a[0]; }
- int &ai() { return a[0]; }
+ int &ai() { return a[0]; }
const int &aj() const { return a[1]; }
- int &aj() { return a[1]; }
+ int &aj() { return a[1]; }
const int &ak() const { return a[2]; }
- int &ak() { return a[2]; }
+ int &ak() { return a[2]; }
const int &al() const { return a[3]; }
- int &al() { return a[3]; }
+ int &al() { return a[3]; }
const int &am() const { return a[4]; }
- int &am() { return a[4]; }
+ int &am() { return a[4]; }
real &c0() { return c[0]; }
real &c1() { return c[1]; }
real &c2() { return c[2]; }
-} t_param;
+};
-typedef struct { // NOLINT (clang-analyzer-optin.performance.Padding)
+struct t_params
+{ // NOLINT (clang-analyzer-optin.performance.Padding)
int nr; /* The number of bonds in this record */
int maxnr; /* The amount of elements in the array */
t_param *param; /* Array of parameters (dim: nr or nr*nr) */
int *cmap_types; /* Store the five atomtypes followed by a number that identifies the type */
int nct; /* Number of allocated elements in cmap_types */
+};
-} t_params;
-
-typedef struct {
+struct t_excls
+{
int nr; /* The number of exclusions */
int *e; /* The excluded atoms */
-} t_excls;
+};
-typedef struct {
+struct t_molinfo
+{
char **name;
int nrexcl; /* Number of exclusions per atom */
bool excl_set; /* Have exclusions been generated? */
t_block mols; /* Molecules */
t_blocka excls; /* Exclusions */
t_params plist[F_NRE]; /* Parameters in old style */
-} t_molinfo;
+};
-typedef struct {
+struct t_mols
+{
char *name;
int nr;
-} t_mols;
+};
bool is_int(double x);
/* Returns TRUE when x is integer */
-/* Must correspond to strings in topdirs.c */
-typedef enum {
- d_defaults,
- d_atomtypes,
- d_bondtypes,
- d_constrainttypes,
- d_pairtypes,
- d_angletypes,
- d_dihedraltypes,
- d_nonbond_params,
- d_implicit_genborn_params,
- d_implicit_surface_params,
- d_cmaptypes,
- d_moleculetype,
- d_atoms,
- d_vsites2,
- d_vsites3,
- d_vsites4,
- d_vsitesn,
- d_bonds,
- d_exclusions,
- d_pairs,
- d_pairs_nb,
- d_angles,
- d_dihedrals,
- d_constraints,
- d_settles,
- d_polarization,
- d_water_polarization,
- d_thole_polarization,
- d_system,
- d_molecules,
- d_position_restraints,
- d_angle_restraints,
- d_angle_restraints_z,
- d_distance_restraints,
- d_orientation_restraints,
- d_dihedral_restraints,
- d_cmap,
- d_intermolecular_interactions,
- d_maxdir,
- d_invalid,
- d_none
-} directive;
-
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/mdlib/compute_io.h"
#include "gromacs/mdlib/constr.h"
#include "gromacs/mdlib/perf_est.h"
+#include "gromacs/mdlib/qmmm.h"
#include "gromacs/mdlib/sim_util.h"
#include "gromacs/mdrunutility/mdmodules.h"
#include "gromacs/mdtypes/inputrec.h"
{
/* Get the energy group of the first atom in this charge group */
firstj = astart + molt->cgs.index[cg];
- firsteg = getGroupType(&mtop->groups, egcENER, firstj);
+ firsteg = getGroupType(mtop->groups, egcENER, firstj);
for (j = molt->cgs.index[cg]+1; j < molt->cgs.index[cg+1]; j++)
{
- eg = getGroupType(&mtop->groups, egcENER, astart+j);
+ eg = getGroupType(mtop->groups, egcENER, astart+j);
if (eg != firsteg)
{
gmx_fatal(FARGS, "atoms %d and %d in charge group %d of molecule type '%s' are in different energy groups",
}
}
-static void check_cg_sizes(const char *topfn, const t_block *cgs, warninp_t wi)
+static void check_cg_sizes(const char *topfn, const t_block *cgs, warninp *wi)
{
int maxsize, cg;
char warn_buf[STRLEN];
}
}
-static void check_bonds_timestep(const gmx_mtop_t *mtop, double dt, warninp_t wi)
+static void check_bonds_timestep(const gmx_mtop_t *mtop, double dt, warninp *wi)
{
/* This check is not intended to ensure accurate integration,
* rather it is to signal mistakes in the mdp settings.
static void check_vel(gmx_mtop_t *mtop, rvec v[])
{
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
- int a;
-
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- if (atom->ptype == eptShell ||
- atom->ptype == eptBond ||
- atom->ptype == eptVSite)
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ if (local.ptype == eptShell ||
+ local.ptype == eptBond ||
+ local.ptype == eptVSite)
{
- clear_rvec(v[a]);
+ clear_rvec(v[i]);
}
}
}
static void check_shells_inputrec(gmx_mtop_t *mtop,
t_inputrec *ir,
- warninp_t wi)
+ warninp *wi)
{
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
- int a, nshells = 0;
- char warn_buf[STRLEN];
+ int nshells = 0;
+ char warn_buf[STRLEN];
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- if (atom->ptype == eptShell ||
- atom->ptype == eptBond)
+ const t_atom &local = atomP.atom();
+ if (local.ptype == eptShell ||
+ local.ptype == eptBond)
{
nshells++;
}
new_status(const char *topfile, const char *topppfile, const char *confin,
t_gromppopts *opts, t_inputrec *ir, gmx_bool bZero,
bool bGenVel, bool bVerbose, t_state *state,
- gpp_atomtype_t atype, gmx_mtop_t *sys,
+ gpp_atomtype *atype, gmx_mtop_t *sys,
int *nmi, t_molinfo **mi, t_molinfo **intermolecular_interactions,
t_params plist[],
int *comb, double *reppow, real *fudgeQQ,
gmx_bool bMorse,
- warninp_t wi)
+ warninp *wi)
{
t_molinfo *molinfo = nullptr;
std::vector<gmx_molblock_t> molblock;
if (bGenVel)
{
real *mass;
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
snew(mass, state->natoms);
- aloop = gmx_mtop_atomloop_all_init(sys);
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*sys))
{
- mass[i] = atom->m;
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ mass[i] = local.m;
}
if (opts->seed == -1)
const char *fn,
int rc_scaling, int ePBC,
rvec com,
- warninp_t wi)
+ warninp *wi)
{
gmx_bool *hadAtom;
rvec *x, *v;
const char *fnA, const char *fnB,
int rc_scaling, int ePBC,
rvec com, rvec comB,
- warninp_t wi)
+ warninp *wi)
{
read_posres (mtop, mi, FALSE, fnA, rc_scaling, ePBC, com, wi);
/* It is safer to simply read the b-state posres rather than trying
read_posres(mtop, mi, TRUE, fnB, rc_scaling, ePBC, comB, wi);
}
-static void set_wall_atomtype(gpp_atomtype_t at, t_gromppopts *opts,
- t_inputrec *ir, warninp_t wi)
+static void set_wall_atomtype(gpp_atomtype *at, t_gromppopts *opts,
+ t_inputrec *ir, warninp *wi)
{
int i;
char warn_buf[STRLEN];
}
-static int count_constraints(const gmx_mtop_t *mtop, t_molinfo *mi, warninp_t wi)
+static int count_constraints(const gmx_mtop_t *mtop, t_molinfo *mi, warninp *wi)
{
int count, count_mol, i;
t_params *plist;
const t_inputrec *ir,
rvec *v)
{
- gmx_mtop_atomloop_all_t aloop;
- const t_atom *atom;
- int a;
-
- double sum_mv2 = 0;
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+ double sum_mv2 = 0;
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- sum_mv2 += atom->m*norm2(v[a]);
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ sum_mv2 += local.m*norm2(v[i]);
}
double nrdf = 0;
}
static real get_max_reference_temp(const t_inputrec *ir,
- warninp_t wi)
+ warninp *wi)
{
real ref_t;
int i;
*/
static void checkForUnboundAtoms(const gmx_moltype_t *molt,
gmx_bool bVerbose,
- warninp_t wi)
+ warninp *wi)
{
const t_atoms *atoms = &molt->atoms;
/* Checks all moleculetypes for unbound atoms */
static void checkForUnboundAtoms(const gmx_mtop_t *mtop,
gmx_bool bVerbose,
- warninp_t wi)
+ warninp *wi)
{
for (const gmx_moltype_t &molt : mtop->moltype)
{
*/
static void checkDecoupledModeAccuracy(const gmx_mtop_t *mtop,
const t_inputrec *ir,
- warninp_t wi)
+ warninp *wi)
{
/* We only have issues with decoupled modes with normal MD.
* With stochastic dynamics equipartitioning is enforced strongly.
t_inputrec *ir,
real buffer_temp,
matrix box,
- warninp_t wi)
+ warninp *wi)
{
real rlist_1x1;
int n_nonlin_vsite;
t_gromppopts *opts;
int nmi;
t_molinfo *mi, *intermolecular_interactions;
- gpp_atomtype_t atype;
+ gpp_atomtype *atype;
int nvsite, comb;
t_params *plist;
real fudgeQQ;
gmx_bool have_atomnumber;
gmx_output_env_t *oenv;
gmx_bool bVerbose = FALSE;
- warninp_t wi;
+ warninp *wi;
char warn_buf[STRLEN];
t_filenm fnm[] = {
pr_symtab(debug, 0, "After close", &sys.symtab);
}
- /* make exclusions between QM atoms */
+ /* make exclusions between QM atoms and remove charges if needed */
if (ir->bQMMM)
{
if (ir->QMMMscheme == eQMMMschemenormal && ir->ns_type == ensSIMPLE)
{
generate_qmexcl(&sys, ir, wi, GmxQmmmMode::GMX_QMMM_ORIGINAL);
}
+ if (ir->QMMMscheme != eQMMMschemeoniom)
+ {
+ std::vector<int> qmmmAtoms = qmmmAtomIndices(*ir, sys);
+ removeQmmmAtomCharges(&sys, qmmmAtoms);
+ }
}
if (ir->eI == eiMimic)
}
}
- struct pull_t *pull = nullptr;
+ pull_t *pull = nullptr;
if (ir->bPull)
{
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <vector>
#include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/utility/arraysize.h"
#include "gromacs/utility/cstringutil.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_H_DB_H
#define GMX_GMXPREPROCESS_H_DB_H
-#include <stdio.h>
+#include <cstdio>
-#include "gromacs/gmxpreprocess/hackblock.h"
+struct t_hack;
+struct t_hackblock;
/* functions for the h-database */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdtypes/md_enums.h"
+#include "gromacs/topology/atoms.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_HACKBLOCK_H
#define GMX_GMXPREPROCESS_HACKBLOCK_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/topology/symtab.h"
+#include <cstdio>
+
+#include "gromacs/topology/ifunc.h"
+
+struct t_atom;
/* Used for reading .rtp/.tdb */
/* ebtsBONDS must be the first, new types can be added to the end */
free/clear/copy/merge_t_* functions stay updated */
/* BONDEDS */
-typedef struct {
+struct t_rbonded
+{
char *a[MAXATOMLIST]; /* atom names */
char *s; /* optional define string which gets copied from
.rtp/.tdb to .top and will be parsed by cpp
during grompp */
- bool match; /* boolean to mark that the entry has been found */
+ bool match; /* boolean to mark that the entry has been found */
char* &ai() { return a[0]; }
char* &aj() { return a[1]; }
char* &ak() { return a[2]; }
char* &al() { return a[3]; }
char* &am() { return a[4]; }
-} t_rbonded;
+};
-typedef struct {
+struct t_rbondeds
+{
int type; /* The type of bonded interaction */
int nb; /* number of bondeds */
t_rbonded *b; /* bondeds */
-} t_rbondeds;
+};
/* RESIDUES (rtp) */
-typedef struct {
+struct t_restp
+{
char *resname;
/* The base file name this rtp entry was read from */
char *filebase;
bool bRemoveDihedralIfWithImproper;
/* list of bonded interactions to add */
t_rbondeds rb[ebtsNR];
-} t_restp;
+};
/* Block to hack residues */
-typedef struct {
+struct t_hack
+{
int nr; /* Number of atoms to hack */
char *oname; /* Old name */
char *nname; /* New name */
char* &aj() { return a[1]; }
char* &ak() { return a[2]; }
char* &al() { return a[3]; }
-} t_hack;
+};
-typedef struct {
+struct t_hackblock
+{
char *name; /* Name of hack block (residue or terminus) */
char *filebase; /* The base file name this entry was read from */
int nhack; /* Number of atoms to hack */
t_hack *hack; /* Hack list */
/* list of bonded interactions to add */
t_rbondeds rb[ebtsNR];
-} t_hackblock;
-
-typedef struct {
- char *res1, *res2;
- char *atom1, *atom2;
- char *newres1, *newres2;
- int nbond1, nbond2;
- real length;
-} t_specbond;
-
-t_specbond *get_specbonds(int *nspecbond);
-void done_specbonds(int nsb, t_specbond sb[]);
+};
void free_t_restp(int nrtp, t_restp **rtp);
void free_t_hack(int nh, t_hack **h);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#define GMX_GMXPREPROCESS_HIZZIE_H
#include "gromacs/math/vectypes.h"
-#include "gromacs/topology/atoms.h"
+#include "gromacs/utility/real.h"
+
+struct t_atoms;
void set_histp(t_atoms *pdba, rvec *x, real angle, real distance);
/* calculate HIStidine protonation state */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
RotationType enum_rot)
{
fprintf(stderr, "Initialising inter-atomic distances...\n");
- gmx_atomprop_t aps = gmx_atomprop_init();
+ AtomProperties aps;
std::vector<real> exclusionDistances(
- makeExclusionDistances(atoms, aps, defaultDistance, scaleFactor));
+ makeExclusionDistances(atoms, &aps, defaultDistance, scaleFactor));
const std::vector<real> exclusionDistances_insrt(
- makeExclusionDistances(&atoms_insrt, aps, defaultDistance, scaleFactor));
- gmx_atomprop_destroy(aps);
+ makeExclusionDistances(&atoms_insrt, &aps, defaultDistance, scaleFactor));
const real maxInsertRadius
= *std::max_element(exclusionDistances_insrt.begin(),
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "makeexclusiondistances.h"
+#include <string>
#include <vector>
#include "gromacs/topology/atomprop.h"
#include "gromacs/topology/atoms.h"
std::vector<real>
-makeExclusionDistances(const t_atoms *a, gmx_atomprop_t aps,
+makeExclusionDistances(const t_atoms *a, AtomProperties *aps,
real defaultDistance, real scaleFactor)
{
std::vector<real> exclusionDistances;
exclusionDistances.reserve(a->nr);
for (int i = 0; i < a->nr; ++i)
{
- real value;
- if (!gmx_atomprop_query(aps, epropVDW,
- *(a->resinfo[a->atom[i].resind].name),
- *(a->atomname[i]), &value))
+ real value;
+ if (!aps->setAtomProperty(epropVDW,
+ std::string(*(a->resinfo[a->atom[i].resind].name)),
+ std::string(*(a->atomname[i])), &value))
{
value = defaultDistance;
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/real.h"
-struct gmx_atomprop;
+class AtomProperties;
struct t_atoms;
/*! \brief Allocate and fill an array of inter-atomic half distances
* insert-molecules for deciding whether molecules clash. The return
* pointer should be freed by the caller. */
std::vector<real>
-makeExclusionDistances(const t_atoms *a, gmx_atomprop *aps,
+makeExclusionDistances(const t_atoms *a, AtomProperties *aps,
real defaultDistance, real scaleFactor);
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxpreprocess/fflibutil.h"
#include "gromacs/gmxpreprocess/gpp_atomtype.h"
#include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pdb2top.h"
#include "gromacs/gmxpreprocess/toppush.h"
}
}
-int nm2type(int nnm, t_nm2type nm2t[], struct t_symtab *tab, t_atoms *atoms,
- gpp_atomtype_t atype, int *nbonds, t_params *bonds)
+int nm2type(int nnm, t_nm2type nm2t[], t_symtab *tab, t_atoms *atoms,
+ gpp_atomtype *atype, int *nbonds, t_params *bonds)
{
int cur = 0;
#define prev (1-cur)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMX_NM2TYPE_H
#define GMX_GMX_NM2TYPE_H
-#include <stdio.h>
+#include <cstdio>
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/topology/atoms.h"
+struct gpp_atomtype;
+struct t_atoms;
+struct t_params;
+struct t_symtab;
-typedef struct {
+struct t_nm2type
+{
char *elem, *type;
double q, m;
int nbonds;
char **bond;
double *blen;
-} t_nm2type;
+};
t_nm2type *rd_nm2type(const char *ffdir, int *nnm);
/* Read the name 2 type database. nnm is the number of entries
void dump_nm2type(FILE *fp, int nnm, t_nm2type nm2t[]);
/* Dump the database for debugging. Can be reread by the program */
-int nm2type(int nnm, t_nm2type nm2t[], struct t_symtab *tab, t_atoms *atoms,
- gpp_atomtype_t atype, int *nbonds, t_params *bond);
+int nm2type(int nnm, t_nm2type nm2t[], t_symtab *tab, t_atoms *atoms,
+ gpp_atomtype *atype, int *nbonds, t_params *bond);
/* Try to determine the atomtype (force field dependent) for the atoms
* with help of the bond list
*/
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxlib/conformation-utilities.h"
#include "gromacs/gmxpreprocess/fflibutil.h"
#include "gromacs/gmxpreprocess/genhydro.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/hizzie.h"
#include "gromacs/gmxpreprocess/pdb2top.h"
#include "gromacs/gmxpreprocess/pgutil.h"
int i;
i = 0;
- while (i < nrr && gmx_strcasecmp(name, rr[i].gmx) != 0)
+ while (i < nrr && !gmx::equalCaseInsensitive(name, rr[i].gmx))
{
i++;
}
for (i = 0; (i < pdba->nres); i++)
{
resnm = *pdba->resinfo[i].name;
- if ((bFullCompare && (gmx_strcasecmp(resnm, oldnm) == 0)) ||
+ if ((bFullCompare && (gmx::equalCaseInsensitive(resnm, oldnm))) ||
(!bFullCompare && strstr(resnm, oldnm) != nullptr))
{
/* Rename the residue name (not the rtp name) */
{
/* We have not set the rtp name yes, use the residue name */
bbnm = *pdba->resinfo[i].name;
- if ((bFullCompare && (gmx_strcasecmp(bbnm, oldnm) == 0)) ||
+ if ((bFullCompare && (gmx::equalCaseInsensitive(bbnm, oldnm))) ||
(!bFullCompare && strstr(bbnm, oldnm) != nullptr))
{
/* Change the rtp builing block name */
static int read_pdball(const char *inf, bool bOutput, const char *outf, char **title,
t_atoms *atoms, rvec **x,
int *ePBC, matrix box, bool bRemoveH,
- t_symtab *symtab, gmx_residuetype_t *rt, const char *watres,
- gmx_atomprop_t aps, bool bVerbose)
+ t_symtab *symtab, ResidueType *rt, const char *watres,
+ AtomProperties *aps, bool bVerbose)
/* Read a pdb file. (containing proteins) */
{
int natom, new_natom, i;
rename_pdbres(atoms, "WAT", watres, false, symtab);
rename_atoms("xlateat.dat", nullptr,
- atoms, symtab, nullptr, true, rt, true, bVerbose);
+ atoms, symtab, nullptr, true,
+ rt, true, bVerbose);
if (natom == 0)
{
{
t_atoms *pdba, *pdbnew;
rvec **xnew;
- int i, j;
t_restp *rptr;
t_pdbindex *pdbi;
- int *a;
char *atomnm;
pdba = *pdbaptr;
snew(xnew, 1);
snew(pdbi, natoms);
- for (i = 0; i < natoms; i++)
+ for (int i = 0; i < natoms; i++)
{
atomnm = *pdba->atomname[i];
rptr = &restp[pdba->atom[i].resind];
- for (j = 0; (j < rptr->natom); j++)
- {
- if (gmx_strcasecmp(atomnm, *(rptr->atomname[j])) == 0)
- {
- break;
- }
- }
+ int j = std::find_if(rptr->atomname, rptr->atomname+rptr->natom,
+ [&atomnm](char** it){return gmx::equalCaseInsensitive(atomnm, *it); })
+ - rptr->atomname;
if (j == rptr->natom)
{
char buf[STRLEN];
std::sort(pdbi, pdbi+natoms, pdbicomp);
/* pdba is sorted in pdbnew using the pdbi index */
- snew(a, natoms);
+ std::vector<int> a(natoms);
snew(pdbnew, 1);
init_t_atoms(pdbnew, natoms, true);
snew(*xnew, natoms);
pdbnew->nres = pdba->nres;
sfree(pdbnew->resinfo);
pdbnew->resinfo = pdba->resinfo;
- for (i = 0; i < natoms; i++)
+ for (int i = 0; i < natoms; i++)
{
pdbnew->atom[i] = pdba->atom[pdbi[i].index];
pdbnew->atomname[i] = pdba->atomname[pdbi[i].index];
/* copy the sorted pdbnew back to pdba */
*pdbaptr = pdbnew;
*x = *xnew;
- add_grp(block, gnames, natoms, a, "prot_sort");
+ add_grp(block, gnames, a, "prot_sort");
sfree(xnew);
- sfree(a);
sfree(pdbi);
}
}
static void
-checkResidueTypeSanity(t_atoms * pdba,
- int r0,
- int r1,
- gmx_residuetype_t * rt)
+checkResidueTypeSanity(t_atoms *pdba,
+ int r0,
+ int r1,
+ ResidueType *rt)
{
std::string startResidueString = gmx::formatString("%s%d", *pdba->resinfo[r0].name, pdba->resinfo[r0].nr);
std::string endResidueString = gmx::formatString("%s%d", *pdba->resinfo[r1-1].name, pdba->resinfo[r1-1].nr);
if (chainID0 != ' ')
{
bool allResiduesHaveSameType = true;
- const char *restype0;
- const char *restype;
- gmx_residuetype_get_type(rt, *pdba->resinfo[r0].name, &restype0);
+ std::string restype;
+ std::string restype0 = rt->typeNameForIndexedResidue(*pdba->resinfo[r0].name);
for (int i = r0 + 1; i < r1; i++)
{
- gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &restype);
- if (gmx_strcasecmp(restype, restype0))
+ restype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+ if (!gmx::equalCaseInsensitive(restype, restype0))
{
allResiduesHaveSameType = false;
residueString = gmx::formatString("%s%d", *pdba->resinfo[i].name, pdba->resinfo[i].nr);
"such as ligands, they should not have the same chain ID as the "
"adjacent protein chain since it's a separate molecule.",
startResidueString.c_str(), endResidueString.c_str(),
- restype0, residueString.c_str(), restype);
+ restype0.c_str(), residueString.c_str(), restype.c_str());
}
}
}
static void find_nc_ter(t_atoms *pdba, int r0, int r1, int *r_start, int *r_end,
- gmx_residuetype_t *rt)
+ ResidueType *rt)
{
int i;
- const char *p_startrestype;
- const char *p_restype;
+ std::string p_startrestype;
*r_start = -1;
*r_end = -1;
/* Find the starting terminus (typially N or 5') */
for (i = r0; i < r1 && *r_start == -1; i++)
{
- gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &p_startrestype);
- if (!gmx_strcasecmp(p_startrestype, "Protein") || !gmx_strcasecmp(p_startrestype, "DNA") || !gmx_strcasecmp(p_startrestype, "RNA") )
+ p_startrestype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+ if (gmx::equalCaseInsensitive(p_startrestype, "Protein") ||
+ gmx::equalCaseInsensitive(p_startrestype, "DNA") ||
+ gmx::equalCaseInsensitive(p_startrestype, "RNA") )
{
printf("Identified residue %s%d as a starting terminus.\n", *pdba->resinfo[i].name, pdba->resinfo[i].nr);
*r_start = i;
}
- else if (!gmx_strcasecmp(p_startrestype, "Ion"))
+ else if (gmx::equalCaseInsensitive(p_startrestype, "Ion"))
{
if (ionNotes < 5)
{
if (*r_start >= 0)
{
/* Go through the rest of the residues, check that they are the same class, and identify the ending terminus. */
- for (i = *r_start; i < r1; i++)
+ for (int i = *r_start; i < r1; i++)
{
- gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &p_restype);
- if (!gmx_strcasecmp(p_restype, p_startrestype) && endWarnings == 0)
+ std::string p_restype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+ if (!gmx::equalCaseInsensitive(p_restype, p_startrestype) && endWarnings == 0)
{
*r_end = i;
}
- else if (!gmx_strcasecmp(p_startrestype, "Ion"))
+ else if (gmx::equalCaseInsensitive(p_startrestype, "Ion"))
{
if (ionNotes < 5)
{
"introduce a break, but that will be catastrophic if they should in fact be\n"
"linked. Please check your structure, and add %s to residuetypes.dat\n"
"if this was not correct.\n\n",
- *pdba->resinfo[i].name, pdba->resinfo[i].nr, p_restype,
- *pdba->resinfo[*r_start].name, pdba->resinfo[*r_start].nr, p_startrestype, *pdba->resinfo[i].name);
+ *pdba->resinfo[i].name, pdba->resinfo[i].nr, p_restype.c_str(),
+ *pdba->resinfo[*r_start].name, pdba->resinfo[*r_start].nr, p_startrestype.c_str(), *pdba->resinfo[i].name);
}
if (endWarnings == 4)
{
open_symtab(&symtab);
/* Residue type database */
- gmx_residuetype_t *rt;
- gmx_residuetype_init(&rt);
+ ResidueType rt;
/* Read residue renaming database(s), if present */
std::vector<std::string> rrn = fflib_search_file_end(ffdir_, ".r2b", FALSE);
/* Add all alternative names from the residue renaming database to the list
of recognized amino/nucleic acids. */
- const char *p_restype;
for (int i = 0; i < nrtprename; i++)
{
- int rc = gmx_residuetype_get_type(rt, rtprename[i].gmx, &p_restype);
-
/* Only add names if the 'standard' gromacs/iupac base name was found */
- if (rc == 0)
+
+ /* TODO this should be changed with gmx::optional so that we only need
+ * to search rt once.
+ */
+ if (rt.nameIndexedInResidueTypes(rtprename[i].gmx))
{
- gmx_residuetype_add(rt, rtprename[i].main, p_restype);
- gmx_residuetype_add(rt, rtprename[i].nter, p_restype);
- gmx_residuetype_add(rt, rtprename[i].cter, p_restype);
- gmx_residuetype_add(rt, rtprename[i].bter, p_restype);
+ std::string restype = rt.typeNameForIndexedResidue(rtprename[i].gmx);
+ rt.addResidue(rtprename[i].main, restype);
+ rt.addResidue(rtprename[i].nter, restype);
+ rt.addResidue(rtprename[i].cter, restype);
+ rt.addResidue(rtprename[i].bter, restype);
}
}
watres = "HOH";
}
- gmx_atomprop_t aps = gmx_atomprop_init();
+ AtomProperties aps;
char *title;
int ePBC;
t_atoms pdba_all;
rvec *pdbx;
int natom = read_pdball(inputConfFile_.c_str(), bOutputSet_, outFile_.c_str(),
&title, &pdba_all, &pdbx, &ePBC, box, bRemoveH_,
- &symtab, rt, watres, aps, bVerbose_);
+ &symtab, &rt, watres, &aps, bVerbose_);
if (natom == 0)
{
this_chainid = ri->chainid;
this_chainnumber = ri->chainnum;
- bWat_ = gmx_strcasecmp(*ri->name, watres) == 0;
+ bWat_ = gmx::equalCaseInsensitive(*ri->name, watres);
if ((i == 0) || (this_chainnumber != prev_chainnumber) || (bWat_ != bPrevWat_))
{
check_occupancy(&pdba_all, inputConfFile_.c_str(), bVerbose_);
/* Read atomtypes... */
- gpp_atomtype_t atype = read_atype(ffdir_, &symtab);
+ gpp_atomtype *atype = read_atype(ffdir_, &symtab);
/* read residue database */
printf("Reading residue database... (%s)\n", forcefield_);
for (int i = 0; i < cc->nterpairs; i++)
{
find_nc_ter(pdba, cc->chainstart[i], cc->chainstart[i+1],
- &(cc->r_start[j]), &(cc->r_end[j]), rt);
+ &(cc->r_start[j]), &(cc->r_end[j]), &rt);
if (cc->r_start[j] >= 0 && cc->r_end[j] >= 0)
{
do now :( AF 26-7-99 */
rename_atoms(nullptr, ffdir_,
- pdba, &symtab, restp_chain, false, rt, false, bVerbose_);
+ pdba, &symtab, restp_chain, false, &rt, false, bVerbose_);
match_atomnames_with_rtp(restp_chain, hb_chain, pdba, x, bVerbose_);
/* make up molecule name(s) */
- int k = (cc->nterpairs > 0 && cc->r_start[0] >= 0) ? cc->r_start[0] : 0;
+ int k = (cc->nterpairs > 0 && cc->r_start[0] >= 0) ? cc->r_start[0] : 0;
- gmx_residuetype_get_type(rt, *pdba->resinfo[k].name, &p_restype);
+ std::string restype = rt.typeNameForIndexedResidue(*pdba->resinfo[k].name);
std::string molname;
std::string suffix;
if (suffix.length() > 0)
{
- molname.append(p_restype);
+ molname.append(restype);
molname.append(suffix);
}
else
{
- molname = p_restype;
+ molname = restype;
}
}
std::string itp_fn = topologyFile_;;
print_top_mols(top_file, title, ffdir_, watermodel_, nincl_, incls_, nmol_, mols_);
gmx_fio_fclose(top_file);
- gmx_residuetype_destroy(rt);
-
/* now merge all chains back together */
natom = 0;
int nres = 0;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/gmxpreprocess/gen_ad.h"
#include "gromacs/gmxpreprocess/gen_vsite.h"
#include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pgutil.h"
#include "gromacs/gmxpreprocess/resall.h"
+#include "gromacs/gmxpreprocess/specbond.h"
#include "gromacs/gmxpreprocess/topdirs.h"
#include "gromacs/gmxpreprocess/topio.h"
#include "gromacs/gmxpreprocess/toputil.h"
}
static int name2type(t_atoms *at, int **cgnr,
- t_restp restp[], gmx_residuetype_t *rt)
+ t_restp restp[], ResidueType *rt)
{
int i, j, prevresind, resind, i0, prevcg, cg, curcg;
char *name;
{
bool bProt;
resind = at->atom[i].resind;
- bProt = gmx_residuetype_is_protein(rt, *(at->resinfo[resind].name));
+ bProt = rt->namedResidueHasType(*(at->resinfo[resind].name), "Protein");
bNterm = bProt && (resind == 0);
if (resind > 0)
{
static void print_top_system(FILE *out, const char *title)
{
- fprintf(out, "[ %s ]\n", dir2str(d_system));
+ fprintf(out, "[ %s ]\n", dir2str(Directive::d_system));
fprintf(out, "; Name\n");
fprintf(out, "%s\n\n", title[0] ? title : "Protein");
}
if (nmol)
{
- fprintf(out, "[ %s ]\n", dir2str(d_molecules));
+ fprintf(out, "[ %s ]\n", dir2str(Directive::d_molecules));
fprintf(out, "; %-15s %5s\n", "Compound", "#mols");
for (int i = 0; i < nmol; i++)
{
void write_top(FILE *out, const char *pr, const char *molname,
t_atoms *at, bool bRTPresname,
int bts[], t_params plist[], t_excls excls[],
- gpp_atomtype_t atype, int *cgnr, int nrexcl)
+ gpp_atomtype *atype, int *cgnr, int nrexcl)
/* NOTE: nrexcl is not the size of *excl! */
{
if (at && atype && cgnr)
{
- fprintf(out, "[ %s ]\n", dir2str(d_moleculetype));
+ fprintf(out, "[ %s ]\n", dir2str(Directive::d_moleculetype));
fprintf(out, "; %-15s %5s\n", "Name", "nrexcl");
fprintf(out, "%-15s %5d\n\n", molname ? molname : "Protein", nrexcl);
print_atoms(out, atype, at, cgnr, bRTPresname);
- print_bondeds(out, at->nr, d_bonds, F_BONDS, bts[ebtsBONDS], plist);
- print_bondeds(out, at->nr, d_constraints, F_CONSTR, 0, plist);
- print_bondeds(out, at->nr, d_constraints, F_CONSTRNC, 0, plist);
- print_bondeds(out, at->nr, d_pairs, F_LJ14, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_bonds, F_BONDS, bts[ebtsBONDS], plist);
+ print_bondeds(out, at->nr, Directive::d_constraints, F_CONSTR, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_constraints, F_CONSTRNC, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_pairs, F_LJ14, 0, plist);
print_excl(out, at->nr, excls);
- print_bondeds(out, at->nr, d_angles, F_ANGLES, bts[ebtsANGLES], plist);
- print_bondeds(out, at->nr, d_dihedrals, F_PDIHS, bts[ebtsPDIHS], plist);
- print_bondeds(out, at->nr, d_dihedrals, F_IDIHS, bts[ebtsIDIHS], plist);
- print_bondeds(out, at->nr, d_cmap, F_CMAP, bts[ebtsCMAP], plist);
- print_bondeds(out, at->nr, d_polarization, F_POLARIZATION, 0, plist);
- print_bondeds(out, at->nr, d_thole_polarization, F_THOLE_POL, 0, plist);
- print_bondeds(out, at->nr, d_vsites2, F_VSITE2, 0, plist);
- print_bondeds(out, at->nr, d_vsites3, F_VSITE3, 0, plist);
- print_bondeds(out, at->nr, d_vsites3, F_VSITE3FD, 0, plist);
- print_bondeds(out, at->nr, d_vsites3, F_VSITE3FAD, 0, plist);
- print_bondeds(out, at->nr, d_vsites3, F_VSITE3OUT, 0, plist);
- print_bondeds(out, at->nr, d_vsites4, F_VSITE4FD, 0, plist);
- print_bondeds(out, at->nr, d_vsites4, F_VSITE4FDN, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_angles, F_ANGLES, bts[ebtsANGLES], plist);
+ print_bondeds(out, at->nr, Directive::d_dihedrals, F_PDIHS, bts[ebtsPDIHS], plist);
+ print_bondeds(out, at->nr, Directive::d_dihedrals, F_IDIHS, bts[ebtsIDIHS], plist);
+ print_bondeds(out, at->nr, Directive::d_cmap, F_CMAP, bts[ebtsCMAP], plist);
+ print_bondeds(out, at->nr, Directive::d_polarization, F_POLARIZATION, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_thole_polarization, F_THOLE_POL, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites2, F_VSITE2, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites3, F_VSITE3, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites3, F_VSITE3FD, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites3, F_VSITE3FAD, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites3, F_VSITE3OUT, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites4, F_VSITE4FD, 0, plist);
+ print_bondeds(out, at->nr, Directive::d_vsites4, F_VSITE4FDN, 0, plist);
if (pr)
{
void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
- t_atoms *atoms, rvec **x, gpp_atomtype_t atype, t_symtab *tab,
+ t_atoms *atoms, rvec **x, gpp_atomtype *atype, t_symtab *tab,
int nrtp, t_restp rtp[],
t_restp *restp, t_hackblock *hb,
bool bAllowMissing,
int *vsite_type;
int i, nmissat;
int bts[ebtsNR];
- gmx_residuetype_t*rt;
init_plist(plist);
- gmx_residuetype_init(&rt);
+ ResidueType rt;
/* Make bonds */
at2bonds(&(plist[F_BONDS]), hb,
atoms, nssbonds, ssbonds,
bAllowMissing);
- nmissat = name2type(atoms, &cgnr, restp, rt);
+ nmissat = name2type(atoms, &cgnr, restp, &rt);
if (nmissat)
{
if (bAllowMissing)
/* cleaning up */
free_t_hackblock(atoms->nres, &hb);
free_t_restp(atoms->nres, &restp);
- gmx_residuetype_destroy(rt);
/* we should clean up hb and restp here, but that is a *L*O*T* of work! */
sfree(cgnr);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_PDB2TOP_H
#define GMX_GMXPREPROCESS_PDB2TOP_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+#include <cstdio>
+
+#include "gromacs/math/vectypes.h"
+
+struct gpp_atomtype;
+struct t_atoms;
+struct t_excls;
+struct t_hackblock;
+struct t_mols;
+struct t_params;
+struct t_resinfo;
+struct t_restp;
+struct t_ssbond;
+struct t_symtab;
/* this *MUST* correspond to array in pdb2top.c */
enum {
};
extern const char *hh[ehisNR];
-typedef struct {
- int res1, res2;
- char *a1, *a2;
-} t_ssbond;
-
void choose_ff(const char *ffsel,
char *forcefield, int ff_maxlen,
char *ffdir, int ffdir_maxlen);
void write_top(FILE *out, const char *pr, const char *molname,
t_atoms *at, bool bRTPresname,
int bts[], t_params plist[], t_excls excls[],
- gpp_atomtype_t atype, int *cgnr, int nrexcl);
+ gpp_atomtype *atype, int *cgnr, int nrexcl);
/* NOTE: nrexcl is not the size of *excl! */
void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
t_atoms *atoms, rvec **x,
- gpp_atomtype_t atype, struct t_symtab *tab,
+ gpp_atomtype *atype, t_symtab *tab,
int nrtp, t_restp rtp[],
t_restp *restp, t_hackblock *hb,
bool bAllowMissing,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
{
t_grpopts *opts;
- const gmx_groups_t *groups;
pull_params_t *pull;
int natoms, ai, aj, i, j, d, g, imin, jmin;
int *nrdf2, *na_vcm, na_tot;
double *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
ivec *dof_vcm;
- gmx_mtop_atomloop_all_t aloop;
int mol, ftype, as;
/* Calculate nrdf.
opts = &ir->opts;
- groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
natoms = mtop->natoms;
/* Allocate one more for a possible rest group */
/* We need to sum degrees of freedom into doubles,
* since floats give too low nrdf's above 3 million atoms.
*/
- snew(nrdf_tc, groups->grps[egcTC].nr+1);
- snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
- snew(dof_vcm, groups->grps[egcVCM].nr+1);
- snew(na_vcm, groups->grps[egcVCM].nr+1);
- snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
+ snew(nrdf_tc, groups.grps[egcTC].nr+1);
+ snew(nrdf_vcm, groups.grps[egcVCM].nr+1);
+ snew(dof_vcm, groups.grps[egcVCM].nr+1);
+ snew(na_vcm, groups.grps[egcVCM].nr+1);
+ snew(nrdf_vcm_sub, groups.grps[egcVCM].nr+1);
- for (i = 0; i < groups->grps[egcTC].nr; i++)
+ for (i = 0; i < groups.grps[egcTC].nr; i++)
{
nrdf_tc[i] = 0;
}
- for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
+ for (i = 0; i < groups.grps[egcVCM].nr+1; i++)
{
nrdf_vcm[i] = 0;
clear_ivec(dof_vcm[i]);
}
snew(nrdf2, natoms);
- aloop = gmx_mtop_atomloop_all_init(mtop);
- const t_atom *atom;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
nrdf2[i] = 0;
- if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
+ if (local.ptype == eptAtom || local.ptype == eptNucleus)
{
g = getGroupType(groups, egcFREEZE, i);
- for (d = 0; d < DIM; d++)
+ for (int d = 0; d < DIM; d++)
{
if (opts->nFreeze[g][d] == 0)
{
for (const gmx_molblock_t &molb : mtop->molblock)
{
const gmx_moltype_t &molt = mtop->moltype[molb.type];
- atom = molt.atoms.atom;
+ const t_atom *atom = molt.atoms.atom;
for (mol = 0; mol < molb.nmol; mol++)
{
for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
nrdf_vcm[getGroupType(groups, egcVCM, ai)] -= 0.5*imin;
if (nrdf_tc[getGroupType(groups, egcTC, ai)] < 0)
{
- gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups->grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
+ gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups.grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
}
}
else
* the number of degrees of freedom in each vcm group when COM
* translation is removed and 6 when rotation is removed as well.
*/
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
switch (ir->comm_mode)
{
}
}
- for (i = 0; i < groups->grps[egcTC].nr; i++)
+ for (i = 0; i < groups.grps[egcTC].nr; i++)
{
/* Count the number of atoms of TC group i for every VCM group */
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
na_vcm[j] = 0;
}
*/
nrdf_uc = nrdf_tc[i];
nrdf_tc[i] = 0;
- for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+ for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
{
if (nrdf_vcm[j] > nrdf_vcm_sub[j])
{
}
}
}
- for (i = 0; (i < groups->grps[egcTC].nr); i++)
+ for (i = 0; (i < groups.grps[egcTC].nr); i++)
{
opts->nrdf[i] = nrdf_tc[i];
if (opts->nrdf[i] < 0)
}
fprintf(stderr,
"Number of degrees of freedom in T-Coupling group %s is %.2f\n",
- gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
+ gnames[groups.grps[egcTC].nm_ind[i]], opts->nrdf[i]);
}
sfree(nrdf2);
real *mgrp, mt;
rvec acc;
gmx_mtop_atomloop_block_t aloopb;
- gmx_mtop_atomloop_all_t aloop;
ivec AbsRef;
char warn_buf[STRLEN];
{
clear_rvec(acc);
snew(mgrp, sys->groups.grps[egcACC].nr);
- aloop = gmx_mtop_atomloop_all_init(sys);
- const t_atom *atom;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*sys))
{
- mgrp[getGroupType(&sys->groups, egcACC, i)] += atom->m;
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ mgrp[getGroupType(sys->groups, egcACC, i)] += local.m;
}
mt = 0.0;
for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#define GMX_GMXPREPROCESS_READIR_H
#include "gromacs/fileio/readinp.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/math/vectypes.h"
+#include "gromacs/utility/real.h"
namespace gmx
{
struct gmx_output_env_t;
struct pull_params_t;
struct pull_t;
+struct t_blocka;
struct t_grpopts;
struct t_inpfile;
struct t_inputrec;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <vector>
#include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pgutil.h"
+#include "gromacs/topology/atoms.h"
#include "gromacs/topology/symtab.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strdb.h"
-gpp_atomtype_t read_atype(const char *ffdir, t_symtab *tab)
+gpp_atomtype *read_atype(const char *ffdir, t_symtab *tab)
{
FILE *in;
char buf[STRLEN], name[STRLEN];
double m;
int nratt = 0;
- gpp_atomtype_t at;
+ gpp_atomtype *at;
t_atom *a;
t_param *nb;
return at;
}
-static void print_resatoms(FILE *out, gpp_atomtype_t atype, t_restp *rtp)
+static void print_resatoms(FILE *out, gpp_atomtype *atype, t_restp *rtp)
{
int j, tp;
char *tpnm;
}
static bool read_atoms(FILE *in, char *line,
- t_restp *r0, t_symtab *tab, gpp_atomtype_t atype)
+ t_restp *r0, t_symtab *tab, gpp_atomtype *atype)
{
int i, j, cg, maxentries;
char buf[256], buf1[256];
}
void print_resall(FILE *out, int nrtp, t_restp rtp[],
- gpp_atomtype_t atype)
+ gpp_atomtype *atype)
{
int i, bt;
}
void read_resall(const char *rrdb, int *nrtpptr, t_restp **rtp,
- gpp_atomtype_t atype, t_symtab *tab,
+ gpp_atomtype *atype, t_symtab *tab,
bool bAllowOverrideRTP)
{
FILE *in;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_RESALL_H
#define GMX_GMXPREPROCESS_RESALL_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include <cstdio>
+
+struct gpp_atomtype;
+struct t_restp;
+struct t_symtab;
char *search_rtp(const char *key, int nrtp, t_restp rtp[]);
/* Search for an entry in the rtp database, returns the rtp residue name.
* Generates a fatal error when rtpname is not found.
*/
-gpp_atomtype_t read_atype(const char *ffdir, struct t_symtab *tab);
+gpp_atomtype *read_atype(const char *ffdir, t_symtab *tab);
/* read atom type database(s) */
void read_resall(const char *resdb, int *nrtp, t_restp **rtp,
- gpp_atomtype_t atype, struct t_symtab *tab,
+ gpp_atomtype *atype, t_symtab *tab,
bool bAllowOverrideRTP);
/* read rtp database, append to the existing database */
void print_resall(FILE *out, int nrtp, t_restp rtp[],
- gpp_atomtype_t atype);
+ gpp_atomtype *atype);
/* write rtp database */
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
const gmx::TopologyInformation &topInfo,
t_atoms *atoms,
std::vector<RVec> *x, std::vector<RVec> *v,
- matrix box, gmx_atomprop_t aps,
+ matrix box, AtomProperties *aps,
real defaultDistance, real scaleFactor,
real rshell, int max_sol)
{
}
}
-static void update_top(t_atoms *atoms, int firstSolventResidueIndex, matrix box, int NFILE, t_filenm fnm[],
- gmx_atomprop_t aps)
+static void update_top(t_atoms *atoms,
+ int firstSolventResidueIndex,
+ matrix box,
+ int NFILE,
+ t_filenm fnm[],
+ AtomProperties *aps)
{
FILE *fpin, *fpout;
char buf[STRLEN*2], buf2[STRLEN], *temp;
mtot = 0;
for (i = 0; (i < atoms->nr); i++)
{
- gmx_atomprop_query(aps, epropMass,
- *atoms->resinfo[atoms->atom[i].resind].name,
- *atoms->atomname[i], &mm);
+ aps->setAtomProperty(epropMass,
+ std::string(*atoms->resinfo[atoms->atom[i].resind].name),
+ std::string(*atoms->atomname[i]), &mm);
mtot += mm;
}
/* parameter data */
gmx_bool bProt, bBox;
const char *conf_prot, *confout;
- gmx_atomprop_t aps;
t_filenm fnm[] = {
{ efSTX, "-cp", "protein", ffOPTRD },
"a box size (-box) must be specified");
}
- aps = gmx_atomprop_init();
+ AtomProperties aps;
gmx::TopologyInformation topInfo;
std::vector<RVec> x, v;
}
add_solv(solventFileName, topInfo, atoms.get(), &x, &v, box,
- aps, defaultDistance, scaleFactor, r_shell, max_sol);
+ &aps, defaultDistance, scaleFactor, r_shell, max_sol);
/* write new configuration 1 to file confout */
confout = ftp2fn(efSTO, NFILE, fnm);
/* print size of generated configuration */
fprintf(stderr, "\nOutput configuration contains %d atoms in %d residues\n",
atoms->nr, atoms->nres);
- update_top(atoms.get(), firstSolventResidueIndex, box, NFILE, fnm, aps);
-
- gmx_atomprop_destroy(aps);
+ update_top(atoms.get(), firstSolventResidueIndex, box, NFILE, fnm, &aps);
output_env_done(oenv);
return 0;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strdb.h"
+struct t_specbond
+{
+ char *res1, *res2;
+ char *atom1, *atom2;
+ char *newres1, *newres2;
+ int nbond1, nbond2;
+ real length;
+};
+
bool yesno()
{
char c;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_SPECBOND_H
#define GMX_GMXPREPROCESS_SPECBOND_H
-#include "gromacs/gmxpreprocess/pdb2top.h"
+#include "gromacs/math/vectypes.h"
+
+struct t_atoms;
+struct t_specbond;
+
+struct t_ssbond
+{
+ int res1, res2;
+ char *a1, *a2;
+};
int mk_specbonds(t_atoms *pdba, rvec x[], bool bInteractive,
t_ssbond **specbonds, bool bVerbose);
+t_specbond *get_specbonds(int *nspecbond);
+void done_specbonds(int nsb, t_specbond sb[]);
+
bool yesno();
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/fileio/gmxfio.h"
#include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/resall.h"
#include "gromacs/gmxpreprocess/toputil.h"
#define FATAL() gmx_fatal(FARGS, "Reading Termini Database: not enough items on line\n%s", line)
static void read_atom(char *line, bool bAdd,
- char **nname, t_atom *a, gpp_atomtype_t atype, int *cgnr)
+ char **nname, t_atom *a, gpp_atomtype *atype, int *cgnr)
{
int nr, i;
char buf[5][30];
}
}
-static void print_atom(FILE *out, t_atom *a, gpp_atomtype_t atype)
+static void print_atom(FILE *out, t_atom *a, gpp_atomtype *atype)
{
fprintf(out, "\t%s\t%g\t%g\n",
get_atomtype_name(a->type, atype), a->m, a->q);
}
static void print_ter_db(const char *ff, char C, int nb, t_hackblock tb[],
- gpp_atomtype_t atype)
+ gpp_atomtype *atype)
{
FILE *out;
int i, j, k, bt, nrepl, nadd, ndel;
static void read_ter_db_file(const char *fn,
int *ntbptr, t_hackblock **tbptr,
- gpp_atomtype_t atype)
+ gpp_atomtype *atype)
{
char filebase[STRLEN], *ptr;
FILE *in;
}
int read_ter_db(const char *ffdir, char ter,
- t_hackblock **tbptr, gpp_atomtype_t atype)
+ t_hackblock **tbptr, gpp_atomtype *atype)
{
char ext[STRLEN];
int ntb;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TER_DB_H
#define GMX_GMXPREPROCESS_TER_DB_H
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
-
+struct gpp_atomtype;
+struct t_hackblock;
int read_ter_db(const char *ffdir, char ter,
- t_hackblock **tbptr, gpp_atomtype_t atype);
+ t_hackblock **tbptr, gpp_atomtype *atype);
/* Read database for N&C terminal hacking */
t_hackblock **filter_ter(int nb, t_hackblock tb[],
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
insert-molecules.cpp
readir.cpp
solvate.cpp
+ topdirs.cpp
)
# Currently these are too slow to run in Jenkins, so they are in their
"solvate", "-cs"
};
setInputFile("-cp", "spc-and-methanol.gro");
-
- // TODO: Consider adding a convenience method for this.
- std::string topFileName = gmx::test::TestFileManager::getInputFilePath("spc-and-methanol.top");
- std::string modifiableTopFileName = fileManager().getTemporaryFilePath(".top");
- gmx_file_copy(topFileName.c_str(), modifiableTopFileName.c_str(), true);
- commandLine().addOption("-p", modifiableTopFileName);
+ setModifiableInputFile("-p", "spc-and-methanol.top");
runTest(CommandLine(cmdline));
}
};
setInputFile("-cs", "mixed_solvent.gro");
setInputFile("-cp", "simple.gro");
-
- // TODO: Consider adding a convenience method for this.
- // Copies topology file to where it would be found as an output file, so the copied
- // .top file is used as both input and output
- std::string topFileName = gmx::test::TestFileManager::getInputFilePath("simple.top");
- std::string modifiableTopFileName = fileManager().getTemporaryFilePath("simple.top");
- gmx_file_copy(topFileName.c_str(), modifiableTopFileName.c_str(), true);
- setOutputFile("-p", "simple.top", ExactTextMatch());
+ setInputAndOutputFile("-p", "simple.top", ExactTextMatch());
runTest(CommandLine(cmdline));
}
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Test routines that handle topology directive data structures
+ * and files.
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/gmxpreprocess/topdirs.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/utility/enumerationhelpers.h"
+
+TEST(TopDirTests, NamesArrayHasCorrectSize)
+{
+ for (auto d : gmx::EnumerationWrapper<Directive>())
+ {
+ // If the enumeration is extended, but there is no matching
+ // name, then at least one element will be value initialized,
+ // ie. to nullptr, which this test will catch.
+ auto name = dir2str(d);
+ EXPECT_NE(name, nullptr);
+ }
+}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
}
-void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype_t atype)
+void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype *atype)
{
int n2m;
t_2morse *t2m;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TOMORSE_H
#define GMX_GMXPREPROCESS_TOMORSE_H
-#include <stdio.h>
+struct gpp_atomtype;
+struct t_molinfo;
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-
-void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype_t atype);
+void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype *atype);
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cstdarg>
#include <cstdio>
+#include <algorithm>
+
+#include "gromacs/topology/idef.h"
#include "gromacs/utility/cstringutil.h"
+#include "gromacs/utility/enumerationhelpers.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
-/* Must correspond to the directive enum in grompp-impl.h */
-static const char *directive_names[d_maxdir+1] = {
- "defaults",
- "atomtypes",
- "bondtypes",
- "constrainttypes",
- "pairtypes",
- "angletypes",
- "dihedraltypes",
- "nonbond_params",
- "implicit_genborn_params",
- "implicit_surface_params",
- "cmaptypes",
- /* All the directives above can not appear after moleculetype */
- "moleculetype",
- "atoms",
- "virtual_sites2",
- "virtual_sites3",
- "virtual_sites4",
- "virtual_sitesn",
- "bonds",
- "exclusions",
- "pairs",
- "pairs_nb",
- "angles",
- "dihedrals",
- "constraints",
- "settles",
- "polarization",
- "water_polarization",
- "thole_polarization",
- "system",
- "molecules",
- "position_restraints",
- "angle_restraints",
- "angle_restraints_z",
- "distance_restraints",
- "orientation_restraints",
- "dihedral_restraints",
- "cmap",
- "intermolecular_interactions",
- "invalid"
-};
+/* Must correspond to the Directive enum in grompp-impl.h */
+static gmx::EnumerationArray<Directive, const char *> directive_names
+ = { {
+ "defaults",
+ "atomtypes",
+ "bondtypes",
+ "constrainttypes",
+ "pairtypes",
+ "angletypes",
+ "dihedraltypes",
+ "nonbond_params",
+ "implicit_genborn_params",
+ "implicit_surface_params",
+ "cmaptypes",
+ /* All the directives above can not appear after moleculetype */
+ "moleculetype",
+ "atoms",
+ "virtual_sites2",
+ "virtual_sites3",
+ "virtual_sites4",
+ "virtual_sitesn",
+ "bonds",
+ "exclusions",
+ "pairs",
+ "pairs_nb",
+ "angles",
+ "dihedrals",
+ "constraints",
+ "settles",
+ "polarization",
+ "water_polarization",
+ "thole_polarization",
+ "system",
+ "molecules",
+ "position_restraints",
+ "angle_restraints",
+ "angle_restraints_z",
+ "distance_restraints",
+ "orientation_restraints",
+ "dihedral_restraints",
+ "cmap",
+ "intermolecular_interactions",
+ "maxdirs",
+ "invalid",
+ "none"
+ }};
-int ifunc_index(directive d, int type)
+int ifunc_index(Directive d, int type)
{
switch (d)
{
- case d_bondtypes:
- case d_bonds:
+ case Directive::d_bondtypes:
+ case Directive::d_bonds:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid bond type %d", type);
}
- case d_angles:
- case d_angletypes:
+ case Directive::d_angles:
+ case Directive::d_angletypes:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid angle type %d", type);
}
- case d_pairs:
- case d_pairtypes:
- if (type == 1 || (d == d_pairtypes && type == 2))
+ case Directive::d_pairs:
+ case Directive::d_pairtypes:
+ if (type == 1 || (d == Directive::d_pairtypes && type == 2))
{
return F_LJ14;
}
{
gmx_fatal(FARGS, "Invalid pairs type %d", type);
}
- case d_pairs_nb:
+ case Directive::d_pairs_nb:
return F_LJC_PAIRS_NB;
- case d_dihedrals:
- case d_dihedraltypes:
+ case Directive::d_dihedrals:
+ case Directive::d_dihedraltypes:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid dihedral type %d", type);
}
- case d_cmaptypes:
- case d_cmap:
+ case Directive::d_cmaptypes:
+ case Directive::d_cmap:
return F_CMAP;
- case d_nonbond_params:
+ case Directive::d_nonbond_params:
if (type == 1)
{
return F_LJ;
{
return F_BHAM;
}
- case d_vsites2:
+ case Directive::d_vsites2:
return F_VSITE2;
- case d_vsites3:
+ case Directive::d_vsites3:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid vsites3 type %d", type);
}
- case d_vsites4:
+ case Directive::d_vsites4:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid vsites4 type %d", type);
}
- case d_vsitesn:
+ case Directive::d_vsitesn:
return F_VSITEN;
- case d_constraints:
- case d_constrainttypes:
+ case Directive::d_constraints:
+ case Directive::d_constrainttypes:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid constraints type %d", type);
}
- case d_settles:
+ case Directive::d_settles:
return F_SETTLE;
- case d_position_restraints:
+ case Directive::d_position_restraints:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid position restraint type %d", type);
}
- case d_polarization:
+ case Directive::d_polarization:
switch (type)
{
case 1:
default:
gmx_fatal(FARGS, "Invalid polarization type %d", type);
}
- case d_thole_polarization:
+ case Directive::d_thole_polarization:
return F_THOLE_POL;
- case d_water_polarization:
+ case Directive::d_water_polarization:
return F_WATER_POL;
- case d_angle_restraints:
+ case Directive::d_angle_restraints:
return F_ANGRES;
- case d_angle_restraints_z:
+ case Directive::d_angle_restraints_z:
return F_ANGRESZ;
- case d_distance_restraints:
+ case Directive::d_distance_restraints:
return F_DISRES;
- case d_orientation_restraints:
+ case Directive::d_orientation_restraints:
return F_ORIRES;
- case d_dihedral_restraints:
+ case Directive::d_dihedral_restraints:
return F_DIHRES;
default:
gmx_fatal(FARGS, "invalid directive %s in ifunc_index (%s:%d)",
}
}
-const char *dir2str (directive d)
+const char *dir2str (Directive d)
{
- if (d < d_maxdir)
- {
- return directive_names[d];
- }
- else
- {
- return directive_names[d_maxdir];
- }
+ int index = static_cast<int>(d);
+ return directive_names[index];
}
-directive str2dir (char *dstr)
+Directive str2dir (char *dstr)
{
- int d;
char buf[STRLEN], *ptr;
/* Hack to be able to read old topologies */
ptr = dstr;
}
- for (d = 0; (d < d_maxdir); d++)
+ for (auto d : gmx::EnumerationWrapper<Directive>())
{
- if (gmx_strcasecmp_min(ptr, dir2str(static_cast<directive>(d))) == 0)
+ if (gmx_strcasecmp_min(ptr, dir2str(static_cast<Directive>(d))) == 0)
{
- return static_cast<directive>(d);
+ return static_cast<Directive>(d);
}
}
- return d_invalid;
+ return Directive::d_invalid;
}
-static directive **necessary = nullptr;
+static gmx::EnumerationArray<Directive, Directive *> necessary = {{ nullptr }};
-static void set_nec(directive **n, ...)
+static void set_nec(Directive **n, ...)
/* Must always have at least one extra argument */
{
va_list ap;
int ind = 0;
- directive d;
+ Directive d;
va_start(ap, n);
do
{
- d = static_cast<directive>(va_arg(ap, int));
+ d = static_cast<Directive>(va_arg(ap, int));
srenew(*n, ++ind);
(*n)[ind-1] = d;
}
- while (d != d_none);
+ while (d != Directive::d_none);
va_end(ap);
}
void DS_Init(DirStack **DS)
{
- if (necessary == nullptr)
+ if (necessary[0] == nullptr)
{
- int i;
-
- snew(necessary, d_maxdir);
- set_nec(&(necessary[d_defaults]), d_none);
- set_nec(&(necessary[d_atomtypes]), d_defaults, d_none);
- set_nec(&(necessary[d_bondtypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_constrainttypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_pairtypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_angletypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_dihedraltypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_nonbond_params]), d_atomtypes, d_none);
+ set_nec(&(necessary[Directive::d_defaults]), Directive::d_none);
+ set_nec(&(necessary[Directive::d_atomtypes]), Directive::d_defaults, Directive::d_none);
+ set_nec(&(necessary[Directive::d_bondtypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_constrainttypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_pairtypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_angletypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_dihedraltypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_nonbond_params]), Directive::d_atomtypes, Directive::d_none);
// Note that the content of the next two directives are
// ignored, but if grompp reads them in old force field files,
// it still needs to understand that they are in a valid place
// be in the same place that was valid in old versions (ie. child
// directive of [atomtypes]) but any relevant case will
// satisfy that.
- set_nec(&(necessary[d_implicit_genborn_params]), d_atomtypes, d_none);
- set_nec(&(necessary[d_implicit_surface_params]), d_atomtypes, d_none);
- set_nec(&(necessary[d_cmaptypes]), d_atomtypes, d_none);
- set_nec(&(necessary[d_moleculetype]), d_atomtypes, d_none);
- set_nec(&(necessary[d_atoms]), d_moleculetype, d_none);
- set_nec(&(necessary[d_vsites2]), d_atoms, d_none);
- set_nec(&(necessary[d_vsites3]), d_atoms, d_none);
- set_nec(&(necessary[d_vsites4]), d_atoms, d_none);
- set_nec(&(necessary[d_vsitesn]), d_atoms, d_none);
- set_nec(&(necessary[d_bonds]), d_atoms, d_none);
- set_nec(&(necessary[d_exclusions]), d_bonds, d_constraints, d_settles, d_none);
- set_nec(&(necessary[d_pairs]), d_atoms, d_none);
- set_nec(&(necessary[d_pairs_nb]), d_atoms, d_none);
- set_nec(&(necessary[d_angles]), d_atoms, d_none);
- set_nec(&(necessary[d_polarization]), d_atoms, d_none);
- set_nec(&(necessary[d_water_polarization]), d_atoms, d_none);
- set_nec(&(necessary[d_thole_polarization]), d_atoms, d_none);
- set_nec(&(necessary[d_dihedrals]), d_atoms, d_none);
- set_nec(&(necessary[d_constraints]), d_atoms, d_none);
- set_nec(&(necessary[d_settles]), d_atoms, d_none);
- set_nec(&(necessary[d_system]), d_moleculetype, d_none);
- set_nec(&(necessary[d_molecules]), d_system, d_none);
- set_nec(&(necessary[d_position_restraints]), d_atoms, d_none);
- set_nec(&(necessary[d_angle_restraints]), d_atoms, d_none);
- set_nec(&(necessary[d_angle_restraints_z]), d_atoms, d_none);
- set_nec(&(necessary[d_distance_restraints]), d_atoms, d_none);
- set_nec(&(necessary[d_orientation_restraints]), d_atoms, d_none);
- set_nec(&(necessary[d_dihedral_restraints]), d_atoms, d_none);
- set_nec(&(necessary[d_cmap]), d_atoms, d_none);
- set_nec(&(necessary[d_intermolecular_interactions]), d_molecules, d_none);
-
- for (i = 0; (i < d_maxdir); i++)
- {
- if (necessary[i])
- {
- directive d;
- int j = 0;
- do
- {
- d = necessary[i][j++];
- }
- while (d != d_none);
- }
- }
+ set_nec(&(necessary[Directive::d_implicit_genborn_params]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_implicit_surface_params]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_cmaptypes]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_moleculetype]), Directive::d_atomtypes, Directive::d_none);
+ set_nec(&(necessary[Directive::d_atoms]), Directive::d_moleculetype, Directive::d_none);
+ set_nec(&(necessary[Directive::d_vsites2]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_vsites3]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_vsites4]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_vsitesn]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_bonds]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_exclusions]), Directive::d_bonds, Directive::d_constraints, Directive::d_settles, Directive::d_none);
+ set_nec(&(necessary[Directive::d_pairs]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_pairs_nb]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_angles]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_polarization]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_water_polarization]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_thole_polarization]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_dihedrals]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_constraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_settles]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_system]), Directive::d_moleculetype, Directive::d_none);
+ set_nec(&(necessary[Directive::d_molecules]), Directive::d_system, Directive::d_none);
+ set_nec(&(necessary[Directive::d_position_restraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_angle_restraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_angle_restraints_z]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_distance_restraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_orientation_restraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_dihedral_restraints]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_cmap]), Directive::d_atoms, Directive::d_none);
+ set_nec(&(necessary[Directive::d_intermolecular_interactions]), Directive::d_molecules, Directive::d_none);
}
*DS = nullptr;
}
}
-void DS_Push (DirStack **DS, directive d)
+void DS_Push (DirStack **DS, Directive d)
{
DirStack *D;
*DS = D;
}
-int DS_Search(DirStack *DS, directive d)
+int DS_Search(DirStack *DS, Directive d)
{
DirStack *D;
return static_cast<int>(D != nullptr);
}
-int DS_Check_Order(DirStack *DS, directive d)
+int DS_Check_Order(DirStack *DS, Directive d)
{
- directive d0;
+ Directive d0;
int i = 0;
/* Check if parameter definitions appear after a moleculetype directive */
- if (d < d_moleculetype && DS_Search(DS, d_moleculetype))
+ if (d < Directive::d_moleculetype && DS_Search(DS, Directive::d_moleculetype))
{
return FALSE;
}
/* Check if all the necessary directives have appeared before directive d */
- if (necessary[d][0] == d_none)
+ if (necessary[d][0] == Directive::d_none)
{
return TRUE;
}
return TRUE;
}
}
- while (d0 != d_none);
+ while (d0 != Directive::d_none);
}
return FALSE;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TOPDIRS_H
#define GMX_GMXPREPROCESS_TOPDIRS_H
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+/* Must correspond to strings in topdirs.cpp */
+enum class Directive : int
+{
+ d_defaults,
+ d_atomtypes,
+ d_bondtypes,
+ d_constrainttypes,
+ d_pairtypes,
+ d_angletypes,
+ d_dihedraltypes,
+ d_nonbond_params,
+ d_implicit_genborn_params,
+ d_implicit_surface_params,
+ d_cmaptypes,
+ d_moleculetype,
+ d_atoms,
+ d_vsites2,
+ d_vsites3,
+ d_vsites4,
+ d_vsitesn,
+ d_bonds,
+ d_exclusions,
+ d_pairs,
+ d_pairs_nb,
+ d_angles,
+ d_dihedrals,
+ d_constraints,
+ d_settles,
+ d_polarization,
+ d_water_polarization,
+ d_thole_polarization,
+ d_system,
+ d_molecules,
+ d_position_restraints,
+ d_angle_restraints,
+ d_angle_restraints_z,
+ d_distance_restraints,
+ d_orientation_restraints,
+ d_dihedral_restraints,
+ d_cmap,
+ d_intermolecular_interactions,
+ d_maxdir,
+ d_invalid,
+ d_none,
+ Count
+};
-typedef struct tagDirStack {
- directive d;
- struct tagDirStack *prev;
-} DirStack;
+struct DirStack
+{
+ Directive d;
+ DirStack *prev;
+};
-int ifunc_index(directive d, int type);
+int ifunc_index(Directive d, int type);
-const char *dir2str (directive d);
+const char *dir2str (Directive d);
-directive str2dir (char *dstr);
+Directive str2dir (char *dstr);
void DS_Init (DirStack **DS);
void DS_Done (DirStack **DS);
-void DS_Push (DirStack **DS, directive d);
+void DS_Push (DirStack **DS, Directive d);
-int DS_Search (DirStack *DS, directive d);
+int DS_Search (DirStack *DS, Directive d);
-int DS_Check_Order (DirStack *DS, directive d);
+int DS_Check_Order (DirStack *DS, Directive d);
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <algorithm>
+#include <unordered_set>
#include <sys/types.h>
#include "gromacs/fileio/gmxfio.h"
#include "gromacs/fileio/warninp.h"
#include "gromacs/gmxpreprocess/gmxcpp.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
#include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
#include "gromacs/gmxpreprocess/gpp_nextnb.h"
#include "gromacs/gmxpreprocess/grompp-impl.h"
#define OPENDIR '[' /* starting sign for directive */
#define CLOSEDIR ']' /* ending sign for directive */
-static void free_nbparam(t_nbparam **param, int nr)
-{
- int i;
-
- assert(param);
- for (i = 0; i < nr; i++)
- {
- assert(param[i]);
- sfree(param[i]);
- }
- sfree(param);
-}
-
-static int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr)
-{
- int i, j, f;
- int nrfp, ncopy;
-
- nrfp = NRFP(ftype);
-
- ncopy = 0;
- for (i = 0; i < nr; i++)
- {
- for (j = 0; j <= i; j++)
- {
- assert(param);
- if (param[i][j].bSet)
- {
- for (f = 0; f < nrfp; f++)
- {
- plist->param[nr*i+j].c[f] = param[i][j].c[f];
- plist->param[nr*j+i].c[f] = param[i][j].c[f];
- }
- ncopy++;
- }
- }
- }
-
- return ncopy;
-}
-
static void gen_pairs(t_params *nbs, t_params *pairs, real fudge, int comb)
{
int i, j, ntp, nrfp, nrfpA, nrfpB, nnn;
}
}
-double check_mol(const gmx_mtop_t *mtop, warninp_t wi)
+double check_mol(const gmx_mtop_t *mtop, warninp *wi)
{
char buf[256];
int i, ri, pt;
}
static void get_nbparm(char *nb_str, char *comb_str, int *nb, int *comb,
- warninp_t wi)
+ warninp *wi)
{
int i;
char warn_buf[STRLEN];
}
static char ** cpp_opts(const char *define, const char *include,
- warninp_t wi)
+ warninp *wi)
{
int n, len;
int ncppopts = 0;
static char **read_topol(const char *infile, const char *outfile,
const char *define, const char *include,
t_symtab *symtab,
- gpp_atomtype_t atype,
+ gpp_atomtype *atype,
int *nrmols,
t_molinfo **molinfo,
t_molinfo **intermolecular_interactions,
bool bFEP,
bool bZero,
bool usingFullRangeElectrostatics,
- warninp_t wi)
+ warninp *wi)
{
FILE *out;
int i, sl, nb_funct;
double fLJ, fQQ, fPOW;
t_molinfo *mi0 = nullptr;
DirStack *DS;
- directive d, newd;
+ Directive d, newd;
t_nbparam **nbparam, **pair;
gmx::ExclusionBlocks *exclusionBlocks;
real fudgeLJ = -1; /* Multiplication factor to generate 1-4 from LJ */
bool bReadDefaults, bReadMolType, bGenPairs, bWarn_copy_A_B;
double qt = 0, qBt = 0; /* total charge */
- t_bond_atomtype batype;
+ gpp_bond_atomtype *batype;
int lastcg = -1;
int dcatt = -1, nmol_couple;
/* File handling variables */
}
/* some local variables */
- DS_Init(&DS); /* directive stack */
- nmol = 0; /* no molecules yet... */
- d = d_invalid; /* first thing should be a directive */
- nbparam = nullptr; /* The temporary non-bonded matrix */
- pair = nullptr; /* The temporary pair interaction matrix */
- exclusionBlocks = nullptr; /* the extra exclusions */
+ DS_Init(&DS); /* directive stack */
+ nmol = 0; /* no molecules yet... */
+ d = Directive::d_invalid; /* first thing should be a directive */
+ nbparam = nullptr; /* The temporary non-bonded matrix */
+ pair = nullptr; /* The temporary pair interaction matrix */
+ exclusionBlocks = nullptr; /* the extra exclusions */
nb_funct = F_LJ;
*reppow = 12.0; /* Default value for repulsion power */
}
trim (dirstr);
- if ((newd = str2dir(dirstr)) == d_invalid)
+ if ((newd = str2dir(dirstr)) == Directive::d_invalid)
{
sprintf(errbuf, "Invalid directive %s", dirstr);
warning_error(wi, errbuf);
been present, and which actually are */
gmx_fatal(FARGS, "%s\nInvalid order for directive %s",
cpp_error(&handle, eCPP_SYNTAX), dir2str(newd));
- /* d = d_invalid; */
+ /* d = Directive::d_invalid; */
}
- if (d == d_intermolecular_interactions)
+ if (d == Directive::d_intermolecular_interactions)
{
if (*intermolecular_interactions == nullptr)
{
}
sfree(dirstr);
}
- else if (d != d_invalid)
+ else if (d != Directive::d_invalid)
{
/* Not a directive, just a plain string
* use a gigantic switch to decode,
*/
switch (d)
{
- case d_defaults:
+ case Directive::d_defaults:
if (bReadDefaults)
{
gmx_fatal(FARGS, "%s\nFound a second defaults directive.\n",
*reppow = fPOW;
}
}
- nb_funct = ifunc_index(d_nonbond_params, nb_funct);
+ nb_funct = ifunc_index(Directive::d_nonbond_params, nb_funct);
break;
- case d_atomtypes:
+ case Directive::d_atomtypes:
push_at(symtab, atype, batype, pline, nb_funct,
&nbparam, bGenPairs ? &pair : nullptr, wi);
break;
- case d_bondtypes:
+ case Directive::d_bondtypes:
push_bt(d, plist, 2, nullptr, batype, pline, wi);
break;
- case d_constrainttypes:
+ case Directive::d_constrainttypes:
push_bt(d, plist, 2, nullptr, batype, pline, wi);
break;
- case d_pairtypes:
+ case Directive::d_pairtypes:
if (bGenPairs)
{
push_nbt(d, pair, atype, pline, F_LJ14, wi);
push_bt(d, plist, 2, atype, nullptr, pline, wi);
}
break;
- case d_angletypes:
+ case Directive::d_angletypes:
push_bt(d, plist, 3, nullptr, batype, pline, wi);
break;
- case d_dihedraltypes:
+ case Directive::d_dihedraltypes:
/* Special routine that can read both 2 and 4 atom dihedral definitions. */
push_dihedraltype(d, plist, batype, pline, wi);
break;
- case d_nonbond_params:
+ case Directive::d_nonbond_params:
push_nbt(d, nbparam, atype, pline, nb_funct, wi);
break;
- /*
- case d_blocktype:
- nblock++;
- srenew(block,nblock);
- srenew(blockinfo,nblock);
- blk0=&(block[nblock-1]);
- bi0=&(blockinfo[nblock-1]);
- init_top(blk0);
- init_molinfo(bi0);
- push_molt(symtab,bi0,pline);
- break;
- */
-
- case d_implicit_genborn_params:
+
+ case Directive::d_implicit_genborn_params:
// Skip this line, so old topologies with
// GB parameters can be read.
break;
- case d_implicit_surface_params:
+ case Directive::d_implicit_surface_params:
// Skip this line, so that any topologies
// with surface parameters can be read
// (even though these were never formally
// supported).
break;
- case d_cmaptypes:
+ case Directive::d_cmaptypes:
push_cmaptype(d, plist, 5, atype, batype, pline, wi);
break;
- case d_moleculetype:
+ case Directive::d_moleculetype:
{
if (!bReadMolType)
{
mi0->atoms.havePdbInfo = FALSE;
break;
}
- case d_atoms:
+ case Directive::d_atoms:
push_atom(symtab, &(mi0->cgs), &(mi0->atoms), atype, pline, &lastcg, wi);
break;
- case d_pairs:
+ case Directive::d_pairs:
push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
break;
- case d_pairs_nb:
+ case Directive::d_pairs_nb:
push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
FALSE, 1.0, bZero, &bWarn_copy_A_B, wi);
break;
- case d_vsites2:
- case d_vsites3:
- case d_vsites4:
- case d_bonds:
- case d_angles:
- case d_constraints:
- case d_settles:
- case d_position_restraints:
- case d_angle_restraints:
- case d_angle_restraints_z:
- case d_distance_restraints:
- case d_orientation_restraints:
- case d_dihedral_restraints:
- case d_dihedrals:
- case d_polarization:
- case d_water_polarization:
- case d_thole_polarization:
+ case Directive::d_vsites2:
+ case Directive::d_vsites3:
+ case Directive::d_vsites4:
+ case Directive::d_bonds:
+ case Directive::d_angles:
+ case Directive::d_constraints:
+ case Directive::d_settles:
+ case Directive::d_position_restraints:
+ case Directive::d_angle_restraints:
+ case Directive::d_angle_restraints_z:
+ case Directive::d_distance_restraints:
+ case Directive::d_orientation_restraints:
+ case Directive::d_dihedral_restraints:
+ case Directive::d_dihedrals:
+ case Directive::d_polarization:
+ case Directive::d_water_polarization:
+ case Directive::d_thole_polarization:
push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, TRUE,
bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
break;
- case d_cmap:
+ case Directive::d_cmap:
push_cmap(d, plist, mi0->plist, &(mi0->atoms), atype, pline, wi);
break;
- case d_vsitesn:
+ case Directive::d_vsitesn:
push_vsitesn(d, mi0->plist, &(mi0->atoms), pline, wi);
break;
- case d_exclusions:
+ case Directive::d_exclusions:
GMX_ASSERT(exclusionBlocks, "exclusionBlocks must always be allocated so exclusions can be processed");
if (!exclusionBlocks[nmol-1].nr)
{
}
push_excl(pline, &(exclusionBlocks[nmol-1]), wi);
break;
- case d_system:
+ case Directive::d_system:
trim(pline);
title = put_symtab(symtab, pline);
break;
- case d_molecules:
+ case Directive::d_molecules:
{
int whichmol;
bool bCouple;
}
}
while (!done);
+
+ // Check that all strings defined with -D were used when processing topology
+ std::string unusedDefineWarning = checkAndWarnForUnusedDefines(*handle);
+ if (!unusedDefineWarning.empty())
+ {
+ warning(wi, unusedDefineWarning);
+ }
+
sfree(cpp_opts_return);
if (out)
int *combination_rule,
double *repulsion_power,
real *fudgeQQ,
- gpp_atomtype_t atype,
+ gpp_atomtype *atype,
int *nrmols,
t_molinfo **molinfo,
t_molinfo **intermolecular_interactions,
const t_inputrec *ir,
std::vector<gmx_molblock_t> *molblock,
bool *ffParametrizedWithHBondConstraints,
- warninp_t wi)
+ warninp *wi)
{
/* Tmpfile might contain a long path */
const char *tmpfile;
free(blink);
} /* generate_qmexcl */
-void generate_qmexcl(gmx_mtop_t *sys, t_inputrec *ir, warninp_t wi, GmxQmmmMode qmmmMode)
+void generate_qmexcl(gmx_mtop_t *sys, t_inputrec *ir, warninp *wi, GmxQmmmMode qmmmMode)
{
/* This routine expects molt->molt[m].ilist to be of size F_NRE and ordered.
*/
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <vector>
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/utility/real.h"
struct gmx_molblock_t;
struct gmx_mtop_t;
+struct gpp_atomtype;
struct t_gromppopts;
struct t_inputrec;
+struct t_molinfo;
+struct t_params;
+struct t_symtab;
struct warninp;
enum struct GmxQmmmMode;
typedef warninp *warninp_t;
const char *topppfile,
t_gromppopts *opts,
bool bZero,
- struct t_symtab *symtab,
+ t_symtab *symtab,
t_params plist[],
int *combination_rule,
double *repulsion_power,
real *fudgeQQ,
- gpp_atomtype_t atype,
+ gpp_atomtype *atype,
int *nrmols,
t_molinfo **molinfo,
t_molinfo **intermolecular_interactions,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/fileio/warninp.h"
#include "gromacs/gmxpreprocess/gpp_atomtype.h"
#include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/readir.h"
#include "gromacs/gmxpreprocess/topdirs.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/stringutil.h"
-void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
- warninp_t wi)
+void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype *atype,
+ warninp *wi)
{
int i, j, k = -1, nf;
int nr, nrfp;
}
}
-static void realloc_nb_params(gpp_atomtype_t at,
+/*! \brief Used to temporarily store the explicit non-bonded parameter
+ * combinations, which will be copied to t_params. */
+struct t_nbparam
+{
+ //! Has this combination been set.
+ bool bSet;
+ //! The non-bonded parameters
+ real c[4];
+};
+
+static void realloc_nb_params(gpp_atomtype *at,
t_nbparam ***nbparam, t_nbparam ***pair)
{
/* Add space in the non-bonded parameters matrix */
}
}
+int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr)
+{
+ int i, j, f;
+ int nrfp, ncopy;
+
+ nrfp = NRFP(ftype);
+
+ ncopy = 0;
+ for (i = 0; i < nr; i++)
+ {
+ for (j = 0; j <= i; j++)
+ {
+ GMX_RELEASE_ASSERT(param, "Must have valid parameters");
+ if (param[i][j].bSet)
+ {
+ for (f = 0; f < nrfp; f++)
+ {
+ plist->param[nr*i+j].c[f] = param[i][j].c[f];
+ plist->param[nr*j+i].c[f] = param[i][j].c[f];
+ }
+ ncopy++;
+ }
+ }
+ }
+
+ return ncopy;
+}
+
+void free_nbparam(t_nbparam **param, int nr)
+{
+ int i;
+
+ GMX_RELEASE_ASSERT(param, "Must have valid parameters");
+ for (i = 0; i < nr; i++)
+ {
+ GMX_RELEASE_ASSERT(param[i], "Must have valid parameters");
+ sfree(param[i]);
+ }
+ sfree(param);
+}
+
static void copy_B_from_A(int ftype, double *c)
{
int nrfpA, nrfpB, i;
}
}
-void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
+void push_at (t_symtab *symtab, gpp_atomtype *at, gpp_bond_atomtype *bat,
char *line, int nb_funct,
t_nbparam ***nbparam, t_nbparam ***pair,
- warninp_t wi)
+ warninp *wi)
{
typedef struct {
const char *entry;
int ftype,
bool bAllowRepeat,
const char * line,
- warninp_t wi)
+ warninp *wi)
{
int nr = bt->nr;
int nrfp = NRFP(ftype);
}
}
-void push_bt(directive d, t_params bt[], int nral,
- gpp_atomtype_t at,
- t_bond_atomtype bat, char *line,
- warninp_t wi)
+void push_bt(Directive d, t_params bt[], int nral,
+ gpp_atomtype *at,
+ gpp_bond_atomtype *bat, char *line,
+ warninp *wi)
{
const char *formal[MAXATOMLIST+1] = {
"%s",
}
-void push_dihedraltype(directive d, t_params bt[],
- t_bond_atomtype bat, char *line,
- warninp_t wi)
+void push_dihedraltype(Directive d, t_params bt[],
+ gpp_bond_atomtype *bat, char *line,
+ warninp *wi)
{
const char *formal[MAXATOMLIST+1] = {
"%s",
}
-void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
+void push_nbt(Directive d, t_nbparam **nbt, gpp_atomtype *atype,
char *pline, int nb_funct,
- warninp_t wi)
+ warninp *wi)
{
/* swap the atoms */
const char *form3 = "%*s%*s%*s%lf%lf%lf";
}
void
-push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
- t_bond_atomtype bat, char *line,
- warninp_t wi)
+push_cmaptype(Directive d, t_params bt[], int nral, gpp_atomtype *at,
+ gpp_bond_atomtype *bat, char *line,
+ warninp *wi)
{
const char *formal = "%s%s%s%s%s%s%s%s%n";
char *resnumberic,
char *resname, char *name, real m0, real q0,
int typeB, char *ctypeB, real mB, real qB,
- warninp_t wi)
+ warninp *wi)
{
int j, resind = 0, resnr;
unsigned char ric;
}
void push_atom(t_symtab *symtab, t_block *cgs,
- t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
- warninp_t wi)
+ t_atoms *at, gpp_atomtype *atype, char *line, int *lastcg,
+ warninp *wi)
{
int nr, ptype;
int cgnumber, atomnr, type, typeB, nscan;
}
void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
- warninp_t wi)
+ warninp *wi)
{
char type[STRLEN];
int nrexcl, i;
}
static bool default_cmap_params(t_params bondtype[],
- t_atoms *at, gpp_atomtype_t atype,
+ t_atoms *at, gpp_atomtype *atype,
t_param *p, bool bB,
int *cmap_type, int *nparam_def,
- warninp_t wi)
+ warninp *wi)
{
int i, nparam_found;
int ct;
}
static bool default_params(int ftype, t_params bt[],
- t_atoms *at, gpp_atomtype_t atype,
+ t_atoms *at, gpp_atomtype *atype,
t_param *p, bool bB,
t_param **param_def,
int *nparam_def)
-void push_bond(directive d, t_params bondtype[], t_params bond[],
- t_atoms *at, gpp_atomtype_t atype, char *line,
+void push_bond(Directive d, t_params bondtype[], t_params bond[],
+ t_atoms *at, gpp_atomtype *atype, char *line,
bool bBonded, bool bGenPairs, real fudgeQQ,
bool bZero, bool *bWarn_copy_A_B,
- warninp_t wi)
+ warninp *wi)
{
const char *aaformat[MAXATOMLIST] = {
"%d%d",
}
}
-void push_cmap(directive d, t_params bondtype[], t_params bond[],
- t_atoms *at, gpp_atomtype_t atype, char *line,
- warninp_t wi)
+void push_cmap(Directive d, t_params bondtype[], t_params bond[],
+ t_atoms *at, gpp_atomtype *atype, char *line,
+ warninp *wi)
{
const char *aaformat[MAXATOMLIST+1] =
{
-void push_vsitesn(directive d, t_params bond[],
+void push_vsitesn(Directive d, t_params bond[],
t_atoms *at, char *line,
- warninp_t wi)
+ warninp *wi)
{
char *ptr;
int type, ftype, j, n, ret, nj, a;
void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
int *nrcopies,
- warninp_t wi)
+ warninp *wi)
{
char type[STRLEN];
}
}
-void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp_t wi)
+void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp *wi)
{
int i, j;
int n;
while (n == 1);
}
-int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
+int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype *at,
t_nbparam ***nbparam, t_nbparam ***pair)
{
t_atom atom;
plist[F_LJ14].param = nullptr;
}
-static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp, warninp_t wi)
+static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp, warninp *wi)
{
int n, ntype, i, j, k;
t_atom *atom;
static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
int couple_lam0, int couple_lam1,
- const char *mol_name, warninp_t wi)
+ const char *mol_name, warninp *wi)
{
int i;
void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
int couple_lam0, int couple_lam1,
bool bCoupleIntra, int nb_funct, t_params *nbp,
- warninp_t wi)
+ warninp *wi)
{
convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
if (!bCoupleIntra)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TOPPUSH_H
#define GMX_GMXPREPROCESS_TOPPUSH_H
-#include "gromacs/fileio/warninp.h"
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+#include "gromacs/utility/real.h"
+
+enum class Directive : int;
+struct gpp_atomtype;
+struct gpp_bond_atomtype;
+struct t_atoms;
+struct t_block;
+struct t_molinfo;
+struct t_nbparam;
+struct t_param;
+struct t_params;
+struct t_restp;
+struct warninp;
namespace gmx
{
} // namespace gmx
void generate_nbparams(int comb, int funct, t_params plist[],
- gpp_atomtype_t atype,
- warninp_t wi);
+ gpp_atomtype *atype,
+ warninp *wi);
-void push_at (struct t_symtab *symtab, gpp_atomtype_t at,
- t_bond_atomtype bat, char *line, int nb_funct,
+void push_at (struct t_symtab *symtab, gpp_atomtype *at,
+ gpp_bond_atomtype *bat, char *line, int nb_funct,
t_nbparam ***nbparam, t_nbparam ***pair,
- warninp_t wi);
+ warninp *wi);
-void push_bt(directive d, t_params bt[], int nral,
- gpp_atomtype_t at, t_bond_atomtype bat, char *line,
- warninp_t wi);
+void push_bt(Directive d, t_params bt[], int nral,
+ gpp_atomtype *at, gpp_bond_atomtype *bat, char *line,
+ warninp *wi);
-void push_dihedraltype(directive d, t_params bt[],
- t_bond_atomtype bat, char *line,
- warninp_t wi);
+void push_dihedraltype(Directive d, t_params bt[],
+ gpp_bond_atomtype *bat, char *line,
+ warninp *wi);
-void push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
- t_bond_atomtype bat, char *line,
- warninp_t wi);
+void push_cmaptype(Directive d, t_params bt[], int nral, gpp_atomtype *at,
+ gpp_bond_atomtype *bat, char *line,
+ warninp *wi);
-void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
+void push_nbt(Directive d, t_nbparam **nbt, gpp_atomtype *atype,
char *plines, int nb_funct,
- warninp_t wi);
+ warninp *wi);
void push_atom(struct t_symtab *symtab,
t_block *cgs,
t_atoms *at,
- gpp_atomtype_t atype,
+ gpp_atomtype *atype,
char *line,
int *lastcg,
- warninp_t wi);
+ warninp *wi);
-void push_bond(directive d, t_params bondtype[], t_params bond[],
- t_atoms *at, gpp_atomtype_t atype, char *line,
+void push_bond(Directive d, t_params bondtype[], t_params bond[],
+ t_atoms *at, gpp_atomtype *atype, char *line,
bool bBonded, bool bGenPairs, real fudgeQQ,
bool bZero, bool *bWarn_copy_A_B,
- warninp_t wi);
+ warninp *wi);
-void push_cmap(directive d, t_params bondtype[], t_params bond[],
- t_atoms *at, gpp_atomtype_t atype, char *line,
- warninp_t wi);
+void push_cmap(Directive d, t_params bondtype[], t_params bond[],
+ t_atoms *at, gpp_atomtype *atype, char *line,
+ warninp *wi);
-void push_vsitesn(directive d, t_params bond[],
+void push_vsitesn(Directive d, t_params bond[],
t_atoms *at, char *line,
- warninp_t wi);
+ warninp *wi);
void push_mol(int nrmols, t_molinfo mols[], char *pline,
int *whichmol, int *nrcopies,
- warninp_t wi);
+ warninp *wi);
void push_molt(struct t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
- warninp_t wi);
+ warninp *wi);
+
+void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp *wi);
+
+int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr);
-void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp_t wi);
+void free_nbparam(t_nbparam **param, int nr);
-int add_atomtype_decoupled(struct t_symtab *symtab, gpp_atomtype_t at,
+int add_atomtype_decoupled(struct t_symtab *symtab, gpp_atomtype *at,
t_nbparam ***nbparam, t_nbparam ***pair);
/* Add an atom type with all parameters set to zero (no interactions).
* Returns the atom type number.
int couple_lam0, int couple_lam1,
bool bCoupleIntra,
int nb_funct, t_params *nbp,
- warninp_t wi);
+ warninp *wi);
/* Setup mol such that the B-state has no interaction with the rest
* of the system, but full interaction with itself.
*/
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cctype>
#include <cmath>
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/readir.h"
#include "gromacs/gmxpreprocess/topdirs.h"
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TOPSHAKE_H
#define GMX_GMXPREPROCESS_TOPSHAKE_H
-#include "gromacs/gmxpreprocess/topio.h"
+struct t_atoms;
+struct t_params;
void make_shake (t_params plist[], t_atoms *atoms, int nshake);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <algorithm>
#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/topdirs.h"
#include "gromacs/topology/block.h"
/* PRINTING STRUCTURES */
-static void print_bt(FILE *out, directive d, gpp_atomtype_t at,
+static void print_bt(FILE *out, Directive d, gpp_atomtype *at,
int ftype, int fsubtype, t_params plist[],
bool bFullDih)
{
if (have_excl)
{
- fprintf (out, "[ %s ]\n", dir2str(d_exclusions));
+ fprintf (out, "[ %s ]\n", dir2str(Directive::d_exclusions));
fprintf (out, "; %4s %s\n", "i", "excluded from i");
for (i = 0; i < natoms; i++)
{
return q;
}
-void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
+void print_atoms(FILE *out, gpp_atomtype *atype, t_atoms *at, int *cgnr,
bool bRTPresname)
{
int i, ri;
char *tpnmA, *tpnmB;
double qres, qtot;
- as = dir2str(d_atoms);
+ as = dir2str(Directive::d_atoms);
fprintf(out, "[ %s ]\n", as);
fprintf(out, "; %4s %10s %6s %7s%6s %6s %10s %10s %6s %10s %10s\n",
"nr", "type", "resnr", "residue", "atom", "cgnr", "charge", "mass", "typeB", "chargeB", "massB");
fflush(out);
}
-void print_bondeds(FILE *out, int natoms, directive d,
+void print_bondeds(FILE *out, int natoms, Directive d,
int ftype, int fsubtype, t_params plist[])
{
t_symtab stab;
- gpp_atomtype_t atype;
+ gpp_atomtype *atype;
t_param *param;
t_atom *a;
int i;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_TOPUTIL_H
#define GMX_GMXPREPROCESS_TOPUTIL_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include <cstdio>
+
+enum class Directive : int;
+struct gpp_atomtype;
+struct t_atoms;
+struct t_blocka;
+struct t_excls;
+struct t_molinfo;
+struct t_param;
+struct t_params;
/* UTILITIES */
void print_blocka(FILE *out, const char *szName, const char *szIndex,
const char *szA, t_blocka *block);
-void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
+void print_atoms(FILE *out, gpp_atomtype *atype, t_atoms *at, int *cgnr,
bool bRTPresname);
-void print_bondeds(FILE *out, int natoms, directive d,
+void print_bondeds(FILE *out, int natoms, Directive d,
int ftype, int fsubtype, t_params plist[]);
void print_excl(FILE *out, int natoms, t_excls excls[]);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <algorithm>
#include "gromacs/gmxpreprocess/add_par.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/resall.h"
#include "gromacs/gmxpreprocess/toputil.h"
return angle;
}
-static char *get_atomtype_name_AB(t_atom *atom, gpp_atomtype_t atype)
+static char *get_atomtype_name_AB(t_atom *atom, gpp_atomtype *atype)
{
char *name;
return name;
}
-static bool calc_vsite3_param(gpp_atomtype_t atype,
+static bool calc_vsite3_param(gpp_atomtype *atype,
t_param *param, t_atoms *at,
int nrbond, t_mybonded *bonds,
int nrang, t_mybonded *angles )
return bError;
}
-static bool calc_vsite3out_param(gpp_atomtype_t atype,
+static bool calc_vsite3out_param(gpp_atomtype *atype,
t_param *param, t_atoms *at,
int nrbond, t_mybonded *bonds,
int nrang, t_mybonded *angles)
-int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype_t atype,
+int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype *atype,
t_params plist[])
{
int i, j, ftype;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_VSITE_PARM_H
#define GMX_GMXPREPROCESS_VSITE_PARM_H
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-
+struct gpp_atomtype;
struct gmx_moltype_t;
+struct t_atoms;
+struct t_params;
-int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype_t atype,
+int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype *atype,
t_params plist[]);
/* set parameters for virtual sites, return number of virtual sites */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/fileio/confio.h"
#include "gromacs/fileio/gmxfio.h"
#include "gromacs/gmxpreprocess/gen_ad.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
#include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/gmxpreprocess/nm2type.h"
#include "gromacs/gmxpreprocess/notset.h"
#include "gromacs/gmxpreprocess/pdb2top.h"
#include "gromacs/gmxpreprocess/toppush.h"
+#include "gromacs/gmxpreprocess/toputil.h"
#include "gromacs/listed-forces/bonded.h"
#include "gromacs/math/units.h"
#include "gromacs/math/utilities.h"
return cgnr;
}
-static gpp_atomtype_t set_atom_type(t_symtab *tab, t_atoms *atoms, t_params *bonds,
- int *nbonds, int nnm, t_nm2type nm2t[])
+static gpp_atomtype *set_atom_type(t_symtab *tab, t_atoms *atoms, t_params *bonds,
+ int *nbonds, int nnm, t_nm2type nm2t[])
{
- gpp_atomtype_t atype;
+ gpp_atomtype *atype;
int nresolved;
atype = init_atomtype();
}
static void print_rtp(const char *filenm, const char *title, t_atoms *atoms,
- t_params plist[], gpp_atomtype_t atype, int cgnr[])
+ t_params plist[], gpp_atomtype *atype, int cgnr[])
{
FILE *fp;
int i, tp;
FILE *fp;
t_params plist[F_NRE];
t_excls *excls;
- gpp_atomtype_t atype;
+ gpp_atomtype *atype;
t_nextnb nnb;
t_nm2type *nm2t;
t_mols mymol;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <vector>
#include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
#include "gromacs/gmxpreprocess/hackblock.h"
#include "gromacs/topology/residuetypes.h"
#include "gromacs/topology/symtab.h"
void rename_atoms(const char* xlfile, const char *ffdir,
t_atoms *atoms, t_symtab *symtab, const t_restp *restp,
- bool bResname, gmx_residuetype_t *rt, bool bReorderNum,
+ bool bResname, ResidueType *rt, bool bReorderNum,
bool bVerbose)
{
int nxlate, a, i, resind;
/* Match the residue name */
bMatch = (xlatom[i].res == nullptr ||
(gmx_strcasecmp("protein-nterm", xlatom[i].res) == 0 &&
- gmx_residuetype_is_protein(rt, rnm) && bStartTerm) ||
+ rt->namedResidueHasType(rnm, "Protein") && bStartTerm) ||
(gmx_strcasecmp("protein-cterm", xlatom[i].res) == 0 &&
- gmx_residuetype_is_protein(rt, rnm) && bEndTerm) ||
+ rt->namedResidueHasType(rnm, "Protein") && bEndTerm) ||
(gmx_strcasecmp("protein", xlatom[i].res) == 0 &&
- gmx_residuetype_is_protein(rt, rnm)) ||
+ rt->namedResidueHasType(rnm, "Protein")) ||
(gmx_strcasecmp("DNA", xlatom[i].res) == 0 &&
- gmx_residuetype_is_dna(rt, rnm)) ||
+ rt->namedResidueHasType(rnm, "DNA")) ||
(gmx_strcasecmp("RNA", xlatom[i].res) == 0 &&
- gmx_residuetype_is_rna(rt, rnm)));
+ rt->namedResidueHasType(rnm, "RNA")));
if (!bMatch)
{
ptr0 = rnm;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_GMXPREPROCESS_XLATE_H
#define GMX_GMXPREPROCESS_XLATE_H
-#include "gromacs/gmxpreprocess/hackblock.h"
-#include "gromacs/utility/basedefinitions.h"
-
-struct gmx_residuetype_t;
+class ResidueType;
struct t_atoms;
+struct t_restp;
struct t_symtab;
/* If bResname is true renames atoms based on residue names,
* otherwise renames atoms based on rtp entry names.
*/
void rename_atoms(const char* xlfile, const char *ffdir,
- struct t_atoms *atoms, struct t_symtab *symtab, const t_restp *restp,
- bool bResname, struct gmx_residuetype_t *rt, bool bReorderNum,
+ t_atoms *atoms, t_symtab *symtab, const t_restp *restp,
+ bool bResname, ResidueType *rt, bool bReorderNum,
bool bVerbose);
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
// TODO: template on transferKind to avoid runtime conditionals
-int cu_copy_H2D(void *d_dest, void *h_src, size_t bytes,
+int cu_copy_H2D(void *d_dest, const void *h_src, size_t bytes,
GpuApiCallBehavior transferKind, cudaStream_t s = nullptr)
{
cudaError_t stat;
return 0;
}
-int cu_copy_H2D_sync(void * d_dest, void * h_src, size_t bytes)
+int cu_copy_H2D_sync(void * d_dest, const void * h_src, size_t bytes)
{
return cu_copy_H2D(d_dest, h_src, bytes, GpuApiCallBehavior::Sync);
}
/*!
* The copy is launched in stream s or if not specified, in stream 0.
*/
-int cu_copy_H2D_async(void * d_dest, void * h_src, size_t bytes, cudaStream_t s = nullptr)
+int cu_copy_H2D_async(void * d_dest, const void * h_src, size_t bytes, cudaStream_t s = nullptr)
{
return cu_copy_H2D(d_dest, h_src, bytes, GpuApiCallBehavior::Async, s);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*
* The copy is launched in stream s or if not specified, in stream 0.
*/
-int cu_copy_H2D(void *d_dest, void *h_src, size_t bytes, GpuApiCallBehavior transferKind, cudaStream_t /*s = nullptr*/);
+int cu_copy_H2D(void *d_dest, const void *h_src, size_t bytes, GpuApiCallBehavior transferKind, cudaStream_t /*s = nullptr*/);
/*! Launches synchronous host to device memory copy. */
-int cu_copy_H2D_sync(void * /*d_dest*/, void * /*h_src*/, size_t /*bytes*/);
+int cu_copy_H2D_sync(void * /*d_dest*/, const void * /*h_src*/, size_t /*bytes*/);
/*! Launches asynchronous host to device memory copy in stream s. */
-int cu_copy_H2D_async(void * /*d_dest*/, void * /*h_src*/, size_t /*bytes*/, cudaStream_t /*s = nullptr*/);
+int cu_copy_H2D_async(void * /*d_dest*/, const void * /*h_src*/, size_t /*bytes*/, cudaStream_t /*s = nullptr*/);
// TODO: the 2 functions below are pretty much a constructor/destructor of a simple
// GPU table object. There is also almost self-contained fetchFromParamLookupTable()
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/stringutil.h"
#if !GMX_GPU
-/*! \brief Set allocation functions used by the GPU host
- *
- * Since GPU support is not configured, there is no host memory to
- * allocate. */
-void gpu_set_host_malloc_and_free(bool /*unused*/,
- gmx_host_alloc_t **nb_alloc,
- gmx_host_free_t **nb_free)
-{
- *nb_alloc = nullptr;
- *nb_free = nullptr;
-}
-
int gpu_info_get_stat(const gmx_gpu_info_t & /*unused*/, int /*unused*/)
{
return egpuNonexistent;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
return sizeof(gmx_device_info_t);
}
-void gpu_set_host_malloc_and_free(bool bUseGpuKernels,
- gmx_host_alloc_t **nb_alloc,
- gmx_host_free_t **nb_free)
-{
- if (bUseGpuKernels)
- {
- *nb_alloc = &pmalloc;
- *nb_free = &pfree;
- }
- else
- {
- *nb_alloc = nullptr;
- *nb_free = nullptr;
- }
-}
-
void startGpuProfiler(void)
{
/* The NVPROF_ID environment variable is set by nvprof and indicates that
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2010, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
GPU_FUNC_QUALIFIER
size_t sizeof_gpu_dev_info() GPU_FUNC_TERM_WITH_RETURN(0)
-/*! \brief Returns a pointer *ptr to page-locked memory of size nbytes.
- *
- * The allocated memory is suitable to be used for data transfers between host
- * and GPU.
- * Error handling should be done within this function.
- */
-typedef void gmx_host_alloc_t (void **ptr, size_t nbytes);
-
-/*! \brief Frees page-locked memory pointed to by *ptr.
- *
- * NULL should not be passed to this function.
- */
-typedef void gmx_host_free_t (void *ptr);
-
-/*! \brief Set page-locked memory allocation functions used by the GPU host. */
-void gpu_set_host_malloc_and_free(bool bUseGpuKernels,
- gmx_host_alloc_t **nb_alloc,
- gmx_host_free_t **nb_free);
-
//! Get status of device with specified index
int gpu_info_get_stat(const gmx_gpu_info_t &info, int index);
return sizeof(gmx_device_info_t);
}
-void gpu_set_host_malloc_and_free(bool bUseGpuKernels,
- gmx_host_alloc_t **nb_alloc,
- gmx_host_free_t **nb_free)
-{
- if (bUseGpuKernels)
- {
- *nb_alloc = &pmalloc;
- *nb_free = &pfree;
- }
- else
- {
- *nb_alloc = nullptr;
- *nb_free = nullptr;
- }
-}
-
int gpu_info_get_stat(const gmx_gpu_info_t &info, int index)
{
return info.gpu_dev[index].stat;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* the research papers on the package. Check out http://www.gromacs.org.
*/
/*! \file
- * \brief Declares gmx::HostAllocationPolicy, gmx::HostAllocator, and
- * gmx::HostVector, which are used to make/be standard library
- * containers that can allocate memory suitable for transfers.
+ * \brief Declares gmx::HostAllocationPolicy, gmx::HostAllocator,
+ * gmx::HostVector and gmx::PaddedHostVector, which are used to make/be
+ * standard library containers that can allocate memory suitable for transfers.
* Currently the only supported transfers using pinned memory are
* to CUDA GPUs, but other possibilities exist in future.
*
template <class T>
using HostAllocator = Allocator<T, HostAllocationPolicy>;
-//! Convenience alias for PaddedVector that uses HostAllocator.
+//! Convenience alias for std::vector that uses HostAllocator.
template <class T>
-using HostVector = PaddedVector<T, HostAllocator<T> >;
+using HostVector = std::vector<T, HostAllocator<T> >;
-//! Convenience alias for std::vector that uses HostAllocator.
+//! Convenience alias for PaddedVector that uses HostAllocator.
template <class T>
-using HostStdVector = std::vector<T, HostAllocator<T> >;
+using PaddedHostVector = PaddedVector<T, HostAllocator<T> >;
/*! \libinternal
* \brief Policy class for configuring gmx::Allocator, to manage
return a.pinningPolicy() == b.pinningPolicy();
}
-/*! \brief Helper function for changing the pinning policy of a HostVector.
+/*! \brief Helper function for changing the pinning policy of a pinnable vector.
*
* If the vector has contents, then a full reallocation and buffer
* copy are needed if the policy change requires tighter restrictions,
* restrictions. That cost is OK, because GROMACS will do this
* operation very rarely (e.g. when auto-tuning and deciding to switch
* whether a task will run on a GPU, or not). */
-template <class T>
-void changePinningPolicy(HostVector<T> *v, PinningPolicy pinningPolicy)
+template <typename PinnableVector>
+void changePinningPolicy(PinnableVector *v,
+ PinningPolicy pinningPolicy)
{
- //Force reallocation by element-wise move (because policy is different
- //container is forced to realloc). Does nothing if policy is the same.
- *v = HostVector<T>(std::move(*v), {pinningPolicy});
+ // Force reallocation by element-wise move (because policy is
+ // different container is forced to realloc). Does nothing if
+ // policy is the same.
+ *v = PinnableVector(std::move(*v), {pinningPolicy});
}
} // namespace gmx
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
-int ocl_copy_H2D(cl_mem d_dest, void* h_src,
+int ocl_copy_H2D(cl_mem d_dest, const void* h_src,
size_t offset, size_t bytes,
GpuApiCallBehavior transferKind,
cl_command_queue command_queue,
* identifying this particular host to device operation. The event can further
* be used to queue a wait for this operation or to query profiling information.
*/
-int ocl_copy_H2D_async(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_async(cl_mem d_dest, const void * h_src,
size_t offset, size_t bytes,
cl_command_queue command_queue,
cl_event *copy_event)
/*! \brief Launches synchronous host to device memory copy.
*/
-int ocl_copy_H2D_sync(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_sync(cl_mem d_dest, const void * h_src,
size_t offset, size_t bytes,
cl_command_queue command_queue)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* identifying this particular host to device operation. The event can further
* be used to queue a wait for this operation or to query profiling information.
*/
-int ocl_copy_H2D(cl_mem d_dest, void* h_src,
+int ocl_copy_H2D(cl_mem d_dest, const void* h_src,
size_t offset, size_t bytes,
GpuApiCallBehavior transferKind,
cl_command_queue command_queue,
cl_event *copy_event);
/*! \brief Launches asynchronous host to device memory copy. */
-int ocl_copy_H2D_async(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_async(cl_mem d_dest, const void * h_src,
size_t offset, size_t bytes,
cl_command_queue command_queue,
cl_event *copy_event);
/*! \brief Launches synchronous host to device memory copy. */
-int ocl_copy_H2D_sync(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_sync(cl_mem d_dest, const void * h_src,
size_t offset, size_t bytes,
cl_command_queue command_queue);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
template <typename T>
struct HostAllocatorTest : HostMemoryTest<T>
{
- using VectorType = HostVector<T>; //!< HostVector of type tested
+ using VectorType = PaddedHostVector<T>; //!< PaddedHostVector of type tested
};
TYPED_TEST_CASE(HostAllocatorTest, TestTypes);
template <typename T>
struct HostAllocatorTestNoMem : ::testing::Test
{
- using VectorType = HostVector<T>; //!< HostVector of type tested
+ using VectorType = PaddedHostVector<T>; //!< PaddedHostVector of type tested
};
TYPED_TEST_CASE(HostAllocatorTestNoMem, TestTypes);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
//! List of interactions, see \c HostInteractionLists
- HostStdVector<int> iatoms = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
+ HostVector<int> iatoms = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
};
/*! \internal \brief Implements GPU bondeds */
//! Shift force vector on the device.
fvec *fshiftDevice = nullptr;
//! \brief Host-side virial buffer
- HostStdVector <float> vtot = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
+ HostVector <float> vtot = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
//! \brief Device-side total virial
float *vtotDevice = nullptr;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
/* Thread local force and energy data */
int nthreads; /**< Number of threads to be used for bondeds */
- f_thread_t *f_t; /**< Force/enegry data per thread, size nthreads */
+ f_thread_t *f_t; /**< Force/energy data per thread, size nthreads */
int nblock_used; /**< The number of force blocks to reduce */
int *block_index; /**< Index of size nblock_used into mask */
gmx_bitmask_t *mask; /**< Mask array, one element corresponds to a block of reduction_block_size atoms of the force array, bit corresponding to thread indices set if a thread writes to that block */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
for (int th = 0; th < bt->nthreads; th++)
{
+ sfree(bt->f_t[th].mask);
sfree(bt->f_t[th].fshift);
+ sfree(bt->f_t[th].block_index);
+ sfree_aligned(bt->f_t[th].f);
for (int i = 0; i < egNR; i++)
{
sfree(bt->f_t[th].grpp.ener[i]);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
od->nref = 0;
for (int i = 0; i < mtop->natoms; i++)
{
- if (getGroupType(&mtop->groups, egcORFIT, i) == 0)
+ if (getGroupType(mtop->groups, egcORFIT, i) == 0)
{
od->nref++;
}
* Copy it to the other nodes after checking multi compatibility,
* so we are sure the subsystems match before copying.
*/
- auto x = makeArrayRef(globalState->x);
- rvec com = { 0, 0, 0 };
- double mtot = 0.0;
- int j = 0;
- gmx_mtop_atomloop_all_t aloop = gmx_mtop_atomloop_all_init(mtop);
- int i = -1;
- const t_atom *atom;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
- {
+ auto x = makeArrayRef(globalState->x);
+ rvec com = { 0, 0, 0 };
+ double mtot = 0.0;
+ int j = 0;
+ for (const AtomProxy &atomP : AtomRange(*mtop))
+ {
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
if (mtop->groups.grpnr[egcORFIT] == nullptr ||
mtop->groups.grpnr[egcORFIT][i] == 0)
{
/* Not correct for free-energy with changing masses */
- od->mref[j] = atom->m;
+ od->mref[j] = local.m;
// Note that only one rank per sim is supported.
if (isMasterSim(ms))
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/listed-forces/listed-forces.h"
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
#include "gromacs/pbcutil/ishift.h"
#include "gromacs/pbcutil/pbc.h"
#include "gromacs/topology/idef.h"
+#include "gromacs/utility/strconvert.h"
#include "testutils/refdata.h"
#include "testutils/testasserts.h"
-#include "testutils/testfilemanager.h"
namespace gmx
{
{
//! Number of atoms used in these tests.
-#define NATOMS 4
+constexpr int c_numAtoms = 4;
-class BondedTest : public ::testing::Test
+/*! \brief Output from bonded kernels
+ *
+ * \todo Later this might turn into the actual output struct. */
+struct OutputQuantities
+{
+ //! Energy of this interaction
+ real energy = 0;
+ //! Derivative with respect to lambda
+ real dvdlambda = 0;
+ //! Shift vectors
+ rvec fshift[N_IVEC] = {{0}};
+ //! Forces
+ rvec4 f[c_numAtoms] = {{0}};
+};
+
+/*! \brief Utility to check the output from bonded tests
+ *
+ * \param[in] checker Reference checker
+ * \param[in] output The output from the test to check
+ */
+void checkOutput(test::TestReferenceChecker *checker,
+ const OutputQuantities &output)
+{
+ checker->checkReal(output.energy, "Epot ");
+ // Should still be zero if not doing FEP, so may as well test it.
+ checker->checkReal(output.dvdlambda, "dVdlambda ");
+ // TODO This is pretty inefficient, perhaps we should just check
+ // whether the central box fields have their values.
+ checker->checkSequence(std::begin(output.fshift), std::end(output.fshift), "ShiftForces");
+ checker->checkSequence(std::begin(output.f), std::end(output.f), "Forces");
+}
+
+class BondedTest : public ::testing::TestWithParam<std::tuple<std::vector<gmx::RVec>, int> >
{
protected:
- rvec x[NATOMS];
- matrix box;
- test::TestReferenceData refData_;
- test::TestReferenceChecker checker_;
+ matrix box_;
+ t_pbc pbc_;
+ std::vector<gmx::RVec> x_;
+ int epbc_;
+ test::TestReferenceData refData_;
+ test::TestReferenceChecker checker_;
BondedTest( ) :
checker_(refData_.rootChecker())
{
- test::FloatingPointTolerance tolerance(test::relativeToleranceAsFloatingPoint(1.0, 1e-6));
+ // We need quite specific tolerances here since angle functions
+ // etc. are not very precise and reproducible.
+ test::FloatingPointTolerance tolerance(test::FloatingPointTolerance(1.0e-4, 2.0e-7,
+ 1.0e-6, 1.0e-12,
+ 1000000000, 10000, false));
checker_.setDefaultTolerance(tolerance);
- clear_rvecs(NATOMS, x);
- x[1][2] = 1;
- x[2][1] = x[2][2] = 1;
- x[3][0] = x[3][1] = x[3][2] = 1;
-
- clear_mat(box);
- box[0][0] = box[1][1] = box[2][2] = 1.5;
+ x_ = std::get<0>(GetParam());
+ clear_mat(box_);
+ box_[0][0] = box_[1][1] = box_[2][2] = 1.5;
+ epbc_ = std::get<1>(GetParam());
+ set_pbc(&pbc_, epbc_, box_);
}
- void testBondAngle(int epbc)
+ void testBondAngle()
{
rvec r_ij, r_kj;
real cosine_angle, angle;
int t1, t2;
- t_pbc pbc;
- set_pbc(&pbc, epbc, box);
- angle = bond_angle(x[0], x[1], x[2], &pbc,
+ angle = bond_angle(x_[0], x_[1], x_[2], &pbc_,
r_ij, r_kj, &cosine_angle,
&t1, &t2);
checker_.checkReal(angle, "angle");
checker_.checkInteger(t2, "t2");
}
- void testDihedralAngle(int epbc)
+ void testDihedralAngle()
{
rvec r_ij, r_kj, r_kl, m, n;
real angle;
int t1, t2, t3;
- t_pbc pbc;
- set_pbc(&pbc, epbc, box);
- angle = dih_angle(x[0], x[1], x[2], x[3], &pbc,
+ angle = dih_angle(x_[0], x_[1], x_[2], x_[3], &pbc_,
r_ij, r_kj, r_kl, m, n,
&t1, &t2, &t3);
checker_.checkInteger(t2, "t2");
checker_.checkInteger(t3, "t3");
}
-
- void testIfunc(int ftype,
+ void testIfunc(test::TestReferenceChecker *checker,
+ const int ftype,
const std::vector<t_iatom> &iatoms,
- const t_iparams iparams[],
- int epbc)
+ const t_iparams &iparams,
+ const real lambda)
{
- real lambda = 0;
- real dvdlambda = 0;
- rvec4 f[NATOMS];
- for (int i = 0; i < NATOMS; i++)
- {
- for (int j = 0; j < 4; j++)
- {
- f[i][j] = 0;
- }
- }
- rvec fshift[N_IVEC];
- clear_rvecs(N_IVEC, fshift);
- t_pbc pbc;
- set_pbc(&pbc, epbc, box);
- int ddgatindex = 0;
- real energy = bondedFunction(ftype)(iatoms.size(),
- iatoms.data(),
- iparams,
- x, f, fshift,
- &pbc,
- /* const struct t_graph *g */ nullptr,
- lambda, &dvdlambda,
- /* const struct t_mdatoms *md */ nullptr,
- /* struct t_fcdata *fcd */ nullptr,
- &ddgatindex);
- checker_.checkReal(energy, interaction_function[ftype].longname);
+ SCOPED_TRACE(std::string("Testing PBC ") + epbc_names[epbc_]);
+
+ int ddgatindex = 0;
+ OutputQuantities output;
+ output.energy = bondedFunction(ftype)(iatoms.size(),
+ iatoms.data(),
+ &iparams,
+ as_rvec_array(x_.data()),
+ output.f, output.fshift,
+ &pbc_,
+ /* const struct t_graph *g */ nullptr,
+ lambda, &output.dvdlambda,
+ /* const struct t_mdatoms *md */ nullptr,
+ /* struct t_fcdata *fcd */ nullptr,
+ &ddgatindex);
+ checkOutput(checker, output);
}
-
};
-TEST_F (BondedTest, BondAnglePbcNone)
-{
- testBondAngle(epbcNONE);
-}
-
-TEST_F (BondedTest, BondAnglePbcXy)
-{
- testBondAngle(epbcXY);
-}
-
-TEST_F (BondedTest, BondAnglePbcXyz)
-{
- testBondAngle(epbcXYZ);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcNone)
-{
- testDihedralAngle(epbcNONE);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcXy)
-{
- testDihedralAngle(epbcXY);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcXyz)
+TEST_P (BondedTest, BondAngle)
{
- testDihedralAngle(epbcXYZ);
+ testBondAngle();
}
-TEST_F (BondedTest, IfuncBondsPbcNo)
+TEST_P (BondedTest, DihedralAngle)
{
- std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
- t_iparams iparams;
- iparams.harmonic.rA = iparams.harmonic.rB = 0.8;
- iparams.harmonic.krA = iparams.harmonic.krB = 50;
- testIfunc(F_BONDS, iatoms, &iparams, epbcNONE);
+ testDihedralAngle();
}
-TEST_F (BondedTest, IfuncBondsPbcXy)
+TEST_P (BondedTest, IfuncBonds)
{
std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
t_iparams iparams;
iparams.harmonic.rA = iparams.harmonic.rB = 0.8;
- iparams.harmonic.krA = iparams.harmonic.krB = 50;
- testIfunc(F_BONDS, iatoms, &iparams, epbcXY);
+ iparams.harmonic.krA = iparams.harmonic.krB = 50.0;
+ const real lambda = 0.0;
+ testIfunc(&checker_, F_BONDS, iatoms, iparams, lambda);
}
-TEST_F (BondedTest, IfuncBondsPbcXyz)
-{
- std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
- t_iparams iparams;
- iparams.harmonic.rA = iparams.harmonic.rB = 0.8;
- iparams.harmonic.krA = iparams.harmonic.krB = 50;
- testIfunc(F_BONDS, iatoms, &iparams, epbcXYZ);
-}
-
-TEST_F (BondedTest, IfuncAnglesPbcNo)
+TEST_P (BondedTest, IfuncAngles)
{
std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 0, 1, 2, 3 };
t_iparams iparams;
- real k = 50;
- iparams.harmonic.rA = iparams.harmonic.rB = 100;
- iparams.harmonic.krA = iparams.harmonic.krB = k;
- testIfunc(F_ANGLES, iatoms, &iparams, epbcNONE);
-}
-
-TEST_F (BondedTest, IfuncAnglesPbcXy)
-{
- std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 0, 1, 2, 3 };
- t_iparams iparams;
- real k = 50;
- iparams.harmonic.rA = iparams.harmonic.rB = 100;
+ real k = 50.0;
+ iparams.harmonic.rA = iparams.harmonic.rB = 100.0;
iparams.harmonic.krA = iparams.harmonic.krB = k;
- testIfunc(F_ANGLES, iatoms, &iparams, epbcXY);
+ const real lambda = 0.0;
+ testIfunc(&checker_, F_ANGLES, iatoms, iparams, lambda);
}
-TEST_F (BondedTest, IfuncAnglesPbcXYZ)
+TEST_P (BondedTest, IfuncProperDihedrals)
{
- std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 0, 1, 2, 3 };
+ std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
t_iparams iparams;
- real k = 50;
- iparams.harmonic.rA = iparams.harmonic.rB = 100;
- iparams.harmonic.krA = iparams.harmonic.krB = k;
- testIfunc(F_ANGLES, iatoms, &iparams, epbcXYZ);
+ iparams.pdihs.phiA = iparams.pdihs.phiB = -100.0;
+ iparams.pdihs.cpA = iparams.pdihs.cpB = 10.0;
+ iparams.pdihs.mult = 1;
+ const real lambda = 0.0;
+ testIfunc(&checker_, F_PDIHS, iatoms, iparams, lambda);
}
-TEST_F (BondedTest, IfuncProperDihedralsPbcNo)
+TEST_P (BondedTest, IfuncImproperDihedrals)
{
std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
t_iparams iparams;
- iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
- iparams.pdihs.cpA = iparams.pdihs.cpB = 10;
- iparams.pdihs.mult = 1;
- testIfunc(F_PDIHS, iatoms, &iparams, epbcNONE);
+ iparams.harmonic.rA = iparams.harmonic.rB = 0.0;
+ iparams.harmonic.krA = iparams.harmonic.krB = 5.0;
+ const real lambda = 0.0;
+ testIfunc(&checker_, F_IDIHS, iatoms, iparams, lambda);
}
-TEST_F (BondedTest, IfuncProperDihedralsPbcXy)
+TEST_P (BondedTest, IfuncImproperDihedralsFEP)
{
std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
t_iparams iparams;
- iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
- iparams.pdihs.cpA = iparams.pdihs.cpB = 10;
- iparams.pdihs.mult = 1;
- testIfunc(F_PDIHS, iatoms, &iparams, epbcXY);
+ iparams.harmonic.rA = iparams.harmonic.rB = 0.0;
+ iparams.harmonic.krA = iparams.harmonic.krB = 5.0;
+ iparams.harmonic.rB = 35.5;
+ iparams.harmonic.krB = 10.0;
+
+ const int numLambdas = 3;
+ for (int i = 0; i < numLambdas; ++i)
+ {
+ const real lambda = i / (numLambdas - 1.0);
+ auto valueChecker = checker_.checkCompound("Lambda", toString(lambda));
+ testIfunc(&valueChecker, F_IDIHS, iatoms, iparams, lambda);
+ }
}
-TEST_F (BondedTest, IfuncProperDihedralsPbcXyz)
+//! Coordinates for testing
+std::vector<std::vector<gmx::RVec> > c_coordinatesForTests =
{
- std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
- t_iparams iparams;
- iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
- iparams.pdihs.cpA = iparams.pdihs.cpB = 10;
- iparams.pdihs.mult = 1;
- testIfunc(F_PDIHS, iatoms, &iparams, epbcXYZ);
-}
+ {{ 0.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 }},
+ {{ 0.5, 0.0, 0.0 }, { 0.5, 0.0, 0.15 }, { 0.5, 0.07, 0.22 }, { 0.5, 0.18, 0.22 }},
+ {{ -0.1143, -0.0282, 0.0 }, { 0.0, 0.0434, 0.0 }, { 0.1185, -0.0138, 0.0 }, { -0.0195, 0.1498, 0.0 }}
+};
+
+//! PBC values for testing
+std::vector<int> c_pbcForTests = { epbcNONE, epbcXY, epbcXYZ };
+INSTANTIATE_TEST_CASE_P(ForPbcValues, BondedTest, ::testing::Combine(::testing::ValuesIn(c_coordinatesForTests), ::testing::ValuesIn(c_pbcForTests)));
} // namespace
} // namespace gmx
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Bond">2.9999995</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Bond">5.5</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Bond">6.75</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Proper Dih.">19.848078</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Proper Dih.">19.848078</Real>
-</ReferenceData>
+++ /dev/null
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
- <Real Name="Proper Dih.">0.1519227</Real>
-</ReferenceData>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">1.5707964</Real>
+ <Real Name="angle">1.5707963267948966</Real>
<Real Name="cosine_angle">0</Real>
<Int Name="t1">22</Int>
<Int Name="t2">22</Int>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">1.5707964</Real>
+ <Real Name="angle">1.5707963267948966</Real>
<Real Name="cosine_angle">0</Real>
<Int Name="t1">22</Int>
<Int Name="t2">17</Int>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">1.5707964</Real>
+ <Real Name="angle">1.5707963267948966</Real>
<Real Name="cosine_angle">0</Real>
<Int Name="t1">37</Int>
<Int Name="t2">17</Int>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.3561944901923448</Real>
+ <Real Name="cosine_angle">-0.70710678118654757</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.3561944901923448</Real>
+ <Real Name="cosine_angle">-0.70710678118654757</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.3561944901923448</Real>
+ <Real Name="cosine_angle">-0.70710678118654757</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.1322592341076487</Real>
+ <Real Name="cosine_angle">-0.53242508478135198</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.1322592341076487</Real>
+ <Real Name="cosine_angle">-0.53242508478135198</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">2.1322592341076487</Real>
+ <Real Name="cosine_angle">-0.53242508478135198</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">-1.5707963267948966</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">-1.5707964</Real>
+ <Real Name="angle">-1.5707963267948966</Real>
<Int Name="t1">22</Int>
<Int Name="t2">17</Int>
<Int Name="t3">23</Int>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">1.5707964</Real>
+ <Real Name="angle">1.5707963267948966</Real>
<Int Name="t1">37</Int>
<Int Name="t2">17</Int>
<Int Name="t3">23</Int>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Real Name="angle">-1.5707964</Real>
+ <Real Name="angle">0</Real>
<Int Name="t1">22</Int>
<Int Name="t2">22</Int>
<Int Name="t3">22</Int>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">0</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">0</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">3.1415926535897931</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">3.1415926535897931</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="angle">3.1415926535897931</Real>
+ <Int Name="t1">22</Int>
+ <Int Name="t2">22</Int>
+ <Int Name="t3">22</Int>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">1.5230870989335434</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-8.7266462599716483</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-8.7266462599716483</Real>
+ <Real Name="Y">8.7266462599716483</Real>
+ <Real Name="Z">-8.7266462599716483</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">8.7266462599716483</Real>
+ <Real Name="Y">-8.7266462599716483</Real>
+ <Real Name="Z">8.7266462599716483</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">8.7266462599716483</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">1.5230870989335434</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-17.453292519943297</Real>
+ <Real Name="Y">17.453292519943297</Real>
+ <Real Name="Z">-17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">17.453292519943297</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">8.7266462599716483</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">17.453292519943297</Real>
+ <Real Name="Y">-8.7266462599716483</Real>
+ <Real Name="Z">-17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-17.453292519943297</Real>
+ <Real Name="Y">17.453292519943297</Real>
+ <Real Name="Z">17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">1.5230870989335434</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-17.453292519943297</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">17.453292519943297</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">17.453292519943297</Real>
+ <Real Name="Y">-17.453292519943297</Real>
+ <Real Name="Z">17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-17.453292519943297</Real>
+ <Real Name="Y">17.453292519943297</Real>
+ <Real Name="Z">-17.453292519943297</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-17.453292519943297</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">18.6578169619359</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">2.8421709430404007e-14</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">203.62174606600516</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-203.62174606600516</Real>
+ <Real Name="Z">8.5265128291212022e-14</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">8.5265128291212022e-14</Real>
+ <Real Name="Z">277.66601736273412</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-5.6843418860808015e-14</Real>
+ <Real Name="Z">-277.66601736273424</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">18.6578169619359</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">2.8421709430404007e-14</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">203.62174606600516</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-203.62174606600516</Real>
+ <Real Name="Z">8.5265128291212022e-14</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">8.5265128291212022e-14</Real>
+ <Real Name="Z">277.66601736273412</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-5.6843418860808015e-14</Real>
+ <Real Name="Z">-277.66601736273424</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">18.6578169619359</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">2.8421709430404007e-14</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">203.62174606600516</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-203.62174606600516</Real>
+ <Real Name="Z">8.5265128291212022e-14</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">8.5265128291212022e-14</Real>
+ <Real Name="Z">277.66601736273412</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-5.6843418860808015e-14</Real>
+ <Real Name="Z">-277.66601736273424</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">47.631231917431272</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">76.147849407575862</Real>
+ <Real Name="Y">-121.56004451516648</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-231.09578724977212</Real>
+ <Real Name="Y">-199.44223930127089</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-81.648145884981545</Real>
+ <Real Name="Y">121.42857015903795</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">236.59608372717781</Real>
+ <Real Name="Y">199.57371365739942</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">47.631231917431272</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">76.147849407575862</Real>
+ <Real Name="Y">-121.56004451516648</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-231.09578724977212</Real>
+ <Real Name="Y">-199.44223930127089</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-81.648145884981545</Real>
+ <Real Name="Y">121.42857015903795</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">236.59608372717781</Real>
+ <Real Name="Y">199.57371365739942</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">47.631231917431272</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">76.147849407575862</Real>
+ <Real Name="Y">-121.56004451516648</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-231.09578724977212</Real>
+ <Real Name="Y">-199.44223930127089</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-81.648145884981545</Real>
+ <Real Name="Y">121.42857015903795</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">236.59608372717781</Real>
+ <Real Name="Y">199.57371365739942</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">2.9999999999999987</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">9.9999999999999982</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">9.9999999999999982</Real>
+ <Real Name="Z">-9.9999999999999982</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">9.9999999999999982</Real>
+ <Real Name="Y">-9.9999999999999982</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-9.9999999999999982</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">5.5</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.000000000000002</Real>
+ <Real Name="Y">-15.000000000000002</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.000000000000002</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">15.000000000000002</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">9.9999999999999982</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">15.000000000000002</Real>
+ <Real Name="Z">-9.9999999999999982</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.000000000000002</Real>
+ <Real Name="Y">-15.000000000000002</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.000000000000002</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">6.7500000000000018</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.000000000000002</Real>
+ <Real Name="Y">-15.000000000000002</Real>
+ <Real Name="Z">-15.000000000000002</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.000000000000002</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">15.000000000000002</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.000000000000002</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.000000000000002</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">15.000000000000002</Real>
+ <Real Name="Z">-15.000000000000002</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.000000000000002</Real>
+ <Real Name="Y">-15.000000000000002</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.000000000000002</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">34.750202025355343</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-32.5</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-24.784271247461906</Real>
+ <Real Name="Z">7.7157287525380944</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-9.7157287525380944</Real>
+ <Real Name="Z">24.784271247461906</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">34.5</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">34.750202025355343</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-32.5</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-24.784271247461906</Real>
+ <Real Name="Z">7.7157287525380944</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-9.7157287525380944</Real>
+ <Real Name="Z">24.784271247461906</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">34.5</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">34.750202025355343</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-32.5</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-24.784271247461906</Real>
+ <Real Name="Z">7.7157287525380944</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">-9.7157287525380944</Real>
+ <Real Name="Z">24.784271247461906</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">34.5</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">30.813352720018372</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-28.183254655737294</Real>
+ <Real Name="Y">-17.654602216542347</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-1.914631562657501</Real>
+ <Real Name="Y">32.182864593691562</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">48.98862968517011</Real>
+ <Real Name="Y">-36.923375646456762</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-18.890743466775312</Real>
+ <Real Name="Y">22.395113269307547</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">30.813352720018372</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-28.183254655737294</Real>
+ <Real Name="Y">-17.654602216542347</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-1.914631562657501</Real>
+ <Real Name="Y">32.182864593691562</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">48.98862968517011</Real>
+ <Real Name="Y">-36.923375646456762</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-18.890743466775312</Real>
+ <Real Name="Y">22.395113269307547</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">30.813352720018372</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-28.183254655737294</Real>
+ <Real Name="Y">-17.654602216542347</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-1.914631562657501</Real>
+ <Real Name="Y">32.182864593691562</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">48.98862968517011</Real>
+ <Real Name="Y">-36.923375646456762</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-18.890743466775312</Real>
+ <Real Name="Y">22.395113269307547</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">11.034766031773518</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">7.8539816339744828</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-7.8539816339744828</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">13.262352308671588</Real>
+ <Real Name="dVdlambda ">17.580566014743312</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">14.104442017679176</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-14.104442017679176</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">14.104442017679176</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-14.104442017679176</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">23.989002579978035</Real>
+ <Real Name="dVdlambda ">25.565968885036352</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">21.903882112528837</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-21.903882112528837</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">21.903882112528837</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-21.903882112528837</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">11.034766031773518</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">13.262352308671588</Real>
+ <Real Name="dVdlambda ">17.580566014743312</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-28.208884035358352</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">28.208884035358352</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-14.104442017679176</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">14.104442017679176</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">28.208884035358352</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-28.208884035358352</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">23.989002579978035</Real>
+ <Real Name="dVdlambda ">25.565968885036352</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-43.807764225057674</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">43.807764225057674</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-21.903882112528837</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">21.903882112528837</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">43.807764225057674</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-43.807764225057674</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">1.30223946958818</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">5.9629573870325823</Real>
+ <Real Name="dVdlambda ">-1.8844871096273672</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">18.915005768488545</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-18.915005768488545</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">18.915005768488545</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-18.915005768488545</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-18.915005768488545</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">18.915005768488545</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-18.915005768488545</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">18.915005768488545</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">4.5239494556073554</Real>
+ <Real Name="dVdlambda ">-3.6316108015196664</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">19.024088846738191</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-19.024088846738191</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">19.024088846738191</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-19.024088846738191</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-19.024088846738191</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">19.024088846738191</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-19.024088846738191</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">19.024088846738191</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">0.35990072183081195</Real>
+ <Real Name="dVdlambda ">1.6795367018771223</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.5527136788005009e-15</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">21.905881153419724</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-68.847055053604848</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">76.812830018484746</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-29.871656118299622</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">1.9194705164309971</Real>
+ <Real Name="dVdlambda ">4.7986762910774932</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">58.415683075785935</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-183.59214680961293</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">204.83421338262602</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-79.657749648799012</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">0.35990072183081195</Real>
+ <Real Name="dVdlambda ">1.6795367018771223</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.5527136788005009e-15</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">21.905881153419724</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-68.847055053604848</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">76.812830018484746</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-29.871656118299622</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">1.9194705164309971</Real>
+ <Real Name="dVdlambda ">4.7986762910774932</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">58.415683075785935</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-183.59214680961293</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">204.83421338262602</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-79.657749648799012</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">0.35990072183081195</Real>
+ <Real Name="dVdlambda ">1.6795367018771223</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.5527136788005009e-15</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">21.905881153419724</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-68.847055053604848</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">76.812830018484746</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-29.871656118299622</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">1.9194705164309971</Real>
+ <Real Name="dVdlambda ">4.7986762910774932</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">58.415683075785935</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-183.59214680961293</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">204.83421338262602</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-79.657749648799012</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">34.406537564908731</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">30.0715223042769</Real>
+ <Real Name="dVdlambda ">6.8884945802298407</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-186.02838875700192</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">648.63549209155053</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-219.44843007209428</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-243.1586732624543</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">31.802439397507104</Real>
+ <Real Name="dVdlambda ">0.27510760724486971</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-220.90274001345065</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">770.23382522633005</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-260.58796626948225</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-288.74311894339718</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">34.406537564908731</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">30.0715223042769</Real>
+ <Real Name="dVdlambda ">6.8884945802298407</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-186.02838875700192</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">648.63549209155053</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-219.44843007209428</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-243.1586732624543</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">31.802439397507104</Real>
+ <Real Name="dVdlambda ">0.27510760724486971</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-220.90274001345065</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">770.23382522633005</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-260.58796626948225</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-288.74311894339718</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Lambda Name="0">
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">34.406537564908731</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot ">30.0715223042769</Real>
+ <Real Name="dVdlambda ">6.8884945802298407</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-186.02838875700192</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">648.63549209155053</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-219.44843007209428</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-243.1586732624543</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot ">31.802439397507104</Real>
+ <Real Name="dVdlambda ">0.27510760724486971</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-220.90274001345065</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">770.23382522633005</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-260.58796626948225</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-288.74311894339718</Real>
+ </Vector>
+ </Sequence>
+ </Lambda>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">7.8539816339744828</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-7.8539816339744828</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">7.8539816339744828</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">6.1685027506808492</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">15.707963267948966</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-15.707963267948966</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">15.707963267948966</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">0</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">24.674011002723397</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">137.58648166927725</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-479.73041017556898</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">162.30392362805125</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">179.84000487824048</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">19.848077530122083</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">1.7364817766693035</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-1.7364817766693035</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">1.7364817766693035</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-1.7364817766693035</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">19.848077530122083</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-3.472963553338607</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">3.472963553338607</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-1.7364817766693035</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.7364817766693035</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">3.472963553338607</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-3.472963553338607</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">0.15192246987791869</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">3.4729635533386007</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-3.4729635533386007</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.4729635533386007</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-3.4729635533386007</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">-3.4729635533386007</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.4729635533386007</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-3.4729635533386007</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">3.4729635533386007</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">8.2635182233306974</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">92.848565376002526</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-291.80977689600792</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">325.57289157819071</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-126.61168005818529</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">8.2635182233306974</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">92.848565376002526</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-291.80977689600792</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">325.57289157819071</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-126.61168005818529</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">8.2635182233306974</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">1.4210854715202004e-14</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">92.848565376002526</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-291.80977689600792</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">325.57289157819071</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-126.61168005818529</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">11.736481776669301</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-86.259581555074774</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">300.76606319841176</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-101.75613452021821</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-112.75034712311879</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">11.736481776669301</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-86.259581555074774</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">300.76606319841176</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-101.75613452021821</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-112.75034712311879</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Real Name="Epot ">11.736481776669301</Real>
+ <Real Name="dVdlambda ">0</Real>
+ <Sequence Name="ShiftForces">
+ <Int Name="Length">45</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Sequence Name="Forces">
+ <Int Name="Length">4</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-86.259581555074774</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">300.76606319841176</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-101.75613452021821</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">-112.75034712311879</Real>
+ </Vector>
+ </Sequence>
+</ReferenceData>
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \libinternal
+ * \file
+ * \brief Declares MultiDimArray.
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup module_math
+ * \ingroup module_mdspan
+ */
+
+#ifndef GMX_MATH_MULTIDIMARRAY_H_
+#define GMX_MATH_MULTIDIMARRAY_H_
+
+#include "gromacs/mdspan/mdspan.h"
+#include "gromacs/utility/arrayref.h"
+
+namespace gmx
+{
+
+namespace detail
+{
+/*! \libinternal \brief
+ * Determine static array size at compile time.
+ * Statically evaluates the product of static array extents.
+ * \tparam Extents Extents of an multidimensional array as in module_mdspan
+ * \returns the product of the static extents
+ */
+template <typename Extents>
+constexpr typename Extents::index_type staticExtentsProduct(size_t const i = 0)
+{
+ return (i < Extents::rank()) ? Extents::static_extent(i) * staticExtentsProduct<Extents>(i + 1) : 1;
+}
+} // namespace detail
+/*! \libinternal \brief
+ * Multidimensional array that manages its own memory.
+ *
+ * \note No bounds checking when accessing memory
+ *
+ * \note That the view holds a valid pointer to the data is a class invariant.
+ *
+ * The Container type that stores the data may be resizable (std::vector or similar)
+ * or static (std::array or similar). Copy and move assignment routines as well as
+ * swapping are designed to yield good performances in both cases, notably
+ * foregoing the copy-swap idiom due to the bad performance in swapping std::array.
+ *
+ * This class avoids throwing exeptions, apart from the ones that might be thrown
+ * from the containers during resizing an allocation. (bad_malloc from std::vector
+ * is a likely candidate)
+ *
+ *
+ * Holds as many elements as required by a multidimensional view.
+ * \tparam TContainer Data type container for the data to be stored
+ * as MultiDimArray with random element access and
+ * value_type, refence and const_reference exposed
+ * \tparam Extents An extents class describing the array dimensions
+ * as used in module_mdspan
+ * \tparam LayoutPolicy The data layout as in module_mdspan describes
+ * translation of indices to memory offset.
+ * Defaults to right aligned, so that the right-most index
+ * is contiguous in memory.
+ */
+template <class TContainer, class Extents, class LayoutPolicy = layout_right>
+class MultiDimArray
+{
+ public:
+ //! the type of values that are stored
+ using value_type = typename TContainer::value_type;
+ //! reference type to the stored values
+ using reference = typename TContainer::reference;
+ //! const reference type to the stored values
+ using const_reference = typename TContainer::const_reference;
+ //! the view used to access the data
+ using view_type = basic_mdspan<value_type, Extents, LayoutPolicy>;
+ /*! \brief Iterator type for contiguous iteration over the stored data.
+ * Used, e.g., in free begin and end functions
+ */
+ using iterator = typename ArrayRef<value_type>::iterator;
+ /*! \brief Const iterator type for contiguous iteration over the stored data.
+ * used, e.g., in free begin and end functions
+ */
+ using const_iterator = const typename ArrayRef<const value_type>::const_iterator;
+ /*! \brief
+ * Allocate dynamic array data and set view with the dynamic extents.
+ *
+ * \param[in] dynamicExtent A parameter pack that describes the dynamic
+ * size of the array. Empty if purely static.
+ *
+ * \tparam IndexType Parameter pack type holding the dynamic
+ * extents of the multidimensional array
+ */
+ template <class ... IndexType>
+ MultiDimArray(IndexType... dynamicExtent)
+ {
+ static_assert(Extents::rank_dynamic() != 0,
+ "Resizable container type not allowed in a static MultiDimArray.");
+ resize(dynamicExtent ...);
+ }
+ /*! \brief
+ * Construction with fixed sized array for storage if MultiDimArray size
+ * is static and layout policy allows compile time determination of the
+ * container size.
+ *
+ * Exampe use is MultiDimArray<std::array<float, 9>, extents<3,3>>
+ * \tparam StaticSizeAndLayout Template parameter for activation via SFINAE.
+ */
+ template <bool StaticSizeAndLayoutRight = Extents::rank_dynamic() == 0 &&
+ std::is_same<LayoutPolicy, layout_right>::value,
+ typename std::enable_if<StaticSizeAndLayoutRight, int>::type = 0>
+ constexpr MultiDimArray() noexcept : view_(data_.data())
+ {
+ // \todo replace staticExtentsProduct by the required_span_size
+ // of the LayoutPolicy, once required_span_size is a constexpr
+ // with C++14
+ // using tuple_size allows constexpr for this constructor (data_.size() is not available then)
+ static_assert(std::tuple_size<TContainer>() ==
+ detail::staticExtentsProduct<Extents>(),
+ "Non-resizable container type size must match static MultiDimArray size.");
+ }
+ /*! \brief
+ * Construction from fixed sized arrays if the array size is static and
+ * layout policy allows compile time determination of the container size.
+ *
+ * Enables the expected initialization
+ * MultiDimArray<std::array<float, 9>, extents<3,3>> arr = {{1,2...}}
+ * \tparam StaticSizeAndLayout Template parameter for activation via SFINAE.
+ */
+ template <bool StaticSizeAndLayoutRight = Extents::rank_dynamic() == 0 &&
+ std::is_same<LayoutPolicy, layout_right>::value,
+ typename std::enable_if<StaticSizeAndLayoutRight, int>::type = 0>
+ constexpr MultiDimArray(const TContainer &data) noexcept : data_(data), view_(data_.data())
+ {
+ // \todo replace staticExtentsProduct by the required_span_size
+ // of the LayoutPolicy, once required_span_size is a constexpr
+ // with C++14
+ // using tuple_size allows constexpr for this constructor (data_.size() is not available then)
+ static_assert(std::tuple_size<TContainer>() ==
+ detail::staticExtentsProduct<Extents>(),
+ "Non-resizable container type size must match static MultiDimArray size.");
+ }
+ //! Copy constructor
+ constexpr MultiDimArray(const MultiDimArray &o) :
+ data_(o.data_),
+ view_(data_.data(), o.view_.extents())
+ {}
+ //! Move constructor
+ MultiDimArray(MultiDimArray &&o) noexcept : data_(std::move(o.data_)),
+ view_(data_.data(), o.view_.extents())
+ {}
+ //! Copy assignment
+ MultiDimArray &operator=(const MultiDimArray &o) noexcept
+ {
+ data_ = o.data_;
+ view_ = view_type(data_.data(), o.view_.extents());
+ return *this;
+ }
+ //! Move assignment
+ MultiDimArray &operator=(MultiDimArray &&o) noexcept
+ {
+ data_ = std::move(o.data_);
+ view_ = view_type(data_.data(), o.view_.extents());
+ return *this;
+ }
+ //! Swaps content with other
+ void swap(MultiDimArray &o)
+ {
+ using std::swap;
+ swap(data_, o.data_);
+ swap(view_, o.view_);
+ }
+ /*! \brief
+ * Resize the dynamic extents of the array if any and set container size
+ * accordingly.
+ *
+ * Invalidates data and views of this array.
+ *
+ * \param[in] dynamicExtent A parameter pack that describes the dynamic
+ * size of the array. Empty if purely static.
+ * \tparam IndexType Parameter pack type holding the dynamic
+ * extents of the multidimensional array
+ */
+ template <class ... IndexType>
+ void resize(IndexType... dynamicExtent)
+ {
+ // use a mapping object to determine the required span size;
+ layout_right::mapping<Extents> map {Extents {dynamicExtent ...}};
+ data_.resize(map.required_span_size());
+ // to construct a valid view on the data, the container has to be resized before
+ // the assignment, so that data_.data() is valid
+ view_ = view_type(data_.data(), dynamicExtent ...);
+ }
+ /*! \brief Data access via multidimensional indices.
+ * This allows referencing rank R array elements as array(x_0,x_1,x_2, .., x_R)
+ *
+ * \param[in] index multidimensional indices as parameter pack
+ * the number of parameters must match the rank of the array.
+ *
+ * \returns reference to array element
+ */
+ template< class... IndexType>
+ reference operator()(IndexType ... index) noexcept
+ {
+ return view_(index ...);
+ }
+ /*! \brief Const data access via multidimensional indices.
+ * This allows referencing rank R array elements as array(x_0,x_1,x_2, .., x_R)
+ *
+ * \param[in] index multidimensional indices as parameter pack
+ * the number of parameters must match the rank of the array.
+ *
+ * \returns const reference to array element
+ */
+ template <class... IndexType>
+ constexpr const_reference operator()(IndexType... index) const noexcept
+ {
+ return view_(index ...);
+ }
+ /*! \brief Contiguous access to the data.
+ * \returns ArrayRef to stored data.
+ */
+ ArrayRef<value_type> toArrayRef()
+ {
+ return {data_.data(), data_.data()+data_.size()};
+ }
+ /*! \brief Contiguous const access to the data.
+ * \returns ArrayRef to stored data.
+ */
+ constexpr ArrayRef<const value_type> toArrayRef() const
+ {
+ return {data_.data(), data_.data()+data_.size()};
+ }
+ /*! \brief Return the extent.
+ * \param[in] k dimension to query for extent
+ * \returns extent along specified dimension
+ */
+ constexpr typename view_type::index_type extent(int k) const noexcept
+ {
+ return view_.extent(k);
+ }
+ private:
+ //! The contiguous data that is equipped with multidimensional indexing in this class
+ TContainer data_;
+ //! Multidimensional view into data_.
+ view_type view_;
+};
+
+//! Free MultiDimArray begin function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::const_iterator
+begin(const MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+ return multiDimArray.toArrayRef().begin();
+}
+
+//! Free MultiDimArray begin function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::iterator
+begin(MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+ return multiDimArray.toArrayRef().begin();
+}
+
+//! Free MultiDimArray end function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::const_iterator
+end(const MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+ return multiDimArray.toArrayRef().end();
+}
+
+//! Free MultiDimArray end function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::iterator
+end(MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+ return multiDimArray.toArrayRef().end();
+}
+
+//! Swap function
+template <class TContainer, class Extents>
+void swap(MultiDimArray<TContainer, Extents> &a, MultiDimArray<TContainer, Extents > &b) noexcept
+{
+ a.swap(b);
+}
+
+} // namespace gmx
+
+#endif // GMX_MATH_MULTIDIMARRAY_H_
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2014,2015,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
dofit.cpp
functions.cpp
invertmatrix.cpp
+ multidimarray.cpp
paddedvector.cpp
vectypes.cpp
)
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Tests multidimensional arrays
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup module_math
+ */
+#include "gmxpre.h"
+
+#include "gromacs/math/multidimarray.h"
+
+#include <string>
+#include <vector>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "testutils/testasserts.h"
+
+namespace gmx
+{
+
+namespace test
+{
+
+namespace
+{
+
+class MultiDimArrayTest : public ::testing::Test
+{
+ public:
+ MultiDimArrayTest()
+ {
+ std::fill(begin(staticArray_), end(staticArray_), testNumber_ - 1);
+ std::fill(begin(dynamicArray_), end(dynamicArray_), testNumber_ - 1);
+ }
+ protected:
+
+ using static_container_type = std::array<float, 3*3>;
+ using static_extents_type = extents<3, 3>;
+ using static_array_type = MultiDimArray<static_container_type, static_extents_type>;
+
+ using dynamic_container_type = std::vector<float>;
+ using dynamic_extents_type = extents<dynamic_extent, dynamic_extent>;
+ using dynamic_array_type = MultiDimArray<dynamic_container_type, dynamic_extents_type>;
+
+ static_array_type staticArray_;
+ dynamic_array_type dynamicArray_ {2, 2};
+
+ float testNumber_ = 42;
+};
+
+
+TEST_F(MultiDimArrayTest, canConstructAndFillStatic)
+{
+ for (const auto &x : staticArray_)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canConstructAndFillDynamic)
+{
+ for (const auto &x : dynamicArray_)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canSetValuesInStatic)
+{
+ staticArray_(1, 1) = testNumber_;
+ EXPECT_EQ(testNumber_, staticArray_(1, 1) );
+}
+
+TEST_F(MultiDimArrayTest, canSetValuesInDynamic)
+{
+ dynamicArray_(1, 1) = testNumber_;
+ EXPECT_EQ(testNumber_, dynamicArray_(1, 1));
+}
+
+TEST_F(MultiDimArrayTest, canMoveConstructStatic)
+{
+ auto other(std::move(staticArray_));
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canMoveConstructDynamic)
+{
+ auto other(std::move(dynamicArray_));
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canMoveAssignStatic)
+{
+ static_array_type other;
+ other = std::move(staticArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canMoveAssignDynamic)
+{
+ dynamic_array_type other;
+ other = std::move(dynamicArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canCopyConstructStatic)
+{
+ auto other = staticArray_;
+ auto twoDArrayIt = begin(staticArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(*twoDArrayIt, x);
+ ++twoDArrayIt;
+ }
+}
+
+TEST_F(MultiDimArrayTest, canCopyConstructDynamic)
+{
+ auto other = dynamicArray_;
+ auto twoDArrayIt = begin(dynamicArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(*twoDArrayIt, x);
+ ++twoDArrayIt;
+ }
+}
+
+TEST_F(MultiDimArrayTest, canCopyAssignStatic)
+{
+ static_array_type other;
+ other = staticArray_;
+ auto twoDArrayIt = begin(staticArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(*twoDArrayIt, x);
+ ++twoDArrayIt;
+ }
+}
+
+TEST_F(MultiDimArrayTest, canCopyAssignDynamic)
+{
+ dynamic_array_type other;
+ other = dynamicArray_;
+ auto twoDArrayIt = begin(dynamicArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(*twoDArrayIt, x);
+ ++twoDArrayIt;
+ }
+}
+
+TEST_F(MultiDimArrayTest, canSwapStatic)
+{
+ static_array_type other;
+ other.swap(staticArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, canSwapDynamic)
+{
+ dynamic_array_type other;
+ other.swap(dynamicArray_);
+ for (const auto &x : other)
+ {
+ EXPECT_EQ(testNumber_ - 1, x);
+ }
+}
+
+TEST_F(MultiDimArrayTest, staticMultiDimArrayExtent)
+{
+ EXPECT_EQ(staticArray_.extent(0), 3);
+ EXPECT_EQ(staticArray_.extent(1), 3);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayExtent)
+{
+ EXPECT_EQ(dynamicArray_.extent(0), 2);
+ EXPECT_EQ(dynamicArray_.extent(1), 2);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayResizesToCorrectExtent)
+{
+ dynamicArray_.resize(5, 4);
+ EXPECT_EQ(dynamicArray_.extent(0), 5);
+ EXPECT_EQ(dynamicArray_.extent(1), 4);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayResizeAndSetValue)
+{
+ dynamicArray_.resize(5, 4);
+ dynamicArray_(4, 3) = testNumber_;
+ EXPECT_EQ(dynamicArray_(4, 3), testNumber_);
+}
+
+TEST_F(MultiDimArrayTest, staticMultiDimArrayFromArray)
+{
+ static_array_type arr = {{1, 2, 3, 4, 5, 6, 7, 8, 9}};
+ EXPECT_EQ(arr(0, 0), 1);
+ EXPECT_EQ(arr(0, 1), 2);
+ EXPECT_EQ(arr(0, 2), 3);
+ EXPECT_EQ(arr(1, 0), 4);
+ EXPECT_EQ(arr(1, 1), 5);
+ EXPECT_EQ(arr(1, 2), 6);
+ EXPECT_EQ(arr(2, 0), 7);
+ EXPECT_EQ(arr(2, 1), 8);
+ EXPECT_EQ(arr(2, 2), 9);
+}
+
+} // namespace
+
+} // namespace test
+
+} // namespace gmx
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
Constraints::Impl::~Impl()
{
+ for (auto blocka : at2con_mt)
+ {
+ done_blocka(&blocka);
+ }
+ if (bSettleErrorHasOccurred != nullptr)
+ {
+ sfree(bSettleErrorHasOccurred);
+ }
+ if (vir_r_m_dr_th != nullptr)
+ {
+ sfree(vir_r_m_dr_th);
+ }
+ if (settled != nullptr)
+ {
+ settle_free(settled);
+ }
done_lincs(lincsd);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/random/uniformrealdistribution.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
+#include "gromacs/utility/pleasecite.h"
#include "gromacs/utility/smalloc.h"
#define NTROTTERPARTS 3
int i, j, mi, mj;
double Ekin, Efac, reft, kT, nd;
double dt;
- t_grp_tcstat *tcstat;
double *ivxi, *ixi;
- double *iQinv;
double *GQ;
gmx_bool bBarostat;
int mstepsi, mstepsj;
ivxi = &vxi[i*nh];
ixi = &xi[i*nh];
+ gmx::ArrayRef<const double> iQinv;
if (bBarostat)
{
- iQinv = &(MassQ->QPinv[i*nh]);
+ iQinv = gmx::arrayRefFromArray(&MassQ->QPinv[i*nh], nh);
nd = 1.0; /* THIS WILL CHANGE IF NOT ISOTROPIC */
reft = std::max<real>(0, opts->ref_t[0]);
Ekin = gmx::square(*veta)/MassQ->Winv;
}
else
{
- iQinv = &(MassQ->Qinv[i*nh]);
- tcstat = &ekind->tcstat[i];
+ iQinv = gmx::arrayRefFromArray(&MassQ->Qinv[i*nh], nh);
+ const t_grp_tcstat *tcstat = &ekind->tcstat[i];
nd = opts->nrdf[i];
reft = std::max<real>(0, opts->ref_t[i]);
if (bEkinAveVel)
inc_nrnb(nrnb, eNR_PCOUPL, nr_atoms);
}
-void berendsen_tcoupl(const t_inputrec *ir, const gmx_ekindata_t *ekind, real dt,
+void berendsen_tcoupl(const t_inputrec *ir, gmx_ekindata_t *ekind, real dt,
std::vector<double> &therm_integral)
{
const t_grpopts *opts = &ir->opts;
void andersen_tcoupl(const t_inputrec *ir, int64_t step,
const t_commrec *cr, const t_mdatoms *md,
gmx::ArrayRef<gmx::RVec> v,
- real rate, const gmx_bool *randomize, const real *boltzfac)
+ real rate, const std::vector<bool> &randomize,
+ gmx::ArrayRef<const real> boltzfac)
{
const int *gatindex = (DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
int i;
void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
const gmx_enerdata_t *enerd, t_state *state,
const tensor vir, const t_mdatoms *md,
- const t_extmass *MassQ, const int * const *trotter_seqlist, int trotter_seqno)
+ const t_extmass *MassQ, gmx::ArrayRef < std::vector < int>> trotter_seqlist,
+ int trotter_seqno)
{
int n, i, d, ngtc, gc = 0, t;
int64_t step_eff;
real dt;
double *scalefac, dtc;
- const int *trotter_seq;
rvec sumv = {0, 0, 0};
gmx_bool bCouple;
bCouple = (ir->nsttcouple == 1 ||
do_per_step(step_eff+ir->nsttcouple, ir->nsttcouple));
- trotter_seq = trotter_seqlist[trotter_seqno];
+ const gmx::ArrayRef<const int> trotter_seq = trotter_seqlist[trotter_seqno];
if ((trotter_seq[0] == etrtSKIPALL) || (!bCouple))
{
{
if (bInit)
{
- snew(MassQ->Qinv, ngtc);
+ MassQ->Qinv.resize(ngtc);
}
for (i = 0; (i < ngtc); i++)
{
/* Allocate space for thermostat variables */
if (bInit)
{
- snew(MassQ->Qinv, ngtc*nh);
+ MassQ->Qinv.resize(ngtc * nh);
}
/* now, set temperature variables */
}
}
-int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
+std::array < std::vector < int>, ettTSEQMAX> init_npt_vars(const t_inputrec *ir, t_state *state,
+ t_extmass *MassQ, gmx_bool bTrotter)
{
int i, j, nnhpres, nh;
const t_grpopts *opts;
real bmass, qmass, reft, kT;
- int **trotter_seq;
opts = &(ir->opts); /* just for ease of referencing */
nnhpres = state->nnhpres;
init_npt_masses(ir, state, MassQ, TRUE);
/* first, initialize clear all the trotter calls */
- snew(trotter_seq, ettTSEQMAX);
+ std::array < std::vector < int>, ettTSEQMAX> trotter_seq;
for (i = 0; i < ettTSEQMAX; i++)
{
- snew(trotter_seq[i], NTROTTERPARTS);
- for (j = 0; j < NTROTTERPARTS; j++)
- {
- trotter_seq[i][j] = etrtNONE;
- }
+ trotter_seq[i].resize(NTROTTERPARTS, etrtNONE);
trotter_seq[i][0] = etrtSKIPALL;
}
bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
}
- snew(MassQ->QPinv, nnhpres*opts->nhchainlength);
+ MassQ->QPinv.resize(nnhpres*opts->nhchainlength);
/* barostat temperature */
if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
void rescale_velocities(const gmx_ekindata_t *ekind, const t_mdatoms *mdatoms,
int start, int end, rvec v[])
{
- t_grp_acc *gstat;
- t_grp_tcstat *tcstat;
unsigned short *cACC, *cTC;
int ga, gt, n, d;
real lg;
rvec vrel;
- tcstat = ekind->tcstat;
cTC = mdatoms->cTC;
+ gmx::ArrayRef<const t_grp_tcstat> tcstat = ekind->tcstat;
+
if (ekind->bNEMD)
{
- gstat = ekind->grpstat;
+ gmx::ArrayRef<const t_grp_acc> gstat = ekind->grpstat;
cACC = mdatoms->cACC;
ga = 0;
}
}
+// TODO If we keep simulated annealing, make a proper module that
+// does not rely on changing inputrec.
+bool initSimulatedAnnealing(t_inputrec *ir,
+ gmx::Update *upd)
+{
+ bool doSimulatedAnnealing = false;
+ for (int i = 0; i < ir->opts.ngtc; i++)
+ {
+ /* set bSimAnn if any group is being annealed */
+ if (ir->opts.annealing[i] != eannNO)
+ {
+ doSimulatedAnnealing = true;
+ }
+ }
+ if (doSimulatedAnnealing)
+ {
+ update_annealing_target_temp(ir, ir->init_t, upd);
+ }
+ return doSimulatedAnnealing;
+}
/* set target temperatures if we are annealing */
-void update_annealing_target_temp(t_inputrec *ir, real t, gmx_update_t *upd)
+void update_annealing_target_temp(t_inputrec *ir, real t, gmx::Update *upd)
{
int i, j, n, npoints;
real pert, thist = 0, x;
}
}
- update_temperature_constants(upd, ir);
+ update_temperature_constants(upd->sd(), ir);
+}
+
+void pleaseCiteCouplingAlgorithms(FILE *fplog,
+ const t_inputrec &ir)
+{
+ if (EI_DYNAMICS(ir.eI))
+ {
+ if (ir.etc == etcBERENDSEN)
+ {
+ please_cite(fplog, "Berendsen84a");
+ }
+ if (ir.etc == etcVRESCALE)
+ {
+ please_cite(fplog, "Bussi2007a");
+ }
+ // TODO this is actually an integrator, not a coupling algorithm
+ if (ir.eI == eiSD1)
+ {
+ please_cite(fplog, "Goga2012");
+ }
+ }
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
a0 = cgs->index[cg];
a1 = cgs->index[cg+1];
- if (getGroupType(&mtop->groups, egcENER, a_offset+am+a0) !=
- getGroupType(&mtop->groups, egcENER, a_offset +a0))
+ if (getGroupType(mtop->groups, egcENER, a_offset+am+a0) !=
+ getGroupType(mtop->groups, egcENER, a_offset +a0))
{
bId = FALSE;
}
a1 = cgs->index[cg+1];
/* Store the energy group in cginfo */
- gid = getGroupType(&mtop->groups, egcENER, a_offset+am+a0);
+ gid = getGroupType(mtop->groups, egcENER, a_offset+am+a0);
SET_CGINFO_GID(cginfo[cgm+cg], gid);
/* Check the intra/inter charge group exclusions */
return cutoff;
}
-gmx_bool can_use_allvsall(const t_inputrec *ir, gmx_bool bPrintNote, const t_commrec *cr, FILE *fp)
-{
- gmx_bool bAllvsAll;
-
- bAllvsAll =
- (
- ir->rlist == 0 &&
- ir->rcoulomb == 0 &&
- ir->rvdw == 0 &&
- ir->ePBC == epbcNONE &&
- ir->vdwtype == evdwCUT &&
- ir->coulombtype == eelCUT &&
- ir->efep == efepNO &&
- getenv("GMX_NO_ALLVSALL") == nullptr
- );
-
- if (bAllvsAll && ir->opts.ngener > 1)
- {
- const char *note = "NOTE: Can not use all-vs-all force loops, because there are multiple energy monitor groups; you might get significantly higher performance when using only a single energy monitor group.\n";
-
- if (bPrintNote)
- {
- if (fp != nullptr)
- {
- fprintf(fp, "\n%s\n", note);
- }
- }
- bAllvsAll = FALSE;
- }
-
- if (bAllvsAll && fp && MASTER(cr))
- {
- fprintf(fp, "\nUsing SIMD all-vs-all kernels.\n\n");
- }
-
- return bAllvsAll;
-}
-
-
gmx_bool nbnxn_simd_supported(const gmx::MDLogger &mdlog,
const t_inputrec *ir)
{
nonbonded_verlet_t *nbv;
char *env;
- nbnxn_alloc_t *nb_alloc;
- nbnxn_free_t *nb_free;
-
nbv = new nonbonded_verlet_t();
nbv->emulateGpu = ((getenv("GMX_EMULATE_GPU") != nullptr) ? EmulateGpuNonbonded::Yes : EmulateGpuNonbonded::No);
bFEP_NonBonded,
gmx_omp_nthreads_get(emntPairsearch));
- gpu_set_host_malloc_and_free(nbv->grp[0].kernel_type == nbnxnk8x8x8_GPU,
- &nb_alloc, &nb_free);
-
for (int i = 0; i < nbv->ngrp; i++)
{
nbnxn_init_pairlist_set(&nbv->grp[i].nbl_lists,
nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type),
/* 8x8x8 "non-simple" lists are ATM always combined */
- !nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type),
- nb_alloc, nb_free);
+ !nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type));
}
int enbnxninitcombrule;
enbnxninitcombrule = enbnxninitcombruleNONE;
}
- snew(nbv->nbat, 1);
+ nbv->nbat = new nbnxn_atomdata_t(nbv->bUseGPU ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
int mimimumNumEnergyGroupNonbonded = ir->opts.ngener;
if (ir->opts.ngener - ir->nwall == 1)
{
enbnxninitcombrule,
fr->ntype, fr->nbfp,
mimimumNumEnergyGroupNonbonded,
- bSimpleList ? gmx_omp_nthreads_get(emntNonbonded) : 1,
- nb_alloc, nb_free);
+ bSimpleList ? gmx_omp_nthreads_get(emntNonbonded) : 1);
if (nbv->bUseGPU)
{
fr->bBHAM = (mtop->ffparams.functype[0] == F_BHAM);
- /* Check if we can/should do all-vs-all kernels */
- fr->bAllvsAll = can_use_allvsall(ir, FALSE, nullptr, nullptr);
- fr->AllvsAll_work = nullptr;
-
- /* All-vs-all kernels have not been implemented in 4.6 and later.
- * See Redmine #1249. */
- if (fr->bAllvsAll)
- {
- fr->bAllvsAll = FALSE;
- if (fp != nullptr)
- {
- fprintf(fp,
- "\nYour simulation settings would have triggered the efficient all-vs-all\n"
- "kernels in GROMACS 4.5, but these have not been implemented in GROMACS\n"
- "4.6 and 5.x. If performance is important, please use GROMACS 4.5.7\n"
- "or try cutoff-scheme = Verlet.\n\n");
- }
- }
-
/* Neighbour searching stuff */
fr->cutoff_scheme = ir->cutoff_scheme;
fr->bGrid = (ir->ns_type == ensGRID);
// PME-only ranks don't have a forcerec
return;
}
+ // cginfo is dynamically allocated if no domain decomposition
+ if (fr->cginfo != nullptr)
+ {
+ sfree(fr->cginfo);
+ }
done_cginfo_mb(fr->cginfo_mb, numMolBlocks);
sfree(fr->nbfp);
done_interaction_const(fr->ic);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* with the type of kernel indicated.
*/
-gmx_bool can_use_allvsall(const t_inputrec *ir,
- gmx_bool bPrintNote, const t_commrec *cr, FILE *fp);
-/* Returns if we can use all-vs-all loops.
- * If bPrintNote==TRUE, prints a note, if necessary, to stderr
- * and fp (if !=NULL) on the master node.
- */
-
gmx_bool nbnxn_simd_supported(const gmx::MDLogger &mdlog,
const t_inputrec *ir);
/* Return if CPU SIMD support exists for the given inputrec
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/domdec/domdec_struct.h"
#include "gromacs/gmxlib/nrnb.h"
#include "gromacs/math/functions.h"
+#include "gromacs/math/paddedvector.h"
#include "gromacs/math/units.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/constr.h"
#include "gromacs/simd/vector_operations.h"
#include "gromacs/topology/block.h"
#include "gromacs/topology/mtop_util.h"
+#include "gromacs/utility/alignedallocator.h"
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/bitmask.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/gmxomp.h"
#include "gromacs/utility/pleasecite.h"
-#include "gromacs/utility/smalloc.h"
using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
namespace gmx
{
+//! Indices of the two atoms involved in a single constraint
+struct AtomPair
+{
+ //! \brief Constructor, does not initialize to catch bugs and faster construction
+ AtomPair()
+ {
+ }
+
+ //! Index of atom 1
+ int index1;
+ //! Index of atom 2
+ int index2;
+};
+
//! Unit of work within LINCS.
struct Task
{
//! First constraint for this task.
- int b0 = 0;
+ int b0 = 0;
//! b1-1 is the last constraint for this task.
- int b1 = 0;
+ int b1 = 0;
//! The number of constraints in triangles.
- int ntriangle = 0;
+ int ntriangle = 0;
//! The list of triangle constraints.
- int *triangle = nullptr;
+ std::vector<int> triangle;
//! The bits tell if the matrix element should be used.
- int *tri_bits = nullptr;
- //! Allocation size of triangle and tri_bits.
- int tri_alloc = 0;
- //! Number of indices.
- int nind = 0;
+ std::vector<int> tri_bits;
//! Constraint index for updating atom data.
- int *ind = nullptr;
- //! Number of indices.
- int nind_r = 0;
+ std::vector<int> ind;
//! Constraint index for updating atom data.
- int *ind_r = nullptr;
- //! Allocation size of ind and ind_r.
- int ind_nalloc = 0;
+ std::vector<int> ind_r;
//! Temporary variable for virial calculation.
- tensor vir_r_m_dr = {{0}};
+ tensor vir_r_m_dr = {{0}};
//! Temporary variable for lambda derivative.
- real dhdlambda;
+ real dhdlambda;
};
/*! \brief Data for LINCS algorithm.
int max_connect = 0;
//! The number of real constraints.
- int nc_real = 0;
+ int nc_real = 0;
//! The number of constraints including padding for SIMD.
- int nc = 0;
- //! The number we allocated memory for.
- int nc_alloc = 0;
+ int nc = 0;
//! The number of constraint connections.
- int ncc = 0;
- //! The number we allocated memory for.
- int ncc_alloc = 0;
+ int ncc = 0;
//! The FE lambda value used for filling blc and blmf.
- real matlam = 0;
+ real matlam = 0;
//! mapping from topology to LINCS constraints.
- int *con_index = nullptr;
+ std::vector<int> con_index;
//! The reference distance in topology A.
- real *bllen0 = nullptr;
+ std::vector < real, AlignedAllocator < real>> bllen0;
//! The reference distance in top B - the r.d. in top A.
- real *ddist = nullptr;
+ std::vector < real, AlignedAllocator < real>> ddist;
//! The atom pairs involved in the constraints.
- int *bla = nullptr;
+ std::vector<AtomPair> atoms;
//! 1/sqrt(invmass1 invmass2).
- real *blc = nullptr;
+ std::vector < real, AlignedAllocator < real>> blc;
//! As blc, but with all masses 1.
- real *blc1 = nullptr;
+ std::vector < real, AlignedAllocator < real>> blc1;
//! Index into blbnb and blmf.
- int *blnr = nullptr;
+ std::vector<int> blnr;
//! List of constraint connections.
- int *blbnb = nullptr;
+ std::vector<int> blbnb;
//! The local number of constraints in triangles.
- int ntriangle = 0;
+ int ntriangle = 0;
//! The number of constraint connections in triangles.
- int ncc_triangle = 0;
+ int ncc_triangle = 0;
//! Communicate before each LINCS interation.
- bool bCommIter = false;
+ bool bCommIter = false;
//! Matrix of mass factors for constraint connections.
- real *blmf = nullptr;
+ std::vector<real> blmf;
//! As blmf, but with all masses 1.
- real *blmf1 = nullptr;
+ std::vector<real> blmf1;
//! The reference bond length.
- real *bllen = nullptr;
+ std::vector < real, AlignedAllocator < real>> bllen;
//! The local atom count per constraint, can be NULL.
- int *nlocat = nullptr;
+ std::vector<int> nlocat;
/*! \brief The number of tasks used for LINCS work.
*
* index is used for constructing bit masks and organizing the
* virial output buffer, so other things need to change,
* first. */
- int ntask = 0;
+ int ntask = 0;
/*! \brief LINCS thread division */
- std::vector<Task> task;
+ std::vector<Task> task;
//! Atom flags for thread parallelization.
- gmx_bitmask_t *atf = nullptr;
- //! Allocation size of atf
- int atf_nalloc = 0;
+ std::vector<gmx_bitmask_t> atf;
//! Are the LINCS tasks interdependent?
- bool bTaskDep = false;
+ bool bTaskDep = false;
//! Are there triangle constraints that cross task borders?
- bool bTaskDepTri = false;
+ bool bTaskDepTri = false;
//! Arrays for temporary storage in the LINCS algorithm.
/*! @{ */
- rvec *tmpv = nullptr;
- real *tmpncc = nullptr;
- real *tmp1 = nullptr;
- real *tmp2 = nullptr;
- real *tmp3 = nullptr;
- real *tmp4 = nullptr;
+ PaddedVector<gmx::RVec> tmpv;
+ std::vector<real> tmpncc;
+ std::vector < real, AlignedAllocator < real>> tmp1;
+ std::vector < real, AlignedAllocator < real>> tmp2;
+ std::vector < real, AlignedAllocator < real>> tmp3;
+ std::vector < real, AlignedAllocator < real>> tmp4;
/*! @} */
//! The Lagrange multipliers times -1.
- real *mlambda = nullptr;
+ std::vector < real, AlignedAllocator < real>> mlambda;
//! Storage for the constraint RMS relative deviation output.
std::array<real, 2> rmsdData = {{0}};
};
static const int simd_width = 1;
#endif
-/*! \brief Align to 128 bytes, consistent with the current implementation of
- AlignedAllocator, which currently forces 128 byte alignment. */
-static const int align_bytes = 128;
-
ArrayRef<real> lincs_rmsdData(Lincs *lincsd)
{
return lincsd->rmsdData;
* This function will return with up to date thread-local
* constraint data, without an OpenMP barrier.
*/
-static void lincs_matrix_expand(const Lincs *lincsd,
- const Task *li_task,
- const real *blcc,
- real *rhs1, real *rhs2, real *sol)
+static void lincs_matrix_expand(const Lincs &lincsd,
+ const Task &li_task,
+ gmx::ArrayRef<const real> blcc,
+ gmx::ArrayRef<real> rhs1,
+ gmx::ArrayRef<real> rhs2,
+ gmx::ArrayRef<real> sol)
{
- int b0, b1, nrec, rec;
- const int *blnr = lincsd->blnr;
- const int *blbnb = lincsd->blbnb;
+ gmx::ArrayRef<const int> blnr = lincsd.blnr;
+ gmx::ArrayRef<const int> blbnb = lincsd.blbnb;
- b0 = li_task->b0;
- b1 = li_task->b1;
- nrec = lincsd->nOrder;
+ const int b0 = li_task.b0;
+ const int b1 = li_task.b1;
+ const int nrec = lincsd.nOrder;
- for (rec = 0; rec < nrec; rec++)
+ for (int rec = 0; rec < nrec; rec++)
{
- int b;
-
- if (lincsd->bTaskDep)
+ if (lincsd.bTaskDep)
{
#pragma omp barrier
}
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
real mvb;
int n;
sol[b] = sol[b] + mvb;
}
- real *swap;
-
- swap = rhs1;
- rhs1 = rhs2;
- rhs2 = swap;
+ std::swap(rhs1, rhs2);
} /* nrec*(ncons+2*nrtot) flops */
- if (lincsd->ntriangle > 0)
+ if (lincsd.ntriangle > 0)
{
/* Perform an extra nrec recursions for only the constraints
* involved in rigid triangles.
* is around 0.4 (and 0.7*0.7=0.5).
*/
- if (lincsd->bTaskDep)
+ if (lincsd.bTaskDep)
{
/* We need a barrier here, since other threads might still be
* reading the contents of rhs1 and/o rhs2.
* LINCS task. This means no barriers are required during the extra
* iterations for the triangle constraints.
*/
- const int *triangle = li_task->triangle;
- const int *tri_bits = li_task->tri_bits;
+ gmx::ArrayRef<const int> triangle = li_task.triangle;
+ gmx::ArrayRef<const int> tri_bits = li_task.tri_bits;
- for (rec = 0; rec < nrec; rec++)
+ for (int rec = 0; rec < nrec; rec++)
{
- int tb;
-
- for (tb = 0; tb < li_task->ntriangle; tb++)
+ for (int tb = 0; tb < li_task.ntriangle; tb++)
{
int b, bits, nr0, nr1, n;
real mvb;
sol[b] = sol[b] + mvb;
}
- real *swap;
-
- swap = rhs1;
- rhs1 = rhs2;
- rhs2 = swap;
+ std::swap(rhs1, rhs2);
} /* nrec*(ntriangle + ncc_triangle*2) flops */
- if (lincsd->bTaskDepTri)
+ if (lincsd.bTaskDepTri)
{
/* The constraints triangles are decoupled from each other,
* but constraints in one triangle cross thread task borders.
}
//! Update atomic coordinates when an index is not required.
-static void lincs_update_atoms_noind(int ncons, const int *bla,
- real prefac,
- const real *fac, rvec *r,
- const real *invmass,
- rvec *x)
+static void
+lincs_update_atoms_noind(int ncons,
+ gmx::ArrayRef<const AtomPair> atoms,
+ real preFactor,
+ gmx::ArrayRef<const real> fac,
+ gmx::ArrayRef<const gmx::RVec> r,
+ const real *invmass,
+ rvec *x)
{
- int b, i, j;
- real mvb, im1, im2, tmp0, tmp1, tmp2;
-
if (invmass != nullptr)
{
- for (b = 0; b < ncons; b++)
- {
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = prefac*fac[b];
- im1 = invmass[i];
- im2 = invmass[j];
- tmp0 = r[b][0]*mvb;
- tmp1 = r[b][1]*mvb;
- tmp2 = r[b][2]*mvb;
- x[i][0] -= tmp0*im1;
- x[i][1] -= tmp1*im1;
- x[i][2] -= tmp2*im1;
- x[j][0] += tmp0*im2;
- x[j][1] += tmp1*im2;
- x[j][2] += tmp2*im2;
+ for (int b = 0; b < ncons; b++)
+ {
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real mvb = preFactor*fac[b];
+ real im1 = invmass[i];
+ real im2 = invmass[j];
+ real tmp0 = r[b][0]*mvb;
+ real tmp1 = r[b][1]*mvb;
+ real tmp2 = r[b][2]*mvb;
+ x[i][0] -= tmp0*im1;
+ x[i][1] -= tmp1*im1;
+ x[i][2] -= tmp2*im1;
+ x[j][0] += tmp0*im2;
+ x[j][1] += tmp1*im2;
+ x[j][2] += tmp2*im2;
} /* 16 ncons flops */
}
else
{
- for (b = 0; b < ncons; b++)
+ for (int b = 0; b < ncons; b++)
{
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = prefac*fac[b];
- tmp0 = r[b][0]*mvb;
- tmp1 = r[b][1]*mvb;
- tmp2 = r[b][2]*mvb;
- x[i][0] -= tmp0;
- x[i][1] -= tmp1;
- x[i][2] -= tmp2;
- x[j][0] += tmp0;
- x[j][1] += tmp1;
- x[j][2] += tmp2;
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real mvb = preFactor*fac[b];
+ real tmp0 = r[b][0]*mvb;
+ real tmp1 = r[b][1]*mvb;
+ real tmp2 = r[b][2]*mvb;
+ x[i][0] -= tmp0;
+ x[i][1] -= tmp1;
+ x[i][2] -= tmp2;
+ x[j][0] += tmp0;
+ x[j][1] += tmp1;
+ x[j][2] += tmp2;
}
}
}
//! Update atomic coordinates when an index is required.
-static void lincs_update_atoms_ind(int ncons, const int *ind, const int *bla,
- real prefac,
- const real *fac, rvec *r,
- const real *invmass,
- rvec *x)
+static void
+lincs_update_atoms_ind(gmx::ArrayRef<const int> ind,
+ gmx::ArrayRef<const AtomPair> atoms,
+ real preFactor,
+ gmx::ArrayRef<const real> fac,
+ gmx::ArrayRef<const gmx::RVec> r,
+ const real *invmass,
+ rvec *x)
{
- int bi, b, i, j;
- real mvb, im1, im2, tmp0, tmp1, tmp2;
-
if (invmass != nullptr)
{
- for (bi = 0; bi < ncons; bi++)
- {
- b = ind[bi];
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = prefac*fac[b];
- im1 = invmass[i];
- im2 = invmass[j];
- tmp0 = r[b][0]*mvb;
- tmp1 = r[b][1]*mvb;
- tmp2 = r[b][2]*mvb;
- x[i][0] -= tmp0*im1;
- x[i][1] -= tmp1*im1;
- x[i][2] -= tmp2*im1;
- x[j][0] += tmp0*im2;
- x[j][1] += tmp1*im2;
- x[j][2] += tmp2*im2;
+ for (int b : ind)
+ {
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real mvb = preFactor*fac[b];
+ real im1 = invmass[i];
+ real im2 = invmass[j];
+ real tmp0 = r[b][0]*mvb;
+ real tmp1 = r[b][1]*mvb;
+ real tmp2 = r[b][2]*mvb;
+ x[i][0] -= tmp0*im1;
+ x[i][1] -= tmp1*im1;
+ x[i][2] -= tmp2*im1;
+ x[j][0] += tmp0*im2;
+ x[j][1] += tmp1*im2;
+ x[j][2] += tmp2*im2;
} /* 16 ncons flops */
}
else
{
- for (bi = 0; bi < ncons; bi++)
- {
- b = ind[bi];
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = prefac*fac[b];
- tmp0 = r[b][0]*mvb;
- tmp1 = r[b][1]*mvb;
- tmp2 = r[b][2]*mvb;
- x[i][0] -= tmp0;
- x[i][1] -= tmp1;
- x[i][2] -= tmp2;
- x[j][0] += tmp0;
- x[j][1] += tmp1;
- x[j][2] += tmp2;
+ for (int b : ind)
+ {
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real mvb = preFactor*fac[b];
+ real tmp0 = r[b][0]*mvb;
+ real tmp1 = r[b][1]*mvb;
+ real tmp2 = r[b][2]*mvb;
+ x[i][0] -= tmp0;
+ x[i][1] -= tmp1;
+ x[i][2] -= tmp2;
+ x[j][0] += tmp0;
+ x[j][1] += tmp1;
+ x[j][2] += tmp2;
} /* 16 ncons flops */
}
}
//! Update coordinates for atoms.
-static void lincs_update_atoms(Lincs *li, int th,
- real prefac,
- const real *fac, rvec *r,
- const real *invmass,
- rvec *x)
+static void
+lincs_update_atoms(Lincs *li,
+ int th,
+ real preFactor,
+ gmx::ArrayRef<const real> fac,
+ gmx::ArrayRef<const gmx::RVec> r,
+ const real *invmass,
+ rvec *x)
{
if (li->ntask == 1)
{
/* Single thread, we simply update for all constraints */
lincs_update_atoms_noind(li->nc_real,
- li->bla, prefac, fac, r, invmass, x);
+ li->atoms, preFactor, fac, r, invmass, x);
}
else
{
* constraints that only access our local atom range.
* This can be done without a barrier.
*/
- lincs_update_atoms_ind(li->task[th].nind, li->task[th].ind,
- li->bla, prefac, fac, r, invmass, x);
+ lincs_update_atoms_ind(li->task[th].ind,
+ li->atoms, preFactor, fac, r, invmass, x);
- if (li->task[li->ntask].nind > 0)
+ if (!li->task[li->ntask].ind.empty())
{
/* Update the constraints that operate on atoms
* in multiple thread atom blocks on the master thread.
#pragma omp barrier
#pragma omp master
{
- lincs_update_atoms_ind(li->task[li->ntask].nind,
- li->task[li->ntask].ind,
- li->bla, prefac, fac, r, invmass, x);
+ lincs_update_atoms_ind(li->task[li->ntask].ind,
+ li->atoms, preFactor, fac, r, invmass, x);
}
}
}
* This function only differs from calc_dr_x_xp_simd below in that
* no constraint length is subtracted and no PBC is used for f. */
static void gmx_simdcall
-calc_dr_x_f_simd(int b0,
- int b1,
- const int * bla,
- const rvec * gmx_restrict x,
- const rvec * gmx_restrict f,
- const real * gmx_restrict blc,
- const real * pbc_simd,
- rvec * gmx_restrict r,
- real * gmx_restrict rhs,
- real * gmx_restrict sol)
+calc_dr_x_f_simd(int b0,
+ int b1,
+ gmx::ArrayRef<const AtomPair> atoms,
+ const rvec * gmx_restrict x,
+ const rvec * gmx_restrict f,
+ const real * gmx_restrict blc,
+ const real * pbc_simd,
+ rvec * gmx_restrict r,
+ real * gmx_restrict rhs,
+ real * gmx_restrict sol)
{
assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
{
- offset0[i] = bla[bs*2 + i*2];
- offset1[i] = bla[bs*2 + i*2 + 1];
+ offset0[i] = atoms[bs + i].index1;
+ offset1[i] = atoms[bs + i].index2;
}
gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
ConstraintVariable econq, bool bCalcDHDL,
bool bCalcVir, tensor rmdf)
{
- int b0, b1, b;
- int *bla, *blnr, *blbnb;
- rvec *r;
- real *blc, *blmf, *blcc, *rhs1, *rhs2, *sol;
-
- b0 = lincsd->task[th].b0;
- b1 = lincsd->task[th].b1;
-
- bla = lincsd->bla;
- r = lincsd->tmpv;
- blnr = lincsd->blnr;
- blbnb = lincsd->blbnb;
+ const int b0 = lincsd->task[th].b0;
+ const int b1 = lincsd->task[th].b1;
+
+ gmx::ArrayRef<const AtomPair> atoms = lincsd->atoms;
+ gmx::ArrayRef<gmx::RVec> r = lincsd->tmpv;
+ gmx::ArrayRef<const int> blnr = lincsd->blnr;
+ gmx::ArrayRef<const int> blbnb = lincsd->blbnb;
+
+ gmx::ArrayRef<const real> blc;
+ gmx::ArrayRef<const real> blmf;
if (econq != ConstraintVariable::Force)
{
/* Use mass-weighted parameters */
blc = lincsd->blc1;
blmf = lincsd->blmf1;
}
- blcc = lincsd->tmpncc;
- rhs1 = lincsd->tmp1;
- rhs2 = lincsd->tmp2;
- sol = lincsd->tmp3;
+ gmx::ArrayRef<real> blcc = lincsd->tmpncc;
+ gmx::ArrayRef<real> rhs1 = lincsd->tmp1;
+ gmx::ArrayRef<real> rhs2 = lincsd->tmp2;
+ gmx::ArrayRef<real> sol = lincsd->tmp3;
#if GMX_SIMD_HAVE_REAL
/* This SIMD code does the same as the plain-C code after the #else.
/* Compute normalized x i-j vectors, store in r.
* Compute the inner product of r and xp i-j and store in rhs1.
*/
- calc_dr_x_f_simd(b0, b1, bla, x, f, blc,
+ calc_dr_x_f_simd(b0, b1, atoms, x, f, blc.data(),
pbc_simd,
- r, rhs1, sol);
+ as_rvec_array(r.data()), rhs1.data(), sol.data());
#else // GMX_SIMD_HAVE_REAL
/* Compute normalized i-j vectors */
if (pbc)
{
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
rvec dx;
- pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+ pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
unitv(dx, r[b]);
}
}
else
{
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
rvec dx;
- rvec_sub(x[bla[2*b]], x[bla[2*b+1]], dx);
+ rvec_sub(x[atoms[b].index1], x[atoms[b].index2], dx);
unitv(dx, r[b]);
} /* 16 ncons flops */
}
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- int i, j;
- real mvb;
-
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = blc[b]*(r[b][0]*(f[i][0] - f[j][0]) +
- r[b][1]*(f[i][1] - f[j][1]) +
- r[b][2]*(f[i][2] - f[j][2]));
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real mvb = blc[b]*(r[b][0]*(f[i][0] - f[j][0]) +
+ r[b][1]*(f[i][1] - f[j][1]) +
+ r[b][2]*(f[i][2] - f[j][2]));
rhs1[b] = mvb;
sol[b] = mvb;
/* 7 flops */
}
/* Construct the (sparse) LINCS matrix */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- int n;
-
- for (n = blnr[b]; n < blnr[b+1]; n++)
+ for (int n = blnr[b]; n < blnr[b+1]; n++)
{
blcc[n] = blmf[n]*::iprod(r[b], r[blbnb[n]]);
} /* 6 nr flops */
}
/* Together: 23*ncons + 6*nrtot flops */
- lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+ lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
/* nrec*(ncons+2*nrtot) flops */
if (econq == ConstraintVariable::Deriv_FlexCon)
/* We only want to constraint the flexible constraints,
* so we mask out the normal ones by setting sol to 0.
*/
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
if (!(lincsd->bllen0[b] == 0 && lincsd->ddist[b] == 0))
{
}
/* We multiply sol by blc, so we can use lincs_update_atoms for OpenMP */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
sol[b] *= blc[b];
}
if (bCalcDHDL)
{
- real dhdlambda;
-
- dhdlambda = 0;
- for (b = b0; b < b1; b++)
+ real dhdlambda = 0;
+ for (int b = b0; b < b1; b++)
{
dhdlambda -= sol[b]*lincsd->ddist[b];
}
* where delta f is the constraint correction
* of the quantity that is being constrained.
*/
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- real mvb, tmp1;
- int i, j;
-
- mvb = lincsd->bllen[b]*sol[b];
- for (i = 0; i < DIM; i++)
+ const real mvb = lincsd->bllen[b]*sol[b];
+ for (int i = 0; i < DIM; i++)
{
- tmp1 = mvb*r[b][i];
- for (j = 0; j < DIM; j++)
+ const real tmp1 = mvb*r[b][i];
+ for (int j = 0; j < DIM; j++)
{
rmdf[i][j] += tmp1*r[b][j];
}
*
* Determine the right-hand side of the matrix equation using coordinates xp. */
static void gmx_simdcall
-calc_dr_x_xp_simd(int b0,
- int b1,
- const int * bla,
- const rvec * gmx_restrict x,
- const rvec * gmx_restrict xp,
- const real * gmx_restrict bllen,
- const real * gmx_restrict blc,
- const real * pbc_simd,
- rvec * gmx_restrict r,
- real * gmx_restrict rhs,
- real * gmx_restrict sol)
+calc_dr_x_xp_simd(int b0,
+ int b1,
+ gmx::ArrayRef<const AtomPair> atoms,
+ const rvec * gmx_restrict x,
+ const rvec * gmx_restrict xp,
+ const real * gmx_restrict bllen,
+ const real * gmx_restrict blc,
+ const real * pbc_simd,
+ rvec * gmx_restrict r,
+ real * gmx_restrict rhs,
+ real * gmx_restrict sol)
{
assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
alignas(GMX_SIMD_ALIGNMENT) std::int32_t offset2[GMX_SIMD_REAL_WIDTH];
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
{
- offset0[i] = bla[bs*2 + i*2];
- offset1[i] = bla[bs*2 + i*2 + 1];
+ offset0[i] = atoms[bs + i].index1;
+ offset1[i] = atoms[bs + i].index2;
}
gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
/*! \brief Determine the distances and right-hand side for the next iteration. */
gmx_unused static void calc_dist_iter(
- int b0,
- int b1,
- const int * bla,
- const rvec * gmx_restrict xp,
- const real * gmx_restrict bllen,
- const real * gmx_restrict blc,
- const t_pbc * pbc,
- real wfac,
- real * gmx_restrict rhs,
- real * gmx_restrict sol,
- bool * bWarn)
+ int b0,
+ int b1,
+ gmx::ArrayRef<const AtomPair> atoms,
+ const rvec * gmx_restrict xp,
+ const real * gmx_restrict bllen,
+ const real * gmx_restrict blc,
+ const t_pbc * pbc,
+ real wfac,
+ real * gmx_restrict rhs,
+ real * gmx_restrict sol,
+ bool * bWarn)
{
- int b;
-
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- real len, len2, dlen2, mvb;
+ real len = bllen[b];
rvec dx;
-
- len = bllen[b];
if (pbc)
{
- pbc_dx_aiuc(pbc, xp[bla[2*b]], xp[bla[2*b+1]], dx);
+ pbc_dx_aiuc(pbc, xp[atoms[b].index1], xp[atoms[b].index2], dx);
}
else
{
- rvec_sub(xp[bla[2*b]], xp[bla[2*b+1]], dx);
+ rvec_sub(xp[atoms[b].index1], xp[atoms[b].index2], dx);
}
- len2 = len*len;
- dlen2 = 2*len2 - ::norm2(dx);
+ real len2 = len*len;
+ real dlen2 = 2*len2 - ::norm2(dx);
if (dlen2 < wfac*len2)
{
/* not race free - see detailed comment in caller */
*bWarn = TRUE;
}
+ real mvb;
if (dlen2 > 0)
{
mvb = blc[b]*(len - dlen2*gmx::invsqrt(dlen2));
#if GMX_SIMD_HAVE_REAL
/*! \brief As calc_dist_iter(), but using SIMD intrinsics. */
static void gmx_simdcall
-calc_dist_iter_simd(int b0,
- int b1,
- const int * bla,
- const rvec * gmx_restrict x,
- const real * gmx_restrict bllen,
- const real * gmx_restrict blc,
- const real * pbc_simd,
- real wfac,
- real * gmx_restrict rhs,
- real * gmx_restrict sol,
- bool * bWarn)
+calc_dist_iter_simd(int b0,
+ int b1,
+ gmx::ArrayRef<const AtomPair> atoms,
+ const rvec * gmx_restrict x,
+ const real * gmx_restrict bllen,
+ const real * gmx_restrict blc,
+ const real * pbc_simd,
+ real wfac,
+ real * gmx_restrict rhs,
+ real * gmx_restrict sol,
+ bool * bWarn)
{
SimdReal min_S(GMX_REAL_MIN);
SimdReal two_S(2.0);
SimdReal wfac_S(wfac);
SimdBool warn_S;
- int bs;
-
assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
/* Initialize all to FALSE */
warn_S = (two_S < setZero());
- for (bs = b0; bs < b1; bs += GMX_SIMD_REAL_WIDTH)
+ for (int bs = b0; bs < b1; bs += GMX_SIMD_REAL_WIDTH)
{
SimdReal x0_S, y0_S, z0_S;
SimdReal x1_S, y1_S, z1_S;
for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
{
- offset0[i] = bla[bs*2 + i*2];
- offset1[i] = bla[bs*2 + i*2 + 1];
+ offset0[i] = atoms[bs + i].index1;
+ offset1[i] = atoms[bs + i].index2;
}
gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
real invdt, rvec * gmx_restrict v,
bool bCalcVir, tensor vir_r_m_dr)
{
- int b0, b1, b, i, j, n, iter;
- int *bla, *blnr, *blbnb;
- rvec *r;
- real *blc, *blmf, *bllen, *blcc, *rhs1, *rhs2, *sol, *blc_sol, *mlambda;
- int *nlocat;
-
- b0 = lincsd->task[th].b0;
- b1 = lincsd->task[th].b1;
-
- bla = lincsd->bla;
- r = lincsd->tmpv;
- blnr = lincsd->blnr;
- blbnb = lincsd->blbnb;
- blc = lincsd->blc;
- blmf = lincsd->blmf;
- bllen = lincsd->bllen;
- blcc = lincsd->tmpncc;
- rhs1 = lincsd->tmp1;
- rhs2 = lincsd->tmp2;
- sol = lincsd->tmp3;
- blc_sol = lincsd->tmp4;
- mlambda = lincsd->mlambda;
- nlocat = lincsd->nlocat;
+ const int b0 = lincsd->task[th].b0;
+ const int b1 = lincsd->task[th].b1;
+
+ gmx::ArrayRef<const AtomPair> atoms = lincsd->atoms;
+ gmx::ArrayRef<gmx::RVec> r = lincsd->tmpv;
+ gmx::ArrayRef<const int> blnr = lincsd->blnr;
+ gmx::ArrayRef<const int> blbnb = lincsd->blbnb;
+ gmx::ArrayRef<const real> blc = lincsd->blc;
+ gmx::ArrayRef<const real> blmf = lincsd->blmf;
+ gmx::ArrayRef<const real> bllen = lincsd->bllen;
+ gmx::ArrayRef<real> blcc = lincsd->tmpncc;
+ gmx::ArrayRef<real> rhs1 = lincsd->tmp1;
+ gmx::ArrayRef<real> rhs2 = lincsd->tmp2;
+ gmx::ArrayRef<real> sol = lincsd->tmp3;
+ gmx::ArrayRef<real> blc_sol = lincsd->tmp4;
+ gmx::ArrayRef<real> mlambda = lincsd->mlambda;
+ gmx::ArrayRef<const int> nlocat = lincsd->nlocat;
#if GMX_SIMD_HAVE_REAL
/* Compute normalized x i-j vectors, store in r.
* Compute the inner product of r and xp i-j and store in rhs1.
*/
- calc_dr_x_xp_simd(b0, b1, bla, x, xp, bllen, blc,
+ calc_dr_x_xp_simd(b0, b1, atoms, x, xp, bllen.data(), blc.data(),
pbc_simd,
- r, rhs1, sol);
+ as_rvec_array(r.data()), rhs1.data(), sol.data());
#else // GMX_SIMD_HAVE_REAL
if (pbc)
{
/* Compute normalized i-j vectors */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
rvec dx;
- real mvb;
-
- pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+ pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
unitv(dx, r[b]);
- pbc_dx_aiuc(pbc, xp[bla[2*b]], xp[bla[2*b+1]], dx);
- mvb = blc[b]*(::iprod(r[b], dx) - bllen[b]);
- rhs1[b] = mvb;
- sol[b] = mvb;
+ pbc_dx_aiuc(pbc, xp[atoms[b].index1], xp[atoms[b].index2], dx);
+ real mvb = blc[b]*(::iprod(r[b], dx) - bllen[b]);
+ rhs1[b] = mvb;
+ sol[b] = mvb;
}
}
else
{
/* Compute normalized i-j vectors */
- for (b = b0; b < b1; b++)
- {
- real tmp0, tmp1, tmp2, rlen, mvb;
-
- i = bla[2*b];
- j = bla[2*b+1];
- tmp0 = x[i][0] - x[j][0];
- tmp1 = x[i][1] - x[j][1];
- tmp2 = x[i][2] - x[j][2];
- rlen = gmx::invsqrt(tmp0*tmp0 + tmp1*tmp1 + tmp2*tmp2);
- r[b][0] = rlen*tmp0;
- r[b][1] = rlen*tmp1;
- r[b][2] = rlen*tmp2;
+ for (int b = b0; b < b1; b++)
+ {
+ int i = atoms[b].index1;
+ int j = atoms[b].index2;
+ real tmp0 = x[i][0] - x[j][0];
+ real tmp1 = x[i][1] - x[j][1];
+ real tmp2 = x[i][2] - x[j][2];
+ real rlen = gmx::invsqrt(tmp0*tmp0 + tmp1*tmp1 + tmp2*tmp2);
+ r[b][0] = rlen*tmp0;
+ r[b][1] = rlen*tmp1;
+ r[b][2] = rlen*tmp2;
/* 16 ncons flops */
- i = bla[2*b];
- j = bla[2*b+1];
- mvb = blc[b]*(r[b][0]*(xp[i][0] - xp[j][0]) +
- r[b][1]*(xp[i][1] - xp[j][1]) +
- r[b][2]*(xp[i][2] - xp[j][2]) - bllen[b]);
- rhs1[b] = mvb;
- sol[b] = mvb;
+ real mvb = blc[b]*(r[b][0]*(xp[i][0] - xp[j][0]) +
+ r[b][1]*(xp[i][1] - xp[j][1]) +
+ r[b][2]*(xp[i][2] - xp[j][2]) - bllen[b]);
+ rhs1[b] = mvb;
+ sol[b] = mvb;
/* 10 flops */
}
/* Together: 26*ncons + 6*nrtot flops */
}
/* Construct the (sparse) LINCS matrix */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- for (n = blnr[b]; n < blnr[b+1]; n++)
+ for (int n = blnr[b]; n < blnr[b+1]; n++)
{
- blcc[n] = blmf[n]*::iprod(r[b], r[blbnb[n]]);
+ blcc[n] = blmf[n]*gmx::dot(r[b], r[blbnb[n]]);
}
}
/* Together: 26*ncons + 6*nrtot flops */
- lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+ lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
/* nrec*(ncons+2*nrtot) flops */
#if GMX_SIMD_HAVE_REAL
- for (b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
+ for (int b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
{
- SimdReal t1 = load<SimdReal>(blc + b);
- SimdReal t2 = load<SimdReal>(sol + b);
- store(mlambda + b, t1 * t2);
+ SimdReal t1 = load<SimdReal>(blc.data() + b);
+ SimdReal t2 = load<SimdReal>(sol.data() + b);
+ store(mlambda.data() + b, t1 * t2);
}
#else
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
mlambda[b] = blc[b]*sol[b];
}
wfac = std::cos(DEG2RAD*wangle);
wfac = wfac*wfac;
- for (iter = 0; iter < lincsd->nIter; iter++)
+ for (int iter = 0; iter < lincsd->nIter; iter++)
{
if ((lincsd->bCommIter && DOMAINDECOMP(cr) && cr->dd->constraints))
{
}
#if GMX_SIMD_HAVE_REAL
- calc_dist_iter_simd(b0, b1, bla, xp, bllen, blc, pbc_simd, wfac,
- rhs1, sol, bWarn);
+ calc_dist_iter_simd(b0, b1, atoms,
+ xp, bllen.data(), blc.data(), pbc_simd, wfac,
+ rhs1.data(), sol.data(), bWarn);
#else
- calc_dist_iter(b0, b1, bla, xp, bllen, blc, pbc, wfac,
- rhs1, sol, bWarn);
+ calc_dist_iter(b0, b1, atoms, xp,
+ bllen.data(), blc.data(), pbc, wfac,
+ rhs1.data(), sol.data(), bWarn);
/* 20*ncons flops */
#endif // GMX_SIMD_HAVE_REAL
- lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+ lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
/* nrec*(ncons+2*nrtot) flops */
#if GMX_SIMD_HAVE_REAL
- for (b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
+ for (int b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
{
- SimdReal t1 = load<SimdReal>(blc + b);
- SimdReal t2 = load<SimdReal>(sol + b);
+ SimdReal t1 = load<SimdReal>(blc.data() + b);
+ SimdReal t2 = load<SimdReal>(sol.data() + b);
SimdReal mvb = t1 * t2;
- store(blc_sol + b, mvb);
- store(mlambda + b, load<SimdReal>(mlambda + b) + mvb);
+ store(blc_sol.data() + b, mvb);
+ store(mlambda.data() + b, load<SimdReal>(mlambda.data() + b) + mvb);
}
#else
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- real mvb;
-
- mvb = blc[b]*sol[b];
+ real mvb = blc[b]*sol[b];
blc_sol[b] = mvb;
mlambda[b] += mvb;
}
/* 16 ncons flops */
}
- if (nlocat != nullptr && (bCalcDHDL || bCalcVir))
+ if (!nlocat.empty() && (bCalcDHDL || bCalcVir))
{
if (lincsd->bTaskDep)
{
}
/* Only account for local atoms */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
mlambda[b] *= 0.5*nlocat[b];
}
if (bCalcDHDL)
{
- real dhdl;
-
- dhdl = 0;
- for (b = b0; b < b1; b++)
+ real dhdl = 0;
+ for (int b = b0; b < b1; b++)
{
/* Note that this this is dhdl*dt^2, the dt^2 factor is corrected
* later after the contributions are reduced over the threads.
if (bCalcVir)
{
/* Constraint virial */
- for (b = b0; b < b1; b++)
+ for (int b = b0; b < b1; b++)
{
- real tmp0, tmp1;
-
- tmp0 = -bllen[b]*mlambda[b];
- for (i = 0; i < DIM; i++)
+ real tmp0 = -bllen[b]*mlambda[b];
+ for (int i = 0; i < DIM; i++)
{
- tmp1 = tmp0*r[b][i];
- for (j = 0; j < DIM; j++)
+ real tmp1 = tmp0*r[b][i];
+ for (int j = 0; j < DIM; j++)
{
vir_r_m_dr[i][j] -= tmp1*r[b][j];
}
int *ncc_triangle,
int *nCrossTaskTriangles)
{
- int i;
-
/* Construct the coupling coefficient matrix blmf */
li_task->ntriangle = 0;
*ncc_triangle = 0;
*nCrossTaskTriangles = 0;
- for (i = li_task->b0; i < li_task->b1; i++)
+ for (int i = li_task->b0; i < li_task->b1; i++)
{
- int a1, a2, n;
-
- a1 = li->bla[2*i];
- a2 = li->bla[2*i+1];
- for (n = li->blnr[i]; (n < li->blnr[i+1]); n++)
+ const int a1 = li->atoms[i].index1;
+ const int a2 = li->atoms[i].index2;
+ for (int n = li->blnr[i]; n < li->blnr[i + 1]; n++)
{
- int k, sign, center, end;
-
- k = li->blbnb[n];
+ const int k = li->blbnb[n];
/* If we are using multiple, independent tasks for LINCS,
* the calls to check_assign_connected should have
*/
assert(li->bTaskDep || (k >= li_task->b0 && k < li_task->b1));
- if (a1 == li->bla[2*k] || a2 == li->bla[2*k+1])
+ int sign;
+ if (a1 == li->atoms[k].index1 || a2 == li->atoms[k].index2)
{
sign = -1;
}
{
sign = 1;
}
- if (a1 == li->bla[2*k] || a1 == li->bla[2*k+1])
+ int center;
+ int end;
+ if (a1 == li->atoms[k].index1 || a1 == li->atoms[k].index2)
{
center = a1;
end = a2;
li->blmf1[n] = sign*0.5;
if (li->ncg_triangle > 0)
{
- int nk, kk;
-
/* Look for constraint triangles */
- for (nk = li->blnr[k]; (nk < li->blnr[k+1]); nk++)
+ for (int nk = li->blnr[k]; nk < li->blnr[k + 1]; nk++)
{
- kk = li->blbnb[nk];
+ const int kk = li->blbnb[nk];
if (kk != i && kk != k &&
- (li->bla[2*kk] == end || li->bla[2*kk+1] == end))
+ (li->atoms[kk].index1 == end ||
+ li->atoms[kk].index2 == end))
{
/* Check if the constraints in this triangle actually
* belong to a different task. We still assign them
/*! \brief Sets the elements in the LINCS matrix. */
static void set_lincs_matrix(Lincs *li, real *invmass, real lambda)
{
- int i;
const real invsqrt2 = 0.7071067811865475244;
- for (i = 0; (i < li->nc); i++)
+ for (int i = 0; (i < li->nc); i++)
{
- int a1, a2;
-
- a1 = li->bla[2*i];
- a2 = li->bla[2*i+1];
- li->blc[i] = gmx::invsqrt(invmass[a1] + invmass[a2]);
- li->blc1[i] = invsqrt2;
+ const int a1 = li->atoms[i].index1;
+ const int a2 = li->atoms[i].index2;
+ li->blc[i] = gmx::invsqrt(invmass[a1] + invmass[a2]);
+ li->blc1[i] = invsqrt2;
}
/* Construct the coupling coefficient matrix blmf */
- int th, ntriangle = 0, ncc_triangle = 0, nCrossTaskTriangles = 0;
+ int ntriangle = 0, ncc_triangle = 0, nCrossTaskTriangles = 0;
#pragma omp parallel for reduction(+: ntriangle, ncc_triangle, nCrossTaskTriangles) num_threads(li->ntask) schedule(static)
- for (th = 0; th < li->ntask; th++)
+ for (int th = 0; th < li->ntask; th++)
{
try
{
/*! \brief Sets up the work division over the threads. */
static void lincs_thread_setup(Lincs *li, int natoms)
{
- Task *li_m;
- int th;
- gmx_bitmask_t *atf;
- int a;
+ li->atf.resize(natoms);
- if (natoms > li->atf_nalloc)
- {
- li->atf_nalloc = over_alloc_large(natoms);
- srenew(li->atf, li->atf_nalloc);
- }
+ gmx::ArrayRef<gmx_bitmask_t> atf = li->atf;
- atf = li->atf;
/* Clear the atom flags */
- for (a = 0; a < natoms; a++)
+ for (gmx_bitmask_t &mask : atf)
{
- bitmask_clear(&atf[a]);
+ bitmask_clear(&mask);
}
if (li->ntask > BITMASK_SIZE)
gmx_fatal(FARGS, "More than %d threads is not supported for LINCS.", BITMASK_SIZE);
}
- for (th = 0; th < li->ntask; th++)
+ for (int th = 0; th < li->ntask; th++)
{
- Task *li_task;
- int b;
-
- li_task = &li->task[th];
+ const Task *li_task = &li->task[th];
/* For each atom set a flag for constraints from each */
- for (b = li_task->b0; b < li_task->b1; b++)
+ for (int b = li_task->b0; b < li_task->b1; b++)
{
- bitmask_set_bit(&atf[li->bla[b*2 ]], th);
- bitmask_set_bit(&atf[li->bla[b*2 + 1]], th);
+ bitmask_set_bit(&atf[li->atoms[b].index1], th);
+ bitmask_set_bit(&atf[li->atoms[b].index2], th);
}
}
#pragma omp parallel for num_threads(li->ntask) schedule(static)
- for (th = 0; th < li->ntask; th++)
+ for (int th = 0; th < li->ntask; th++)
{
try
{
li_task = &li->task[th];
- if (li_task->b1 - li_task->b0 > li_task->ind_nalloc)
- {
- li_task->ind_nalloc = over_alloc_large(li_task->b1-li_task->b0);
- srenew(li_task->ind, li_task->ind_nalloc);
- srenew(li_task->ind_r, li_task->ind_nalloc);
- }
-
bitmask_init_low_bits(&mask, th);
- li_task->nind = 0;
- li_task->nind_r = 0;
+ li_task->ind.clear();
+ li_task->ind_r.clear();
for (b = li_task->b0; b < li_task->b1; b++)
{
/* We let the constraint with the lowest thread index
* operate on atoms with constraints from multiple threads.
*/
- if (bitmask_is_disjoint(atf[li->bla[b*2]], mask) &&
- bitmask_is_disjoint(atf[li->bla[b*2+1]], mask))
+ if (bitmask_is_disjoint(atf[li->atoms[b].index1], mask) &&
+ bitmask_is_disjoint(atf[li->atoms[b].index2], mask))
{
/* Add the constraint to the local atom update index */
- li_task->ind[li_task->nind++] = b;
+ li_task->ind.push_back(b);
}
else
{
/* Add the constraint to the rest block */
- li_task->ind_r[li_task->nind_r++] = b;
+ li_task->ind_r.push_back(b);
}
}
}
/* We need to copy all constraints which have not be assigned
* to a thread to a separate list which will be handled by one thread.
*/
- li_m = &li->task[li->ntask];
+ Task *li_m = &li->task[li->ntask];
- li_m->nind = 0;
- for (th = 0; th < li->ntask; th++)
+ li_m->ind.clear();
+ for (int th = 0; th < li->ntask; th++)
{
- Task *li_task;
- int b;
-
- li_task = &li->task[th];
+ const Task &li_task = li->task[th];
- if (li_m->nind + li_task->nind_r > li_m->ind_nalloc)
+ for (int ind_r : li_task.ind_r)
{
- li_m->ind_nalloc = over_alloc_large(li_m->nind+li_task->nind_r);
- srenew(li_m->ind, li_m->ind_nalloc);
- }
-
- for (b = 0; b < li_task->nind_r; b++)
- {
- li_m->ind[li_m->nind++] = li_task->ind_r[b];
+ li_m->ind.push_back(ind_r);
}
if (debug)
{
- fprintf(debug, "LINCS thread %d: %d constraints\n",
- th, li_task->nind);
+ fprintf(debug, "LINCS thread %d: %zu constraints\n",
+ th, li_task.ind.size());
}
}
if (debug)
{
- fprintf(debug, "LINCS thread r: %d constraints\n",
- li_m->nind);
+ fprintf(debug, "LINCS thread r: %zu constraints\n",
+ li_m->ind.size());
}
}
-/*! \brief There is no realloc with alignment, so here we make one for reals.
- * Note that this function does not preserve the contents of the memory.
- */
-static void resize_real_aligned(real **ptr, int nelem)
-{
- sfree_aligned(*ptr);
- snew_aligned(*ptr, nelem, align_bytes);
-}
-
//! Assign a constraint.
static void assign_constraint(Lincs *li,
int constraint_index,
/* Make an mapping of local topology constraint index to LINCS index */
li->con_index[constraint_index] = con;
- li->bllen0[con] = lenA;
- li->ddist[con] = lenB - lenA;
+ li->bllen0[con] = lenA;
+ li->ddist[con] = lenB - lenA;
/* Set the length to the topology A length */
- li->bllen[con] = lenA;
- li->bla[2*con] = a1;
- li->bla[2*con+1] = a2;
+ li->bllen[con] = lenA;
+ li->atoms[con].index1 = a1;
+ li->atoms[con].index2 = a2;
/* Make space in the constraint connection matrix for constraints
* connected to both end of the current constraint.
//! Sets matrix indices.
static void set_matrix_indices(Lincs *li,
- const Task *li_task,
+ const Task &li_task,
const t_blocka *at2con,
bool bSortMatrix)
{
- int b;
-
- for (b = li_task->b0; b < li_task->b1; b++)
+ for (int b = li_task.b0; b < li_task.b1; b++)
{
- int a1, a2, i, k;
-
- a1 = li->bla[b*2];
- a2 = li->bla[b*2 + 1];
+ const int a1 = li->atoms[b].index1;
+ const int a2 = li->atoms[b].index2;
- i = li->blnr[b];
- for (k = at2con->index[a1]; k < at2con->index[a1 + 1]; k++)
+ int i = li->blnr[b];
+ for (int k = at2con->index[a1]; k < at2con->index[a1 + 1]; k++)
{
- int concon;
-
- concon = li->con_index[at2con->a[k]];
+ int concon = li->con_index[at2con->a[k]];
if (concon != b)
{
li->blbnb[i++] = concon;
}
}
- for (k = at2con->index[a2]; k < at2con->index[a2 + 1]; k++)
+ for (int k = at2con->index[a2]; k < at2con->index[a2 + 1]; k++)
{
- int concon;
-
- concon = li->con_index[at2con->a[k]];
+ int concon = li->con_index[at2con->a[k]];
if (concon != b)
{
li->blbnb[i++] = concon;
int natoms;
t_blocka at2con;
t_iatom *iatom;
- int i, ncc_alloc_old, ncon_tot;
li->nc_real = 0;
li->nc = 0;
/* Zero the thread index ranges.
* Otherwise without local constraints we could return with old ranges.
*/
- for (i = 0; i < li->ntask; i++)
+ for (int i = 0; i < li->ntask; i++)
{
li->task[i].b0 = 0;
li->task[i].b1 = 0;
- li->task[i].nind = 0;
+ li->task[i].ind.clear();
}
if (li->ntask > 1)
{
- li->task[li->ntask].nind = 0;
+ li->task[li->ntask].ind.clear();
}
/* This is the local topology, so there are only F_CONSTR constraints */
at2con = make_at2con(natoms, idef.il, idef.iparams,
flexibleConstraintTreatment(bDynamics));
- ncon_tot = idef.il[F_CONSTR].nr/3;
+ const int ncon_tot = idef.il[F_CONSTR].nr/3;
/* Ensure we have enough padding for aligned loads for each thread */
- if (ncon_tot + li->ntask*simd_width > li->nc_alloc || li->nc_alloc == 0)
+ const int numEntries = ncon_tot + li->ntask*simd_width;
+ li->con_index.resize(numEntries);
+ li->bllen0.resize(numEntries);
+ li->ddist.resize(numEntries);
+ li->atoms.resize(numEntries);
+ li->blc.resize(numEntries);
+ li->blc1.resize(numEntries);
+ li->blnr.resize(numEntries);
+ li->bllen.resize(numEntries);
+ li->tmpv.resizeWithPadding(numEntries);
+ if (DOMAINDECOMP(cr))
{
- int old_alloc = li->nc_alloc;
- li->nc_alloc = over_alloc_dd(ncon_tot + li->ntask*simd_width);
- srenew(li->con_index, li->nc_alloc);
- resize_real_aligned(&li->bllen0, li->nc_alloc);
- resize_real_aligned(&li->ddist, li->nc_alloc);
- srenew(li->bla, 2*li->nc_alloc);
- resize_real_aligned(&li->blc, li->nc_alloc);
- resize_real_aligned(&li->blc1, li->nc_alloc);
- srenew(li->blnr, li->nc_alloc + 1);
- resize_real_aligned(&li->bllen, li->nc_alloc);
- srenew(li->tmpv, li->nc_alloc);
- /* Need to clear the SIMD padding */
- for (int i = old_alloc; i < li->nc_alloc; i++)
- {
- clear_rvec(li->tmpv[i]);
- }
- if (DOMAINDECOMP(cr))
- {
- srenew(li->nlocat, li->nc_alloc);
- }
- resize_real_aligned(&li->tmp1, li->nc_alloc);
- resize_real_aligned(&li->tmp2, li->nc_alloc);
- resize_real_aligned(&li->tmp3, li->nc_alloc);
- resize_real_aligned(&li->tmp4, li->nc_alloc);
- resize_real_aligned(&li->mlambda, li->nc_alloc);
+ li->nlocat.resize(numEntries);
}
+ li->tmp1.resize(numEntries);
+ li->tmp2.resize(numEntries);
+ li->tmp3.resize(numEntries);
+ li->tmp4.resize(numEntries);
+ li->mlambda.resize(numEntries);
iatom = idef.il[F_CONSTR].iatoms;
- ncc_alloc_old = li->ncc_alloc;
li->blnr[0] = li->ncc;
/* Assign the constraints for li->ntask LINCS tasks.
* (e.g. because we are doing EM) we get imbalance, but since that doesn't
* happen during normal MD, that's ok.
*/
- int ncon_assign, ncon_target, con, th;
/* Determine the number of constraints we need to assign here */
- ncon_assign = ncon_tot;
+ int ncon_assign = ncon_tot;
if (!bDynamics)
{
/* With energy minimization, flexible constraints are ignored
/* Set the target constraint count per task to exactly uniform,
* this might be overridden below.
*/
- ncon_target = (ncon_assign + li->ntask - 1)/li->ntask;
+ int ncon_target = (ncon_assign + li->ntask - 1)/li->ntask;
/* Mark all constraints as unassigned by setting their index to -1 */
- for (con = 0; con < ncon_tot; con++)
+ for (int con = 0; con < ncon_tot; con++)
{
li->con_index[con] = -1;
}
- con = 0;
- for (th = 0; th < li->ntask; th++)
+ int con = 0;
+ for (int th = 0; th < li->ntask; th++)
{
Task *li_task;
last = li_task->b1 - 1;
for (i = li_task->b1; i < li->nc; i++)
{
- li->bla[i*2 ] = li->bla[last*2 ];
- li->bla[i*2 + 1] = li->bla[last*2 + 1];
+ li->atoms[i] = li->atoms[last];
li->bllen0[i] = li->bllen0[last];
li->ddist[i] = li->ddist[last];
li->bllen[i] = li->bllen[last];
*/
bSortMatrix = !DOMAINDECOMP(cr);
- if (li->ncc > li->ncc_alloc)
- {
- li->ncc_alloc = over_alloc_small(li->ncc);
- srenew(li->blbnb, li->ncc_alloc);
- }
+ li->blbnb.resize(li->ncc);
#pragma omp parallel for num_threads(li->ntask) schedule(static)
- for (th = 0; th < li->ntask; th++)
+ for (int th = 0; th < li->ntask; th++)
{
try
{
- Task *li_task;
-
- li_task = &li->task[th];
+ Task &li_task = li->task[th];
- if (li->ncg_triangle > 0 &&
- li_task->b1 - li_task->b0 > li_task->tri_alloc)
+ if (li->ncg_triangle > 0)
{
/* This is allocating too much, but it is difficult to improve */
- li_task->tri_alloc = over_alloc_dd(li_task->b1 - li_task->b0);
- srenew(li_task->triangle, li_task->tri_alloc);
- srenew(li_task->tri_bits, li_task->tri_alloc);
+ li_task.triangle.resize(li_task.b1 - li_task.b0);
+ li_task.tri_bits.resize(li_task.b1 - li_task.b0);
}
set_matrix_indices(li, li_task, &at2con, bSortMatrix);
if (cr->dd == nullptr)
{
/* Since the matrix is static, we should free some memory */
- li->ncc_alloc = li->ncc;
- srenew(li->blbnb, li->ncc_alloc);
+ li->blbnb.resize(li->ncc);
}
- if (li->ncc_alloc > ncc_alloc_old)
- {
- srenew(li->blmf, li->ncc_alloc);
- srenew(li->blmf1, li->ncc_alloc);
- srenew(li->tmpncc, li->ncc_alloc);
- }
+ li->blmf.resize(li->ncc);
+ li->blmf1.resize(li->ncc);
+ li->tmpncc.resize(li->ncc);
gmx::ArrayRef<const int> nlocat_dd = dd_constraints_nlocalatoms(cr->dd);
if (!nlocat_dd.empty())
}
else
{
- li->nlocat = nullptr;
+ li->nlocat.clear();
}
if (debug)
//! Issues a warning when LINCS constraints cannot be satisfied.
static void lincs_warning(gmx_domdec_t *dd, const rvec *x, rvec *xprime, t_pbc *pbc,
- int ncons, const int *bla, real *bllen, real wangle,
+ int ncons, gmx::ArrayRef<const AtomPair> atoms,
+ gmx::ArrayRef<const real> bllen, real wangle,
int maxwarn, int *warncount)
{
- int b, i, j;
- rvec v0, v1;
- real wfac, d0, d1, cosine;
-
- wfac = std::cos(DEG2RAD*wangle);
+ real wfac = std::cos(DEG2RAD*wangle);
fprintf(stderr,
"bonds that rotated more than %g degrees:\n"
" atom 1 atom 2 angle previous, current, constraint length\n",
wangle);
- for (b = 0; b < ncons; b++)
+ for (int b = 0; b < ncons; b++)
{
- i = bla[2*b];
- j = bla[2*b+1];
+ const int i = atoms[b].index1;
+ const int j = atoms[b].index2;
+ rvec v0;
+ rvec v1;
if (pbc)
{
pbc_dx_aiuc(pbc, x[i], x[j], v0);
rvec_sub(x[i], x[j], v0);
rvec_sub(xprime[i], xprime[j], v1);
}
- d0 = norm(v0);
- d1 = norm(v1);
- cosine = ::iprod(v0, v1)/(d0*d1);
+ real d0 = norm(v0);
+ real d1 = norm(v1);
+ real cosine = ::iprod(v0, v1)/(d0*d1);
if (cosine < wfac)
{
fprintf(stderr,
}
//! Determine how well the constraints have been satisfied.
-static void cconerr(const Lincs *lincsd,
- rvec *x, t_pbc *pbc,
+static void cconerr(const Lincs &lincsd,
+ const rvec *x, const t_pbc *pbc,
real *ncons_loc, real *ssd, real *max, int *imax)
{
- const int *bla, *nlocat;
- const real *bllen;
- real ma, ssd2;
- int count, im, task;
+ gmx::ArrayRef<const AtomPair> atoms = lincsd.atoms;
+ gmx::ArrayRef<const real> bllen = lincsd.bllen;
+ gmx::ArrayRef<const int> nlocat = lincsd.nlocat;
- bla = lincsd->bla;
- bllen = lincsd->bllen;
- nlocat = lincsd->nlocat;
-
- ma = 0;
- ssd2 = 0;
- im = 0;
- count = 0;
- for (task = 0; task < lincsd->ntask; task++)
+ real ma = 0;
+ real ssd2 = 0;
+ int im = 0;
+ int count = 0;
+ for (int task = 0; task < lincsd.ntask; task++)
{
- int b;
-
- for (b = lincsd->task[task].b0; b < lincsd->task[task].b1; b++)
+ for (int b = lincsd.task[task].b0; b < lincsd.task[task].b1; b++)
{
- real len, d, r2;
rvec dx;
-
if (pbc)
{
- pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+ pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
}
else
{
- rvec_sub(x[bla[2*b]], x[bla[2*b+1]], dx);
+ rvec_sub(x[atoms[b].index1], x[atoms[b].index2], dx);
}
- r2 = ::norm2(dx);
- len = r2*gmx::invsqrt(r2);
- d = std::abs(len/bllen[b]-1);
- if (d > ma && (nlocat == nullptr || nlocat[b]))
+ real r2 = ::norm2(dx);
+ real len = r2*gmx::invsqrt(r2);
+ real d = std::abs(len/bllen[b]-1);
+ if (d > ma && (nlocat.empty() || nlocat[b]))
{
ma = d;
im = b;
}
- if (nlocat == nullptr)
+ if (nlocat.empty())
{
ssd2 += d*d;
count++;
}
}
- *ncons_loc = (nlocat ? 0.5 : 1)*count;
- *ssd = (nlocat ? 0.5 : 1)*ssd2;
+ *ncons_loc = (nlocat.empty() ? 1 : 0.5)*count;
+ *ssd = (nlocat.empty() ? 1 : 0.5)*ssd2;
*max = ma;
*imax = im;
}
t_nrnb *nrnb,
int maxwarn, int *warncount)
{
- gmx_bool bCalcDHDL;
- char buf2[22], buf3[STRLEN];
- int i, p_imax;
- real ncons_loc, p_ssd, p_max = 0;
- rvec dx;
- bool bOK, bWarn;
-
- bOK = TRUE;
+ bool bOK = TRUE;
/* This boolean should be set by a flag passed to this routine.
* We can also easily check if any constraint length is changed,
* if not dH/dlambda=0 and we can also set the boolean to FALSE.
*/
- bCalcDHDL = (ir.efep != efepNO && dvdlambda != nullptr);
+ bool bCalcDHDL = (ir.efep != efepNO && dvdlambda != nullptr);
if (lincsd->nc == 0 && cr->dd == nullptr)
{
set_lincs_matrix(lincsd, md.invmass, md.lambda);
}
- for (i = 0; i < lincsd->nc; i++)
+ for (int i = 0; i < lincsd->nc; i++)
{
lincsd->bllen[i] = lincsd->bllen0[i] + lambda*lincsd->ddist[i];
}
/* Set the flexible constraint lengths to the old lengths */
if (pbc != nullptr)
{
- for (i = 0; i < lincsd->nc; i++)
+ for (int i = 0; i < lincsd->nc; i++)
{
if (lincsd->bllen[i] == 0)
{
- pbc_dx_aiuc(pbc, x[lincsd->bla[2*i]], x[lincsd->bla[2*i+1]], dx);
+ rvec dx;
+ pbc_dx_aiuc(pbc, x[lincsd->atoms[i].index1], x[lincsd->atoms[i].index2], dx);
lincsd->bllen[i] = norm(dx);
}
}
}
else
{
- for (i = 0; i < lincsd->nc; i++)
+ for (int i = 0; i < lincsd->nc; i++)
{
if (lincsd->bllen[i] == 0)
{
lincsd->bllen[i] =
- std::sqrt(distance2(x[lincsd->bla[2*i]],
- x[lincsd->bla[2*i+1]]));
+ std::sqrt(distance2(x[lincsd->atoms[i].index1],
+ x[lincsd->atoms[i].index2]));
}
}
}
}
+ int p_imax;
+ real ncons_loc;
+ real p_ssd;
+ real p_max = 0;
if (debug)
{
- cconerr(lincsd, xprime, pbc,
+ cconerr(*lincsd, xprime, pbc,
&ncons_loc, &p_ssd, &p_max, &p_imax);
}
* at the same time. But as we only need to detect
* if a warning occurred or not, this is not an issue.
*/
- bWarn = FALSE;
+ bool bWarn = FALSE;
/* The OpenMP parallel region of constrain_lincs for coords */
#pragma omp parallel num_threads(lincsd->ntask)
fprintf(debug, " Rel. Constraint Deviation: RMS MAX between atoms\n");
fprintf(debug, " Before LINCS %.6f %.6f %6d %6d\n",
std::sqrt(p_ssd/ncons_loc), p_max,
- ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
- ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
}
if (computeRmsd || debug)
{
- cconerr(lincsd, xprime, pbc,
+ cconerr(*lincsd, xprime, pbc,
&ncons_loc, &p_ssd, &p_max, &p_imax);
lincsd->rmsdData[0] = ncons_loc;
lincsd->rmsdData[1] = p_ssd;
fprintf(debug,
" After LINCS %.6f %.6f %6d %6d\n\n",
std::sqrt(p_ssd/ncons_loc), p_max,
- ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
- ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
}
if (bWarn)
{
if (maxwarn < INT_MAX)
{
- cconerr(lincsd, xprime, pbc,
+ cconerr(*lincsd, xprime, pbc,
&ncons_loc, &p_ssd, &p_max, &p_imax);
+ std::string simMesg;
if (isMultiSim(ms))
{
- sprintf(buf3, " in simulation %d", ms->sim);
- }
- else
- {
- buf3[0] = 0;
+ simMesg += gmx::formatString(" in simulation %d", ms->sim);
}
fprintf(stderr,
- "\nStep %s, time %g (ps) LINCS WARNING%s\n"
+ "\nStep %" PRId64 ", time %g (ps) LINCS WARNING%s\n"
"relative constraint deviation after LINCS:\n"
"rms %.6f, max %.6f (between atoms %d and %d)\n",
- gmx_step_str(step, buf2), ir.init_t+step*ir.delta_t,
- buf3,
+ step, ir.init_t+step*ir.delta_t,
+ simMesg.c_str(),
std::sqrt(p_ssd/ncons_loc), p_max,
- ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
- ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+ ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
lincs_warning(cr->dd, x, xprime, pbc,
- lincsd->nc, lincsd->bla, lincsd->bllen,
+ lincsd->nc, lincsd->atoms, lincsd->bllen,
ir.LincsWarnAngle, maxwarn, warncount);
}
bOK = (p_max < 0.5);
if (lincsd->ncg_flex)
{
- for (i = 0; (i < lincsd->nc); i++)
+ for (int i = 0; (i < lincsd->nc); i++)
{
if (lincsd->bllen0[i] == 0 && lincsd->ddist[i] == 0)
{
if (bCalcVir && lincsd->ntask > 1)
{
- for (i = 1; i < lincsd->ntask; i++)
+ for (int i = 1; i < lincsd->ntask; i++)
{
m_add(vir_r_m_dr, lincsd->task[i].vir_r_m_dr, vir_r_m_dr);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
md->bVCMgrps = FALSE;
for (int i = 0; i < mtop.natoms; i++)
{
- if (getGroupType(&mtop.groups, egcVCM, i) > 0)
+ if (getGroupType(mtop.groups, egcVCM, i) > 0)
{
md->bVCMgrps = TRUE;
}
{
gmx_bool bLJPME;
const t_grpopts *opts;
- const gmx_groups_t *groups;
int nthreads gmx_unused;
bLJPME = EVDW_PME(ir->vdwtype);
opts = &ir->opts;
- groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
- auto md = mdAtoms->mdatoms();
+ auto md = mdAtoms->mdatoms();
/* nindex>=0 indicates DD where we use an index */
if (nindex >= 0)
{
else
{
/* The friction coefficient is mass/tau_t */
- fac = ir->delta_t/opts->tau_t[md->cTC ? groups->grpnr[egcTC][ag] : 0];
+ fac = ir->delta_t/opts->tau_t[md->cTC ? groups.grpnr[egcTC][ag] : 0];
mA = 0.5*atom.m*fac;
mB = 0.5*atom.mB*fac;
}
md->ptype[i] = atom.ptype;
if (md->cTC)
{
- md->cTC[i] = groups->grpnr[egcTC][ag];
+ md->cTC[i] = groups.grpnr[egcTC][ag];
}
md->cENER[i] = getGroupType(groups, egcENER, ag);
if (md->cACC)
{
- md->cACC[i] = groups->grpnr[egcACC][ag];
+ md->cACC[i] = groups.grpnr[egcACC][ag];
}
if (md->cVCM)
{
- md->cVCM[i] = groups->grpnr[egcVCM][ag];
+ md->cVCM[i] = groups.grpnr[egcVCM][ag];
}
if (md->cORF)
{
if (md->cU1)
{
- md->cU1[i] = groups->grpnr[egcUser1][ag];
+ md->cU1[i] = groups.grpnr[egcUser1][ag];
}
if (md->cU2)
{
- md->cU2[i] = groups->grpnr[egcUser2][ag];
+ md->cU2[i] = groups.grpnr[egcUser2][ag];
}
if (ir->bQMMM)
{
- if (groups->grpnr[egcQMMM] == nullptr ||
- groups->grpnr[egcQMMM][ag] < groups->grps[egcQMMM].nr-1)
+ if (groups.grpnr[egcQMMM] == nullptr ||
+ groups.grpnr[egcQMMM][ag] < groups.grps[egcQMMM].nr-1)
{
md->bQM[i] = TRUE;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
class MDAtoms
{
//! C-style mdatoms struct.
- unique_cptr<t_mdatoms> mdatoms_;
+ unique_cptr<t_mdatoms> mdatoms_;
//! Memory for chargeA that can be set up for efficient GPU transfer.
- HostVector<real> chargeA_;
+ gmx::PaddedHostVector<real> chargeA_;
public:
// TODO make this private
MDAtoms();
done_mde_delta_h_coll(mdebin->dhc);
sfree(mdebin->dE);
sfree(mdebin->temperatures);
+ sfree(mdebin->ebin);
sfree(mdebin);
}
of->natoms_x_compressed = 0;
for (i = 0; (i < top_global->natoms); i++)
{
- if (getGroupType(of->groups, egcCompressedX, i) == 0)
+ if (getGroupType(*of->groups, egcCompressedX, i) == 0)
{
of->natoms_x_compressed++;
}
auto x = makeArrayRef(state_global->x);
for (i = 0, j = 0; (i < of->natoms_global); i++)
{
- if (getGroupType(of->groups, egcCompressedX, i) == 0)
+ if (getGroupType(*of->groups, egcCompressedX, i) == 0)
{
copy_rvec(x[i], xxtc[j++]);
}
{
if (of->fp_ene != nullptr)
{
- close_enx(of->fp_ene);
+ done_ener_file(of->fp_ene);
}
if (of->fp_xtc)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* The final solution should be an MD algorithm base class with methods
* for initialization and atom-data setup.
*/
-
-void mdAlgorithmsSetupAtomData(const t_commrec *cr,
- const t_inputrec *ir,
- const gmx_mtop_t *top_global,
- gmx_localtop_t *top,
- t_forcerec *fr,
- t_graph **graph,
- gmx::MDAtoms *mdAtoms,
- gmx::Constraints *constr,
- gmx_vsite_t *vsite,
- gmx_shellfc_t *shellfc)
+void mdAlgorithmsSetupAtomData(const t_commrec *cr,
+ const t_inputrec *ir,
+ const gmx_mtop_t &top_global,
+ gmx_localtop_t *top,
+ t_forcerec *fr,
+ t_graph **graph,
+ gmx::MDAtoms *mdAtoms,
+ gmx::Constraints *constr,
+ gmx_vsite_t *vsite,
+ gmx_shellfc_t *shellfc)
{
bool usingDomDec = DOMAINDECOMP(cr);
{
numAtomIndex = -1;
atomIndex = nullptr;
- numHomeAtoms = top_global->natoms;
+ numHomeAtoms = top_global.natoms;
}
- atoms2md(top_global, ir, numAtomIndex, atomIndex, numHomeAtoms, mdAtoms);
+ atoms2md(&top_global, ir, numAtomIndex, atomIndex, numHomeAtoms, mdAtoms);
auto mdatoms = mdAtoms->mdatoms();
if (usingDomDec)
}
else
{
- /* Currently gmx_generate_local_top allocates and returns a pointer.
- * We should implement a more elegant solution.
- */
- gmx_localtop_t *tmpTop;
-
- tmpTop = gmx_mtop_generate_local_top(top_global, ir->efep != efepNO);
- *top = *tmpTop;
- sfree(tmpTop);
+ gmx_mtop_generate_local_top(top_global, top, ir->efep != efepNO);
}
if (vsite)
{
GMX_ASSERT(graph != nullptr, "We use a graph with PBC (no periodic mols) and without DD");
- *graph = mk_graph(nullptr, &(top->idef), 0, top_global->natoms, FALSE, FALSE);
+ *graph = mk_graph(nullptr, &(top->idef), 0, top_global.natoms, FALSE, FALSE);
}
else if (graph != nullptr)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* \param[in,out] vsite The virtual site data, can be NULL
* \param[in,out] shellfc The shell/flexible-constraint data, can be NULL
*/
-void mdAlgorithmsSetupAtomData(const t_commrec *cr,
- const t_inputrec *ir,
- const gmx_mtop_t *top_global,
- gmx_localtop_t *top,
- t_forcerec *fr,
- t_graph **graph,
- gmx::MDAtoms *mdAtoms,
- gmx::Constraints *constr,
- gmx_vsite_t *vsite,
- gmx_shellfc_t *shellfc);
+void mdAlgorithmsSetupAtomData(const t_commrec *cr,
+ const t_inputrec *ir,
+ const gmx_mtop_t &top_global,
+ gmx_localtop_t *top,
+ t_forcerec *fr,
+ t_graph **graph,
+ gmx::MDAtoms *mdAtoms,
+ gmx::Constraints *constr,
+ gmx_vsite_t *vsite,
+ gmx_shellfc_t *shellfc);
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
-/* Default nbnxn allocation routine, allocates NBNXN_MEM_ALIGN byte aligned */
-void nbnxn_alloc_aligned(void **ptr, size_t nbytes)
-{
- *ptr = save_malloc_aligned("ptr", __FILE__, __LINE__, nbytes, 1, NBNXN_MEM_ALIGN);
-}
-
-/* Free function for memory allocated with nbnxn_alloc_aligned */
-void nbnxn_free_aligned(void *ptr)
-{
- sfree_aligned(ptr);
-}
-/* Reallocation wrapper function for nbnxn data structures */
-void nbnxn_realloc_void(void **ptr,
- int nbytes_copy, int nbytes_new,
- nbnxn_alloc_t *ma,
- nbnxn_free_t *mf)
+void nbnxn_atomdata_t::resizeCoordinateBuffer(int numAtoms)
{
- void *ptr_new;
-
- ma(&ptr_new, nbytes_new);
+ numAtoms_ = numAtoms;
- if (nbytes_new > 0 && ptr_new == nullptr)
- {
- gmx_fatal(FARGS, "Allocation of %d bytes failed", nbytes_new);
- }
-
- if (nbytes_copy > 0)
- {
- if (nbytes_new < nbytes_copy)
- {
- gmx_incons("In nbnxn_realloc_void: new size less than copy size");
- }
- memcpy(ptr_new, *ptr, nbytes_copy);
- }
- if (*ptr != nullptr)
- {
- mf(*ptr);
- }
- *ptr = ptr_new;
+ x_.resize(numAtoms*xstride);
}
-/* Reallocate the nbnxn_atomdata_t for a size of n atoms */
-void nbnxn_atomdata_realloc(nbnxn_atomdata_t *nbat, int n)
+void nbnxn_atomdata_t::resizeForceBuffers()
{
- GMX_ASSERT(nbat->nalloc >= nbat->natoms, "We should have at least as many elelements allocated as there are set");
-
- int t;
-
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->type),
- nbat->natoms*sizeof(*nbat->type),
- n*sizeof(*nbat->type),
- nbat->alloc, nbat->free);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->lj_comb),
- nbat->natoms*2*sizeof(*nbat->lj_comb),
- n*2*sizeof(*nbat->lj_comb),
- nbat->alloc, nbat->free);
- if (nbat->XFormat != nbatXYZQ)
- {
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->q),
- nbat->natoms*sizeof(*nbat->q),
- n*sizeof(*nbat->q),
- nbat->alloc, nbat->free);
- }
- if (nbat->nenergrp > 1)
- {
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->energrp),
- nbat->natoms/nbat->na_c*sizeof(*nbat->energrp),
- n/nbat->na_c*sizeof(*nbat->energrp),
- nbat->alloc, nbat->free);
- }
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->x),
- nbat->natoms*nbat->xstride*sizeof(*nbat->x),
- n*nbat->xstride*sizeof(*nbat->x),
- nbat->alloc, nbat->free);
- for (t = 0; t < nbat->nout; t++)
+ /* Force buffers need padding up to a multiple of the buffer flag size */
+ const int paddedSize = (numAtoms() + NBNXN_BUFFERFLAG_SIZE - 1)/NBNXN_BUFFERFLAG_SIZE*NBNXN_BUFFERFLAG_SIZE;
+
+ /* Should we let each thread allocate it's own data instead? */
+ for (nbnxn_atomdata_output_t &outBuffer : out)
{
- /* Allocate one element extra for possible signaling with GPUs */
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->out[t].f),
- nbat->natoms*nbat->fstride*sizeof(*nbat->out[t].f),
- n*nbat->fstride*sizeof(*nbat->out[t].f),
- nbat->alloc, nbat->free);
+ outBuffer.f.resize(paddedSize*fstride);
}
- nbat->nalloc = n;
}
/* Initializes an nbnxn_atomdata_output_t data structure */
-static void nbnxn_atomdata_output_init(nbnxn_atomdata_output_t *out,
- int nb_kernel_type,
- int nenergrp, int stride,
- nbnxn_alloc_t *ma)
+nbnxn_atomdata_output_t::nbnxn_atomdata_output_t(int nb_kernel_type,
+ int numEnergyGroups,
+ int simdEnergyBufferStride,
+ gmx::PinningPolicy pinningPolicy) :
+ f({}, {pinningPolicy}),
+ fshift({}, {pinningPolicy}),
+ Vvdw({}, {pinningPolicy}),
+ Vc({}, {pinningPolicy})
{
- out->f = nullptr;
- ma(reinterpret_cast<void **>(&out->fshift), SHIFTS*DIM*sizeof(*out->fshift));
- out->nV = nenergrp*nenergrp;
- ma(reinterpret_cast<void **>(&out->Vvdw), out->nV*sizeof(*out->Vvdw));
- ma(reinterpret_cast<void **>(&out->Vc), out->nV*sizeof(*out->Vc ));
+ fshift.resize(SHIFTS*DIM);
+ Vvdw.resize(numEnergyGroups*numEnergyGroups);
+ Vc.resize(numEnergyGroups*numEnergyGroups);
if (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
nb_kernel_type == nbnxnk4xN_SIMD_2xNN)
{
- int cj_size = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
- out->nVS = nenergrp*nenergrp*stride*(cj_size>>1)*cj_size;
- ma(reinterpret_cast<void **>(&out->VSvdw), out->nVS*sizeof(*out->VSvdw));
- ma(reinterpret_cast<void **>(&out->VSc), out->nVS*sizeof(*out->VSc ));
- }
- else
- {
- out->nVS = 0;
+ int cj_size = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
+ int numElements = numEnergyGroups*numEnergyGroups*simdEnergyBufferStride*(cj_size/2)*cj_size;
+ VSvdw.resize(numElements);
+ VSc.resize(numElements);
}
}
}
/* Stores the LJ parameter data in a format convenient for different kernels */
-static void set_lj_parameter_data(nbnxn_atomdata_t *nbat, gmx_bool bSIMD)
+static void set_lj_parameter_data(nbnxn_atomdata_t::Params *params, gmx_bool bSIMD)
{
- real c6, c12;
-
- int nt = nbat->ntype;
+ int nt = params->numTypes;
if (bSIMD)
{
* when it might not be used, but introducing the conditional code is not
* really worth it.
*/
- nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp_aligned),
- nt*nt*c_simdBestPairAlignment*sizeof(*nbat->nbfp_aligned));
+ params->nbfp_aligned.resize(nt*nt*c_simdBestPairAlignment);
+
for (int i = 0; i < nt; i++)
{
for (int j = 0; j < nt; j++)
{
- nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+0] = nbat->nbfp[(i*nt+j)*2+0];
- nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+1] = nbat->nbfp[(i*nt+j)*2+1];
- nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0;
- nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0;
+ params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+0] = params->nbfp[(i*nt+j)*2+0];
+ params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+1] = params->nbfp[(i*nt+j)*2+1];
+ params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0;
+ params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0;
}
}
#endif
* and with LJ-PME kernels. We then only need parameters per atom type,
* not per pair of atom types.
*/
- switch (nbat->comb_rule)
+ params->nbfp_comb.resize(nt*2);
+ switch (params->comb_rule)
{
case ljcrGEOM:
- nbat->comb_rule = ljcrGEOM;
+ params->comb_rule = ljcrGEOM;
for (int i = 0; i < nt; i++)
{
/* Store the sqrt of the diagonal from the nbfp matrix */
- nbat->nbfp_comb[i*2 ] = std::sqrt(nbat->nbfp[(i*nt+i)*2 ]);
- nbat->nbfp_comb[i*2+1] = std::sqrt(nbat->nbfp[(i*nt+i)*2+1]);
+ params->nbfp_comb[i*2 ] = std::sqrt(params->nbfp[(i*nt+i)*2 ]);
+ params->nbfp_comb[i*2+1] = std::sqrt(params->nbfp[(i*nt+i)*2+1]);
}
break;
case ljcrLB:
for (int i = 0; i < nt; i++)
{
/* Get 6*C6 and 12*C12 from the diagonal of the nbfp matrix */
- c6 = nbat->nbfp[(i*nt+i)*2 ];
- c12 = nbat->nbfp[(i*nt+i)*2+1];
+ const real c6 = params->nbfp[(i*nt+i)*2 ];
+ const real c12 = params->nbfp[(i*nt+i)*2+1];
if (c6 > 0 && c12 > 0)
{
/* We store 0.5*2^1/6*sigma and sqrt(4*3*eps),
* so we get 6*C6 and 12*C12 after combining.
*/
- nbat->nbfp_comb[i*2 ] = 0.5*gmx::sixthroot(c12/c6);
- nbat->nbfp_comb[i*2+1] = std::sqrt(c6*c6/c12);
+ params->nbfp_comb[i*2 ] = 0.5*gmx::sixthroot(c12/c6);
+ params->nbfp_comb[i*2+1] = std::sqrt(c6*c6/c12);
}
else
{
- nbat->nbfp_comb[i*2 ] = 0;
- nbat->nbfp_comb[i*2+1] = 0;
+ params->nbfp_comb[i*2 ] = 0;
+ params->nbfp_comb[i*2+1] = 0;
}
}
break;
}
}
-#if GMX_SIMD
-static void
-nbnxn_atomdata_init_simple_exclusion_masks(nbnxn_atomdata_t *nbat)
+nbnxn_atomdata_t::SimdMasks::SimdMasks()
{
- const int simd_width = GMX_SIMD_REAL_WIDTH;
- int simd_excl_size;
+#if GMX_SIMD
+ constexpr int simd_width = GMX_SIMD_REAL_WIDTH;
/* Set the diagonal cluster pair exclusion mask setup data.
* In the kernel we check 0 < j - i to generate the masks.
* Here we store j - i for generating the mask for the first i,
* we substract 0.5 to avoid rounding issues.
* In the kernel we can subtract 1 to generate the subsequent mask.
*/
- int simd_4xn_diag_size;
-
- simd_4xn_diag_size = std::max(NBNXN_CPU_CLUSTER_I_SIZE, simd_width);
- snew_aligned(nbat->simd_4xn_diagonal_j_minus_i, simd_4xn_diag_size, NBNXN_MEM_ALIGN);
+ const int simd_4xn_diag_size = std::max(c_nbnxnCpuIClusterSize, simd_width);
+ diagonal_4xn_j_minus_i.resize(simd_4xn_diag_size);
for (int j = 0; j < simd_4xn_diag_size; j++)
{
- nbat->simd_4xn_diagonal_j_minus_i[j] = j - 0.5;
+ diagonal_4xn_j_minus_i[j] = j - 0.5;
}
- snew_aligned(nbat->simd_2xnn_diagonal_j_minus_i, simd_width, NBNXN_MEM_ALIGN);
+ diagonal_2xnn_j_minus_i.resize(simd_width);
for (int j = 0; j < simd_width/2; j++)
{
/* The j-cluster size is half the SIMD width */
- nbat->simd_2xnn_diagonal_j_minus_i[j] = j - 0.5;
+ diagonal_2xnn_j_minus_i[j] = j - 0.5;
/* The next half of the SIMD width is for i + 1 */
- nbat->simd_2xnn_diagonal_j_minus_i[simd_width/2+j] = j - 1 - 0.5;
+ diagonal_2xnn_j_minus_i[simd_width/2 + j] = j - 1 - 0.5;
}
/* We use up to 32 bits for exclusion masking.
* In single precision this means the real and integer SIMD registers
* are of equal size.
*/
- simd_excl_size = NBNXN_CPU_CLUSTER_I_SIZE*simd_width;
+ const int simd_excl_size = c_nbnxnCpuIClusterSize*simd_width;
#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
- snew_aligned(nbat->simd_exclusion_filter64, simd_excl_size, NBNXN_MEM_ALIGN);
+ exclusion_filter64.resize(simd_excl_size);
#else
- snew_aligned(nbat->simd_exclusion_filter, simd_excl_size, NBNXN_MEM_ALIGN);
+ exclusion_filter.resize(simd_excl_size);
#endif
for (int j = 0; j < simd_excl_size; j++)
{
/* Set the consecutive bits for masking pair exclusions */
#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
- nbat->simd_exclusion_filter64[j] = (1U << j);
+ exclusion_filter64[j] = (1U << j);
#else
- nbat->simd_exclusion_filter[j] = (1U << j);
+ exclusion_filter[j] = (1U << j);
#endif
}
-#if !GMX_SIMD_HAVE_LOGICAL && !GMX_SIMD_HAVE_INT32_LOGICAL
- // If the SIMD implementation has no bitwise logical operation support
- // whatsoever we cannot use the normal masking. Instead,
- // we generate a vector of all 2^4 possible ways an i atom
- // interacts with its 4 j atoms. Each array entry contains
- // GMX_SIMD_REAL_WIDTH values that are read with a single aligned SIMD load.
- // Since there is no logical value representation in this case, we use
- // any nonzero value to indicate 'true', while zero mean 'false'.
- // This can then be converted to a SIMD boolean internally in the SIMD
- // module by comparing to zero.
- // Each array entry encodes how this i atom will interact with the 4 j atoms.
- // Matching code exists in set_ci_top_excls() to generate indices into this array.
- // Those indices are used in the kernels.
-
- simd_excl_size = NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
- const real simdFalse = 0.0;
- const real simdTrue = 1.0;
- real *simd_interaction_array;
-
- snew_aligned(simd_interaction_array, simd_excl_size * GMX_SIMD_REAL_WIDTH, NBNXN_MEM_ALIGN);
- for (int j = 0; j < simd_excl_size; j++)
+ if (!GMX_SIMD_HAVE_LOGICAL && !GMX_SIMD_HAVE_INT32_LOGICAL)
{
- int index = j * GMX_SIMD_REAL_WIDTH;
- for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
+ // If the SIMD implementation has no bitwise logical operation support
+ // whatsoever we cannot use the normal masking. Instead,
+ // we generate a vector of all 2^4 possible ways an i atom
+ // interacts with its 4 j atoms. Each array entry contains
+ // GMX_SIMD_REAL_WIDTH values that are read with a single aligned SIMD load.
+ // Since there is no logical value representation in this case, we use
+ // any nonzero value to indicate 'true', while zero mean 'false'.
+ // This can then be converted to a SIMD boolean internally in the SIMD
+ // module by comparing to zero.
+ // Each array entry encodes how this i atom will interact with the 4 j atoms.
+ // Matching code exists in set_ci_top_excls() to generate indices into this array.
+ // Those indices are used in the kernels.
+
+ const int simd_excl_size = c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
+ const real simdFalse = 0.0;
+ const real simdTrue = 1.0;
+
+ interaction_array.resize(simd_excl_size * GMX_SIMD_REAL_WIDTH);
+ for (int j = 0; j < simd_excl_size; j++)
{
- simd_interaction_array[index + i] = (j & (1 << i)) ? simdTrue : simdFalse;
+ const int index = j * GMX_SIMD_REAL_WIDTH;
+ for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
+ {
+ interaction_array[index + i] = (j & (1 << i)) ? simdTrue : simdFalse;
+ }
}
}
- nbat->simd_interaction_array = simd_interaction_array;
#endif
}
-#endif
-/* Initializes an nbnxn_atomdata_t data structure */
-void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
- nbnxn_atomdata_t *nbat,
- int nb_kernel_type,
- int enbnxninitcombrule,
- int ntype, const real *nbfp,
- int n_energygroups,
- int nout,
- nbnxn_alloc_t *alloc,
- nbnxn_free_t *free)
+nbnxn_atomdata_t::Params::Params(gmx::PinningPolicy pinningPolicy) :
+ numTypes(0),
+ nbfp({}, {pinningPolicy}),
+ nbfp_comb({}, {pinningPolicy}),
+ type({}, {pinningPolicy}),
+ lj_comb({}, {pinningPolicy}),
+ q({}, {pinningPolicy}),
+ nenergrp(0),
+ neg_2log(0),
+ energrp({}, {pinningPolicy})
+{
+}
+
+nbnxn_atomdata_t::nbnxn_atomdata_t(gmx::PinningPolicy pinningPolicy) :
+ params_(pinningPolicy),
+ numAtoms_(0),
+ natoms_local(0),
+ shift_vec({}, {pinningPolicy}),
+ x_({}, {pinningPolicy}),
+ simdMasks(),
+ bUseBufferFlags(FALSE),
+ bUseTreeReduce(FALSE)
+{
+}
+
+/* Initializes an nbnxn_atomdata_t::Params data structure */
+static void nbnxn_atomdata_params_init(const gmx::MDLogger &mdlog,
+ nbnxn_atomdata_t::Params *params,
+ int nb_kernel_type,
+ int enbnxninitcombrule,
+ int ntype, const real *nbfp,
+ int n_energygroups)
{
- int nth;
real c6, c12, tol;
char *ptr;
gmx_bool simple, bCombGeom, bCombLB, bSIMD;
- if (alloc == nullptr)
- {
- nbat->alloc = nbnxn_alloc_aligned;
- }
- else
- {
- nbat->alloc = alloc;
- }
- if (free == nullptr)
- {
- nbat->free = nbnxn_free_aligned;
- }
- else
- {
- nbat->free = free;
- }
-
if (debug)
{
fprintf(debug, "There are %d atom types in the system, adding one for nbnxn_atomdata_t\n", ntype);
}
- nbat->ntype = ntype + 1;
- nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp),
- nbat->ntype*nbat->ntype*2*sizeof(*nbat->nbfp));
- nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp_comb), nbat->ntype*2*sizeof(*nbat->nbfp_comb));
+ params->numTypes = ntype + 1;
+ params->nbfp.resize(params->numTypes*params->numTypes*2);
+ params->nbfp_comb.resize(params->numTypes*2);
/* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
* force-field floating point parameters.
bCombGeom = TRUE;
bCombLB = TRUE;
- /* Temporarily fill nbat->nbfp_comb with sigma and epsilon
+ /* Temporarily fill params->nbfp_comb with sigma and epsilon
* to check for the LB rule.
*/
for (int i = 0; i < ntype; i++)
{
- c6 = nbfp[(i*ntype+i)*2 ]/6.0;
- c12 = nbfp[(i*ntype+i)*2+1]/12.0;
+ c6 = nbfp[(i*ntype+i)*2 ]/6.0;
+ c12 = nbfp[(i*ntype+i)*2 + 1]/12.0;
if (c6 > 0 && c12 > 0)
{
- nbat->nbfp_comb[i*2 ] = gmx::sixthroot(c12/c6);
- nbat->nbfp_comb[i*2+1] = 0.25*c6*c6/c12;
+ params->nbfp_comb[i*2 ] = gmx::sixthroot(c12/c6);
+ params->nbfp_comb[i*2 + 1] = 0.25*c6*c6/c12;
}
else if (c6 == 0 && c12 == 0)
{
- nbat->nbfp_comb[i*2 ] = 0;
- nbat->nbfp_comb[i*2+1] = 0;
+ params->nbfp_comb[i*2 ] = 0;
+ params->nbfp_comb[i*2 + 1] = 0;
}
else
{
}
}
- for (int i = 0; i < nbat->ntype; i++)
+ for (int i = 0; i < params->numTypes; i++)
{
- for (int j = 0; j < nbat->ntype; j++)
+ for (int j = 0; j < params->numTypes; j++)
{
if (i < ntype && j < ntype)
{
/* fr->nbfp has been updated, so that array too now stores c6/c12 including
* the 6.0/12.0 prefactors to save 2 flops in the most common case (force-only).
*/
- c6 = nbfp[(i*ntype+j)*2 ];
- c12 = nbfp[(i*ntype+j)*2+1];
- nbat->nbfp[(i*nbat->ntype+j)*2 ] = c6;
- nbat->nbfp[(i*nbat->ntype+j)*2+1] = c12;
+ c6 = nbfp[(i*ntype+j)*2 ];
+ c12 = nbfp[(i*ntype+j)*2 + 1];
+ params->nbfp[(i*params->numTypes+j)*2 ] = c6;
+ params->nbfp[(i*params->numTypes+j)*2 + 1] = c12;
/* Compare 6*C6 and 12*C12 for geometric cobination rule */
bCombGeom = bCombGeom &&
gmx_within_tol(c6*c6, nbfp[(i*ntype+i)*2 ]*nbfp[(j*ntype+j)*2 ], tol) &&
- gmx_within_tol(c12*c12, nbfp[(i*ntype+i)*2+1]*nbfp[(j*ntype+j)*2+1], tol);
+ gmx_within_tol(c12*c12, nbfp[(i*ntype+i)*2 + 1]*nbfp[(j*ntype+j)*2 + 1], tol);
/* Compare C6 and C12 for Lorentz-Berthelot combination rule */
c6 /= 6.0;
c12 /= 12.0;
bCombLB = bCombLB &&
((c6 == 0 && c12 == 0 &&
- (nbat->nbfp_comb[i*2+1] == 0 || nbat->nbfp_comb[j*2+1] == 0)) ||
+ (params->nbfp_comb[i*2 + 1] == 0 || params->nbfp_comb[j*2 + 1] == 0)) ||
(c6 > 0 && c12 > 0 &&
gmx_within_tol(gmx::sixthroot(c12/c6),
- 0.5*(nbat->nbfp_comb[i*2]+nbat->nbfp_comb[j*2]), tol) &&
- gmx_within_tol(0.25*c6*c6/c12, std::sqrt(nbat->nbfp_comb[i*2+1]*nbat->nbfp_comb[j*2+1]), tol)));
+ 0.5*(params->nbfp_comb[i*2]+params->nbfp_comb[j*2]), tol) &&
+ gmx_within_tol(0.25*c6*c6/c12, std::sqrt(params->nbfp_comb[i*2 + 1]*params->nbfp_comb[j*2 + 1]), tol)));
}
else
{
/* Add zero parameters for the additional dummy atom type */
- nbat->nbfp[(i*nbat->ntype+j)*2 ] = 0;
- nbat->nbfp[(i*nbat->ntype+j)*2+1] = 0;
+ params->nbfp[(i*params->numTypes + j)*2 ] = 0;
+ params->nbfp[(i*params->numTypes + j)*2+1] = 0;
}
}
}
*/
if (bCombGeom)
{
- nbat->comb_rule = ljcrGEOM;
+ params->comb_rule = ljcrGEOM;
}
else if (bCombLB)
{
- nbat->comb_rule = ljcrLB;
+ params->comb_rule = ljcrLB;
}
else
{
- nbat->comb_rule = ljcrNONE;
+ params->comb_rule = ljcrNONE;
- nbat->free(nbat->nbfp_comb);
+ params->nbfp_comb.clear();
}
{
std::string mesg;
- if (nbat->comb_rule == ljcrNONE)
+ if (params->comb_rule == ljcrNONE)
{
mesg = "Using full Lennard-Jones parameter combination matrix";
}
else
{
mesg = gmx::formatString("Using %s Lennard-Jones combination rule",
- nbat->comb_rule == ljcrGEOM ? "geometric" : "Lorentz-Berthelot");
+ params->comb_rule == ljcrGEOM ? "geometric" : "Lorentz-Berthelot");
}
GMX_LOG(mdlog.info).asParagraph().appendText(mesg);
}
break;
case enbnxninitcombruleGEOM:
- nbat->comb_rule = ljcrGEOM;
+ params->comb_rule = ljcrGEOM;
break;
case enbnxninitcombruleLB:
- nbat->comb_rule = ljcrLB;
+ params->comb_rule = ljcrLB;
break;
case enbnxninitcombruleNONE:
- nbat->comb_rule = ljcrNONE;
+ params->comb_rule = ljcrNONE;
- nbat->free(nbat->nbfp_comb);
+ params->nbfp_comb.clear();
break;
default:
gmx_incons("Unknown enbnxninitcombrule");
bSIMD = (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
nb_kernel_type == nbnxnk4xN_SIMD_2xNN);
- set_lj_parameter_data(nbat, bSIMD);
+ set_lj_parameter_data(params, bSIMD);
+
+ params->nenergrp = n_energygroups;
+ if (!simple)
+ {
+ // We now check for energy groups already when starting mdrun
+ GMX_RELEASE_ASSERT(n_energygroups == 1, "GPU kernels do not support energy groups");
+ }
+ /* Temporary storage goes as #grp^3*simd_width^2/2, so limit to 64 */
+ if (params->nenergrp > 64)
+ {
+ gmx_fatal(FARGS, "With NxN kernels not more than 64 energy groups are supported\n");
+ }
+ params->neg_2log = 1;
+ while (params->nenergrp > (1<<params->neg_2log))
+ {
+ params->neg_2log++;
+ }
+}
+
+/* Initializes an nbnxn_atomdata_t data structure */
+void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
+ nbnxn_atomdata_t *nbat,
+ int nb_kernel_type,
+ int enbnxninitcombrule,
+ int ntype, const real *nbfp,
+ int n_energygroups,
+ int nout)
+{
+ nbnxn_atomdata_params_init(mdlog, &nbat->paramsDeprecated(), nb_kernel_type,
+ enbnxninitcombrule, ntype, nbfp, n_energygroups);
+
+ const gmx_bool simple = nbnxn_kernel_pairlist_simple(nb_kernel_type);
+ const gmx_bool bSIMD = (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
+ nb_kernel_type == nbnxnk4xN_SIMD_2xNN);
- nbat->natoms = 0;
- nbat->type = nullptr;
- nbat->lj_comb = nullptr;
if (simple)
{
int pack_x;
if (bSIMD)
{
- pack_x = std::max(NBNXN_CPU_CLUSTER_I_SIZE,
+ pack_x = std::max(c_nbnxnCpuIClusterSize,
nbnxn_kernel_to_cluster_j_size(nb_kernel_type));
switch (pack_x)
{
nbat->XFormat = nbatXYZQ;
nbat->FFormat = nbatXYZ;
}
- nbat->q = nullptr;
- nbat->nenergrp = n_energygroups;
- if (!simple)
- {
- // We now check for energy groups already when starting mdrun
- GMX_RELEASE_ASSERT(n_energygroups == 1, "GPU kernels do not support energy groups");
- }
- /* Temporary storage goes as #grp^3*simd_width^2/2, so limit to 64 */
- if (nbat->nenergrp > 64)
- {
- gmx_fatal(FARGS, "With NxN kernels not more than 64 energy groups are supported\n");
- }
- nbat->neg_2log = 1;
- while (nbat->nenergrp > (1<<nbat->neg_2log))
- {
- nbat->neg_2log++;
- }
- nbat->energrp = nullptr;
- nbat->alloc(reinterpret_cast<void **>(&nbat->shift_vec), SHIFTS*sizeof(*nbat->shift_vec));
+
+ nbat->shift_vec.resize(SHIFTS);
+
nbat->xstride = (nbat->XFormat == nbatXYZQ ? STRIDE_XYZQ : DIM);
nbat->fstride = (nbat->FFormat == nbatXYZQ ? STRIDE_XYZQ : DIM);
- nbat->x = nullptr;
-
-#if GMX_SIMD
- if (simple)
- {
- nbnxn_atomdata_init_simple_exclusion_masks(nbat);
- }
-#endif
/* Initialize the output data structures */
- nbat->nout = nout;
- snew(nbat->out, nbat->nout);
- nbat->nalloc = 0;
- for (int i = 0; i < nbat->nout; i++)
+ for (int i = 0; i < nout; i++)
{
- nbnxn_atomdata_output_init(&nbat->out[i],
- nb_kernel_type,
- nbat->nenergrp, 1<<nbat->neg_2log,
- nbat->alloc);
+ const auto &pinningPolicy = nbat->params().type.get_allocator().pinningPolicy();
+ nbat->out.emplace_back(nb_kernel_type, nbat->params().nenergrp, 1 << nbat->params().neg_2log,
+ pinningPolicy);
}
+
nbat->buffer_flags.flag = nullptr;
nbat->buffer_flags.flag_nalloc = 0;
- nth = gmx_omp_nthreads_get(emntNonbonded);
+ const int nth = gmx_omp_nthreads_get(emntNonbonded);
- ptr = getenv("GMX_USE_TREEREDUCE");
+ const char *ptr = getenv("GMX_USE_TREEREDUCE");
if (ptr != nullptr)
{
nbat->bUseTreeReduce = (strtol(ptr, nullptr, 10) != 0);
}
template<int packSize>
-static void copy_lj_to_nbat_lj_comb(const real *ljparam_type,
+static void copy_lj_to_nbat_lj_comb(gmx::ArrayRef<const real> ljparam_type,
const int *type, int na,
real *ljparam_at)
{
}
}
+static int numAtomsFromGrids(const nbnxn_search &nbs)
+{
+ const nbnxn_grid_t &lastGrid = nbs.grid.back();
+
+ return (lastGrid.cell0 + lastGrid.nc)*lastGrid.na_sc;
+}
+
/* Sets the atom type in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_atomtypes(nbnxn_atomdata_t *nbat,
- const nbnxn_search *nbs,
- const int *type)
+static void nbnxn_atomdata_set_atomtypes(nbnxn_atomdata_t::Params *params,
+ const nbnxn_search *nbs,
+ const int *type)
{
+ params->type.resize(numAtomsFromGrids(*nbs));
+
for (const nbnxn_grid_t &grid : nbs->grid)
{
/* Loop over all columns and copy and fill */
int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
copy_int_to_nbat_int(nbs->a.data() + ash, grid.cxy_na[i], ncz*grid.na_sc,
- type, nbat->ntype-1, nbat->type+ash);
+ type, params->numTypes - 1, params->type.data() + ash);
}
}
}
/* Sets the LJ combination rule parameters in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_ljcombparams(nbnxn_atomdata_t *nbat,
- const nbnxn_search *nbs)
+static void nbnxn_atomdata_set_ljcombparams(nbnxn_atomdata_t::Params *params,
+ const int XFormat,
+ const nbnxn_search *nbs)
{
- if (nbat->comb_rule != ljcrNONE)
+ params->lj_comb.resize(numAtomsFromGrids(*nbs)*2);
+
+ if (params->comb_rule != ljcrNONE)
{
for (const nbnxn_grid_t &grid : nbs->grid)
{
int ncz = grid.cxy_ind[i+1] - grid.cxy_ind[i];
int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
- if (nbat->XFormat == nbatX4)
+ if (XFormat == nbatX4)
{
- copy_lj_to_nbat_lj_comb<c_packX4>(nbat->nbfp_comb,
- nbat->type + ash,
+ copy_lj_to_nbat_lj_comb<c_packX4>(params->nbfp_comb,
+ params->type.data() + ash,
ncz*grid.na_sc,
- nbat->lj_comb + ash*2);
+ params->lj_comb.data() + ash*2);
}
- else if (nbat->XFormat == nbatX8)
+ else if (XFormat == nbatX8)
{
- copy_lj_to_nbat_lj_comb<c_packX8>(nbat->nbfp_comb,
- nbat->type + ash,
+ copy_lj_to_nbat_lj_comb<c_packX8>(params->nbfp_comb,
+ params->type.data() + ash,
ncz*grid.na_sc,
- nbat->lj_comb + ash*2);
+ params->lj_comb.data() + ash*2);
}
- else if (nbat->XFormat == nbatXYZQ)
+ else if (XFormat == nbatXYZQ)
{
- copy_lj_to_nbat_lj_comb<1>(nbat->nbfp_comb,
- nbat->type + ash,
+ copy_lj_to_nbat_lj_comb<1>(params->nbfp_comb,
+ params->type.data() + ash,
ncz*grid.na_sc,
- nbat->lj_comb + ash*2);
+ params->lj_comb.data() + ash*2);
}
}
}
const nbnxn_search *nbs,
const real *charge)
{
+ if (nbat->XFormat != nbatXYZQ)
+ {
+ nbat->paramsDeprecated().q.resize(nbat->numAtoms());
+ }
+
for (const nbnxn_grid_t &grid : nbs->grid)
{
/* Loop over all columns and copy and fill */
if (nbat->XFormat == nbatXYZQ)
{
- real *q = nbat->x + ash*STRIDE_XYZQ + ZZ + 1;
+ real *q = nbat->x().data() + ash*STRIDE_XYZQ + ZZ + 1;
int i;
for (i = 0; i < na; i++)
{
}
else
{
- real *q = nbat->q + ash;
+ real *q = nbat->paramsDeprecated().q.data() + ash;
int i;
for (i = 0; i < na; i++)
{
static void nbnxn_atomdata_mask_fep(nbnxn_atomdata_t *nbat,
const nbnxn_search *nbs)
{
- real *q;
- int stride_q, nsubc;
+ nbnxn_atomdata_t::Params ¶ms = nbat->paramsDeprecated();
+ real *q;
+ int stride_q;
if (nbat->XFormat == nbatXYZQ)
{
- q = nbat->x + ZZ + 1;
+ q = nbat->x().data() + ZZ + 1;
stride_q = STRIDE_XYZQ;
}
else
{
- q = nbat->q;
+ q = params.q.data();
stride_q = 1;
}
for (const nbnxn_grid_t &grid : nbs->grid)
{
+ int nsubc;
if (grid.bSimple)
{
nsubc = 1;
{
int ind = c_offset + c*grid.na_c + i;
/* Set atom type and charge to non-interacting */
- nbat->type[ind] = nbat->ntype - 1;
- q[ind*stride_q] = 0;
+ params.type[ind] = params.numTypes - 1;
+ q[ind*stride_q] = 0;
}
}
}
}
/* Set the energy group indices for atoms in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_energygroups(nbnxn_atomdata_t *nbat,
- const nbnxn_search *nbs,
- const int *atinfo)
+static void nbnxn_atomdata_set_energygroups(nbnxn_atomdata_t::Params *params,
+ const nbnxn_search *nbs,
+ const int *atinfo)
{
- if (nbat->nenergrp == 1)
+ if (params->nenergrp == 1)
{
return;
}
+ params->energrp.resize(numAtomsFromGrids(*nbs));
+
for (const nbnxn_grid_t &grid : nbs->grid)
{
/* Loop over all columns and copy and fill */
int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
copy_egp_to_nbat_egps(nbs->a.data() + ash, grid.cxy_na[i], ncz*grid.na_sc,
- nbat->na_c, nbat->neg_2log,
- atinfo, nbat->energrp+(ash>>grid.na_c_2log));
+ c_nbnxnCpuIClusterSize, params->neg_2log,
+ atinfo,
+ params->energrp.data() + (ash >> grid.na_c_2log));
}
}
}
const t_mdatoms *mdatoms,
const int *atinfo)
{
- nbnxn_atomdata_set_atomtypes(nbat, nbs, mdatoms->typeA);
+ nbnxn_atomdata_t::Params ¶ms = nbat->paramsDeprecated();
+
+ nbnxn_atomdata_set_atomtypes(¶ms, nbs, mdatoms->typeA);
nbnxn_atomdata_set_charges(nbat, nbs, mdatoms->chargeA);
}
/* This must be done after masking types for FEP */
- nbnxn_atomdata_set_ljcombparams(nbat, nbs);
+ nbnxn_atomdata_set_ljcombparams(¶ms, nbat->XFormat, nbs);
- nbnxn_atomdata_set_energygroups(nbat, nbs, atinfo);
+ nbnxn_atomdata_set_energygroups(¶ms, nbs, atinfo);
}
/* Copies the shift vector array to nbnxn_atomdata_t */
na_fill = na;
}
copy_rvec_to_nbat_real(nbs->a.data() + ash, na, na_fill, x,
- nbat->XFormat, nbat->x, ash);
+ nbat->XFormat, nbat->x().data(), ash);
}
}
}
}
static void
-nbnxn_atomdata_clear_reals(real * gmx_restrict dest,
+nbnxn_atomdata_clear_reals(gmx::ArrayRef<real> dest,
int i0, int i1)
{
for (int i = i0; i < i1; i++)
gmx_unused static void
nbnxn_atomdata_reduce_reals(real * gmx_restrict dest,
gmx_bool bDestSet,
- real ** gmx_restrict src,
+ const real ** gmx_restrict src,
int nsrc,
int i0, int i1)
{
gmx_unused static void
nbnxn_atomdata_reduce_reals_simd(real gmx_unused * gmx_restrict dest,
gmx_bool gmx_unused bDestSet,
- real gmx_unused ** gmx_restrict src,
+ const gmx_unused real ** gmx_restrict src,
int gmx_unused nsrc,
int gmx_unused i0, int gmx_unused i1)
{
static void
nbnxn_atomdata_add_nbat_f_to_f_part(const nbnxn_search *nbs,
const nbnxn_atomdata_t *nbat,
- nbnxn_atomdata_output_t *out,
+ gmx::ArrayRef<nbnxn_atomdata_output_t> out,
int nfa,
int a0, int a1,
rvec *f)
case nbatXYZQ:
if (nfa == 1)
{
- const real *fnb = out[0].f;
+ const real *fnb = out[0].f.data();
for (int a = a0; a < a1; a++)
{
case nbatX4:
if (nfa == 1)
{
- const real *fnb = out[0].f;
+ const real *fnb = out[0].f.data();
for (int a = a0; a < a1; a++)
{
case nbatX8:
if (nfa == 1)
{
- const real *fnb = out[0].f;
+ const real *fnb = out[0].f.data();
for (int a = a0; a < a1; a++)
{
return (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;
}
-static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(const nbnxn_atomdata_t *nbat,
- int nth)
+static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(nbnxn_atomdata_t *nbat,
+ int nth)
{
const nbnxn_buffer_flags_t *flags = &nbat->buffer_flags;
- int next_pow2 = 1<<(gmx::log2I(nth-1)+1);
+ int next_pow2 = 1<<(gmx::log2I(nth-1)+1);
- assert(nbat->nout == nth); /* tree-reduce currently only works for nout==nth */
+ const int numOutputBuffers = nbat->out.size();
+ GMX_ASSERT(numOutputBuffers == nth,
+ "tree-reduce currently only works for numOutputBuffers==nth");
memset(nbat->syncStep, 0, sizeof(*(nbat->syncStep))*nth);
index[1] = index[0] + group_size/2;
/* If no second buffer, nothing to do */
- if (index[1] >= nbat->nout && group_size > 2)
+ if (index[1] >= numOutputBuffers && group_size > 2)
{
continue;
}
if (bitmask_is_set(flags->flag[b], index[1]) || group_size > 2)
{
+ const real *fIndex1 = nbat->out[index[1]].f.data();
#if GMX_SIMD
nbnxn_atomdata_reduce_reals_simd
#else
nbnxn_atomdata_reduce_reals
#endif
- (nbat->out[index[0]].f,
+ (nbat->out[index[0]].f.data(),
bitmask_is_set(flags->flag[b], index[0]) || group_size > 2,
- &(nbat->out[index[1]].f), 1, i0, i1);
+ &fIndex1, 1, i0, i1);
}
else if (!bitmask_is_set(flags->flag[b], index[0]))
}
-static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nbat,
- int nth)
+static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(nbnxn_atomdata_t *nbat,
+ int nth)
{
#pragma omp parallel for num_threads(nth) schedule(static)
for (int th = 0; th < nth; th++)
try
{
const nbnxn_buffer_flags_t *flags;
- int nfptr;
- real *fptr[NBNXN_BUFFERFLAG_MAX_THREADS];
+ int nfptr;
+ const real *fptr[NBNXN_BUFFERFLAG_MAX_THREADS];
flags = &nbat->buffer_flags;
int i1 = (b+1)*NBNXN_BUFFERFLAG_SIZE*nbat->fstride;
nfptr = 0;
- for (int out = 1; out < nbat->nout; out++)
+ for (int out = 1; out < static_cast<gmx::index>(nbat->out.size()); out++)
{
if (bitmask_is_set(flags->flag[b], out))
{
- fptr[nfptr++] = nbat->out[out].f;
+ fptr[nfptr++] = nbat->out[out].f.data();
}
}
if (nfptr > 0)
#else
nbnxn_atomdata_reduce_reals
#endif
- (nbat->out[0].f,
+ (nbat->out[0].f.data(),
bitmask_is_set(flags->flag[b], 0),
fptr, nfptr,
i0, i1);
/* Add the force array(s) from nbnxn_atomdata_t to f */
void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search *nbs,
int locality,
- const nbnxn_atomdata_t *nbat,
+ nbnxn_atomdata_t *nbat,
rvec *f,
gmx_wallcycle *wcycle)
{
int nth = gmx_omp_nthreads_get(emntNonbonded);
- if (nbat->nout > 1)
+ if (nbat->out.size() > 1)
{
if (locality != eatAll)
{
void nbnxn_atomdata_add_nbat_fshift_to_fshift(const nbnxn_atomdata_t *nbat,
rvec *fshift)
{
- const nbnxn_atomdata_output_t * out = nbat->out;
+ gmx::ArrayRef<const nbnxn_atomdata_output_t> outputBuffers = nbat->out;
for (int s = 0; s < SHIFTS; s++)
{
rvec sum;
clear_rvec(sum);
- for (int th = 0; th < nbat->nout; th++)
+ for (const nbnxn_atomdata_output_t &out : outputBuffers)
{
- sum[XX] += out[th].fshift[s*DIM+XX];
- sum[YY] += out[th].fshift[s*DIM+YY];
- sum[ZZ] += out[th].fshift[s*DIM+ZZ];
+ sum[XX] += out.fshift[s*DIM+XX];
+ sum[YY] += out.fshift[s*DIM+YY];
+ sum[ZZ] += out.fshift[s*DIM+ZZ];
}
rvec_inc(fshift[s], sum);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
struct t_mdatoms;
struct gmx_wallcycle;
-/* Default nbnxn allocation routine, allocates 32 byte aligned,
- * which works for plain C and aligned SSE and AVX loads/stores.
- */
-void nbnxn_alloc_aligned(void **ptr, size_t nbytes);
-
-/* Free function for memory allocated with nbnxn_alloc_aligned */
-void nbnxn_free_aligned(void *ptr);
-
-/* Reallocation wrapper function for nbnxn data structures */
-void nbnxn_realloc_void(void **ptr,
- int nbytes_copy, int nbytes_new,
- nbnxn_alloc_t *ma,
- nbnxn_free_t *mf);
-
/* Reallocate the nbnxn_atomdata_t for a size of n atoms */
void nbnxn_atomdata_realloc(nbnxn_atomdata_t *nbat, int n);
int enbnxninitcombrule,
int ntype, const real *nbfp,
int n_energygroups,
- int nout,
- nbnxn_alloc_t *alloc,
- nbnxn_free_t *free);
+ int nout);
-/* Copy the atom data to the non-bonded atom data structure */
void nbnxn_atomdata_set(nbnxn_atomdata_t *nbat,
const nbnxn_search *nbs,
const t_mdatoms *mdatoms,
/* Add the forces stored in nbat to f, zeros the forces in nbat */
void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search *nbs,
int locality,
- const nbnxn_atomdata_t *nbat,
+ nbnxn_atomdata_t *nbat,
rvec *f,
gmx_wallcycle *wcycle);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef _nbnxn_consts_h
#define _nbnxn_consts_h
-/* With CPU kernels the i-cluster size is always 4 atoms.
- * With x86 SIMD the j-cluster size can be 2, 4 or 8, otherwise 4.
- */
-#define NBNXN_CPU_CLUSTER_I_SIZE 4
-
-#define NBNXN_CPU_CLUSTER_I_SIZE_2LOG 2
-
// Lower limit for square interaction distances in nonbonded kernels.
// For smaller values we will overflow when calculating r^-1 or r^-12, but
// to keep it simple we always apply the limit from the tougher r^-12 condition.
#endif
-/* Cluster-pair Interaction masks for 4xN and 2xNN kernels.
- * Bit i*CJ_SIZE + j tells if atom i and j interact.
- */
-/* All interaction mask is the same for all kernels */
-#define NBNXN_INTERACTION_MASK_ALL 0xffffffffU
-/* 4x4 kernel diagonal mask */
-#define NBNXN_INTERACTION_MASK_DIAG 0x08ceU
-/* 4x2 kernel diagonal masks */
-#define NBNXN_INTERACTION_MASK_DIAG_J2_0 0x0002U
-#define NBNXN_INTERACTION_MASK_DIAG_J2_1 0x002fU
-/* 4x8 kernel diagonal masks */
-#define NBNXN_INTERACTION_MASK_DIAG_J8_0 0xf0f8fcfeU
-#define NBNXN_INTERACTION_MASK_DIAG_J8_1 0x0080c0e0U
-
/* The number of clusters in a super-cluster, used for GPU */
#define c_nbnxnGpuNumClusterPerSupercluster 8
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
/* HtoD x, q */
- cu_copy_H2D_async(adat->xq + adat_begin, nbatom->x + adat_begin * 4,
+ cu_copy_H2D_async(adat->xq + adat_begin,
+ static_cast<const void *>(nbatom->x().data() + adat_begin * 4),
adat_len * sizeof(*adat->xq), stream);
if (bDoTime)
}
void nbnxn_gpu_launch_cpyback(gmx_nbnxn_cuda_t *nb,
- const nbnxn_atomdata_t *nbatom,
+ nbnxn_atomdata_t *nbatom,
int flags,
int aloc,
bool haveOtherWork)
}
/* DtoH f */
- cu_copy_D2H_async(nbatom->out[0].f + adat_begin * 3, adat->f + adat_begin,
+ cu_copy_D2H_async(nbatom->out[0].f.data() + adat_begin * 3, adat->f + adat_begin,
(adat_len)*sizeof(*adat->f), stream);
/* After the non-local D2H is launched the nonlocal_done event can be
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
/*! Initializes the nonbonded parameter data structure. */
-static void init_nbparam(cu_nbparam_t *nbp,
- const interaction_const_t *ic,
- const NbnxnListParameters *listParams,
- const nbnxn_atomdata_t *nbat)
+static void init_nbparam(cu_nbparam_t *nbp,
+ const interaction_const_t *ic,
+ const NbnxnListParameters *listParams,
+ const nbnxn_atomdata_t::Params &nbatParams)
{
int ntypes;
- ntypes = nbat->ntype;
+ ntypes = nbatParams.numTypes;
set_cutoff_parameters(nbp, ic, listParams);
{
case eintmodNONE:
case eintmodPOTSHIFT:
- switch (nbat->comb_rule)
+ switch (nbatParams.comb_rule)
{
case ljcrNONE:
nbp->vdwtype = evdwCuCUT;
{
if (ic->ljpme_comb_rule == ljcrGEOM)
{
- assert(nbat->comb_rule == ljcrGEOM);
+ assert(nbatParams.comb_rule == ljcrGEOM);
nbp->vdwtype = evdwCuEWALDGEOM;
}
else
{
- assert(nbat->comb_rule == ljcrLB);
+ assert(nbatParams.comb_rule == ljcrLB);
nbp->vdwtype = evdwCuEWALDLB;
}
}
if (!useLjCombRule(nbp))
{
initParamLookupTable(nbp->nbfp, nbp->nbfp_texobj,
- nbat->nbfp, 2*ntypes*ntypes);
+ nbatParams.nbfp.data(), 2*ntypes*ntypes);
}
/* set up LJ-PME parameter lookup table */
if (ic->vdwtype == evdwPME)
{
initParamLookupTable(nbp->nbfp_comb, nbp->nbfp_comb_texobj,
- nbat->nbfp_comb, 2*ntypes);
+ nbatParams.nbfp_comb.data(), 2*ntypes);
}
}
static void nbnxn_cuda_init_const(gmx_nbnxn_cuda_t *nb,
const interaction_const_t *ic,
const NbnxnListParameters *listParams,
- const nbnxn_atomdata_t *nbat)
+ const nbnxn_atomdata_t::Params &nbatParams)
{
- init_atomdata_first(nb->atdat, nbat->ntype);
- init_nbparam(nb->nbparam, ic, listParams, nbat);
+ init_atomdata_first(nb->atdat, nbatParams.numTypes);
+ init_nbparam(nb->nbparam, ic, listParams, nbatParams);
/* clear energy and shift force outputs */
nbnxn_cuda_clear_e_fshift(nb);
/* pick L1 cache configuration */
nbnxn_cuda_set_cacheconfig();
- nbnxn_cuda_init_const(nb, ic, listParams, nbat);
+ nbnxn_cuda_init_const(nb, ic, listParams, nbat->params());
*p_nb = nb;
}
void nbnxn_gpu_init_pairlist(gmx_nbnxn_cuda_t *nb,
- const nbnxn_pairlist_t *h_plist,
+ const NbnxnPairlistGpu *h_plist,
int iloc)
{
char sbuf[STRLEN];
- bool bDoTime = (nb->bDoTime && h_plist->nsci > 0);
+ bool bDoTime = (nb->bDoTime && !h_plist->sci.empty());
cudaStream_t stream = nb->stream[iloc];
cu_plist_t *d_plist = nb->plist[iloc];
Context context = nullptr;
- reallocateDeviceBuffer(&d_plist->sci, h_plist->nsci,
+ reallocateDeviceBuffer(&d_plist->sci, h_plist->sci.size(),
&d_plist->nsci, &d_plist->sci_nalloc, context);
- copyToDeviceBuffer(&d_plist->sci, h_plist->sci, 0, h_plist->nsci,
+ copyToDeviceBuffer(&d_plist->sci, h_plist->sci.data(), 0, h_plist->sci.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
- reallocateDeviceBuffer(&d_plist->cj4, h_plist->ncj4,
+ reallocateDeviceBuffer(&d_plist->cj4, h_plist->cj4.size(),
&d_plist->ncj4, &d_plist->cj4_nalloc, context);
- copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4, 0, h_plist->ncj4,
+ copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4.data(), 0, h_plist->cj4.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
- reallocateDeviceBuffer(&d_plist->imask, h_plist->ncj4*c_nbnxnGpuClusterpairSplit,
+ reallocateDeviceBuffer(&d_plist->imask, h_plist->cj4.size()*c_nbnxnGpuClusterpairSplit,
&d_plist->nimask, &d_plist->imask_nalloc, context);
- reallocateDeviceBuffer(&d_plist->excl, h_plist->nexcl,
+ reallocateDeviceBuffer(&d_plist->excl, h_plist->excl.size(),
&d_plist->nexcl, &d_plist->excl_nalloc, context);
- copyToDeviceBuffer(&d_plist->excl, h_plist->excl, 0, h_plist->nexcl,
+ copyToDeviceBuffer(&d_plist->excl, h_plist->excl.data(), 0, h_plist->excl.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
/* only if we have a dynamic box */
if (nbatom->bDynamicBox || !adat->bShiftVecUploaded)
{
- cu_copy_H2D_async(adat->shift_vec, nbatom->shift_vec,
+ cu_copy_H2D_async(adat->shift_vec, nbatom->shift_vec.data(),
SHIFTS * sizeof(*adat->shift_vec), ls);
adat->bShiftVecUploaded = true;
}
cu_atomdata_t *d_atdat = nb->atdat;
cudaStream_t ls = nb->stream[eintLocal];
- natoms = nbat->natoms;
+ natoms = nbat->numAtoms();
realloced = false;
if (bDoTime)
if (useLjCombRule(nb->nbparam))
{
- cu_copy_H2D_async(d_atdat->lj_comb, nbat->lj_comb,
+ cu_copy_H2D_async(d_atdat->lj_comb, nbat->params().lj_comb.data(),
natoms*sizeof(*d_atdat->lj_comb), ls);
}
else
{
- cu_copy_H2D_async(d_atdat->atom_types, nbat->type,
+ cu_copy_H2D_async(d_atdat->atom_types, nbat->params().type.data(),
natoms*sizeof(*d_atdat->atom_types), ls);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
GPU_FUNC_QUALIFIER
void nbnxn_gpu_launch_cpyback(gmx_nbnxn_gpu_t gmx_unused *nb,
- const struct nbnxn_atomdata_t gmx_unused *nbatom,
+ struct nbnxn_atomdata_t gmx_unused *nbatom,
int gmx_unused flags,
int gmx_unused aloc,
bool gmx_unused haveOtherWork) GPU_FUNC_TERM
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/mdtypes/interaction_const.h"
struct nonbonded_verlet_group_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistGpu;
struct nbnxn_atomdata_t;
struct NbnxnListParameters;
struct gmx_wallclock_gpu_nbnxn_t;
/** Initializes pair-list data for GPU, called at every pair search step. */
GPU_FUNC_QUALIFIER
void nbnxn_gpu_init_pairlist(gmx_nbnxn_gpu_t gmx_unused *nb,
- const struct nbnxn_pairlist_t gmx_unused *h_nblist,
+ const struct NbnxnPairlistGpu gmx_unused *h_nblist,
int gmx_unused iloc) GPU_FUNC_TERM
/** Initializes atom-data on the GPU, called at every pair search step. */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
copy_rvec_to_nbat_real(nbs->a.data() + atomStart, numAtoms, grid->na_c,
as_rvec_array(x.data()),
- nbat->XFormat, nbat->x, atomStart);
+ nbat->XFormat, nbat->x().data(), atomStart);
if (nbat->XFormat == nbatX4)
{
#if GMX_SIMD && GMX_SIMD_REAL_WIDTH == 2
if (2*grid->na_cj == grid->na_c)
{
- calc_bounding_box_x_x4_halves(numAtoms, nbat->x + atom_to_x_index<c_packX4>(atomStart), bb_ptr,
+ calc_bounding_box_x_x4_halves(numAtoms, nbat->x().data() + atom_to_x_index<c_packX4>(atomStart), bb_ptr,
grid->bbj.data() + offset*2);
}
else
#endif
{
- calc_bounding_box_x_x4(numAtoms, nbat->x + atom_to_x_index<c_packX4>(atomStart), bb_ptr);
+ calc_bounding_box_x_x4(numAtoms, nbat->x().data() + atom_to_x_index<c_packX4>(atomStart), bb_ptr);
}
}
else if (nbat->XFormat == nbatX8)
size_t offset = (atomStart - grid->cell0*grid->na_sc) >> grid->na_c_2log;
nbnxn_bb_t *bb_ptr = grid->bb.data() + offset;
- calc_bounding_box_x_x8(numAtoms, nbat->x + atom_to_x_index<c_packX8>(atomStart), bb_ptr);
+ calc_bounding_box_x_x8(numAtoms, nbat->x().data() + atom_to_x_index<c_packX8>(atomStart), bb_ptr);
}
#if NBNXN_BBXXXX
else if (!grid->bSimple)
#if NBNXN_SEARCH_SIMD4_FLOAT_X_BB
if (nbat->XFormat == nbatXYZQ)
{
- calc_bounding_box_xxxx_simd4(numAtoms, nbat->x + atomStart*nbat->xstride,
+ calc_bounding_box_xxxx_simd4(numAtoms, nbat->x().data() + atomStart*nbat->xstride,
bb_work_aligned, pbb_ptr);
}
else
#endif
{
- calc_bounding_box_xxxx(numAtoms, nbat->xstride, nbat->x + atomStart*nbat->xstride,
+ calc_bounding_box_xxxx(numAtoms, nbat->xstride, nbat->x().data() + atomStart*nbat->xstride,
pbb_ptr);
}
if (gmx_debug_at)
/* Store the bounding boxes as xyz.xyz. */
nbnxn_bb_t *bb_ptr = grid->bb.data() + ((atomStart - grid->cell0*grid->na_sc) >> grid->na_c_2log);
- calc_bounding_box(numAtoms, nbat->xstride, nbat->x + atomStart*nbat->xstride,
+ calc_bounding_box(numAtoms, nbat->xstride, nbat->x().data() + atomStart*nbat->xstride,
bb_ptr);
if (gmx_debug_at)
*/
nbs->a.resize(numNbnxnAtoms + numAtomsMoved);
- /* We need padding up to a multiple of the buffer flag size: simply add */
- if (numNbnxnAtoms + NBNXN_BUFFERFLAG_SIZE > nbat->nalloc)
- {
- nbnxn_atomdata_realloc(nbat, numNbnxnAtoms + NBNXN_BUFFERFLAG_SIZE);
- }
-
- nbat->natoms = numNbnxnAtoms;
+ /* Make space in nbat for storing the atom coordinates */
+ nbat->resizeCoordinateBuffer(numNbnxnAtoms);
}
/* Determine in which grid cells the atoms should go */
grid->na_sc = (grid->bSimple ? 1 : c_gpuNumClusterPerCell)*grid->na_c;
grid->na_c_2log = get_2log(grid->na_c);
- nbat->na_c = grid->na_c;
-
if (ddZone == 0)
{
grid->cell0 = 0;
if (ddZone == 0)
{
- nbat->natoms_local = nbat->natoms;
+ nbat->natoms_local = nbat->numAtoms();
+ }
+ if (ddZone == static_cast<int>(nbs->grid.size()) - 1)
+ {
+ /* We are done setting up all grids, we can resize the force buffers */
+ nbat->resizeForceBuffers();
}
nbs_cycle_stop(&nbs->cc[enbsCCgrid]);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
struct gmx_domdec_zones_t;
-/* The number of clusters in a pair-search cell, used for GPU */
-static const int c_gpuNumClusterPerCellZ = 2;
-static const int c_gpuNumClusterPerCellY = 2;
-static const int c_gpuNumClusterPerCellX = 2;
-static const int c_gpuNumClusterPerCell = c_gpuNumClusterPerCellZ*c_gpuNumClusterPerCellY*c_gpuNumClusterPerCellX;
-
-
/* Strides for x/f with xyz and xyzq coordinate (and charge) storage */
#define STRIDE_XYZ 3
#define STRIDE_XYZQ 4
#endif /* NBNXN_SEARCH_BB_SIMD4 */
+template <class T>
+using AlignedVector = std::vector < T, gmx::AlignedAllocator < T>>;
+
+
/* Bounding box for a nbnxn atom cluster */
typedef struct {
float lower[NNBSBB_C];
};
/* Working data for the actual i-supercell during pair search */
-typedef struct nbnxn_list_work {
- gmx_cache_protect_t cp0; /* Protect cache between threads */
-
- nbnxn_bb_t *bb_ci; /* The bounding boxes, pbc shifted, for each cluster */
- float *pbb_ci; /* As bb_ci, but in xxxx packed format */
- real *x_ci; /* The coordinates, pbc shifted, for each atom */
- real *x_ci_simd; /* aligned pointer to 4*DIM*GMX_SIMD_REAL_WIDTH floats */
- int cj_ind; /* The current cj_ind index for the current list */
- int cj4_init; /* The first unitialized cj4 block */
-
- float *d2; /* Bounding box distance work array */
-
- nbnxn_cj_t *cj; /* The j-cell list */
- int cj_nalloc; /* Allocation size of cj */
-
- int ncj_noq; /* Nr. of cluster pairs without Coul for flop count */
- int ncj_hlj; /* Nr. of cluster pairs with 1/2 LJ for flop count */
-
- int *sort; /* Sort index */
- int sort_nalloc; /* Allocation size of sort */
-
- nbnxn_sci_t *sci_sort; /* Second sci array, for sorting */
- int sci_sort_nalloc; /* Allocation size of sci_sort */
-
- gmx_cache_protect_t cp1; /* Protect cache between threads */
-} nbnxn_list_work_t;
+struct NbnxnPairlistCpuWork
+{
+ // Struct for storing coordinats and bounding box for an i-entry during search
+ struct IClusterData
+ {
+ IClusterData() :
+ bb(1),
+ x(c_nbnxnCpuIClusterSize*DIM),
+ xSimd(c_nbnxnCpuIClusterSize*DIM*GMX_REAL_MAX_SIMD_WIDTH)
+ {
+ }
+
+ // The bounding boxes, pbc shifted, for each cluster
+ AlignedVector<nbnxn_bb_t> bb;
+ // The coordinates, pbc shifted, for each atom
+ std::vector<real> x;
+ // Aligned list for storing 4*DIM*GMX_SIMD_REAL_WIDTH reals
+ AlignedVector<real> xSimd;
+ };
+
+ // Protect data from cache pollution between threads
+ gmx_cache_protect_t cp0;
+
+ // Work data for generating an IEntry in the pairlist
+ IClusterData iClusterData;
+ // The current cj_ind index for the current list
+ int cj_ind;
+ // Temporary j-cluster list, used for sorting on exclusions
+ std::vector<nbnxn_cj_t> cj;
+
+ // Nr. of cluster pairs without Coulomb for flop counting
+ int ncj_noq;
+ // Nr. of cluster pairs with 1/2 LJ for flop count
+ int ncj_hlj;
+
+ // Protect data from cache pollution between threads
+ gmx_cache_protect_t cp1;
+};
-/* Function type for setting the i-atom coordinate working data */
-typedef void
- gmx_icell_set_x_t (int ci,
- real shx, real shy, real shz,
- int stride, const real *x,
- nbnxn_list_work_t *work);
+/* Working data for the actual i-supercell during pair search */
+struct NbnxnPairlistGpuWork
+{
+ struct ISuperClusterData
+ {
+ ISuperClusterData() :
+ bb(c_gpuNumClusterPerCell),
+#if NBNXN_SEARCH_BB_SIMD4
+ bbPacked(c_gpuNumClusterPerCell/STRIDE_PBB*NNBSBB_XXXX),
+#endif
+ x(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM),
+ xSimd(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM)
+ {
+ }
+
+ // The bounding boxes, pbc shifted, for each cluster
+ AlignedVector<nbnxn_bb_t> bb;
+ // As bb, but in packed xxxx format
+ AlignedVector<float> bbPacked;
+ // The coordinates, pbc shifted, for each atom
+ AlignedVector<real> x;
+ // Aligned coordinate list used for 4*DIM*GMX_SIMD_REAL_WIDTH floats
+ AlignedVector<real> xSimd;
+ };
+
+ NbnxnPairlistGpuWork() :
+ distanceBuffer(c_gpuNumClusterPerCell),
+ sci_sort({}, {gmx::PinningPolicy::PinnedIfSupported})
+ {
+ }
+
+ // Protect data from cache pollution between threads
+ gmx_cache_protect_t cp0;
+
+ // Work data for generating an i-entry in the pairlist
+ ISuperClusterData iSuperClusterData;
+ // The current j-cluster index for the current list
+ int cj_ind;
+ // Bounding box distance work array
+ AlignedVector<float> distanceBuffer;
+
+ // Buffer for sorting list entries
+ std::vector<int> sortBuffer;
+
+ // Second sci array, for sorting
+ gmx::HostVector<nbnxn_sci_t> sci_sort;
+
+ // Protect data from cache pollution between threads
+ gmx_cache_protect_t cp1;
+};
/* Local cycle count struct for profiling */
typedef struct {
int search_count;
nbnxn_cycle_t cc[enbsCCnr];
- gmx_icell_set_x_t *icell_set_x; /* Function for setting i-coords */
-
/* Thread-local work data */
mutable std::vector<nbnxn_search_work_t> work; /* Work array, one entry for each thread */
};
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
static void
clear_f_all(const nbnxn_atomdata_t *nbat, real *f)
{
- int i;
-
- for (i = 0; i < nbat->natoms*nbat->fstride; i++)
+ for (int i = 0; i < nbat->numAtoms()*nbat->fstride; i++)
{
f[i] = 0;
}
real *Vvdw,
real *Vc)
{
- int nb;
- int i, j, ind, indr;
+ const int nenergrp = nbat->params().nenergrp;
- for (nb = 0; nb < nlist; nb++)
+ for (int nb = 0; nb < nlist; nb++)
{
- for (i = 0; i < nbat->nenergrp; i++)
+ for (int i = 0; i < nenergrp; i++)
{
/* Reduce the diagonal terms */
- ind = i*nbat->nenergrp + i;
+ int ind = i*nenergrp + i;
Vvdw[ind] += nbat->out[nb].Vvdw[ind];
Vc[ind] += nbat->out[nb].Vc[ind];
/* Reduce the off-diagonal terms */
- for (j = i+1; j < nbat->nenergrp; j++)
+ for (int j = i + 1; j < nenergrp; j++)
{
/* The output should contain only one off-diagonal part */
- ind = i*nbat->nenergrp + j;
- indr = j*nbat->nenergrp + i;
+ int ind = i*nenergrp + j;
+ int indr = j*nenergrp + i;
Vvdw[ind] += nbat->out[nb].Vvdw[ind] + nbat->out[nb].Vvdw[indr];
Vc[ind] += nbat->out[nb].Vc[ind] + nbat->out[nb].Vc[indr];
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/*! \brief Pair-interaction kernel type that also calculates energies.
*/
-typedef void (nbk_func_ener)(const nbnxn_pairlist_t *nbl,
+typedef void (nbk_func_ener)(const NbnxnPairlistCpu *nbl,
const nbnxn_atomdata_t *nbat,
const interaction_const_t *ic,
rvec *shift_vec,
/*! \brief Pair-interaction kernel type that does not calculates energies.
*/
-typedef void (nbk_func_noener)(const nbnxn_pairlist_t *nbl,
+typedef void (nbk_func_noener)(const NbnxnPairlistCpu *nbl,
const nbnxn_atomdata_t *nbat,
const interaction_const_t *ic,
rvec *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
static void clearGroupEnergies(nbnxn_atomdata_output_t *out)
{
- for (int i = 0; i < out->nV; i++)
- {
- out->Vvdw[i] = 0;
- out->Vc[i] = 0;
- }
-
- for (int i = 0; i < out->nVS; i++)
- {
- out->VSvdw[i] = 0;
- }
- for (int i = 0; i < out->nVS; i++)
- {
- out->VSc[i] = 0;
- }
+ std::fill(out->Vvdw.begin(), out->Vvdw.end(), 0.0_real);
+ std::fill(out->Vc.begin(), out->Vc.end(), 0.0_real);
+ std::fill(out->VSvdw.begin(), out->VSvdw.end(), 0.0_real);
+ std::fill(out->VSc.begin(), out->VSc.end(), 0.0_real);
}
/*! \brief Reduce the group-pair energy buffers produced by a SIMD kernel
* \tparam unrollj The unroll size for j-particles in the SIMD kernel
* \param[in] numGroups The number of energy groups
* \param[in] numGroups_2log Log2 of numGroups, rounded up
- * \param[in] vVdwSimd SIMD Van der Waals energy buffers
- * \param[in] vCoulombSimd SIMD Coulomb energy buffers
- * \param[in,out] vVdw Van der Waals energy output buffer
- * \param[in,out] vCoulomb Coulomb energy output buffer
+ * \param[in,out] out Struct with energy buffers
*/
template <int unrollj> static void
reduceGroupEnergySimdBuffers(int numGroups,
int numGroups_2log,
- const real * gmx_restrict vVdwSimd,
- const real * gmx_restrict vCoulombSimd,
- real * gmx_restrict vVdw,
- real * gmx_restrict vCoulomb)
+ nbnxn_atomdata_output_t *out)
{
- const int unrollj_half = unrollj/2;
+ const int unrollj_half = unrollj/2;
/* Energies are stored in SIMD registers with size 2^numGroups_2log */
- const int numGroupsStorage = (1 << numGroups_2log);
+ const int numGroupsStorage = (1 << numGroups_2log);
+
+ const real * gmx_restrict vVdwSimd = out->VSvdw.data();
+ const real * gmx_restrict vCoulombSimd = out->VSc.data();
+ real * gmx_restrict vVdw = out->Vvdw.data();
+ real * gmx_restrict vCoulomb = out->Vc.data();
/* The size of the SIMD energy group buffer array is:
* numGroups*numGroups*numGroupsStorage*unrollj_half*simd_width
void
nbnxn_kernel_cpu(nonbonded_verlet_group_t *nbvg,
- const nbnxn_atomdata_t *nbat,
+ nbnxn_atomdata_t *nbat,
const interaction_const_t *ic,
rvec *shiftVectors,
int forceFlags,
}
}
+ const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
int vdwkt = 0;
if (ic->vdwtype == evdwCUT)
{
{
case eintmodNONE:
case eintmodPOTSHIFT:
- switch (nbat->comb_rule)
+ switch (nbatParams.comb_rule)
{
case ljcrGEOM: vdwkt = vdwktLJCUT_COMBGEOM; break;
case ljcrLB: vdwkt = vdwktLJCUT_COMBLB; break;
}
int nnbl = nbvg->nbl_lists.nnbl;
- nbnxn_pairlist_t **nbl = nbvg->nbl_lists.nbl;
-
- GMX_ASSERT(nbl[0]->nci >= 0, "nci<0, which signals an invalid pair-list");
+ NbnxnPairlistCpu **nbl = nbvg->nbl_lists.nbl;
- int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded);
+ int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded);
#pragma omp parallel for schedule(static) num_threads(nthreads)
for (int nb = 0; nb < nnbl; nb++)
{
if (clearF == enbvClearFYes)
{
- clear_f(nbat, nb, out->f);
+ clear_f(nbat, nb, out->f.data());
}
real *fshift_p;
}
else
{
- fshift_p = out->fshift;
+ fshift_p = out->fshift.data();
if (clearF == enbvClearFYes)
{
nbnxn_kernel_noener_ref[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p);
break;
#ifdef GMX_NBNXN_SIMD_2XNN
nbnxn_kernel_noener_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p);
break;
#endif
nbnxn_kernel_noener_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p);
break;
#endif
GMX_RELEASE_ASSERT(false, "Unsupported kernel architecture");
}
}
- else if (out->nV == 1)
+ else if (out->Vvdw.size() == 1)
{
/* A single energy group (pair) */
out->Vvdw[0] = 0;
nbnxn_kernel_ener_ref[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->Vvdw,
- out->Vc);
+ out->Vvdw.data(),
+ out->Vc.data());
break;
#ifdef GMX_NBNXN_SIMD_2XNN
case nbnxnk4xN_SIMD_2xNN:
nbnxn_kernel_ener_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->Vvdw,
- out->Vc);
+ out->Vvdw.data(),
+ out->Vc.data());
break;
#endif
#ifdef GMX_NBNXN_SIMD_4XN
nbnxn_kernel_ener_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->Vvdw,
- out->Vc);
+ out->Vvdw.data(),
+ out->Vc.data());
break;
#endif
default:
switch (nbvg->kernel_type)
{
case nbnxnk4x4_PlainC:
- unrollj = NBNXN_CPU_CLUSTER_I_SIZE;
+ unrollj = c_nbnxnCpuIClusterSize;
nbnxn_kernel_energrp_ref[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->Vvdw,
- out->Vc);
+ out->Vvdw.data(),
+ out->Vc.data());
break;
#ifdef GMX_NBNXN_SIMD_2XNN
case nbnxnk4xN_SIMD_2xNN:
nbnxn_kernel_energrp_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->VSvdw,
- out->VSc);
+ out->VSvdw.data(),
+ out->VSc.data());
break;
#endif
#ifdef GMX_NBNXN_SIMD_4XN
nbnxn_kernel_energrp_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
ic,
shiftVectors,
- out->f,
+ out->f.data(),
fshift_p,
- out->VSvdw,
- out->VSc);
+ out->VSvdw.data(),
+ out->VSc.data());
break;
#endif
default:
switch (unrollj)
{
case 2:
- reduceGroupEnergySimdBuffers<2>(nbat->nenergrp,
- nbat->neg_2log,
- out->VSvdw, out->VSc,
- out->Vvdw, out->Vc);
+ reduceGroupEnergySimdBuffers<2>(nbatParams.nenergrp,
+ nbatParams.neg_2log,
+ out);
break;
case 4:
- reduceGroupEnergySimdBuffers<4>(nbat->nenergrp,
- nbat->neg_2log,
- out->VSvdw, out->VSc,
- out->Vvdw, out->Vc);
+ reduceGroupEnergySimdBuffers<4>(nbatParams.nenergrp,
+ nbatParams.neg_2log,
+ out);
break;
case 8:
- reduceGroupEnergySimdBuffers<8>(nbat->nenergrp,
- nbat->neg_2log,
- out->VSvdw, out->VSc,
- out->Vvdw, out->Vc);
+ reduceGroupEnergySimdBuffers<8>(nbatParams.nenergrp,
+ nbatParams.neg_2log,
+ out);
break;
default:
GMX_RELEASE_ASSERT(false, "Unsupported j-unroll size");
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* within this function.
*
* \param[in,out] nbvg The group (local/non-local) to compute interaction for
- * \param[in] nbat The atomdata for the interactions
+ * \param[in,out] nbat The atomdata for the interactions
* \param[in] ic Non-bonded interaction constants
* \param[in] shiftVectors The PBC shift vectors
* \param[in] forceFlags Flags that tell what to compute
*/
void
nbnxn_kernel_cpu(nonbonded_verlet_group_t *nbvg,
- const nbnxn_atomdata_t *nbat,
+ nbnxn_atomdata_t *nbat,
const interaction_const_t *ic,
rvec *shiftVectors,
int forceFlags,
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
sys.path.append('../../../../../admin')
from copyright import create_copyright_header
-FileHeader = create_copyright_header('2012,2013,2014,2015')
+FileHeader = create_copyright_header('2012,2013,2014,2015,2019')
FileHeader += """/*
* Note: this file was generated by the Verlet kernel generator for
* kernel type {0}.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-{5}(const nbnxn_pairlist_t gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu gmx_unused *nbl,
{6}const nbnxn_atomdata_t gmx_unused *nbat,
{6}const interaction_const_t gmx_unused *ic,
{6}rvec gmx_unused *shift_vec,
{6}real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-{5}(const nbnxn_pairlist_t gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu gmx_unused *nbl,
{6}const nbnxn_atomdata_t gmx_unused *nbat,
{6}const interaction_const_t gmx_unused *ic,
{6}rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-{5}(const nbnxn_pairlist_t gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu gmx_unused *nbl,
{6}const nbnxn_atomdata_t gmx_unused *nbat,
{6}const interaction_const_t gmx_unused *ic,
{6}rvec gmx_unused *shift_vec,
{6}real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-{5}(const nbnxn_pairlist_t gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu gmx_unused *nbl,
{6}const nbnxn_atomdata_t gmx_unused *nbat,
{6}const interaction_const_t gmx_unused *ic,
{6}rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
static const int c_clSize = c_nbnxnGpuClusterSize;
void
-nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t *nbl,
+nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu *nbl,
const nbnxn_atomdata_t *nbat,
const interaction_const_t *iconst,
rvec *shift_vec,
int force_flags,
int clearF,
- real * f,
+ gmx::ArrayRef<real> f,
real * fshift,
real * Vc,
real * Vvdw)
{
- const nbnxn_sci_t *nbln;
- const real *x;
gmx_bool bEner;
gmx_bool bEwald;
const real *Ftab = nullptr;
real rcut2, rvdw2, rlist2;
int ntype;
real facel;
- int n;
int ish3;
int sci;
int cj4_ind0, cj4_ind1, cj4_ind;
int int_bit;
real fexcl;
real c6, c12;
- const real * shiftvec;
- real * vdwparam;
- int * type;
const nbnxn_excl_t *excl[2];
int npair_tot, npair;
if (clearF == enbvClearFYes)
{
- clear_f(nbat, 0, f);
+ clear_f(nbat, 0, f.data());
}
bEner = ((force_flags & GMX_FORCE_ENERGY) != 0);
Ftab = iconst->tabq_coul_F;
}
- rcut2 = iconst->rcoulomb*iconst->rcoulomb;
- rvdw2 = iconst->rvdw*iconst->rvdw;
+ rcut2 = iconst->rcoulomb*iconst->rcoulomb;
+ rvdw2 = iconst->rvdw*iconst->rvdw;
- rlist2 = nbl->rlist*nbl->rlist;
+ rlist2 = nbl->rlist*nbl->rlist;
- type = nbat->type;
- facel = iconst->epsfac;
- shiftvec = shift_vec[0];
- vdwparam = nbat->nbfp;
- ntype = nbat->ntype;
+ const int *type = nbat->params().type.data();
+ facel = iconst->epsfac;
+ const real *shiftvec = shift_vec[0];
+ const real *vdwparam = nbat->params().nbfp.data();
+ ntype = nbat->params().numTypes;
- x = nbat->x;
+ const real *x = nbat->x().data();
npair_tot = 0;
nhwu = 0;
nhwu_pruned = 0;
- for (n = 0; n < nbl->nsci; n++)
+ for (const nbnxn_sci_t &nbln : nbl->sci)
{
- nbln = &nbl->sci[n];
-
- ish3 = 3*nbln->shift;
+ ish3 = 3*nbln.shift;
shX = shiftvec[ish3];
shY = shiftvec[ish3+1];
shZ = shiftvec[ish3+2];
- cj4_ind0 = nbln->cj4_ind_start;
- cj4_ind1 = nbln->cj4_ind_end;
- sci = nbln->sci;
+ cj4_ind0 = nbln.cj4_ind_start;
+ cj4_ind1 = nbln.cj4_ind_end;
+ sci = nbln.sci;
vctot = 0;
Vvdwtot = 0;
- if (nbln->shift == CENTRAL &&
+ if (nbln.shift == CENTRAL &&
nbl->cj4[cj4_ind0].cj[0] == sci*c_numClPerSupercl)
{
/* we have the diagonal:
{
ja = cj*c_clSize + jc;
- if (nbln->shift == CENTRAL &&
+ if (nbln.shift == CENTRAL &&
ci == cj && ja <= ia)
{
continue;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/math/vectypes.h"
#include "gromacs/mdlib/nbnxn_pairlist.h"
#include "gromacs/mdtypes/forcerec.h"
+#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/real.h"
/* Reference (slow) kernel for nb n vs n GPU type pair lists */
void
-nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t *nbl,
+nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu *nbl,
const nbnxn_atomdata_t *nbat,
const interaction_const_t *iconst,
rvec *shift_vec,
int force_flags,
int clearF,
- real * f,
+ gmx::ArrayRef<real> f,
real * fshift,
real * Vc,
real * Vvdw);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
nbnxn_pairlist_set_t *nbl_lists = &nbvg->nbl_lists;
- GMX_ASSERT(nbl_lists->nbl[0]->nciOuter >= 0, "nciOuter<0, which signals an invalid pair-list");
+ GMX_ASSERT(nbl_lists->nbl[0]->ciOuter.size() >= nbl_lists->nbl[0]->ci.size(),
+ "Here we should either have an empty ci list or ciOuter should be >= ci");
int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded);
#pragma omp parallel for schedule(static) num_threads(nthreads)
for (int i = 0; i < nbl_lists->nnbl; i++)
{
- nbnxn_pairlist_t *nbl = nbl_lists->nbl[i];
+ NbnxnPairlistCpu *nbl = nbl_lists->nbl[i];
switch (nbvg->kernel_type)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
cj = l_cj[cjind].cj;
#ifdef ENERGY_GROUPS
- egp_cj = nbat->energrp[cj];
+ egp_cj = nbatParams.energrp[cj];
#endif
for (i = 0; i < UNROLLI; i++)
{
#ifdef CALC_ENERGIES
#ifdef ENERGY_GROUPS
- Vvdw[egp_sh_i[i]+((egp_cj>>(nbat->neg_2log*j)) & egp_mask)] += VLJ;
+ Vvdw[egp_sh_i[i] + ((egp_cj >> (nbatParams.neg_2log*j)) & egp_mask)] += VLJ;
#else
Vvdw_ci += VLJ;
/* 1 flop for LJ energy addition */
#ifdef CALC_ENERGIES
#ifdef ENERGY_GROUPS
- Vc[egp_sh_i[i]+((egp_cj>>(nbat->neg_2log*j)) & egp_mask)] += vcoul;
+ Vc[egp_sh_i[i] + ((egp_cj >> (nbatParams.neg_2log*j)) & egp_mask)] += vcoul;
#else
Vc_ci += vcoul;
/* 1 flop for Coulomb energy addition */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* the research papers on the package. Check out http://www.gromacs.org.
*/
-#define UNROLLI NBNXN_CPU_CLUSTER_I_SIZE
-#define UNROLLJ NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI 4
+#define UNROLLJ 4
+
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
/* We could use nbat->xstride and nbat->fstride, but macros might be faster */
#define X_STRIDE 3
#endif
#undef NBK_FUNC_NAME
#undef NBK_FUNC_NAME2
-(const nbnxn_pairlist_t *nbl,
+(const NbnxnPairlistCpu *nbl,
const nbnxn_atomdata_t *nbat,
const interaction_const_t *ic,
rvec *shift_vec,
#endif
)
{
- const nbnxn_ci_t *nbln;
const nbnxn_cj_t *l_cj;
- const int *type;
- const real *q;
- const real *shiftvec;
- const real *x;
- const real *nbfp;
real rcut2;
#ifdef VDW_CUTOFF_CHECK
real rvdw2;
#endif
int ntype2;
real facel;
- int n, ci, ci_sh;
+ int ci, ci_sh;
int ish, ishf;
gmx_bool do_LJ, half_LJ, do_coul;
int cjind0, cjind1, cjind;
#ifdef CALC_ENERGIES
real lje_vc;
#endif
- const real *ljc;
#endif
#ifdef CALC_COUL_RF
swF4 = 5*ic->vdw_switch.c5;
#endif
+ const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
#ifdef LJ_EWALD
lje_coeff2 = ic->ewaldcoeff_lj*ic->ewaldcoeff_lj;
lje_coeff6_6 = lje_coeff2*lje_coeff2*lje_coeff2/6.0;
lje_vc = ic->sh_lj_ewald;
#endif
- ljc = nbat->nbfp_comb;
+ const real *ljc = nbatParams.nbfp_comb.data();
#endif
#ifdef CALC_COUL_RF
#endif
#ifdef ENERGY_GROUPS
- egp_mask = (1<<nbat->neg_2log) - 1;
+ egp_mask = (1 << nbatParams.neg_2log) - 1;
#endif
- rcut2 = ic->rcoulomb*ic->rcoulomb;
+ rcut2 = ic->rcoulomb*ic->rcoulomb;
#ifdef VDW_CUTOFF_CHECK
- rvdw2 = ic->rvdw*ic->rvdw;
+ rvdw2 = ic->rvdw*ic->rvdw;
#endif
- ntype2 = nbat->ntype*2;
- nbfp = nbat->nbfp;
- q = nbat->q;
- type = nbat->type;
- facel = ic->epsfac;
- shiftvec = shift_vec[0];
- x = nbat->x;
+ ntype2 = nbatParams.numTypes*2;
+ const real *nbfp = nbatParams.nbfp.data();
+ const real *q = nbatParams.q.data();
+ const int *type = nbatParams.type.data();
+ facel = ic->epsfac;
+ const real *shiftvec = shift_vec[0];
+ const real *x = nbat->x().data();
- l_cj = nbl->cj;
+ l_cj = nbl->cj.data();
- for (n = 0; n < nbl->nci; n++)
+ for (const nbnxn_ci_t &ciEntry : nbl->ci)
{
int i, d;
- nbln = &nbl->ci[n];
-
- ish = (nbln->shift & NBNXN_CI_SHIFT);
+ ish = (ciEntry.shift & NBNXN_CI_SHIFT);
/* x, f and fshift are assumed to be stored with stride 3 */
ishf = ish*DIM;
- cjind0 = nbln->cj_ind_start;
- cjind1 = nbln->cj_ind_end;
+ cjind0 = ciEntry.cj_ind_start;
+ cjind1 = ciEntry.cj_ind_end;
/* Currently only works super-cells equal to sub-cells */
- ci = nbln->ci;
+ ci = ciEntry.ci;
ci_sh = (ish == CENTRAL ? ci : -1);
/* We have 5 LJ/C combinations, but use only three inner loops,
* inner LJ + C for full-LJ + C
* inner LJ for full-LJ + no-C / half-LJ + no-C
*/
- do_LJ = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
- do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
- half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+ do_LJ = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+ do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+ half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
#ifdef CALC_ENERGIES
#ifdef LJ_EWALD
#else
for (i = 0; i < UNROLLI; i++)
{
- egp_sh_i[i] = ((nbat->energrp[ci]>>(i*nbat->neg_2log)) & egp_mask)*nbat->nenergrp;
+ egp_sh_i[i] = ((nbatParams.energrp[ci] >> (i*nbatParams.neg_2log)) & egp_mask)*nbatParams.nenergrp;
}
#endif
#endif
#endif
#endif
- if (l_cj[nbln->cj_ind_start].cj == ci_sh)
+ if (l_cj[ciEntry.cj_ind_start].cj == ci_sh)
{
for (i = 0; i < UNROLLI; i++)
{
int egp_ind;
#ifdef ENERGY_GROUPS
- egp_ind = egp_sh_i[i] + ((nbat->energrp[ci]>>(i*nbat->neg_2log)) & egp_mask);
+ egp_ind = egp_sh_i[i] + ((nbatParams.energrp[ci] >> (i*nbatParams.neg_2log)) & egp_mask);
#else
egp_ind = 0;
#endif
#ifdef LJ_EWALD
/* LJ Ewald self interaction */
- Vvdw[egp_ind] += 0.5*nbat->nbfp[nbat->type[ci*UNROLLI+i]*(nbat->ntype + 1)*2]/6*lje_coeff6_6;
+ Vvdw[egp_ind] += 0.5*nbatParams.nbfp[nbatParams.type[ci*UNROLLI+i]*(nbatParams.numTypes + 1)*2]/6*lje_coeff6_6;
#endif
}
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/gmxassert.h"
-/* Prune a single nbnxn_pairlist_t entry with distance rlistInner */
+/* Prune a single NbnxnPairlistCpu entry with distance rlistInner */
void
-nbnxn_kernel_prune_ref(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_ref(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner)
{
- const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter;
- nbnxn_ci_t * gmx_restrict ciInner = nbl->ci;
+ /* We avoid push_back() for efficiency reasons and resize after filling */
+ nbl->ci.resize(nbl->ciOuter.size());
+ nbl->cj.resize(nbl->cjOuter.size());
- const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter;
- nbnxn_cj_t * gmx_restrict cjInner = nbl->cj;
+ const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter.data();
+ nbnxn_ci_t * gmx_restrict ciInner = nbl->ci.data();
+
+ const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter.data();
+ nbnxn_cj_t * gmx_restrict cjInner = nbl->cj.data();
const real * gmx_restrict shiftvec = shift_vec[0];
- const real * gmx_restrict x = nbat->x;
+ const real * gmx_restrict x = nbat->x().data();
const real rlist2 = rlistInner*rlistInner;
GMX_ASSERT(c_xStride == nbat->xstride, "xStride should match nbat->xstride");
constexpr int c_xiStride = 3;
- constexpr int c_iUnroll = NBNXN_CPU_CLUSTER_I_SIZE;
- constexpr int c_jUnroll = NBNXN_CPU_CLUSTER_I_SIZE;
+ constexpr int c_iUnroll = c_nbnxnCpuIClusterSize;
+ constexpr int c_jUnroll = c_nbnxnCpuIClusterSize;
/* Initialize the new list as empty and add pairs that are in range */
- int nciInner = 0;
- int ncjInner = 0;
- for (int ciIndex = 0; ciIndex < nbl->nciOuter; ciIndex++)
+ int nciInner = 0;
+ int ncjInner = 0;
+ const int nciOuter = nbl->ciOuter.size();
+ for (int ciIndex = 0; ciIndex < nciOuter; ciIndex++)
{
const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[ciIndex];
}
}
- nbl->nci = nciInner;
+ nbl->ci.resize(nciInner);
+ nbl->cj.resize(ncjInner);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/real.h"
struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
*
* Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
* all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
*/
void
-nbnxn_kernel_prune_ref(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_ref(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* The minor index of the array goes over both the LJ combination rules,
* which is only supported by plain cut-off, and the LJ switch/PME functions.
*/
-static p_nbk_func_noener nbnxn_kernel_noener_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_noener nbnxn_kernel_noener_simd_2xnn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn,
},
};
-static p_nbk_func_ener nbnxn_kernel_ener_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_ener_simd_2xnn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn,
},
};
-static p_nbk_func_ener nbnxn_kernel_energrp_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_energrp_simd_2xnn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#error "Need to define GMX_SIMD_J_UNROLL_SIZE before including the 2xnn kernel common header file"
#endif
-#define UNROLLI NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI 4
#define UNROLLJ (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
+
/* The stride of all the atom data arrays is equal to half the SIMD width */
#define STRIDE UNROLLJ
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
int egps_j;
#if UNROLLJ == 2
- egps_j = nbat->energrp[cj>>1];
+ egps_j = nbatParams.energrp[cj >> 1];
egp_jj[0] = ((egps_j >> ((cj & 1)*egps_jshift)) & egps_jmask)*egps_jstride;
#else
/* We assume UNROLLI <= UNROLLJ */
for (jdi = 0; jdi < UNROLLJ/UNROLLI; jdi++)
{
int jj;
- egps_j = nbat->energrp[cj*(UNROLLJ/UNROLLI)+jdi];
+ egps_j = nbatParams.energrp[cj*(UNROLLJ/UNROLLI) + jdi];
for (jj = 0; jj < (UNROLLI/2); jj++)
{
egp_jj[jdi*(UNROLLI/2)+jj] = ((egps_j >> (jj*egps_jshift)) & egps_jmask)*egps_jstride;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
using namespace gmx;
- const nbnxn_ci_t *nbln;
const nbnxn_cj_t *l_cj;
- const real *q;
- const real *shiftvec;
- const real *x;
- real facel;
- int n, ci, ci_sh;
+ int ci, ci_sh;
int ish, ish3;
gmx_bool do_LJ, half_LJ, do_coul;
int cjind0, cjind1, cjind;
SimdBool diagonal_mask1_S0, diagonal_mask1_S2;
#endif
- unsigned *exclusion_filter;
SimdBitMask filter_S0, filter_S2;
SimdReal zero_S(0.0);
#endif
#ifdef LJ_COMB_LB
- const real *ljc;
-
SimdReal hsig_i_S0, seps_i_S0;
SimdReal hsig_i_S2, seps_i_S2;
#else
alignas(GMX_SIMD_ALIGNMENT) real pvdw_c6[2*UNROLLI*UNROLLJ];
real *pvdw_c12 = pvdw_c6 + UNROLLI*UNROLLJ;
#endif
-
-#if defined LJ_COMB_GEOM || defined LJ_EWALD_GEOM
- const real *ljc;
-#endif
#endif /* LJ_COMB_LB */
SimdReal minRsq_S;
int npair = 0;
#endif
+ const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
#if defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined LJ_EWALD_GEOM
- ljc = nbat->lj_comb;
+ const real * gmx_restrict ljc = nbatParams.lj_comb.data();
#endif
#if !(defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined FIX_LJ_C)
/* No combination rule used */
- real *nbfp_ptr = nbat->nbfp_aligned;
- const int *type = nbat->type;
+ const real * gmx_restrict nbfp_ptr = nbatParams.nbfp_aligned.data();
+ const int * gmx_restrict type = nbatParams.type.data();
#endif
/* Load j-i for the first i */
- diagonal_jmi_S = load<SimdReal>(nbat->simd_2xnn_diagonal_j_minus_i);
+ diagonal_jmi_S = load<SimdReal>(nbat->simdMasks.diagonal_2xnn_j_minus_i.data());
/* Generate all the diagonal masks as comparison results */
#if UNROLLI == UNROLLJ
diagonal_mask_S0 = (zero_S < diagonal_jmi_S);
/* Load masks for topology exclusion masking. filter_stride is
static const, so the conditional will be optimized away. */
#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
- exclusion_filter = nbat->simd_exclusion_filter64;
+ const std::uint64_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter64.data();
#else
- exclusion_filter = nbat->simd_exclusion_filter;
+ const std::uint32_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter.data();
#endif
/* Here we cast the exclusion filters from unsigned * to int * or real *.
rcvdw2_S = SimdReal(ic->rvdw*ic->rvdw);
#endif
- minRsq_S = SimdReal(NBNXN_MIN_RSQ);
+ minRsq_S = SimdReal(NBNXN_MIN_RSQ);
- q = nbat->q;
- facel = ic->epsfac;
- shiftvec = shift_vec[0];
- x = nbat->x;
+ const real * gmx_restrict q = nbatParams.q.data();
+ const real facel = ic->epsfac;
+ const real * gmx_restrict shiftvec = shift_vec[0];
+ const real * gmx_restrict x = nbat->x().data();
#ifdef FIX_LJ_C
#endif /* FIX_LJ_C */
#ifdef ENERGY_GROUPS
- egps_ishift = nbat->neg_2log;
+ egps_ishift = nbatParams.neg_2log;
egps_imask = (1<<egps_ishift) - 1;
- egps_jshift = 2*nbat->neg_2log;
+ egps_jshift = 2*nbatParams.neg_2log;
egps_jmask = (1<<egps_jshift) - 1;
egps_jstride = (UNROLLJ>>1)*UNROLLJ;
/* Major division is over i-particle energy groups, determine the stride */
- Vstride_i = nbat->nenergrp*(1<<nbat->neg_2log)*egps_jstride;
+ Vstride_i = nbatParams.nenergrp*(1 << nbatParams.neg_2log)*egps_jstride;
#endif
- l_cj = nbl->cj;
+ l_cj = nbl->cj.data();
ninner = 0;
- for (n = 0; n < nbl->nci; n++)
+ for (const nbnxn_ci_t &ciEntry : nbl->ci)
{
- nbln = &nbl->ci[n];
-
- ish = (nbln->shift & NBNXN_CI_SHIFT);
+ ish = (ciEntry.shift & NBNXN_CI_SHIFT);
ish3 = ish*3;
- cjind0 = nbln->cj_ind_start;
- cjind1 = nbln->cj_ind_end;
- ci = nbln->ci;
+ cjind0 = ciEntry.cj_ind_start;
+ cjind1 = ciEntry.cj_ind_end;
+ ci = ciEntry.ci;
ci_sh = (ish == CENTRAL ? ci : -1);
shX_S = SimdReal(shiftvec[ish3]);
* inner LJ + C for full-LJ + C
* inner LJ for full-LJ + no-C / half-LJ + no-C
*/
- do_LJ = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
- do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
- half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+ do_LJ = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+ do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+ half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
#ifdef ENERGY_GROUPS
- egps_i = nbat->energrp[ci];
+ egps_i = nbatParams.energrp[ci];
{
int ia, egp_ia;
gmx_bool do_self = do_coul;
#endif
#if UNROLLJ == 4
- if (do_self && l_cj[nbln->cj_ind_start].cj == ci_sh)
+ if (do_self && l_cj[ciEntry.cj_ind_start].cj == ci_sh)
#endif
#if UNROLLJ == 8
- if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh>>1))
+ if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh>>1))
#endif
{
if (do_coul)
{
real c6_i;
- c6_i = nbat->nbfp[nbat->type[sci+ia]*(nbat->ntype + 1)*2]/6;
+ c6_i = nbatParams.nbfp[nbatParams.type[sci+ia]*(nbatParams.numTypes + 1)*2]/6;
#ifdef ENERGY_GROUPS
vvdwtp[ia][((egps_i>>(ia*egps_ishift)) & egps_imask)*egps_jstride]
#else
c12s_S2 = loadU1DualHsimd(ljc+sci2+STRIDE+2);
}
#elif !defined LJ_COMB_LB && !defined FIX_LJ_C
- const real *nbfp0 = nbfp_ptr + type[sci ]*nbat->ntype*c_simdBestPairAlignment;
- const real *nbfp1 = nbfp_ptr + type[sci+1]*nbat->ntype*c_simdBestPairAlignment;
+ const int numTypes = nbatParams.numTypes;
+ const real *nbfp0 = nbfp_ptr + type[sci ]*numTypes*c_simdBestPairAlignment;
+ const real *nbfp1 = nbfp_ptr + type[sci+1]*numTypes*c_simdBestPairAlignment;
const real *nbfp2 = nullptr, *nbfp3 = nullptr;
if (!half_LJ)
{
- nbfp2 = nbfp_ptr + type[sci+2]*nbat->ntype*c_simdBestPairAlignment;
- nbfp3 = nbfp_ptr + type[sci+3]*nbat->ntype*c_simdBestPairAlignment;
+ nbfp2 = nbfp_ptr + type[sci+2]*numTypes*c_simdBestPairAlignment;
+ nbfp3 = nbfp_ptr + type[sci+3]*numTypes*c_simdBestPairAlignment;
}
#endif
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */
void
-nbnxn_kernel_prune_2xnn(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner)
{
#ifdef GMX_NBNXN_SIMD_2XNN
using namespace gmx;
- const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter;
- nbnxn_ci_t * gmx_restrict ciInner = nbl->ci;
- const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter;
- nbnxn_cj_t * gmx_restrict cjInner = nbl->cj;
+ /* We avoid push_back() for efficiency reasons and resize after filling */
+ nbl->ci.resize(nbl->ciOuter.size());
+ nbl->cj.resize(nbl->cjOuter.size());
+
+ const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter.data();
+ nbnxn_ci_t * gmx_restrict ciInner = nbl->ci.data();
+
+ const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter.data();
+ nbnxn_cj_t * gmx_restrict cjInner = nbl->cj.data();
const real * gmx_restrict shiftvec = shift_vec[0];
- const real * gmx_restrict x = nbat->x;
+ const real * gmx_restrict x = nbat->x().data();
const SimdReal rlist2_S(rlistInner*rlistInner);
- /* Initialize the new list as empty and add pairs that are in range */
- int nciInner = 0;
- int ncjInner = 0;
- for (int i = 0; i < nbl->nciOuter; i++)
+ /* Initialize the new list count as empty and add pairs that are in range */
+ int nciInner = 0;
+ int ncjInner = 0;
+ const int nciOuter = nbl->ciOuter.size();
+ for (int i = 0; i < nciOuter; i++)
{
const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[i];
}
}
- nbl->nci = nciInner;
+ nbl->ci.resize(nciInner);
+ nbl->cj.resize(ncjInner);
#else /* GMX_NBNXN_SIMD_2XNN */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/real.h"
struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
*
* Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
* all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
*/
void
-nbnxn_kernel_prune_2xnn(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifdef CALC_ENERGIES
void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
real gmx_unused *Vc)
#else /* CALC_ENERGIES */
void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu gmx_unused *nbl,
const nbnxn_atomdata_t gmx_unused *nbat,
const interaction_const_t gmx_unused *ic,
rvec gmx_unused *shift_vec,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* The minor index of the array goes over both the LJ combination rules,
* which is only supported by plain cut-off, and the LJ switch/PME functions.
*/
-static p_nbk_func_noener nbnxn_kernel_noener_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_noener nbnxn_kernel_noener_simd_4xn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn,
},
};
-static p_nbk_func_ener nbnxn_kernel_ener_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_ener_simd_4xn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn,
},
};
-static p_nbk_func_ener nbnxn_kernel_energrp_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_energrp_simd_4xn[coulktNR][vdwktNR] =
{
{
nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#error "Need to define GMX_SIMD_J_UNROLL_SIZE before including the 4xn kernel common header file"
#endif
-#define UNROLLI NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI 4
#define UNROLLJ (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
+
/* The stride of all the atom data arrays is max(UNROLLI,unrollj) */
#if GMX_SIMD_REAL_WIDTH >= UNROLLI
#define STRIDE (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
SimdBitMask gmx_unused filter_S1,
SimdBitMask gmx_unused filter_S2,
SimdBitMask gmx_unused filter_S3,
- real gmx_unused *simd_interaction_array,
+ const real gmx_unused *simd_interaction_array,
gmx::SimdBool *interact_S0,
gmx::SimdBool *interact_S1,
gmx::SimdBool *interact_S2,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
gmx_load_simd_4xn_interactions(l_cj[cjind].excl,
filter_S0, filter_S1,
filter_S2, filter_S3,
- nbat->simd_interaction_array,
+ nbat->simdMasks.interaction_array.data(),
&interact_S0, &interact_S1,
&interact_S2, &interact_S3);
#endif /* CHECK_EXCLS */
{
int egps_j;
#if UNROLLJ == 2
- egps_j = nbat->energrp[cj>>1];
+ egps_j = nbatParams.energrp[cj >> 1];
egp_jj[0] = ((egps_j >> ((cj & 1)*egps_jshift)) & egps_jmask)*egps_jstride;
#else
/* We assume UNROLLI <= UNROLLJ */
for (jdi = 0; jdi < UNROLLJ/UNROLLI; jdi++)
{
int jj;
- egps_j = nbat->energrp[cj*(UNROLLJ/UNROLLI)+jdi];
+ egps_j = nbatParams.energrp[cj*(UNROLLJ/UNROLLI) + jdi];
for (jj = 0; jj < (UNROLLI/2); jj++)
{
egp_jj[jdi*(UNROLLI/2)+jj] = ((egps_j >> (jj*egps_jshift)) & egps_jmask)*egps_jstride;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
using namespace gmx;
- const nbnxn_ci_t *nbln;
const nbnxn_cj_t *l_cj;
- const real * q;
- const real *shiftvec;
- const real *x;
- real facel;
- int n, ci, ci_sh;
+ int ci, ci_sh;
int ish, ish3;
gmx_bool do_LJ, half_LJ, do_coul;
int cjind0, cjind1, cjind;
SimdBool diagonal_mask1_S0, diagonal_mask1_S1, diagonal_mask1_S2, diagonal_mask1_S3;
#endif
-#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
- std::uint64_t *exclusion_filter;
-#else
- std::uint32_t *exclusion_filter;
-#endif
SimdBitMask filter_S0, filter_S1, filter_S2, filter_S3;
SimdReal zero_S(0.0);
#endif
#ifdef LJ_COMB_LB
- const real *ljc;
-
SimdReal hsig_i_S0, seps_i_S0;
SimdReal hsig_i_S1, seps_i_S1;
SimdReal hsig_i_S2, seps_i_S2;
SimdReal hsig_i_S3, seps_i_S3;
-#else
-
-#if defined LJ_COMB_GEOM || defined LJ_EWALD_GEOM
- const real *ljc;
-#endif
#endif /* LJ_COMB_LB */
SimdReal minRsq_S;
int npair = 0;
#endif
+ const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
#if defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined LJ_EWALD_GEOM
- ljc = nbat->lj_comb;
+ const real * gmx_restrict ljc = nbatParams.lj_comb.data();
#endif
#if !(defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined FIX_LJ_C)
/* No combination rule used */
- real *nbfp_ptr = nbat->nbfp_aligned;
- const int *type = nbat->type;
+ const real * gmx_restrict nbfp_ptr = nbatParams.nbfp_aligned.data();
+ const int * gmx_restrict type = nbatParams.type.data();
#endif
/* Load j-i for the first i */
- diagonal_jmi_S = load<SimdReal>(nbat->simd_4xn_diagonal_j_minus_i);
+ diagonal_jmi_S = load<SimdReal>(nbat->simdMasks.diagonal_4xn_j_minus_i.data());
/* Generate all the diagonal masks as comparison results */
#if UNROLLI == UNROLLJ
diagonal_mask_S0 = (zero_S < diagonal_jmi_S);
#if UNROLLI == 2*UNROLLJ
/* Load j-i for the second half of the j-cluster */
- diagonal_jmi_S = load<SimdReal>(nbat->simd_4xn_diagonal_j_minus_i + UNROLLJ);
+ diagonal_jmi_S = load<SimdReal>(nbat->simdMasks.diagonal_4xn_j_minus_i.data() + UNROLLJ);
#endif
diagonal_mask1_S0 = (zero_S < diagonal_jmi_S);
#endif
#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
- exclusion_filter = nbat->simd_exclusion_filter64;
+ const std::uint64_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter64.data();
#else
- exclusion_filter = nbat->simd_exclusion_filter;
+ const std::uint32_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter.data();
#endif
/* Here we cast the exclusion filters from unsigned * to int * or real *.
rcvdw2_S = SimdReal(ic->rvdw*ic->rvdw);
#endif
- minRsq_S = SimdReal(NBNXN_MIN_RSQ);
+ minRsq_S = SimdReal(NBNXN_MIN_RSQ);
- q = nbat->q;
- facel = ic->epsfac;
- shiftvec = shift_vec[0];
- x = nbat->x;
+ const real * gmx_restrict q = nbatParams.q.data();
+ const real facel = ic->epsfac;
+ const real * gmx_restrict shiftvec = shift_vec[0];
+ const real * gmx_restrict x = nbat->x().data();
#ifdef FIX_LJ_C
alignas(GMX_SIMD_ALIGNMENT) real pvdw_c6[2*UNROLLI*UNROLLJ];
#endif /* FIX_LJ_C */
#ifdef ENERGY_GROUPS
- egps_ishift = nbat->neg_2log;
+ egps_ishift = nbatParams.neg_2log;
egps_imask = (1<<egps_ishift) - 1;
- egps_jshift = 2*nbat->neg_2log;
+ egps_jshift = 2*nbatParams.neg_2log;
egps_jmask = (1<<egps_jshift) - 1;
egps_jstride = (UNROLLJ>>1)*UNROLLJ;
/* Major division is over i-particle energy groups, determine the stride */
- Vstride_i = nbat->nenergrp*(1<<nbat->neg_2log)*egps_jstride;
+ Vstride_i = nbatParams.nenergrp*(1 << nbatParams.neg_2log)*egps_jstride;
#endif
- l_cj = nbl->cj;
+ l_cj = nbl->cj.data();
ninner = 0;
- for (n = 0; n < nbl->nci; n++)
+ for (const nbnxn_ci_t &ciEntry : nbl->ci)
{
- nbln = &nbl->ci[n];
-
- ish = (nbln->shift & NBNXN_CI_SHIFT);
+ ish = (ciEntry.shift & NBNXN_CI_SHIFT);
ish3 = ish*3;
- cjind0 = nbln->cj_ind_start;
- cjind1 = nbln->cj_ind_end;
- ci = nbln->ci;
+ cjind0 = ciEntry.cj_ind_start;
+ cjind1 = ciEntry.cj_ind_end;
+ ci = ciEntry.ci;
ci_sh = (ish == CENTRAL ? ci : -1);
shX_S = SimdReal(shiftvec[ish3]);
* inner LJ + C for full-LJ + C
* inner LJ for full-LJ + no-C / half-LJ + no-C
*/
- do_LJ = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
- do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
- half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+ do_LJ = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+ do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+ half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
#ifdef ENERGY_GROUPS
- egps_i = nbat->energrp[ci];
+ egps_i = nbatParams.energrp[ci];
{
int ia, egp_ia;
gmx_bool do_self = do_coul;
#endif
#if UNROLLJ == 4
- if (do_self && l_cj[nbln->cj_ind_start].cj == ci_sh)
+ if (do_self && l_cj[ciEntry.cj_ind_start].cj == ci_sh)
#endif
#if UNROLLJ == 2
- if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh<<1))
+ if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh<<1))
#endif
#if UNROLLJ == 8
- if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh>>1))
+ if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh>>1))
#endif
{
if (do_coul)
{
real c6_i;
- c6_i = nbat->nbfp[nbat->type[sci+ia]*(nbat->ntype + 1)*2]/6;
+ c6_i = nbatParams.nbfp[nbatParams.type[sci+ia]*(nbatParams.numTypes + 1)*2]/6;
#ifdef ENERGY_GROUPS
vvdwtp[ia][((egps_i>>(ia*egps_ishift)) & egps_imask)*egps_jstride]
#else
c12s_S3 = setZero();
}
#else
- const real *nbfp0 = nbfp_ptr + type[sci ]*nbat->ntype*c_simdBestPairAlignment;
- const real *nbfp1 = nbfp_ptr + type[sci+1]*nbat->ntype*c_simdBestPairAlignment;
+ const int numTypes = nbatParams.numTypes;
+ const real *nbfp0 = nbfp_ptr + type[sci ]*numTypes*c_simdBestPairAlignment;
+ const real *nbfp1 = nbfp_ptr + type[sci+1]*numTypes*c_simdBestPairAlignment;
const real *nbfp2 = nullptr, *nbfp3 = nullptr;
if (!half_LJ)
{
- nbfp2 = nbfp_ptr + type[sci+2]*nbat->ntype*c_simdBestPairAlignment;
- nbfp3 = nbfp_ptr + type[sci+3]*nbat->ntype*c_simdBestPairAlignment;
+ nbfp2 = nbfp_ptr + type[sci+2]*numTypes*c_simdBestPairAlignment;
+ nbfp3 = nbfp_ptr + type[sci+3]*numTypes*c_simdBestPairAlignment;
}
#endif
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */
void
-nbnxn_kernel_prune_4xn(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_4xn(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner)
{
#ifdef GMX_NBNXN_SIMD_4XN
using namespace gmx;
- const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter;
- nbnxn_ci_t * gmx_restrict ciInner = nbl->ci;
- const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter;
- nbnxn_cj_t * gmx_restrict cjInner = nbl->cj;
+ /* We avoid push_back() for efficiency reasons and resize after filling */
+ nbl->ci.resize(nbl->ciOuter.size());
+ nbl->cj.resize(nbl->cjOuter.size());
+
+ const nbnxn_ci_t * gmx_restrict ciOuter = nbl->ciOuter.data();
+ nbnxn_ci_t * gmx_restrict ciInner = nbl->ci.data();
+
+ const nbnxn_cj_t * gmx_restrict cjOuter = nbl->cjOuter.data();
+ nbnxn_cj_t * gmx_restrict cjInner = nbl->cj.data();
const real * gmx_restrict shiftvec = shift_vec[0];
- const real * gmx_restrict x = nbat->x;
+ const real * gmx_restrict x = nbat->x().data();
const SimdReal rlist2_S(rlistInner*rlistInner);
- /* Initialize the new list as empty and add pairs that are in range */
- int nciInner = 0;
- int ncjInner = 0;
- for (int i = 0; i < nbl->nciOuter; i++)
+ /* Initialize the new list count as empty and add pairs that are in range */
+ int nciInner = 0;
+ int ncjInner = 0;
+ const int nciOuter = nbl->ciOuter.size();
+ for (int i = 0; i < nciOuter; i++)
{
const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[i];
}
}
- nbl->nci = nciInner;
+ nbl->ci.resize(nciInner);
+ nbl->cj.resize(ncjInner);
#else /* GMX_NBNXN_SIMD_4XN */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/real.h"
struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
*
* Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
* all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
*/
void
-nbnxn_kernel_prune_4xn(nbnxn_pairlist_t * nbl,
+nbnxn_kernel_prune_4xn(NbnxnPairlistCpu * nbl,
const nbnxn_atomdata_t * nbat,
const rvec * gmx_restrict shift_vec,
real rlistInner);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
/* HtoD x, q */
- ocl_copy_H2D_async(adat->xq, nbatom->x + adat_begin * 4, adat_begin*sizeof(float)*4,
+ ocl_copy_H2D_async(adat->xq, nbatom->x().data() + adat_begin * 4, adat_begin*sizeof(float)*4,
adat_len * sizeof(float) * 4, stream, bDoTime ? t->nb_h2d[iloc].fetchNextEvent() : nullptr);
if (bDoTime)
* (and energies/shift forces if required).
*/
void nbnxn_gpu_launch_cpyback(gmx_nbnxn_ocl_t *nb,
- const struct nbnxn_atomdata_t *nbatom,
+ struct nbnxn_atomdata_t *nbatom,
int flags,
int aloc,
bool haveOtherWork)
}
/* DtoH f */
- ocl_copy_D2H_async(nbatom->out[0].f + adat_begin * 3, adat->f, adat_begin*3*sizeof(float),
+ ocl_copy_D2H_async(nbatom->out[0].f.data() + adat_begin * 3, adat->f, adat_begin*3*sizeof(float),
(adat_len)* adat->f_elem_size, stream, bDoTime ? t->nb_d2h[iloc].fetchNextEvent() : nullptr);
/* kick off work */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/* An element of the shift_vec device buffer has the same size as one element
of the host side shift_vec buffer. */
- ad->shift_vec_elem_size = sizeof(*nbnxn_atomdata_t::shift_vec);
+ ad->shift_vec_elem_size = sizeof(*nbnxn_atomdata_t::shift_vec.data());
ad->shift_vec = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY,
SHIFTS * ad->shift_vec_elem_size, nullptr, &cl_error);
static void init_nbparam(cl_nbparam_t *nbp,
const interaction_const_t *ic,
const NbnxnListParameters *listParams,
- const nbnxn_atomdata_t *nbat,
+ const nbnxn_atomdata_t::Params &nbatParams,
const gmx_device_runtime_data_t *runData)
{
cl_int cl_error;
set_cutoff_parameters(nbp, ic, listParams);
map_interaction_types_to_gpu_kernel_flavors(ic,
- nbat->comb_rule,
+ nbatParams.comb_rule,
&(nbp->eeltype),
&(nbp->vdwtype));
{
if (ic->ljpme_comb_rule == ljcrGEOM)
{
- GMX_ASSERT(nbat->comb_rule == ljcrGEOM, "Combination rule mismatch!");
+ GMX_ASSERT(nbatParams.comb_rule == ljcrGEOM, "Combination rule mismatch!");
}
else
{
- GMX_ASSERT(nbat->comb_rule == ljcrLB, "Combination rule mismatch!");
+ GMX_ASSERT(nbatParams.comb_rule == ljcrLB, "Combination rule mismatch!");
}
}
/* generate table for PME */
("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
}
- int nnbfp = 2*nbat->ntype*nbat->ntype;
- int nnbfp_comb = 2*nbat->ntype;
+ const int nnbfp = 2*nbatParams.numTypes*nbatParams.numTypes;
+ const int nnbfp_comb = 2*nbatParams.numTypes;
{
/* Switched from using textures to using buffers */
&array_format, nnbfp, 1, 0, nbat->nbfp, &cl_error);
*/
- nbp->nbfp_climg2d = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
- nnbfp*sizeof(cl_float), nbat->nbfp, &cl_error);
+ nbp->nbfp_climg2d =
+ clCreateBuffer(runData->context,
+ CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
+ nnbfp*sizeof(cl_float),
+ const_cast<float *>(nbatParams.nbfp.data()),
+ &cl_error);
GMX_RELEASE_ASSERT(cl_error == CL_SUCCESS,
("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
// TODO: decide which alternative is most efficient - textures or buffers.
/* nbp->nbfp_comb_climg2d = clCreateImage2D(runData->context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
&array_format, nnbfp_comb, 1, 0, nbat->nbfp_comb, &cl_error);*/
- nbp->nbfp_comb_climg2d = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
- nnbfp_comb*sizeof(cl_float), nbat->nbfp_comb, &cl_error);
+ nbp->nbfp_comb_climg2d =
+ clCreateBuffer(runData->context,
+ CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
+ nnbfp_comb*sizeof(cl_float),
+ const_cast<float *>(nbatParams.nbfp_comb.data()),
+ &cl_error);
GMX_RELEASE_ASSERT(cl_error == CL_SUCCESS,
("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
}
static void nbnxn_ocl_init_const(gmx_nbnxn_ocl_t *nb,
const interaction_const_t *ic,
const NbnxnListParameters *listParams,
- const nbnxn_atomdata_t *nbat)
+ const nbnxn_atomdata_t::Params &nbatParams)
{
- init_atomdata_first(nb->atdat, nbat->ntype, nb->dev_rundata);
- init_nbparam(nb->nbparam, ic, listParams, nbat, nb->dev_rundata);
+ init_atomdata_first(nb->atdat, nbatParams.numTypes, nb->dev_rundata);
+ init_nbparam(nb->nbparam, ic, listParams, nbatParams, nb->dev_rundata);
}
init_timings(nb->timings);
}
- nbnxn_ocl_init_const(nb, ic, listParams, nbat);
+ nbnxn_ocl_init_const(nb, ic, listParams, nbat->params());
/* Enable LJ param manual prefetch for AMD or Intel or if we request through env. var.
* TODO: decide about NVIDIA
//! This function is documented in the header file
void nbnxn_gpu_init_pairlist(gmx_nbnxn_ocl_t *nb,
- const nbnxn_pairlist_t *h_plist,
+ const NbnxnPairlistGpu *h_plist,
int iloc)
{
char sbuf[STRLEN];
// Timing accumulation should happen only if there was work to do
// because getLastRangeTime() gets skipped with empty lists later
// which leads to the counter not being reset.
- bool bDoTime = ((nb->bDoTime == CL_TRUE) && h_plist->nsci > 0);
+ bool bDoTime = ((nb->bDoTime == CL_TRUE) && !h_plist->sci.empty());
cl_command_queue stream = nb->stream[iloc];
cl_plist_t *d_plist = nb->plist[iloc];
// TODO most of this function is same in CUDA and OpenCL, move into the header
Context context = nb->dev_rundata->context;
- reallocateDeviceBuffer(&d_plist->sci, h_plist->nsci,
+ reallocateDeviceBuffer(&d_plist->sci, h_plist->sci.size(),
&d_plist->nsci, &d_plist->sci_nalloc, context);
- copyToDeviceBuffer(&d_plist->sci, h_plist->sci, 0, h_plist->nsci,
+ copyToDeviceBuffer(&d_plist->sci, h_plist->sci.data(), 0, h_plist->sci.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
- reallocateDeviceBuffer(&d_plist->cj4, h_plist->ncj4,
+ reallocateDeviceBuffer(&d_plist->cj4, h_plist->cj4.size(),
&d_plist->ncj4, &d_plist->cj4_nalloc, context);
- copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4, 0, h_plist->ncj4,
+ copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4.data(), 0, h_plist->cj4.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
- reallocateDeviceBuffer(&d_plist->imask, h_plist->ncj4*c_nbnxnGpuClusterpairSplit,
+ reallocateDeviceBuffer(&d_plist->imask, h_plist->cj4.size()*c_nbnxnGpuClusterpairSplit,
&d_plist->nimask, &d_plist->imask_nalloc, context);
- reallocateDeviceBuffer(&d_plist->excl, h_plist->nexcl,
+ reallocateDeviceBuffer(&d_plist->excl, h_plist->excl.size(),
&d_plist->nexcl, &d_plist->excl_nalloc, context);
- copyToDeviceBuffer(&d_plist->excl, h_plist->excl, 0, h_plist->nexcl,
+ copyToDeviceBuffer(&d_plist->excl, h_plist->excl.data(), 0, h_plist->excl.size(),
stream, GpuApiCallBehavior::Async,
bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
/* only if we have a dynamic box */
if (nbatom->bDynamicBox || !adat->bShiftVecUploaded)
{
- ocl_copy_H2D_async(adat->shift_vec, nbatom->shift_vec, 0,
+ ocl_copy_H2D_async(adat->shift_vec, nbatom->shift_vec.data(), 0,
SHIFTS * adat->shift_vec_elem_size, ls, nullptr);
adat->bShiftVecUploaded = CL_TRUE;
}
cl_atomdata_t *d_atdat = nb->atdat;
cl_command_queue ls = nb->stream[eintLocal];
- natoms = nbat->natoms;
+ natoms = nbat->numAtoms();
realloced = false;
if (bDoTime)
if (useLjCombRule(nb->nbparam->vdwtype))
{
- ocl_copy_H2D_async(d_atdat->lj_comb, nbat->lj_comb, 0,
+ ocl_copy_H2D_async(d_atdat->lj_comb, nbat->params().lj_comb.data(), 0,
natoms*sizeof(cl_float2), ls, bDoTime ? timers->atdat.fetchNextEvent() : nullptr);
}
else
{
- ocl_copy_H2D_async(d_atdat->atom_types, nbat->type, 0,
+ ocl_copy_H2D_async(d_atdat->atom_types, nbat->params().type.data(), 0,
natoms*sizeof(int), ls, bDoTime ? timers->atdat.fetchNextEvent() : nullptr);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cstddef>
+#include "gromacs/gpu_utils/hostallocator.h"
#include "gromacs/math/vectypes.h"
#include "gromacs/mdlib/nbnxn_consts.h"
#include "gromacs/mdtypes/nblist.h"
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/bitmask.h"
+#include "gromacs/utility/defaultinitializationallocator.h"
#include "gromacs/utility/real.h"
+struct NbnxnPairlistCpuWork;
+struct NbnxnPairlistGpuWork;
struct tMPI_Atomic;
+/* Convenience type for vector with aligned memory */
+template<typename T>
+using AlignedVector = std::vector < T, gmx::AlignedAllocator < T>>;
+
+/* Convenience type for vector that avoids initialization at resize() */
+template<typename T>
+using FastVector = std::vector < T, gmx::DefaultInitializationAllocator < T>>;
+
/*! \cond INTERNAL */
/*! \brief The setup for generating and pruning the nbnxn pair list.
/*! \endcond */
+/* With CPU kernels the i-cluster size is always 4 atoms. */
+static constexpr int c_nbnxnCpuIClusterSize = 4;
+
/* With GPU kernels the i and j cluster size is 8 atoms for CUDA and can be set at compile time for OpenCL */
#if GMX_GPU == GMX_GPU_OPENCL
static constexpr int c_nbnxnGpuClusterSize = GMX_OPENCL_NB_CLUSTER_SIZE;
static constexpr int c_nbnxnGpuClusterSize = 8;
#endif
+/* The number of clusters in a pair-search cell, used for GPU */
+static constexpr int c_gpuNumClusterPerCellZ = 2;
+static constexpr int c_gpuNumClusterPerCellY = 2;
+static constexpr int c_gpuNumClusterPerCellX = 2;
+static constexpr int c_gpuNumClusterPerCell = c_gpuNumClusterPerCellZ*c_gpuNumClusterPerCellY*c_gpuNumClusterPerCellX;
/* In CUDA the number of threads in a warp is 32 and we have cluster pairs
* of 8*8=64 atoms, so it's convenient to store data for cluster pair halves.
* This means that once a full mask (=NBNXN_INTERACTION_MASK_ALL)
* is found, all subsequent j-entries in the i-entry also have full masks.
*/
-typedef struct {
+struct nbnxn_cj_t
+{
int cj; /* The j-cluster */
unsigned int excl; /* The exclusion (interaction) bits */
-} nbnxn_cj_t;
+};
/* In nbnxn_ci_t the integer shift contains the shift in the lower 7 bits.
* The upper bits contain information for non-bonded kernel optimization.
#define NBNXN_CI_HALF_LJ(subc) (1<<(8+3*(subc)))
#define NBNXN_CI_DO_COUL(subc) (1<<(9+3*(subc)))
+/* Cluster-pair Interaction masks
+ * Bit i*j-cluster-size + j tells if atom i and j interact.
+ */
+// TODO: Rename according to convention when moving into Nbnxn namespace
+/* All interaction mask is the same for all kernels */
+constexpr unsigned int NBNXN_INTERACTION_MASK_ALL = 0xffffffffU;
+/* 4x4 kernel diagonal mask */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG = 0x08ceU;
+/* 4x2 kernel diagonal masks */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J2_0 = 0x0002U;
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J2_1 = 0x002fU;
+/* 4x8 kernel diagonal masks */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J8_0 = 0xf0f8fcfeU;
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J8_1 = 0x0080c0e0U;
+
/* Simple pair-list i-unit */
-typedef struct {
+struct nbnxn_ci_t
+{
int ci; /* i-cluster */
int shift; /* Shift vector index plus possible flags, see above */
int cj_ind_start; /* Start index into cj */
int cj_ind_end; /* End index into cj */
-} nbnxn_ci_t;
+};
/* Grouped pair-list i-unit */
typedef struct {
+ /* Returns the number of j-cluster groups in this entry */
+ int numJClusterGroups() const
+ {
+ return cj4_ind_end - cj4_ind_start;
+ };
+
int sci; /* i-super-cluster */
int shift; /* Shift vector index plus possible flags */
int cj4_ind_start; /* Start index into cj4 */
int cj4_ind_end; /* End index into cj4 */
} nbnxn_sci_t;
-typedef struct {
- unsigned int imask; /* The i-cluster interactions mask for 1 warp */
- int excl_ind; /* Index into the exclusion array for 1 warp */
-} nbnxn_im_ei_t;
+/* Interaction data for a j-group for one warp */
+struct nbnxn_im_ei_t
+{
+ // The i-cluster interactions mask for 1 warp
+ unsigned int imask = 0U;
+ // Index into the exclusion array for 1 warp, default index 0 which means no exclusions
+ int excl_ind = 0;
+};
typedef struct {
int cj[c_nbnxnGpuJgroupSize]; /* The 4 j-clusters */
nbnxn_im_ei_t imei[c_nbnxnGpuClusterpairSplit]; /* The i-cluster mask data for 2 warps */
} nbnxn_cj4_t;
-typedef struct {
- unsigned int pair[c_nbnxnGpuExclSize]; /* Topology exclusion interaction bits for one warp,
- * each unsigned has bitS for 4*8 i clusters
- */
-} nbnxn_excl_t;
-
-typedef struct nbnxn_pairlist_t {
- gmx_cache_protect_t cp0;
+/* Struct for storing the atom-pair interaction bits for a cluster pair in a GPU pairlist */
+struct nbnxn_excl_t
+{
+ /* Constructor, sets no exclusions, so all atom pairs interacting */
+ nbnxn_excl_t()
+ {
+ for (unsigned int &pairEntry : pair)
+ {
+ pairEntry = NBNXN_INTERACTION_MASK_ALL;
+ }
+ }
- nbnxn_alloc_t *alloc;
- nbnxn_free_t *free;
+ /* Topology exclusion interaction bits per warp */
+ unsigned int pair[c_nbnxnGpuExclSize];
+};
- gmx_bool bSimple; /* Simple list has na_sc=na_s and uses cj *
- * Complex list uses cj4 */
+/* Cluster pairlist type for use on CPUs */
+struct NbnxnPairlistCpu
+{
+ gmx_cache_protect_t cp0;
int na_ci; /* The number of atoms per i-cluster */
int na_cj; /* The number of atoms per j-cluster */
- int na_sc; /* The number of atoms per super cluster */
real rlist; /* The radius for constructing the list */
- int nci; /* The number of i-clusters in the list */
- int nciOuter; /* The number of i-clusters in the outer, unpruned list, -1 when invalid */
- nbnxn_ci_t *ci; /* The i-cluster list, size nci */
- nbnxn_ci_t *ciOuter; /* The outer, unpruned i-cluster list, size nciOuter(=-1 when invalid) */
- int ci_nalloc; /* The allocation size of ci/ciOuter */
- int nsci; /* The number of i-super-clusters in the list */
- nbnxn_sci_t *sci; /* The i-super-cluster list */
- int sci_nalloc; /* The allocation size of sci */
-
- int ncj; /* The number of j-clusters in the list */
- nbnxn_cj_t *cj; /* The j-cluster list, size ncj */
- nbnxn_cj_t *cjOuter; /* The outer, unpruned j-cluster list, size ncj */
- int cj_nalloc; /* The allocation size of cj/cj0 */
- int ncjInUse; /* The number of j-clusters that are used by ci entries in this list, will be <= ncj */
-
- int ncj4; /* The total number of 4*j clusters */
- nbnxn_cj4_t *cj4; /* The 4*j cluster list, size ncj4 */
- int cj4_nalloc; /* The allocation size of cj4 */
- int nexcl; /* The count for excl */
- nbnxn_excl_t *excl; /* Atom interaction bits (non-exclusions) */
- int excl_nalloc; /* The allocation size for excl */
+ FastVector<nbnxn_ci_t> ci; /* The i-cluster list */
+ FastVector<nbnxn_ci_t> ciOuter; /* The outer, unpruned i-cluster list */
+
+ FastVector<nbnxn_cj_t> cj; /* The j-cluster list, size ncj */
+ FastVector<nbnxn_cj_t> cjOuter; /* The outer, unpruned j-cluster list */
+ int ncjInUse; /* The number of j-clusters that are used by ci entries in this list, will be <= cj.size() */
+
int nci_tot; /* The total number of i clusters */
- struct nbnxn_list_work *work;
+ NbnxnPairlistCpuWork *work;
gmx_cache_protect_t cp1;
-} nbnxn_pairlist_t;
+};
+
+/* Cluster pairlist type, with extra hierarchies, for on the GPU
+ *
+ * NOTE: for better performance when combining lists over threads,
+ * all vectors should use default initialization. But when
+ * changing this, excl should be intialized when adding entries.
+ */
+struct NbnxnPairlistGpu
+{
+ /* Constructor
+ *
+ * \param[in] pinningPolicy Sets the pinning policy for all buffers used on the GPU
+ */
+ NbnxnPairlistGpu(gmx::PinningPolicy pinningPolicy);
+
+ gmx_cache_protect_t cp0;
+
+ int na_ci; /* The number of atoms per i-cluster */
+ int na_cj; /* The number of atoms per j-cluster */
+ int na_sc; /* The number of atoms per super cluster */
+ real rlist; /* The radius for constructing the list */
+ // The i-super-cluster list, indexes into cj4;
+ gmx::HostVector<nbnxn_sci_t> sci;
+ // The list of 4*j-cluster groups
+ gmx::HostVector<nbnxn_cj4_t> cj4;
+ // Atom interaction bits (non-exclusions)
+ gmx::HostVector<nbnxn_excl_t> excl;
+ // The total number of i-clusters
+ int nci_tot;
+
+ NbnxnPairlistGpuWork *work;
+
+ gmx_cache_protect_t cp1;
+};
typedef struct {
int nnbl; /* number of lists */
- nbnxn_pairlist_t **nbl; /* lists */
- nbnxn_pairlist_t **nbl_work; /* work space for rebalancing lists */
+ NbnxnPairlistCpu **nbl; /* lists for CPU */
+ NbnxnPairlistCpu **nbl_work; /* work space for rebalancing lists */
+ NbnxnPairlistGpu **nblGpu; /* lists for GPU */
gmx_bool bCombined; /* TRUE if lists get combined into one (the 1st) */
gmx_bool bSimple; /* TRUE if the list of of type "simple"
(na_sc=na_s, no super-clusters used) */
nbatXYZ, nbatXYZQ, nbatX4, nbatX8
};
-typedef struct {
- real *f; /* f, size natoms*fstride */
- real *fshift; /* Shift force array, size SHIFTS*DIM */
- int nV; /* The size of *Vvdw and *Vc */
- real *Vvdw; /* Temporary Van der Waals group energy storage */
- real *Vc; /* Temporary Coulomb group energy storage */
- int nVS; /* The size of *VSvdw and *VSc */
- real *VSvdw; /* Temporary SIMD Van der Waals group energy storage */
- real *VSc; /* Temporary SIMD Coulomb group energy storage */
-} nbnxn_atomdata_output_t;
+// Struct that holds force and energy output buffers
+struct nbnxn_atomdata_output_t
+{
+ /* Constructor
+ *
+ * \param[in] nb_kernel_type Type of non-bonded kernel
+ * \param[in] numEnergyGroups The number of energy groups
+ * \param[in] simdEnergyBufferStride Stride for entries in the energy buffers for SIMD kernels
+ * \param[in] pinningPolicy Sets the pinning policy for all buffers used on the GPU
+ */
+ nbnxn_atomdata_output_t(int nb_kernel_type,
+ int numEnergyGroups,
+ int simdEnergyBUfferStride,
+ gmx::PinningPolicy pinningPolicy);
+
+ gmx::HostVector<real> f; // f, size natoms*fstride
+ gmx::HostVector<real> fshift; // Shift force array, size SHIFTS*DIM
+ gmx::HostVector<real> Vvdw; // Temporary Van der Waals group energy storage
+ gmx::HostVector<real> Vc; // Temporary Coulomb group energy storage
+ AlignedVector<real> VSvdw; // Temporary SIMD Van der Waals group energy storage
+ AlignedVector<real> VSc; // Temporary SIMD Coulomb group energy storage
+};
/* Block size in atoms for the non-bonded thread force-buffer reduction,
* should be a multiple of all cell and x86 SIMD sizes (i.e. 2, 4 and 8).
ljcrGEOM, ljcrLB, ljcrNONE, ljcrNR
};
-typedef struct nbnxn_atomdata_t { //NOLINT(clang-analyzer-optin.performance.Padding)
- nbnxn_alloc_t *alloc;
- nbnxn_free_t *free;
- int ntype; /* The number of different atom types */
- real *nbfp; /* Lennard-Jones 6*C6 and 12*C12 params, size ntype^2*2 */
- int comb_rule; /* Combination rule, see enum above */
- real *nbfp_comb; /* LJ parameter per atom type, size ntype*2 */
- real *nbfp_aligned; /* As nbfp, but with an alignment (stride) suitable
- * for the present SIMD architectures
- */
- int natoms; /* Number of atoms */
- int natoms_local; /* Number of local atoms */
- int *type; /* Atom types */
- real *lj_comb; /* LJ parameters per atom for combining for pairs */
- int XFormat; /* The format of x (and q), enum */
- int FFormat; /* The format of f, enum */
- real *q; /* Charges, can be NULL if incorporated in x */
- int na_c; /* The number of atoms per cluster */
- int nenergrp; /* The number of energy groups */
- int neg_2log; /* Log2 of nenergrp */
- int *energrp; /* The energy groups per cluster, can be NULL */
- gmx_bool bDynamicBox; /* Do we need to update shift_vec every step? */
- rvec *shift_vec; /* Shift vectors, copied from t_forcerec */
- int xstride; /* stride for a coordinate in x (usually 3 or 4) */
- int fstride; /* stride for a coordinate in f (usually 3 or 4) */
- real *x; /* x and possibly q, size natoms*xstride */
-
- /* j-atom minus i-atom index for generating self and Newton exclusions
- * cluster-cluster pairs of the diagonal, for 4xn and 2xnn kernels.
+/* Struct that stores atom related data for the nbnxn module
+ *
+ * Note: performance would improve slightly when all std::vector containers
+ * in this struct would not initialize during resize().
+ */
+struct nbnxn_atomdata_t
+{ //NOLINT(clang-analyzer-optin.performance.Padding)
+ struct Params
+ {
+ /* Constructor
+ *
+ * \param[in] pinningPolicy Sets the pinning policy for all data that might be transfered to a GPU
+ */
+ Params(gmx::PinningPolicy pinningPolicy);
+
+ // The number of different atom types
+ int numTypes;
+ // Lennard-Jone 6*C6 and 12*C12 parameters, size numTypes*2*2
+ gmx::HostVector<real> nbfp;
+ // Combination rule, see enum defined above
+ int comb_rule;
+ // LJ parameters per atom type, size numTypes*2
+ gmx::HostVector<real> nbfp_comb;
+ // As nbfp, but with a stride for the present SIMD architecture
+ AlignedVector<real> nbfp_aligned;
+ // Atom types per atom
+ gmx::HostVector<int> type;
+ // LJ parameters per atom for fast SIMD loading
+ gmx::HostVector<real> lj_comb;
+ // Charges per atom, not set with format nbatXYZQ
+ gmx::HostVector<real> q;
+ // The number of energy groups
+ int nenergrp;
+ // 2log(nenergrp)
+ int neg_2log;
+ // The energy groups, one int entry per cluster, only set when needed
+ gmx::HostVector<int> energrp;
+ };
+
+ // Diagonal and topology exclusion helper data for all SIMD kernels
+ struct SimdMasks
+ {
+ SimdMasks();
+
+ // Helper data for setting up diagonal exclusion masks in the SIMD 4xN kernels
+ AlignedVector<real> diagonal_4xn_j_minus_i;
+ // Helper data for setting up diaginal exclusion masks in the SIMD 2xNN kernels
+ AlignedVector<real> diagonal_2xnn_j_minus_i;
+ // Filters for topology exclusion masks for the SIMD kernels
+ AlignedVector<uint32_t> exclusion_filter;
+ // Filters for topology exclusion masks for double SIMD kernels without SIMD int32 logical support
+ AlignedVector<uint64_t> exclusion_filter64;
+ // Array of masks needed for exclusions
+ AlignedVector<real> interaction_array;
+ };
+
+ /* Constructor
+ *
+ * \param[in] pinningPolicy Sets the pinning policy for all data that might be transfered to a GPU
*/
- real *simd_4xn_diagonal_j_minus_i;
- real *simd_2xnn_diagonal_j_minus_i;
- /* Filters for topology exclusion masks for the SIMD kernels. */
- uint32_t *simd_exclusion_filter;
- uint64_t *simd_exclusion_filter64; //!< Used for double w/o SIMD int32 logical support
- real *simd_interaction_array; /* Array of masks needed for exclusions */
- int nout; /* The number of force arrays */
- nbnxn_atomdata_output_t *out; /* Output data structures */
- int nalloc; /* Allocation size of all arrays (for x/f *x/fstride) */
- gmx_bool bUseBufferFlags; /* Use the flags or operate on all atoms */
- nbnxn_buffer_flags_t buffer_flags; /* Flags for buffer zeroing+reduc. */
- gmx_bool bUseTreeReduce; /* Use tree for force reduction */
- tMPI_Atomic *syncStep; /* Synchronization step for tree reduce */
-} nbnxn_atomdata_t;
+ nbnxn_atomdata_t(gmx::PinningPolicy pinningPolicy);
+
+ /* Returns a const reference to the parameters */
+ const Params ¶ms() const
+ {
+ return params_;
+ }
+
+ /* Returns a non-const reference to the parameters */
+ Params ¶msDeprecated()
+ {
+ return params_;
+ }
+
+ /* Returns the current total number of atoms stored */
+ int numAtoms() const
+ {
+ return numAtoms_;
+ }
+
+ /* Return the coordinate buffer, and q with xFormat==nbatXYZQ */
+ gmx::ArrayRef<const real> x() const
+ {
+ return x_;
+ }
+
+ /* Return the coordinate buffer, and q with xFormat==nbatXYZQ */
+ gmx::ArrayRef<real> x()
+ {
+ return x_;
+ }
+
+ /* Resizes the coordinate buffer and sets the number of atoms */
+ void resizeCoordinateBuffer(int numAtoms);
+
+ /* Resizes the force buffers for the current number of atoms */
+ void resizeForceBuffers();
+
+ private:
+ // The LJ and charge parameters
+ Params params_;
+ // The total number of atoms currently stored
+ int numAtoms_;
+ public:
+ int natoms_local; /* Number of local atoms */
+ int XFormat; /* The format of x (and q), enum */
+ int FFormat; /* The format of f, enum */
+ gmx_bool bDynamicBox; /* Do we need to update shift_vec every step? */
+ gmx::HostVector<gmx::RVec> shift_vec; /* Shift vectors, copied from t_forcerec */
+ int xstride; /* stride for a coordinate in x (usually 3 or 4) */
+ int fstride; /* stride for a coordinate in f (usually 3 or 4) */
+ private:
+ gmx::HostVector<real> x_; /* x and possibly q, size natoms*xstride */
+
+ public:
+ // Masks for handling exclusions in the SIMD kernels
+ const SimdMasks simdMasks;
+
+ /* Output data */
+ std::vector<nbnxn_atomdata_output_t> out; /* Output data structures, 1 per thread */
+
+ /* Reduction related data */
+ gmx_bool bUseBufferFlags; /* Use the flags or operate on all atoms */
+ nbnxn_buffer_flags_t buffer_flags; /* Flags for buffer zeroing+reduc. */
+ gmx_bool bUseTreeReduce; /* Use tree for force reduction */
+ tMPI_Atomic *syncStep; /* Synchronization step for tree reduce */
+};
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
static_assert(layout == NbnxnLayout::NoSimd4x4 || layout == NbnxnLayout::Simd4xN || layout == NbnxnLayout::Simd2xNN, "Currently jClusterSize only supports CPU layouts");
- return layout == NbnxnLayout::Simd4xN ? GMX_SIMD_REAL_WIDTH : (layout == NbnxnLayout::Simd2xNN ? GMX_SIMD_REAL_WIDTH/2 : NBNXN_CPU_CLUSTER_I_SIZE);
+ return layout == NbnxnLayout::Simd4xN ? GMX_SIMD_REAL_WIDTH : (layout == NbnxnLayout::Simd2xNN ? GMX_SIMD_REAL_WIDTH/2 : c_nbnxnCpuIClusterSize);
}
-/* Returns the j-cluster index given the i-cluster index */
-template <int jClusterSize>
+/*! \brief Returns the j-cluster index given the i-cluster index.
+ *
+ * \tparam jClusterSize The number of atoms in a j-cluster
+ * \tparam jSubClusterIndex The j-sub-cluster index (0/1), used when size(j-cluster) < size(i-cluster)
+ * \param[in] ci The i-cluster index
+ */
+template <int jClusterSize, int jSubClusterIndex>
static inline int cjFromCi(int ci)
{
- static_assert(jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE || jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+ static_assert(jClusterSize == c_nbnxnCpuIClusterSize/2 || jClusterSize == c_nbnxnCpuIClusterSize || jClusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+
+ static_assert(jSubClusterIndex == 0 || jSubClusterIndex == 1,
+ "Only sub-cluster indices 0 and 1 are supported");
- if (jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2)
+ if (jClusterSize == c_nbnxnCpuIClusterSize/2)
{
- return ci << 1;
+ if (jSubClusterIndex == 0)
+ {
+ return ci << 1;
+ }
+ else
+ {
+ return ((ci + 1) << 1) - 1;
+ }
}
- else if (jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE)
+ else if (jClusterSize == c_nbnxnCpuIClusterSize)
{
return ci;
}
}
}
-/* Returns the j-cluster index given the i-cluster index */
-template <NbnxnLayout layout>
+/*! \brief Returns the j-cluster index given the i-cluster index.
+ *
+ * \tparam layout The pair-list layout
+ * \tparam jSubClusterIndex The j-sub-cluster index (0/1), used when size(j-cluster) < size(i-cluster)
+ * \param[in] ci The i-cluster index
+ */
+template <NbnxnLayout layout, int jSubClusterIndex>
static inline int cjFromCi(int ci)
{
constexpr int clusterSize = jClusterSize<layout>();
- return cjFromCi<clusterSize>(ci);
+ return cjFromCi<clusterSize, jSubClusterIndex>(ci);
}
/* Returns the nbnxn coordinate data index given the i-cluster index */
{
constexpr int clusterSize = jClusterSize<layout>();
- static_assert(clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+ static_assert(clusterSize == c_nbnxnCpuIClusterSize/2 || clusterSize == c_nbnxnCpuIClusterSize || clusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
- if (clusterSize <= NBNXN_CPU_CLUSTER_I_SIZE)
+ if (clusterSize <= c_nbnxnCpuIClusterSize)
{
/* Coordinates are stored packed in groups of 4 */
return ci*STRIDE_P4;
{
constexpr int clusterSize = jClusterSize<layout>();
- static_assert(clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+ static_assert(clusterSize == c_nbnxnCpuIClusterSize/2 || clusterSize == c_nbnxnCpuIClusterSize || clusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
- if (clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2)
+ if (clusterSize == c_nbnxnCpuIClusterSize/2)
{
/* Coordinates are stored packed in groups of 4 */
return (cj >> 1)*STRIDE_P4 + (cj & 1)*(c_packX4 >> 1);
}
- else if (clusterSize == NBNXN_CPU_CLUSTER_I_SIZE)
+ else if (clusterSize == c_nbnxnCpuIClusterSize)
{
/* Coordinates are stored packed in groups of 4 */
return cj*STRIDE_P4;
* to cells), this distance returned can be larger than the input.
*/
static real listRangeForGridCellToGridCell(real rlist,
- const nbnxn_grid_t &gridi,
- const nbnxn_grid_t &gridj)
+ const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid)
{
- return rlist + gridi.maxAtomGroupRadius + gridj.maxAtomGroupRadius;
+ return rlist + iGrid.maxAtomGroupRadius + jGrid.maxAtomGroupRadius;
}
/* Determines the cell range along one dimension that
*/
template<int dim>
static void get_cell_range(real b0, real b1,
- const nbnxn_grid_t &gridj,
+ const nbnxn_grid_t &jGrid,
real d2, real rlist, int *cf, int *cl)
{
- real listRangeBBToCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, gridj));
- real distanceInCells = (b0 - gridj.c0[dim])*gridj.invCellSize[dim];
+ real listRangeBBToCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, jGrid));
+ real distanceInCells = (b0 - jGrid.c0[dim])*jGrid.invCellSize[dim];
*cf = std::max(static_cast<int>(distanceInCells), 0);
while (*cf > 0 &&
- d2 + gmx::square((b0 - gridj.c0[dim]) - (*cf - 1 + 1)*gridj.cellSize[dim]) < listRangeBBToCell2)
+ d2 + gmx::square((b0 - jGrid.c0[dim]) - (*cf - 1 + 1)*jGrid.cellSize[dim]) < listRangeBBToCell2)
{
(*cf)--;
}
- *cl = std::min(static_cast<int>((b1 - gridj.c0[dim])*gridj.invCellSize[dim]), gridj.numCells[dim] - 1);
- while (*cl < gridj.numCells[dim] - 1 &&
- d2 + gmx::square((*cl + 1)*gridj.cellSize[dim] - (b1 - gridj.c0[dim])) < listRangeBBToCell2)
+ *cl = std::min(static_cast<int>((b1 - jGrid.c0[dim])*jGrid.invCellSize[dim]), jGrid.numCells[dim] - 1);
+ while (*cl < jGrid.numCells[dim] - 1 &&
+ d2 + gmx::square((*cl + 1)*jGrid.cellSize[dim] - (b1 - jGrid.c0[dim])) < listRangeBBToCell2)
{
(*cl)++;
}
/* Returns if any atom pair from two clusters is within distance sqrt(rlist2) */
static inline gmx_bool
-clusterpair_in_range(const nbnxn_list_work_t *work,
+clusterpair_in_range(const NbnxnPairlistGpuWork &work,
int si,
int csj, int stride, const real *x_j,
real rlist2)
* All coordinates are stored as xyzxyz...
*/
- const real *x_i = work->x_ci;
+ const real *x_i = work.iSuperClusterData.x.data();
for (int i = 0; i < c_nbnxnGpuClusterSize; i++)
{
Simd4Real rc2_S = Simd4Real(rlist2);
- const real *x_i = work->x_ci_simd;
+ const real *x_i = work.iSuperClusterData.xSimd.data();
int dim_stride = c_nbnxnGpuClusterSize*DIM;
Simd4Real ix_S0 = load4(x_i + si*dim_stride + 0*GMX_SIMD4_WIDTH);
}
/* Returns the j-cluster index for index cjIndex in a cj list */
-static inline int nblCj(const nbnxn_cj_t *cjList, int cjIndex)
+static inline int nblCj(gmx::ArrayRef<const nbnxn_cj_t> cjList,
+ int cjIndex)
{
return cjList[cjIndex].cj;
}
/* Returns the j-cluster index for index cjIndex in a cj4 list */
-static inline int nblCj(const nbnxn_cj4_t *cj4List, int cjIndex)
+static inline int nblCj(gmx::ArrayRef<const nbnxn_cj4_t> cj4List,
+ int cjIndex)
{
return cj4List[cjIndex/c_nbnxnGpuJgroupSize].cj[cjIndex & (c_nbnxnGpuJgroupSize - 1)];
}
/* Returns the i-interaction mask of the j sub-cell for index cj_ind */
-static unsigned int nbl_imask0(const nbnxn_pairlist_t *nbl, int cj_ind)
+static unsigned int nbl_imask0(const NbnxnPairlistGpu *nbl, int cj_ind)
{
return nbl->cj4[cj_ind/c_nbnxnGpuJgroupSize].imei[0].imask;
}
-/* Ensures there is enough space for extra extra exclusion masks */
-static void check_excl_space(nbnxn_pairlist_t *nbl, int extra)
-{
- if (nbl->nexcl+extra > nbl->excl_nalloc)
- {
- nbl->excl_nalloc = over_alloc_small(nbl->nexcl+extra);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->excl),
- nbl->nexcl*sizeof(*nbl->excl),
- nbl->excl_nalloc*sizeof(*nbl->excl),
- nbl->alloc, nbl->free);
- }
-}
-
-/* Ensures there is enough space for maxNumExtraClusters extra j-clusters in the list */
-static void check_cell_list_space_simple(nbnxn_pairlist_t *nbl,
- int maxNumExtraClusters)
-{
- int cj_max;
-
- cj_max = nbl->ncj + maxNumExtraClusters;
-
- if (cj_max > nbl->cj_nalloc)
- {
- nbl->cj_nalloc = over_alloc_small(cj_max);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cj),
- nbl->ncj*sizeof(*nbl->cj),
- nbl->cj_nalloc*sizeof(*nbl->cj),
- nbl->alloc, nbl->free);
-
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cjOuter),
- nbl->ncj*sizeof(*nbl->cjOuter),
- nbl->cj_nalloc*sizeof(*nbl->cjOuter),
- nbl->alloc, nbl->free);
- }
-}
-
-/* Ensures there is enough space for ncell extra j-clusters in the list */
-static void check_cell_list_space_supersub(nbnxn_pairlist_t *nbl,
- int ncell)
-{
- int ncj4_max, w;
-
- /* We can have maximally nsupercell*c_gpuNumClusterPerCell sj lists */
- /* We can store 4 j-subcell - i-supercell pairs in one struct.
- * since we round down, we need one extra entry.
- */
- ncj4_max = ((nbl->work->cj_ind + ncell*c_gpuNumClusterPerCell + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize);
-
- if (ncj4_max > nbl->cj4_nalloc)
- {
- nbl->cj4_nalloc = over_alloc_small(ncj4_max);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cj4),
- nbl->work->cj4_init*sizeof(*nbl->cj4),
- nbl->cj4_nalloc*sizeof(*nbl->cj4),
- nbl->alloc, nbl->free);
- }
-
- if (ncj4_max > nbl->work->cj4_init)
- {
- for (int j4 = nbl->work->cj4_init; j4 < ncj4_max; j4++)
- {
- /* No i-subcells and no excl's in the list initially */
- for (w = 0; w < c_nbnxnGpuClusterpairSplit; w++)
- {
- nbl->cj4[j4].imei[w].imask = 0U;
- nbl->cj4[j4].imei[w].excl_ind = 0;
-
- }
- }
- nbl->work->cj4_init = ncj4_max;
- }
-}
-
-/* Set all excl masks for one GPU warp no exclusions */
-static void set_no_excls(nbnxn_excl_t *excl)
-{
- for (int t = 0; t < c_nbnxnGpuExclSize; t++)
- {
- /* Turn all interaction bits on */
- excl->pair[t] = NBNXN_INTERACTION_MASK_ALL;
- }
-}
-
-/* Initializes a single nbnxn_pairlist_t data structure */
-static void nbnxn_init_pairlist(nbnxn_pairlist_t *nbl,
- gmx_bool bSimple,
- nbnxn_alloc_t *alloc,
- nbnxn_free_t *free)
+/* Initializes a single NbnxnPairlistCpu data structure */
+static void nbnxn_init_pairlist(NbnxnPairlistCpu *nbl)
{
- if (alloc == nullptr)
- {
- nbl->alloc = nbnxn_alloc_aligned;
- }
- else
- {
- nbl->alloc = alloc;
- }
- if (free == nullptr)
- {
- nbl->free = nbnxn_free_aligned;
- }
- else
- {
- nbl->free = free;
- }
-
- nbl->bSimple = bSimple;
- nbl->na_sc = 0;
- nbl->na_ci = 0;
+ nbl->na_ci = c_nbnxnCpuIClusterSize;
nbl->na_cj = 0;
- nbl->nci = 0;
- nbl->ci = nullptr;
- nbl->ci_nalloc = 0;
- nbl->nsci = 0;
- nbl->sci = nullptr;
- nbl->sci_nalloc = 0;
- nbl->ncj = 0;
+ nbl->ci.clear();
+ nbl->ciOuter.clear();
nbl->ncjInUse = 0;
- nbl->cj = nullptr;
- nbl->cj_nalloc = 0;
- nbl->ncj4 = 0;
- /* We need one element extra in sj, so alloc initially with 1 */
- nbl->cj4_nalloc = 0;
- nbl->cj4 = nullptr;
+ nbl->cj.clear();
+ nbl->cjOuter.clear();
nbl->nci_tot = 0;
- if (!nbl->bSimple)
- {
- GMX_ASSERT(c_nbnxnGpuNumClusterPerSupercluster == c_gpuNumClusterPerCell, "The search code assumes that the a super-cluster matches a search grid cell");
+ nbl->work = new NbnxnPairlistCpuWork();
+}
- GMX_ASSERT(sizeof(nbl->cj4[0].imei[0].imask)*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The i super-cluster cluster interaction mask does not contain a sufficient number of bits");
- GMX_ASSERT(sizeof(nbl->excl[0])*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The GPU exclusion mask does not contain a sufficient number of bits");
+NbnxnPairlistGpu::NbnxnPairlistGpu(gmx::PinningPolicy pinningPolicy) :
+ na_ci(c_nbnxnGpuClusterSize),
+ na_cj(c_nbnxnGpuClusterSize),
+ na_sc(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize),
+ rlist(0),
+ sci({}, {pinningPolicy}),
+ cj4({}, {pinningPolicy}),
+ excl({}, {pinningPolicy}),
+ nci_tot(0)
+{
+ static_assert(c_nbnxnGpuNumClusterPerSupercluster == c_gpuNumClusterPerCell,
+ "The search code assumes that the a super-cluster matches a search grid cell");
- nbl->excl = nullptr;
- nbl->excl_nalloc = 0;
- nbl->nexcl = 0;
- check_excl_space(nbl, 1);
- nbl->nexcl = 1;
- set_no_excls(&nbl->excl[0]);
- }
+ static_assert(sizeof(cj4[0].imei[0].imask)*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell,
+ "The i super-cluster cluster interaction mask does not contain a sufficient number of bits");
- snew(nbl->work, 1);
- if (nbl->bSimple)
- {
- snew_aligned(nbl->work->bb_ci, 1, NBNXN_SEARCH_BB_MEM_ALIGN);
- }
- else
- {
-#if NBNXN_BBXXXX
- snew_aligned(nbl->work->pbb_ci, c_gpuNumClusterPerCell/STRIDE_PBB*NNBSBB_XXXX, NBNXN_SEARCH_BB_MEM_ALIGN);
-#else
- snew_aligned(nbl->work->bb_ci, c_gpuNumClusterPerCell, NBNXN_SEARCH_BB_MEM_ALIGN);
-#endif
- }
- int gpu_clusterpair_nc = c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM;
- snew(nbl->work->x_ci, gpu_clusterpair_nc);
-#if GMX_SIMD
- snew_aligned(nbl->work->x_ci_simd,
- std::max(NBNXN_CPU_CLUSTER_I_SIZE*DIM*GMX_SIMD_REAL_WIDTH,
- gpu_clusterpair_nc),
- GMX_SIMD_REAL_WIDTH);
-#endif
- snew_aligned(nbl->work->d2, c_gpuNumClusterPerCell, NBNXN_SEARCH_BB_MEM_ALIGN);
+ static_assert(sizeof(excl[0])*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The GPU exclusion mask does not contain a sufficient number of bits");
+
+ // We always want a first entry without any exclusions
+ excl.resize(1);
- nbl->work->sort = nullptr;
- nbl->work->sort_nalloc = 0;
- nbl->work->sci_sort = nullptr;
- nbl->work->sci_sort_nalloc = 0;
+ work = new NbnxnPairlistGpuWork();
}
void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
- gmx_bool bSimple, gmx_bool bCombined,
- nbnxn_alloc_t *alloc,
- nbnxn_free_t *free)
+ gmx_bool bSimple, gmx_bool bCombined)
{
+ GMX_RELEASE_ASSERT(!bSimple || !bCombined, "Can only combine non-simple lists");
+
nbl_list->bSimple = bSimple;
nbl_list->bCombined = bCombined;
nbl_list->nnbl, NBNXN_BUFFERFLAG_MAX_THREADS, NBNXN_BUFFERFLAG_MAX_THREADS);
}
- snew(nbl_list->nbl, nbl_list->nnbl);
- if (bSimple && nbl_list->nnbl > 1)
+ if (bSimple)
+ {
+ snew(nbl_list->nbl, nbl_list->nnbl);
+ if (nbl_list->nnbl > 1)
+ {
+ snew(nbl_list->nbl_work, nbl_list->nnbl);
+ }
+ }
+ else
{
- snew(nbl_list->nbl_work, nbl_list->nnbl);
+ snew(nbl_list->nblGpu, nbl_list->nnbl);
}
snew(nbl_list->nbl_fep, nbl_list->nnbl);
/* Execute in order to avoid memory interleaving between threads */
/* Allocate the nblist data structure locally on each thread
* to optimize memory access for NUMA architectures.
*/
- snew(nbl_list->nbl[i], 1);
-
- /* Only list 0 is used on the GPU, use normal allocation for i>0 */
- if (!bSimple && i == 0)
+ if (bSimple)
{
- nbnxn_init_pairlist(nbl_list->nbl[i], nbl_list->bSimple, alloc, free);
+ nbl_list->nbl[i] = new NbnxnPairlistCpu();
+
+ nbnxn_init_pairlist(nbl_list->nbl[i]);
+ if (nbl_list->nnbl > 1)
+ {
+ nbl_list->nbl_work[i] = new NbnxnPairlistCpu();
+ nbnxn_init_pairlist(nbl_list->nbl_work[i]);
+ }
}
else
{
- nbnxn_init_pairlist(nbl_list->nbl[i], nbl_list->bSimple, nullptr, nullptr);
- if (bSimple && nbl_list->nnbl > 1)
- {
- snew(nbl_list->nbl_work[i], 1);
- nbnxn_init_pairlist(nbl_list->nbl_work[i], nbl_list->bSimple, nullptr, nullptr);
- }
+ /* Only list 0 is used on the GPU, use normal allocation for i>0 */
+ auto pinningPolicy = (i == 0 ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
+
+ nbl_list->nblGpu[i] = new NbnxnPairlistGpu(pinningPolicy);
}
snew(nbl_list->nbl_fep[i], 1);
}
/* Print statistics of a pair list, used for debug output */
-static void print_nblist_statistics_simple(FILE *fp, const nbnxn_pairlist_t *nbl,
- const nbnxn_search *nbs, real rl)
+static void print_nblist_statistics(FILE *fp, const NbnxnPairlistCpu *nbl,
+ const nbnxn_search *nbs, real rl)
{
const nbnxn_grid_t *grid;
int cs[SHIFTS];
grid = &nbs->grid[0];
- fprintf(fp, "nbl nci %d ncj %d\n",
- nbl->nci, nbl->ncjInUse);
- fprintf(fp, "nbl na_sc %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
- nbl->na_sc, rl, nbl->ncjInUse, nbl->ncjInUse/static_cast<double>(grid->nc),
- nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_sc,
- nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_sc/(0.5*4.0/3.0*M_PI*rl*rl*rl*grid->nc*grid->na_sc/(grid->size[XX]*grid->size[YY]*grid->size[ZZ])));
+ fprintf(fp, "nbl nci %zu ncj %d\n",
+ nbl->ci.size(), nbl->ncjInUse);
+ fprintf(fp, "nbl na_cj %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
+ nbl->na_cj, rl, nbl->ncjInUse, nbl->ncjInUse/static_cast<double>(grid->nc),
+ nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_cj,
+ nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_cj/(0.5*4.0/3.0*M_PI*rl*rl*rl*grid->nc*grid->na_cj/(grid->size[XX]*grid->size[YY]*grid->size[ZZ])));
fprintf(fp, "nbl average j cell list length %.1f\n",
- 0.25*nbl->ncjInUse/static_cast<double>(std::max(nbl->nci, 1)));
+ 0.25*nbl->ncjInUse/std::max(static_cast<double>(nbl->ci.size()), 1.0));
for (int s = 0; s < SHIFTS; s++)
{
cs[s] = 0;
}
npexcl = 0;
- for (int i = 0; i < nbl->nci; i++)
+ for (const nbnxn_ci_t &ciEntry : nbl->ci)
{
- cs[nbl->ci[i].shift & NBNXN_CI_SHIFT] +=
- nbl->ci[i].cj_ind_end - nbl->ci[i].cj_ind_start;
+ cs[ciEntry.shift & NBNXN_CI_SHIFT] +=
+ ciEntry.cj_ind_end - ciEntry.cj_ind_start;
- int j = nbl->ci[i].cj_ind_start;
- while (j < nbl->ci[i].cj_ind_end &&
+ int j = ciEntry.cj_ind_start;
+ while (j < ciEntry.cj_ind_end &&
nbl->cj[j].excl != NBNXN_INTERACTION_MASK_ALL)
{
npexcl++;
j++;
}
}
- fprintf(fp, "nbl cell pairs, total: %d excl: %d %.1f%%\n",
- nbl->ncj, npexcl, 100*npexcl/static_cast<double>(std::max(nbl->ncj, 1)));
+ fprintf(fp, "nbl cell pairs, total: %zu excl: %d %.1f%%\n",
+ nbl->cj.size(), npexcl, 100*npexcl/std::max(static_cast<double>(nbl->cj.size()), 1.0));
for (int s = 0; s < SHIFTS; s++)
{
if (cs[s] > 0)
}
/* Print statistics of a pair lists, used for debug output */
-static void print_nblist_statistics_supersub(FILE *fp, const nbnxn_pairlist_t *nbl,
- const nbnxn_search *nbs, real rl)
+static void print_nblist_statistics(FILE *fp, const NbnxnPairlistGpu *nbl,
+ const nbnxn_search *nbs, real rl)
{
const nbnxn_grid_t *grid;
int b;
/* This code only produces correct statistics with domain decomposition */
grid = &nbs->grid[0];
- fprintf(fp, "nbl nsci %d ncj4 %d nsi %d excl4 %d\n",
- nbl->nsci, nbl->ncj4, nbl->nci_tot, nbl->nexcl);
+ fprintf(fp, "nbl nsci %zu ncj4 %zu nsi %d excl4 %zu\n",
+ nbl->sci.size(), nbl->cj4.size(), nbl->nci_tot, nbl->excl.size());
fprintf(fp, "nbl na_c %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
nbl->na_ci, rl, nbl->nci_tot, nbl->nci_tot/static_cast<double>(grid->nsubc_tot),
nbl->nci_tot/static_cast<double>(grid->nsubc_tot)*grid->na_c,
{
c[si] = 0;
}
- for (int i = 0; i < nbl->nsci; i++)
+ for (const nbnxn_sci_t &sci : nbl->sci)
{
- int nsp;
-
- nsp = 0;
- for (int j4 = nbl->sci[i].cj4_ind_start; j4 < nbl->sci[i].cj4_ind_end; j4++)
+ int nsp = 0;
+ for (int j4 = sci.cj4_ind_start; j4 < sci.cj4_ind_end; j4++)
{
for (int j = 0; j < c_nbnxnGpuJgroupSize; j++)
{
sum_nsp2 += nsp*nsp;
nsp_max = std::max(nsp_max, nsp);
}
- if (nbl->nsci > 0)
+ if (!nbl->sci.empty())
{
- sum_nsp /= nbl->nsci;
- sum_nsp2 /= nbl->nsci;
+ sum_nsp /= nbl->sci.size();
+ sum_nsp2 /= nbl->sci.size();
}
fprintf(fp, "nbl #cluster-pairs: av %.1f stddev %.1f max %d\n",
sum_nsp, std::sqrt(sum_nsp2 - sum_nsp*sum_nsp), nsp_max);
- if (nbl->ncj4 > 0)
+ if (!nbl->cj4.empty())
{
for (b = 0; b <= c_gpuNumClusterPerCell; b++)
{
fprintf(fp, "nbl j-list #i-subcell %d %7d %4.1f\n",
- b, c[b],
- 100.0*c[b]/int{nbl->ncj4*c_nbnxnGpuJgroupSize});
+ b, c[b], 100.0*c[b]/size_t {nbl->cj4.size()*c_nbnxnGpuJgroupSize});
}
}
}
-/* Returns a pointer to the exclusion mask for cj4-unit cj4, warp warp */
-static void low_get_nbl_exclusions(nbnxn_pairlist_t *nbl, int cj4,
- int warp, nbnxn_excl_t **excl)
-{
- if (nbl->cj4[cj4].imei[warp].excl_ind == 0)
- {
- /* No exclusions set, make a new list entry */
- nbl->cj4[cj4].imei[warp].excl_ind = nbl->nexcl;
- nbl->nexcl++;
- *excl = &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
- set_no_excls(*excl);
- }
- else
- {
- /* We already have some exclusions, new ones can be added to the list */
- *excl = &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
- }
-}
-
-/* Returns a pointer to the exclusion mask for cj4-unit cj4, warp warp,
- * generates a new element and allocates extra memory, if necessary.
+/* Returns a pointer to the exclusion mask for j-cluster-group \p cj4 and warp \p warp
+ * Generates a new exclusion entry when the j-cluster-group uses
+ * the default all-interaction mask at call time, so the returned mask
+ * can be modified when needed.
*/
-static void get_nbl_exclusions_1(nbnxn_pairlist_t *nbl, int cj4,
- int warp, nbnxn_excl_t **excl)
+static nbnxn_excl_t *get_exclusion_mask(NbnxnPairlistGpu *nbl,
+ int cj4,
+ int warp)
{
if (nbl->cj4[cj4].imei[warp].excl_ind == 0)
{
- /* We need to make a new list entry, check if we have space */
- check_excl_space(nbl, 1);
+ /* No exclusions set, make a new list entry */
+ const size_t oldSize = nbl->excl.size();
+ GMX_ASSERT(oldSize >= 1, "We should always have entry [0]");
+ /* Add entry with default values: no exclusions */
+ nbl->excl.resize(oldSize + 1);
+ nbl->cj4[cj4].imei[warp].excl_ind = oldSize;
}
- low_get_nbl_exclusions(nbl, cj4, warp, excl);
-}
-
-/* Returns pointers to the exclusion masks for cj4-unit cj4 for both warps,
- * generates a new element and allocates extra memory, if necessary.
- */
-static void get_nbl_exclusions_2(nbnxn_pairlist_t *nbl, int cj4,
- nbnxn_excl_t **excl_w0,
- nbnxn_excl_t **excl_w1)
-{
- /* Check for space we might need */
- check_excl_space(nbl, 2);
- low_get_nbl_exclusions(nbl, cj4, 0, excl_w0);
- low_get_nbl_exclusions(nbl, cj4, 1, excl_w1);
+ return &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
}
-/* Sets the self exclusions i=j and pair exclusions i>j */
-static void set_self_and_newton_excls_supersub(nbnxn_pairlist_t *nbl,
+static void set_self_and_newton_excls_supersub(NbnxnPairlistGpu *nbl,
int cj4_ind, int sj_offset,
int i_cluster_in_cell)
{
/* Here we only set the set self and double pair exclusions */
- static_assert(c_nbnxnGpuClusterpairSplit == 2, "");
-
- get_nbl_exclusions_2(nbl, cj4_ind, &excl[0], &excl[1]);
+ /* Reserve extra elements, so the resize() in get_exclusion_mask()
+ * will not invalidate excl entries in the loop below
+ */
+ nbl->excl.reserve(nbl->excl.size() + c_nbnxnGpuClusterpairSplit);
+ for (int w = 0; w < c_nbnxnGpuClusterpairSplit; w++)
+ {
+ excl[w] = get_exclusion_mask(nbl, cj4_ind, w);
+ }
/* Only minor < major bits set */
for (int ej = 0; ej < nbl->na_ci; ej++)
* \param[in,out] numDistanceChecks The number of distance checks performed
*/
static void
-makeClusterListSimple(const nbnxn_grid_t * gridj,
- nbnxn_pairlist_t * nbl,
+makeClusterListSimple(const nbnxn_grid_t &jGrid,
+ NbnxnPairlistCpu * nbl,
int icluster,
int jclusterFirst,
int jclusterLast,
float rbb2,
int * gmx_restrict numDistanceChecks)
{
- const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->bb_ci;
- const real * gmx_restrict x_ci = nbl->work->x_ci;
+ const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->iClusterData.bb.data();
+ const real * gmx_restrict x_ci = nbl->work->iClusterData.x.data();
gmx_bool InRange;
InRange = FALSE;
while (!InRange && jclusterFirst <= jclusterLast)
{
- real d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bb);
+ real d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bb);
*numDistanceChecks += 2;
/* Check if the distance is within the distance where
}
else if (d2 < rlist2)
{
- int cjf_gl = gridj->cell0 + jclusterFirst;
- for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE && !InRange; i++)
+ int cjf_gl = jGrid.cell0 + jclusterFirst;
+ for (int i = 0; i < c_nbnxnCpuIClusterSize && !InRange; i++)
{
- for (int j = 0; j < NBNXN_CPU_CLUSTER_I_SIZE; j++)
+ for (int j = 0; j < c_nbnxnCpuIClusterSize; j++)
{
InRange = InRange ||
- (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+XX]) +
- gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+YY]) +
- gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+ZZ]) < rlist2);
+ (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+XX]) +
+ gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+YY]) +
+ gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+ZZ]) < rlist2);
}
}
- *numDistanceChecks += NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
+ *numDistanceChecks += c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
}
if (!InRange)
{
InRange = FALSE;
while (!InRange && jclusterLast > jclusterFirst)
{
- real d2 = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bb);
+ real d2 = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bb);
*numDistanceChecks += 2;
/* Check if the distance is within the distance where
}
else if (d2 < rlist2)
{
- int cjl_gl = gridj->cell0 + jclusterLast;
- for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE && !InRange; i++)
+ int cjl_gl = jGrid.cell0 + jclusterLast;
+ for (int i = 0; i < c_nbnxnCpuIClusterSize && !InRange; i++)
{
- for (int j = 0; j < NBNXN_CPU_CLUSTER_I_SIZE; j++)
+ for (int j = 0; j < c_nbnxnCpuIClusterSize; j++)
{
InRange = InRange ||
- (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+XX]) +
- gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+YY]) +
- gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+ZZ]) < rlist2);
+ (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+XX]) +
+ gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+YY]) +
+ gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+ZZ]) < rlist2);
}
}
- *numDistanceChecks += NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
+ *numDistanceChecks += c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
}
if (!InRange)
{
for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
{
/* Store cj and the interaction mask */
- nbl->cj[nbl->ncj].cj = gridj->cell0 + jcluster;
- nbl->cj[nbl->ncj].excl = get_imask(excludeSubDiagonal, icluster, jcluster);
- nbl->ncj++;
+ nbnxn_cj_t cjEntry;
+ cjEntry.cj = jGrid.cell0 + jcluster;
+ cjEntry.excl = get_imask(excludeSubDiagonal, icluster, jcluster);
+ nbl->cj.push_back(cjEntry);
}
- /* Increase the closing index in i super-cell list */
- nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+ /* Increase the closing index in the i list */
+ nbl->ci.back().cj_ind_end = nbl->cj.size();
}
}
/* Plain C or SIMD4 code for making a pair list of super-cell sci vs scj.
* Checks bounding box distances and possibly atom pair distances.
*/
-static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj,
- nbnxn_pairlist_t *nbl,
- int sci, int scj,
- gmx_bool sci_equals_scj,
- int stride, const real *x,
- real rlist2, float rbb2,
- int *numDistanceChecks)
+static void make_cluster_list_supersub(const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid,
+ NbnxnPairlistGpu *nbl,
+ const int sci,
+ const int scj,
+ const bool excludeSubDiagonal,
+ const int stride,
+ const real *x,
+ const real rlist2,
+ const float rbb2,
+ int *numDistanceChecks)
{
- nbnxn_list_work_t *work = nbl->work;
+ NbnxnPairlistGpuWork &work = *nbl->work;
#if NBNXN_BBXXXX
- const float *pbb_ci = work->pbb_ci;
+ const float *pbb_ci = work.iSuperClusterData.bbPacked.data();
#else
- const nbnxn_bb_t *bb_ci = work->bb_ci;
+ const nbnxn_bb_t *bb_ci = work.iSuperClusterData.bb.data();
#endif
- assert(c_nbnxnGpuClusterSize == gridi->na_c);
- assert(c_nbnxnGpuClusterSize == gridj->na_c);
+ assert(c_nbnxnGpuClusterSize == iGrid.na_c);
+ assert(c_nbnxnGpuClusterSize == jGrid.na_c);
/* We generate the pairlist mainly based on bounding-box distances
* and do atom pair distance based pruning on the GPU.
int ci_last = -1;
#endif
- float *d2l = work->d2;
+ float *d2l = work.distanceBuffer.data();
- for (int subc = 0; subc < gridj->nsubc[scj]; subc++)
+ for (int subc = 0; subc < jGrid.nsubc[scj]; subc++)
{
- int cj4_ind = nbl->work->cj_ind/c_nbnxnGpuJgroupSize;
- int cj_offset = nbl->work->cj_ind - cj4_ind*c_nbnxnGpuJgroupSize;
- nbnxn_cj4_t *cj4 = &nbl->cj4[cj4_ind];
+ const int cj4_ind = work.cj_ind/c_nbnxnGpuJgroupSize;
+ const int cj_offset = work.cj_ind - cj4_ind*c_nbnxnGpuJgroupSize;
+ const int cj = scj*c_gpuNumClusterPerCell + subc;
- int cj = scj*c_gpuNumClusterPerCell + subc;
+ const int cj_gl = jGrid.cell0*c_gpuNumClusterPerCell + cj;
- int cj_gl = gridj->cell0*c_gpuNumClusterPerCell + cj;
-
- /* Initialize this j-subcell i-subcell list */
- cj4->cj[cj_offset] = cj_gl;
-
- int ci1;
- if (sci_equals_scj)
+ int ci1;
+ if (excludeSubDiagonal && sci == scj)
{
ci1 = subc + 1;
}
else
{
- ci1 = gridi->nsubc[sci];
+ ci1 = iGrid.nsubc[sci];
}
#if NBNXN_BBXXXX
/* Determine all ci1 bb distances in one call with SIMD4 */
- subc_bb_dist2_simd4_xxxx(gridj->pbb.data() + (cj >> STRIDE_PBB_2LOG)*NNBSBB_XXXX + (cj & (STRIDE_PBB-1)),
+ subc_bb_dist2_simd4_xxxx(jGrid.pbb.data() + (cj >> STRIDE_PBB_2LOG)*NNBSBB_XXXX + (cj & (STRIDE_PBB-1)),
ci1, pbb_ci, d2l);
*numDistanceChecks += c_nbnxnGpuClusterSize*2;
#endif
#if !NBNXN_BBXXXX
/* Determine the bb distance between ci and cj */
- d2l[ci] = subc_bb_dist2(ci, bb_ci, cj, gridj->bb);
+ d2l[ci] = subc_bb_dist2(ci, bb_ci, cj, jGrid.bb);
*numDistanceChecks += 2;
#endif
float d2 = d2l[ci];
if (npair > 0)
{
- /* We have a useful sj entry, close it now */
+ /* We have at least one cluster pair: add a j-entry */
+ if (static_cast<size_t>(cj4_ind) == nbl->cj4.size())
+ {
+ nbl->cj4.resize(nbl->cj4.size() + 1);
+ }
+ nbnxn_cj4_t *cj4 = &nbl->cj4[cj4_ind];
+
+ cj4->cj[cj_offset] = cj_gl;
/* Set the exclusions for the ci==sj entry.
* Here we don't bother to check if this entry is actually flagged,
* as it will nearly always be in the list.
*/
- if (sci_equals_scj)
+ if (excludeSubDiagonal && sci == scj)
{
set_self_and_newton_excls_supersub(nbl, cj4_ind, cj_offset, subc);
}
nbl->nci_tot += npair;
/* Increase the closing index in i super-cell list */
- nbl->sci[nbl->nsci].cj4_ind_end =
+ nbl->sci.back().cj4_ind_end =
(nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
}
}
/* Returns how many contiguous j-clusters we have starting in the i-list */
template <typename CjListType>
-static int numContiguousJClusters(const int cjIndexStart,
- const int cjIndexEnd,
- const CjListType &cjList)
+static int numContiguousJClusters(const int cjIndexStart,
+ const int cjIndexEnd,
+ gmx::ArrayRef<const CjListType> cjList)
{
const int firstJCluster = nblCj(cjList, cjIndexStart);
return numContiguous;
}
-/* Helper struct for efficient searching for excluded atoms in a j-list */
+/*! \internal
+ * \brief Helper struct for efficient searching for excluded atoms in a j-list
+ */
struct JListRanges
{
- /* Constructor */
+ /*! \brief Constructs a j-list range from \p cjList with the given index range */
template <typename CjListType>
- JListRanges(int cjIndexStart,
- int cjIndexEnd,
- const CjListType &cjList);
-
- int cjIndexStart; // The start index in the j-list
- int cjIndexEnd; // The end index in the j-list
- int cjFirst; // The j-cluster with index cjIndexStart
- int cjLast; // The j-cluster with index cjIndexEnd-1
- int numDirect; // Up to cjIndexStart+numDirect the j-clusters are cjFirst + the index offset
+ JListRanges(int cjIndexStart,
+ int cjIndexEnd,
+ gmx::ArrayRef<const CjListType> cjList);
+
+ int cjIndexStart; //!< The start index in the j-list
+ int cjIndexEnd; //!< The end index in the j-list
+ int cjFirst; //!< The j-cluster with index cjIndexStart
+ int cjLast; //!< The j-cluster with index cjIndexEnd-1
+ int numDirect; //!< Up to cjIndexStart+numDirect the j-clusters are cjFirst + the index offset
};
+#ifndef DOXYGEN
template <typename CjListType>
-JListRanges::JListRanges(int cjIndexStart,
- int cjIndexEnd,
- const CjListType &cjList) :
+JListRanges::JListRanges(int cjIndexStart,
+ int cjIndexEnd,
+ gmx::ArrayRef<const CjListType> cjList) :
cjIndexStart(cjIndexStart),
cjIndexEnd(cjIndexEnd)
{
*/
numDirect = numContiguousJClusters(cjIndexStart, cjIndexEnd, cjList);
}
+#endif // !DOXYGEN
/* Return the index of \p jCluster in the given range or -1 when not present
*
* important. It should be inlined and fully optimized.
*/
template <typename CjListType>
-static inline int findJClusterInJList(int jCluster,
- const JListRanges &ranges,
- const CjListType &cjList)
+static inline int
+findJClusterInJList(int jCluster,
+ const JListRanges &ranges,
+ gmx::ArrayRef<const CjListType> cjList)
{
int index;
return index;
}
+// TODO: Get rid of the two functions below by renaming sci to ci (or something better)
+
+/* Return the i-entry in the list we are currently operating on */
+static nbnxn_ci_t *getOpenIEntry(NbnxnPairlistCpu *nbl)
+{
+ return &nbl->ci.back();
+}
+
+/* Return the i-entry in the list we are currently operating on */
+static nbnxn_sci_t *getOpenIEntry(NbnxnPairlistGpu *nbl)
+{
+ return &nbl->sci.back();
+}
+
/* Set all atom-pair exclusions for a simple type list i-entry
*
* Set all atom-pair exclusions from the topology stored in exclusions
* as masks in the pair-list for simple list entry iEntry.
*/
static void
-setExclusionsForSimpleIentry(const nbnxn_search *nbs,
- nbnxn_pairlist_t *nbl,
- gmx_bool diagRemoved,
- int na_cj_2log,
- const nbnxn_ci_t &iEntry,
- const t_blocka &exclusions)
+setExclusionsForIEntry(const nbnxn_search *nbs,
+ NbnxnPairlistCpu *nbl,
+ gmx_bool diagRemoved,
+ int na_cj_2log,
+ const nbnxn_ci_t &iEntry,
+ const t_blocka &exclusions)
{
if (iEntry.cj_ind_end == iEntry.cj_ind_start)
{
return;
}
- const JListRanges ranges(iEntry.cj_ind_start, iEntry.cj_ind_end, nbl->cj);
+ const JListRanges ranges(iEntry.cj_ind_start, iEntry.cj_ind_end, gmx::makeConstArrayRef(nbl->cj));
const int iCluster = iEntry.ci;
gmx::ArrayRef<const int> cell = nbs->cell;
/* Loop over the atoms in the i-cluster */
- for (int i = 0; i < nbl->na_sc; i++)
+ for (int i = 0; i < nbl->na_ci; i++)
{
- const int iIndex = iCluster*nbl->na_sc + i;
+ const int iIndex = iCluster*nbl->na_ci + i;
const int iAtom = nbs->a[iIndex];
if (iAtom >= 0)
{
if (jCluster >= ranges.cjFirst && jCluster <= ranges.cjLast)
{
const int index =
- findJClusterInJList(jCluster, ranges, nbl->cj);
+ findJClusterInJList(jCluster, ranges,
+ gmx::makeConstArrayRef(nbl->cj));
if (index >= 0)
{
*/
static void make_fep_list(const nbnxn_search *nbs,
const nbnxn_atomdata_t *nbat,
- nbnxn_pairlist_t *nbl,
+ NbnxnPairlistCpu *nbl,
gmx_bool bDiagRemoved,
nbnxn_ci_t *nbl_ci,
- const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj,
+ real gmx_unused shx,
+ real gmx_unused shy,
+ real gmx_unused shz,
+ real gmx_unused rlist_fep2,
+ const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid,
t_nblist *nlist)
{
int ci, cj_ind_start, cj_ind_end, cja, cjr;
reallocate_nblist(nlist);
}
- ngid = nbat->nenergrp;
+ const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
- if (ngid*gridj->na_cj > gmx::index(sizeof(gid_cj)*8))
+ ngid = nbatParams.nenergrp;
+
+ if (ngid*jGrid.na_cj > gmx::index(sizeof(gid_cj)*8))
{
gmx_fatal(FARGS, "The Verlet scheme with %dx%d kernels and free-energy only supports up to %zu energy groups",
- gridi->na_c, gridj->na_cj, (sizeof(gid_cj)*8)/gridj->na_cj);
+ iGrid.na_c, jGrid.na_cj, (sizeof(gid_cj)*8)/jGrid.na_cj);
}
- egp_shift = nbat->neg_2log;
- egp_mask = (1<<nbat->neg_2log) - 1;
+ egp_shift = nbatParams.neg_2log;
+ egp_mask = (1 << egp_shift) - 1;
/* Loop over the atoms in the i sub-cell */
bFEP_i_all = TRUE;
nlist->gid[nri] = 0;
nlist->shift[nri] = nbl_ci->shift & NBNXN_CI_SHIFT;
- bFEP_i = ((gridi->fep[ci - gridi->cell0] & (1 << i)) != 0u);
+ bFEP_i = ((iGrid.fep[ci - iGrid.cell0] & (1 << i)) != 0u);
bFEP_i_all = bFEP_i_all && bFEP_i;
if (ngid > 1)
{
- gid_i = (nbat->energrp[ci] >> (egp_shift*i)) & egp_mask;
+ gid_i = (nbatParams.energrp[ci] >> (egp_shift*i)) & egp_mask;
}
for (int cj_ind = cj_ind_start; cj_ind < cj_ind_end; cj_ind++)
cja = nbl->cj[cj_ind].cj;
- if (gridj->na_cj == gridj->na_c)
+ if (jGrid.na_cj == jGrid.na_c)
{
- cjr = cja - gridj->cell0;
- fep_cj = gridj->fep[cjr];
+ cjr = cja - jGrid.cell0;
+ fep_cj = jGrid.fep[cjr];
if (ngid > 1)
{
- gid_cj = nbat->energrp[cja];
+ gid_cj = nbatParams.energrp[cja];
}
}
- else if (2*gridj->na_cj == gridj->na_c)
+ else if (2*jGrid.na_cj == jGrid.na_c)
{
- cjr = cja - gridj->cell0*2;
+ cjr = cja - jGrid.cell0*2;
/* Extract half of the ci fep/energrp mask */
- fep_cj = (gridj->fep[cjr>>1] >> ((cjr&1)*gridj->na_cj)) & ((1<<gridj->na_cj) - 1);
+ fep_cj = (jGrid.fep[cjr>>1] >> ((cjr&1)*jGrid.na_cj)) & ((1<<jGrid.na_cj) - 1);
if (ngid > 1)
{
- gid_cj = nbat->energrp[cja>>1] >> ((cja&1)*gridj->na_cj*egp_shift) & ((1<<(gridj->na_cj*egp_shift)) - 1);
+ gid_cj = nbatParams.energrp[cja>>1] >> ((cja&1)*jGrid.na_cj*egp_shift) & ((1<<(jGrid.na_cj*egp_shift)) - 1);
}
}
else
{
- cjr = cja - (gridj->cell0>>1);
+ cjr = cja - (jGrid.cell0>>1);
/* Combine two ci fep masks/energrp */
- fep_cj = gridj->fep[cjr*2] + (gridj->fep[cjr*2+1] << gridj->na_c);
+ fep_cj = jGrid.fep[cjr*2] + (jGrid.fep[cjr*2+1] << jGrid.na_c);
if (ngid > 1)
{
- gid_cj = nbat->energrp[cja*2] + (nbat->energrp[cja*2+1] << (gridj->na_c*egp_shift));
+ gid_cj = nbatParams.energrp[cja*2] + (nbatParams.energrp[cja*2+1] << (jGrid.na_c*egp_shift));
}
}
}
/* As make_fep_list above, but for super/sub lists. */
-static void make_fep_list_supersub(const nbnxn_search *nbs,
- const nbnxn_atomdata_t *nbat,
- nbnxn_pairlist_t *nbl,
- gmx_bool bDiagRemoved,
- const nbnxn_sci_t *nbl_sci,
- real shx,
- real shy,
- real shz,
- real rlist_fep2,
- const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj,
- t_nblist *nlist)
+static void make_fep_list(const nbnxn_search *nbs,
+ const nbnxn_atomdata_t *nbat,
+ NbnxnPairlistGpu *nbl,
+ gmx_bool bDiagRemoved,
+ const nbnxn_sci_t *nbl_sci,
+ real shx,
+ real shy,
+ real shz,
+ real rlist_fep2,
+ const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid,
+ t_nblist *nlist)
{
- int sci, cj4_ind_start, cj4_ind_end, cjr;
int nri_max;
int c_abs;
int ind_i, ind_j, ai, aj;
real xi, yi, zi;
const nbnxn_cj4_t *cj4;
- if (nbl_sci->cj4_ind_end == nbl_sci->cj4_ind_start)
+ const int numJClusterGroups = nbl_sci->numJClusterGroups();
+ if (numJClusterGroups == 0)
{
/* Empty list */
return;
}
- sci = nbl_sci->sci;
+ const int sci = nbl_sci->sci;
- cj4_ind_start = nbl_sci->cj4_ind_start;
- cj4_ind_end = nbl_sci->cj4_ind_end;
+ const int cj4_ind_start = nbl_sci->cj4_ind_start;
+ const int cj4_ind_end = nbl_sci->cj4_ind_end;
/* Here we process one super-cell, max #atoms na_sc, versus a list
* cj4 entries, each with max c_nbnxnGpuJgroupSize cj's, each
* So for each of the na_sc i-atoms, we need max one FEP list
* for each max_nrj_fep j-atoms.
*/
- nri_max = nbl->na_sc*nbl->na_cj*(1 + ((cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize)/max_nrj_fep);
+ nri_max = nbl->na_sc*nbl->na_cj*(1 + (numJClusterGroups*c_nbnxnGpuJgroupSize)/max_nrj_fep);
if (nlist->nri + nri_max > nlist->maxnri)
{
nlist->maxnri = over_alloc_large(nlist->nri + nri_max);
nlist->gid[nri] = 0;
nlist->shift[nri] = nbl_sci->shift & NBNXN_CI_SHIFT;
- bFEP_i = ((gridi->fep[c_abs - gridi->cell0*c_gpuNumClusterPerCell] & (1 << i)) != 0u);
+ bFEP_i = ((iGrid.fep[c_abs - iGrid.cell0*c_gpuNumClusterPerCell] & (1 << i)) != 0u);
- xi = nbat->x[ind_i*nbat->xstride+XX] + shx;
- yi = nbat->x[ind_i*nbat->xstride+YY] + shy;
- zi = nbat->x[ind_i*nbat->xstride+ZZ] + shz;
+ xi = nbat->x()[ind_i*nbat->xstride+XX] + shx;
+ yi = nbat->x()[ind_i*nbat->xstride+YY] + shy;
+ zi = nbat->x()[ind_i*nbat->xstride+ZZ] + shz;
- if ((nlist->nrj + cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize*nbl->na_cj > nlist->maxnrj)
+ const int nrjMax = nlist->nrj + numJClusterGroups*c_nbnxnGpuJgroupSize*nbl->na_cj;
+ if (nrjMax > nlist->maxnrj)
{
- nlist->maxnrj = over_alloc_small((nlist->nrj + cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize*nbl->na_cj);
+ nlist->maxnrj = over_alloc_small(nrjMax);
srenew(nlist->jjnr, nlist->maxnrj);
srenew(nlist->excl_fep, nlist->maxnrj);
}
continue;
}
- cjr = cj4->cj[gcj] - gridj->cell0*c_gpuNumClusterPerCell;
+ const int cjr =
+ cj4->cj[gcj] - jGrid.cell0*c_gpuNumClusterPerCell;
- fep_cj = gridj->fep[cjr];
+ fep_cj = jGrid.fep[cjr];
if (bFEP_i || fep_cj != 0)
{
for (int j = 0; j < nbl->na_cj; j++)
{
/* Is this interaction perturbed and not excluded? */
- ind_j = (gridj->cell0*c_gpuNumClusterPerCell + cjr)*nbl->na_cj + j;
+ ind_j = (jGrid.cell0*c_gpuNumClusterPerCell + cjr)*nbl->na_cj + j;
aj = nbs->a[ind_j];
if (aj >= 0 &&
(bFEP_i || (fep_cj & (1 << j))) &&
(!bDiagRemoved || ind_j >= ind_i))
{
- nbnxn_excl_t *excl;
int excl_pair;
unsigned int excl_bit;
real dx, dy, dz;
const int jHalf = j/(c_nbnxnGpuClusterSize/c_nbnxnGpuClusterpairSplit);
- get_nbl_exclusions_1(nbl, cj4_ind, jHalf, &excl);
+ nbnxn_excl_t *excl =
+ get_exclusion_mask(nbl, cj4_ind, jHalf);
excl_pair = a_mod_wj(j)*nbl->na_ci + i;
excl_bit = (1U << (gcj*c_gpuNumClusterPerCell + c));
- dx = nbat->x[ind_j*nbat->xstride+XX] - xi;
- dy = nbat->x[ind_j*nbat->xstride+YY] - yi;
- dz = nbat->x[ind_j*nbat->xstride+ZZ] - zi;
+ dx = nbat->x()[ind_j*nbat->xstride+XX] - xi;
+ dy = nbat->x()[ind_j*nbat->xstride+YY] - yi;
+ dz = nbat->x()[ind_j*nbat->xstride+ZZ] - zi;
/* The unpruned GPU list has more than 2/3
* of the atom pairs beyond rlist. Using
* as masks in the pair-list for i-super-cluster list entry iEntry.
*/
static void
-setExclusionsForGpuIentry(const nbnxn_search *nbs,
- nbnxn_pairlist_t *nbl,
- gmx_bool diagRemoved,
- const nbnxn_sci_t &iEntry,
- const t_blocka &exclusions)
+setExclusionsForIEntry(const nbnxn_search *nbs,
+ NbnxnPairlistGpu *nbl,
+ gmx_bool diagRemoved,
+ int gmx_unused na_cj_2log,
+ const nbnxn_sci_t &iEntry,
+ const t_blocka &exclusions)
{
- if (iEntry.cj4_ind_end == iEntry.cj4_ind_start)
+ if (iEntry.numJClusterGroups() == 0)
{
/* Empty list */
return;
*/
const JListRanges ranges(iEntry.cj4_ind_start*c_nbnxnGpuJgroupSize,
nbl->work->cj_ind,
- nbl->cj4);
+ gmx::makeConstArrayRef(nbl->cj4));
GMX_ASSERT(nbl->na_ci == c_nbnxnGpuClusterSize, "na_ci should match the GPU cluster size");
constexpr int c_clusterSize = c_nbnxnGpuClusterSize;
if (jCluster >= ranges.cjFirst && jCluster <= ranges.cjLast)
{
const int index =
- findJClusterInJList(jCluster, ranges, nbl->cj4);
+ findJClusterInJList(jCluster, ranges,
+ gmx::makeConstArrayRef(nbl->cj4));
if (index >= 0)
{
/* Determine which j-half (CUDA warp) we are in */
const int jHalf = innerJ/(c_clusterSize/c_nbnxnGpuClusterpairSplit);
- nbnxn_excl_t *interactionMask;
- get_nbl_exclusions_1(nbl, cj_to_cj4(index), jHalf, &interactionMask);
+ nbnxn_excl_t *interactionMask =
+ get_exclusion_mask(nbl, cj_to_cj4(index), jHalf);
interactionMask->pair[a_mod_wj(innerJ)*c_clusterSize + innerI] &= ~pairMask;
}
}
}
-/* Reallocate the simple ci list for at least n entries */
-static void nb_realloc_ci(nbnxn_pairlist_t *nbl, int n)
+/* Make a new ci entry at the back of nbl->ci */
+static void addNewIEntry(NbnxnPairlistCpu *nbl, int ci, int shift, int flags)
{
- nbl->ci_nalloc = over_alloc_small(n);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->ci),
- nbl->nci*sizeof(*nbl->ci),
- nbl->ci_nalloc*sizeof(*nbl->ci),
- nbl->alloc, nbl->free);
-
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->ciOuter),
- nbl->nci*sizeof(*nbl->ciOuter),
- nbl->ci_nalloc*sizeof(*nbl->ciOuter),
- nbl->alloc, nbl->free);
-}
-
-/* Reallocate the super-cell sci list for at least n entries */
-static void nb_realloc_sci(nbnxn_pairlist_t *nbl, int n)
-{
- nbl->sci_nalloc = over_alloc_small(n);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->sci),
- nbl->nsci*sizeof(*nbl->sci),
- nbl->sci_nalloc*sizeof(*nbl->sci),
- nbl->alloc, nbl->free);
-}
-
-/* Make a new ci entry at index nbl->nci */
-static void new_ci_entry(nbnxn_pairlist_t *nbl, int ci, int shift, int flags)
-{
- if (nbl->nci + 1 > nbl->ci_nalloc)
- {
- nb_realloc_ci(nbl, nbl->nci+1);
- }
- nbl->ci[nbl->nci].ci = ci;
- nbl->ci[nbl->nci].shift = shift;
+ nbnxn_ci_t ciEntry;
+ ciEntry.ci = ci;
+ ciEntry.shift = shift;
/* Store the interaction flags along with the shift */
- nbl->ci[nbl->nci].shift |= flags;
- nbl->ci[nbl->nci].cj_ind_start = nbl->ncj;
- nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+ ciEntry.shift |= flags;
+ ciEntry.cj_ind_start = nbl->cj.size();
+ ciEntry.cj_ind_end = nbl->cj.size();
+ nbl->ci.push_back(ciEntry);
}
/* Make a new sci entry at index nbl->nsci */
-static void new_sci_entry(nbnxn_pairlist_t *nbl, int sci, int shift)
+static void addNewIEntry(NbnxnPairlistGpu *nbl, int sci, int shift, int gmx_unused flags)
{
- if (nbl->nsci + 1 > nbl->sci_nalloc)
- {
- nb_realloc_sci(nbl, nbl->nsci+1);
- }
- nbl->sci[nbl->nsci].sci = sci;
- nbl->sci[nbl->nsci].shift = shift;
- nbl->sci[nbl->nsci].cj4_ind_start = nbl->ncj4;
- nbl->sci[nbl->nsci].cj4_ind_end = nbl->ncj4;
+ nbnxn_sci_t sciEntry;
+ sciEntry.sci = sci;
+ sciEntry.shift = shift;
+ sciEntry.cj4_ind_start = nbl->cj4.size();
+ sciEntry.cj4_ind_end = nbl->cj4.size();
+
+ nbl->sci.push_back(sciEntry);
}
/* Sort the simple j-list cj on exclusions.
* Entries with exclusions will all be sorted to the beginning of the list.
*/
static void sort_cj_excl(nbnxn_cj_t *cj, int ncj,
- nbnxn_list_work_t *work)
+ NbnxnPairlistCpuWork *work)
{
- int jnew;
-
- if (ncj > work->cj_nalloc)
- {
- work->cj_nalloc = over_alloc_large(ncj);
- srenew(work->cj, work->cj_nalloc);
- }
+ work->cj.resize(ncj);
/* Make a list of the j-cells involving exclusions */
- jnew = 0;
+ int jnew = 0;
for (int j = 0; j < ncj; j++)
{
if (cj[j].excl != NBNXN_INTERACTION_MASK_ALL)
}
/* Close this simple list i entry */
-static void close_ci_entry_simple(nbnxn_pairlist_t *nbl)
+static void closeIEntry(NbnxnPairlistCpu *nbl,
+ int gmx_unused sp_max_av,
+ gmx_bool gmx_unused progBal,
+ float gmx_unused nsp_tot_est,
+ int gmx_unused thread,
+ int gmx_unused nthread)
{
- int jlen;
+ nbnxn_ci_t &ciEntry = nbl->ci.back();
/* All content of the new ci entry have already been filled correctly,
- * we only need to increase the count here (for non empty lists).
+ * we only need to sort and increase counts or remove the entry when empty.
*/
- jlen = nbl->ci[nbl->nci].cj_ind_end - nbl->ci[nbl->nci].cj_ind_start;
+ const int jlen = ciEntry.cj_ind_end - ciEntry.cj_ind_start;
if (jlen > 0)
{
- sort_cj_excl(nbl->cj+nbl->ci[nbl->nci].cj_ind_start, jlen, nbl->work);
+ sort_cj_excl(nbl->cj.data() + ciEntry.cj_ind_start, jlen, nbl->work);
/* The counts below are used for non-bonded pair/flop counts
* and should therefore match the available kernel setups.
*/
- if (!(nbl->ci[nbl->nci].shift & NBNXN_CI_DO_COUL(0)))
+ if (!(ciEntry.shift & NBNXN_CI_DO_COUL(0)))
{
nbl->work->ncj_noq += jlen;
}
- else if ((nbl->ci[nbl->nci].shift & NBNXN_CI_HALF_LJ(0)) ||
- !(nbl->ci[nbl->nci].shift & NBNXN_CI_DO_LJ(0)))
+ else if ((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) ||
+ !(ciEntry.shift & NBNXN_CI_DO_LJ(0)))
{
nbl->work->ncj_hlj += jlen;
}
-
- nbl->nci++;
+ }
+ else
+ {
+ /* Entry is empty: remove it */
+ nbl->ci.pop_back();
}
}
* As the lists get concatenated later, this estimate depends
* both on nthread and our own thread index.
*/
-static void split_sci_entry(nbnxn_pairlist_t *nbl,
+static void split_sci_entry(NbnxnPairlistGpu *nbl,
int nsp_target_av,
gmx_bool progBal, float nsp_tot_est,
int thread, int nthread)
{
int nsp_max;
- int cj4_start, cj4_end, j4len;
- int sci;
- int nsp, nsp_sci, nsp_cj4, nsp_cj4_e, nsp_cj4_p;
if (progBal)
{
nsp_max = nsp_target_av;
}
- cj4_start = nbl->sci[nbl->nsci-1].cj4_ind_start;
- cj4_end = nbl->sci[nbl->nsci-1].cj4_ind_end;
- j4len = cj4_end - cj4_start;
+ const int cj4_start = nbl->sci.back().cj4_ind_start;
+ const int cj4_end = nbl->sci.back().cj4_ind_end;
+ const int j4len = cj4_end - cj4_start;
if (j4len > 1 && j4len*c_gpuNumClusterPerCell*c_nbnxnGpuJgroupSize > nsp_max)
{
- /* Remove the last ci entry and process the cj4's again */
- nbl->nsci -= 1;
+ /* Modify the last ci entry and process the cj4's again */
- sci = nbl->nsci;
- nsp = 0;
- nsp_sci = 0;
- nsp_cj4_e = 0;
- nsp_cj4 = 0;
+ int nsp = 0;
+ int nsp_sci = 0;
+ int nsp_cj4_e = 0;
+ int nsp_cj4 = 0;
for (int cj4 = cj4_start; cj4 < cj4_end; cj4++)
{
- nsp_cj4_p = nsp_cj4;
+ int nsp_cj4_p = nsp_cj4;
/* Count the number of cluster pairs in this cj4 group */
nsp_cj4 = 0;
for (int p = 0; p < c_gpuNumClusterPerCell*c_nbnxnGpuJgroupSize; p++)
if (nsp > 0 && nsp_max - nsp < nsp + nsp_cj4 - nsp_max)
{
/* Split the list at cj4 */
- nbl->sci[sci].cj4_ind_end = cj4;
+ nbl->sci.back().cj4_ind_end = cj4;
/* Create a new sci entry */
- sci++;
- nbl->nsci++;
- if (nbl->nsci+1 > nbl->sci_nalloc)
- {
- nb_realloc_sci(nbl, nbl->nsci+1);
- }
- nbl->sci[sci].sci = nbl->sci[nbl->nsci-1].sci;
- nbl->sci[sci].shift = nbl->sci[nbl->nsci-1].shift;
- nbl->sci[sci].cj4_ind_start = cj4;
- nsp_sci = nsp;
- nsp_cj4_e = nsp_cj4_p;
- nsp = 0;
+ nbnxn_sci_t sciNew;
+ sciNew.sci = nbl->sci.back().sci;
+ sciNew.shift = nbl->sci.back().shift;
+ sciNew.cj4_ind_start = cj4;
+ nbl->sci.push_back(sciNew);
+
+ nsp_sci = nsp;
+ nsp_cj4_e = nsp_cj4_p;
+ nsp = 0;
}
nsp += nsp_cj4;
}
/* Put the remaining cj4's in the last sci entry */
- nbl->sci[sci].cj4_ind_end = cj4_end;
+ nbl->sci.back().cj4_ind_end = cj4_end;
/* Possibly balance out the last two sci's
* by moving the last cj4 of the second last sci.
*/
if (nsp_sci - nsp_cj4_e >= nsp + nsp_cj4_e)
{
- nbl->sci[sci-1].cj4_ind_end--;
- nbl->sci[sci].cj4_ind_start--;
+ GMX_ASSERT(nbl->sci.size() >= 2, "We expect at least two elements");
+ nbl->sci[nbl->sci.size() - 2].cj4_ind_end--;
+ nbl->sci[nbl->sci.size() - 1].cj4_ind_start--;
}
-
- nbl->nsci++;
}
}
/* Clost this super/sub list i entry */
-static void close_ci_entry_supersub(nbnxn_pairlist_t *nbl,
- int nsp_max_av,
- gmx_bool progBal, float nsp_tot_est,
- int thread, int nthread)
+static void closeIEntry(NbnxnPairlistGpu *nbl,
+ int nsp_max_av,
+ gmx_bool progBal, float nsp_tot_est,
+ int thread, int nthread)
{
+ nbnxn_sci_t &sciEntry = *getOpenIEntry(nbl);
+
/* All content of the new ci entry have already been filled correctly,
- * we only need to increase the count here (for non empty lists).
+ * we only need to, potentially, split or remove the entry when empty.
*/
- int j4len = nbl->sci[nbl->nsci].cj4_ind_end - nbl->sci[nbl->nsci].cj4_ind_start;
+ int j4len = sciEntry.numJClusterGroups();
if (j4len > 0)
{
/* We can only have complete blocks of 4 j-entries in a list,
* so round the count up before closing.
*/
- nbl->ncj4 = (nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
- nbl->work->cj_ind = nbl->ncj4*c_nbnxnGpuJgroupSize;
-
- nbl->nsci++;
+ int ncj4 = (nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
+ nbl->work->cj_ind = ncj4*c_nbnxnGpuJgroupSize;
if (nsp_max_av > 0)
{
thread, nthread);
}
}
+ else
+ {
+ /* Entry is empty: remove it */
+ nbl->sci.pop_back();
+ }
}
-/* Syncs the working array before adding another grid pair to the list */
-static void sync_work(nbnxn_pairlist_t *nbl)
+/* Syncs the working array before adding another grid pair to the GPU list */
+static void sync_work(NbnxnPairlistCpu gmx_unused *nbl)
{
- if (!nbl->bSimple)
- {
- nbl->work->cj_ind = nbl->ncj4*c_nbnxnGpuJgroupSize;
- nbl->work->cj4_init = nbl->ncj4;
- }
}
-/* Clears an nbnxn_pairlist_t data structure */
-static void clear_pairlist(nbnxn_pairlist_t *nbl)
+/* Syncs the working array before adding another grid pair to the GPU list */
+static void sync_work(NbnxnPairlistGpu *nbl)
{
- nbl->nci = 0;
- nbl->nsci = 0;
- nbl->ncj = 0;
+ nbl->work->cj_ind = nbl->cj4.size()*c_nbnxnGpuJgroupSize;
+}
+
+/* Clears an NbnxnPairlistCpu data structure */
+static void clear_pairlist(NbnxnPairlistCpu *nbl)
+{
+ nbl->ci.clear();
+ nbl->cj.clear();
nbl->ncjInUse = 0;
- nbl->ncj4 = 0;
nbl->nci_tot = 0;
- nbl->nciOuter = -1;
- nbl->nexcl = 1;
+ nbl->ciOuter.clear();
+ nbl->cjOuter.clear();
nbl->work->ncj_noq = 0;
nbl->work->ncj_hlj = 0;
}
+/* Clears an NbnxnPairlistGpu data structure */
+static void clear_pairlist(NbnxnPairlistGpu *nbl)
+{
+ nbl->sci.clear();
+ nbl->cj4.clear();
+ nbl->excl.resize(1);
+ nbl->nci_tot = 0;
+}
+
/* Clears a group scheme pair list */
static void clear_pairlist_fep(t_nblist *nl)
{
bb_ci->upper[BB_Z] = bb[ci].upper[BB_Z] + shz;
}
+/* Sets a simple list i-cell bounding box, including PBC shift */
+static inline void set_icell_bb(const nbnxn_grid_t &iGrid,
+ int ci,
+ real shx, real shy, real shz,
+ NbnxnPairlistCpuWork *work)
+{
+ set_icell_bb_simple(iGrid.bb, ci, shx, shy, shz, &work->iClusterData.bb[0]);
+}
+
#if NBNXN_BBXXXX
/* Sets a super-cell and sub cell bounding boxes, including PBC shift */
static void set_icell_bbxxxx_supersub(gmx::ArrayRef<const float> bb,
}
}
+/* Sets a super-cell and sub cell bounding boxes, including PBC shift */
+gmx_unused static void set_icell_bb(const nbnxn_grid_t &iGrid,
+ int ci,
+ real shx, real shy, real shz,
+ NbnxnPairlistGpuWork *work)
+{
+#if NBNXN_BBXXXX
+ set_icell_bbxxxx_supersub(iGrid.pbb, ci, shx, shy, shz,
+ work->iSuperClusterData.bbPacked.data());
+#else
+ set_icell_bb_supersub(iGrid.bb, ci, shx, shy, shz,
+ work->iSuperClusterData.bb.data());
+#endif
+}
+
/* Copies PBC shifted i-cell atom coordinates x,y,z to working array */
static void icell_set_x_simple(int ci,
real shx, real shy, real shz,
int stride, const real *x,
- nbnxn_list_work_t *work)
+ NbnxnPairlistCpuWork::IClusterData *iClusterData)
{
- int ia = ci*NBNXN_CPU_CLUSTER_I_SIZE;
+ const int ia = ci*c_nbnxnCpuIClusterSize;
- for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE; i++)
+ for (int i = 0; i < c_nbnxnCpuIClusterSize; i++)
{
- work->x_ci[i*STRIDE_XYZ+XX] = x[(ia+i)*stride+XX] + shx;
- work->x_ci[i*STRIDE_XYZ+YY] = x[(ia+i)*stride+YY] + shy;
- work->x_ci[i*STRIDE_XYZ+ZZ] = x[(ia+i)*stride+ZZ] + shz;
+ iClusterData->x[i*STRIDE_XYZ+XX] = x[(ia+i)*stride+XX] + shx;
+ iClusterData->x[i*STRIDE_XYZ+YY] = x[(ia+i)*stride+YY] + shy;
+ iClusterData->x[i*STRIDE_XYZ+ZZ] = x[(ia+i)*stride+ZZ] + shz;
+ }
+}
+
+static void icell_set_x(int ci,
+ real shx, real shy, real shz,
+ int stride, const real *x,
+ int nb_kernel_type,
+ NbnxnPairlistCpuWork *work)
+{
+ switch (nb_kernel_type)
+ {
+#if GMX_SIMD
+#ifdef GMX_NBNXN_SIMD_4XN
+ case nbnxnk4xN_SIMD_4xN:
+ icell_set_x_simd_4xn(ci, shx, shy, shz, stride, x, work);
+ break;
+#endif
+#ifdef GMX_NBNXN_SIMD_2XNN
+ case nbnxnk4xN_SIMD_2xNN:
+ icell_set_x_simd_2xnn(ci, shx, shy, shz, stride, x, work);
+ break;
+#endif
+#endif
+ case nbnxnk4x4_PlainC:
+ icell_set_x_simple(ci, shx, shy, shz, stride, x, &work->iClusterData);
+ break;
+ default:
+ GMX_ASSERT(false, "Unhandled case");
+ break;
}
}
/* Copies PBC shifted super-cell atom coordinates x,y,z to working array */
-static void icell_set_x_supersub(int ci,
- real shx, real shy, real shz,
- int stride, const real *x,
- nbnxn_list_work_t *work)
+static void icell_set_x(int ci,
+ real shx, real shy, real shz,
+ int stride, const real *x,
+ int gmx_unused nb_kernel_type,
+ NbnxnPairlistGpuWork *work)
{
#if !GMX_SIMD4_HAVE_REAL
- real * x_ci = work->x_ci;
+ real * x_ci = work->iSuperClusterData.x.data();
int ia = ci*c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize;
for (int i = 0; i < c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize; i++)
#else /* !GMX_SIMD4_HAVE_REAL */
- real * x_ci = work->x_ci_simd;
+ real * x_ci = work->iSuperClusterData.xSimd.data();
for (int si = 0; si < c_gpuNumClusterPerCell; si++)
{
#endif /* !GMX_SIMD4_HAVE_REAL */
}
-static real minimum_subgrid_size_xy(const nbnxn_grid_t *grid)
+static real minimum_subgrid_size_xy(const nbnxn_grid_t &grid)
{
- if (grid->bSimple)
+ if (grid.bSimple)
{
- return std::min(grid->cellSize[XX], grid->cellSize[YY]);
+ return std::min(grid.cellSize[XX], grid.cellSize[YY]);
}
else
{
- return std::min(grid->cellSize[XX]/c_gpuNumClusterPerCellX,
- grid->cellSize[YY]/c_gpuNumClusterPerCellY);
+ return std::min(grid.cellSize[XX]/c_gpuNumClusterPerCellX,
+ grid.cellSize[YY]/c_gpuNumClusterPerCellY);
}
}
-static real effective_buffer_1x1_vs_MxN(const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj)
+static real effective_buffer_1x1_vs_MxN(const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid)
{
const real eff_1x1_buffer_fac_overest = 0.1;
* Smaller tolerances or using RF lead to a smaller effective buffer,
* so 10% gives a safe overestimate.
*/
- return eff_1x1_buffer_fac_overest*(minimum_subgrid_size_xy(gridi) +
- minimum_subgrid_size_xy(gridj));
+ return eff_1x1_buffer_fac_overest*(minimum_subgrid_size_xy(iGrid) +
+ minimum_subgrid_size_xy(jGrid));
}
/* Clusters at the cut-off only increase rlist by 60% of their size */
/* We should get this from the setup, but currently it's the same for
* all setups, including GPUs.
*/
- cluster_size_i = NBNXN_CPU_CLUSTER_I_SIZE;
+ cluster_size_i = c_nbnxnCpuIClusterSize;
vol_inc_i = (cluster_size_i - 1)/atom_density;
vol_inc_j = (cluster_size_j - 1)/atom_density;
* Maxwell is less sensitive to the exact value.
*/
const int nsubpair_target_min = 36;
- const nbnxn_grid_t *grid;
rvec ls;
real r_eff_sup, vol_est, nsp_est, nsp_est_nl;
- grid = &nbs->grid[0];
+ const nbnxn_grid_t &grid = nbs->grid[0];
/* We don't need to balance list sizes if:
* - We didn't request balancing.
* since we will always generate at least #cells lists.
* - We don't have any cells, since then there won't be any lists.
*/
- if (min_ci_balanced <= 0 || grid->nc >= min_ci_balanced || grid->nc == 0)
+ if (min_ci_balanced <= 0 || grid.nc >= min_ci_balanced || grid.nc == 0)
{
/* nsubpair_target==0 signals no balancing */
*nsubpair_target = 0;
return;
}
- ls[XX] = (grid->c1[XX] - grid->c0[XX])/(grid->numCells[XX]*c_gpuNumClusterPerCellX);
- ls[YY] = (grid->c1[YY] - grid->c0[YY])/(grid->numCells[YY]*c_gpuNumClusterPerCellY);
- ls[ZZ] = grid->na_c/(grid->atom_density*ls[XX]*ls[YY]);
+ ls[XX] = (grid.c1[XX] - grid.c0[XX])/(grid.numCells[XX]*c_gpuNumClusterPerCellX);
+ ls[YY] = (grid.c1[YY] - grid.c0[YY])/(grid.numCells[YY]*c_gpuNumClusterPerCellY);
+ ls[ZZ] = grid.na_c/(grid.atom_density*ls[XX]*ls[YY]);
/* The average length of the diagonal of a sub cell */
real diagonal = std::sqrt(ls[XX]*ls[XX] + ls[YY]*ls[YY] + ls[ZZ]*ls[ZZ]);
/* The formulas below are a heuristic estimate of the average nsj per si*/
- r_eff_sup = rlist + nbnxn_rlist_inc_outside_fac*gmx::square((grid->na_c - 1.0)/grid->na_c)*0.5*diagonal;
+ r_eff_sup = rlist + nbnxn_rlist_inc_outside_fac*gmx::square((grid.na_c - 1.0)/grid.na_c)*0.5*diagonal;
if (!nbs->DomDec || nbs->zones->n == 1)
{
else
{
nsp_est_nl =
- gmx::square(grid->atom_density/grid->na_c)*
+ gmx::square(grid.atom_density/grid.na_c)*
nonlocal_vol2(nbs->zones, ls, r_eff_sup);
}
/* Estimate the number of cluster pairs as the local number of
* clusters times the volume they interact with times the density.
*/
- nsp_est = grid->nsubc_tot*vol_est*grid->atom_density/grid->na_c;
+ nsp_est = grid.nsubc_tot*vol_est*grid.atom_density/grid.na_c;
/* Subtract the non-local pair count */
nsp_est -= nsp_est_nl;
* groups of atoms we'll anyhow be limited by nsubpair_target_min,
* so this overestimation will not matter.
*/
- nsp_est = std::max(nsp_est, grid->nsubc_tot*14._real);
+ nsp_est = std::max(nsp_est, grid.nsubc_tot*14._real);
if (debug)
{
}
/* Debug list print function */
-static void print_nblist_ci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
+static void print_nblist_ci_cj(FILE *fp, const NbnxnPairlistCpu *nbl)
{
- for (int i = 0; i < nbl->nci; i++)
+ for (const nbnxn_ci_t &ciEntry : nbl->ci)
{
fprintf(fp, "ci %4d shift %2d ncj %3d\n",
- nbl->ci[i].ci, nbl->ci[i].shift,
- nbl->ci[i].cj_ind_end - nbl->ci[i].cj_ind_start);
+ ciEntry.ci, ciEntry.shift,
+ ciEntry.cj_ind_end - ciEntry.cj_ind_start);
- for (int j = nbl->ci[i].cj_ind_start; j < nbl->ci[i].cj_ind_end; j++)
+ for (int j = ciEntry.cj_ind_start; j < ciEntry.cj_ind_end; j++)
{
fprintf(fp, " cj %5d imask %x\n",
nbl->cj[j].cj,
}
/* Debug list print function */
-static void print_nblist_sci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
+static void print_nblist_sci_cj(FILE *fp, const NbnxnPairlistGpu *nbl)
{
- for (int i = 0; i < nbl->nsci; i++)
+ for (const nbnxn_sci_t &sci : nbl->sci)
{
fprintf(fp, "ci %4d shift %2d ncj4 %2d\n",
- nbl->sci[i].sci, nbl->sci[i].shift,
- nbl->sci[i].cj4_ind_end - nbl->sci[i].cj4_ind_start);
+ sci.sci, sci.shift,
+ sci.numJClusterGroups());
int ncp = 0;
- for (int j4 = nbl->sci[i].cj4_ind_start; j4 < nbl->sci[i].cj4_ind_end; j4++)
+ for (int j4 = sci.cj4_ind_start; j4 < sci.cj4_ind_end; j4++)
{
for (int j = 0; j < c_nbnxnGpuJgroupSize; j++)
{
}
}
fprintf(fp, "ci %4d shift %2d ncj4 %2d ncp %3d\n",
- nbl->sci[i].sci, nbl->sci[i].shift,
- nbl->sci[i].cj4_ind_end - nbl->sci[i].cj4_ind_start,
+ sci.sci, sci.shift,
+ sci.numJClusterGroups(),
ncp);
}
}
/* Combine pair lists *nbl generated on multiple threads nblc */
-static void combine_nblists(int nnbl, nbnxn_pairlist_t **nbl,
- nbnxn_pairlist_t *nblc)
+static void combine_nblists(int nnbl, NbnxnPairlistGpu **nbl,
+ NbnxnPairlistGpu *nblc)
{
- int nsci, ncj4, nexcl;
-
- if (nblc->bSimple)
- {
- gmx_incons("combine_nblists does not support simple lists");
- }
-
- nsci = nblc->nsci;
- ncj4 = nblc->ncj4;
- nexcl = nblc->nexcl;
+ int nsci = nblc->sci.size();
+ int ncj4 = nblc->cj4.size();
+ int nexcl = nblc->excl.size();
for (int i = 0; i < nnbl; i++)
{
- nsci += nbl[i]->nsci;
- ncj4 += nbl[i]->ncj4;
- nexcl += nbl[i]->nexcl;
+ nsci += nbl[i]->sci.size();
+ ncj4 += nbl[i]->cj4.size();
+ nexcl += nbl[i]->excl.size();
}
- if (nsci > nblc->sci_nalloc)
- {
- nb_realloc_sci(nblc, nsci);
- }
- if (ncj4 > nblc->cj4_nalloc)
- {
- nblc->cj4_nalloc = over_alloc_small(ncj4);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nblc->cj4),
- nblc->ncj4*sizeof(*nblc->cj4),
- nblc->cj4_nalloc*sizeof(*nblc->cj4),
- nblc->alloc, nblc->free);
- }
- if (nexcl > nblc->excl_nalloc)
- {
- nblc->excl_nalloc = over_alloc_small(nexcl);
- nbnxn_realloc_void(reinterpret_cast<void **>(&nblc->excl),
- nblc->nexcl*sizeof(*nblc->excl),
- nblc->excl_nalloc*sizeof(*nblc->excl),
- nblc->alloc, nblc->free);
- }
+ /* Resize with the final, combined size, so we can fill in parallel */
+ /* NOTE: For better performance we should use default initialization */
+ nblc->sci.resize(nsci);
+ nblc->cj4.resize(ncj4);
+ nblc->excl.resize(nexcl);
/* Each thread should copy its own data to the combined arrays,
* as otherwise data will go back and forth between different caches.
{
try
{
- int sci_offset;
- int cj4_offset;
- int excl_offset;
- const nbnxn_pairlist_t *nbli;
-
- /* Determine the offset in the combined data for our thread */
- sci_offset = nblc->nsci;
- cj4_offset = nblc->ncj4;
- excl_offset = nblc->nexcl;
+ /* Determine the offset in the combined data for our thread.
+ * Note that the original sizes in nblc are lost.
+ */
+ int sci_offset = nsci;
+ int cj4_offset = ncj4;
+ int excl_offset = nexcl;
- for (int i = 0; i < n; i++)
+ for (int i = n; i < nnbl; i++)
{
- sci_offset += nbl[i]->nsci;
- cj4_offset += nbl[i]->ncj4;
- excl_offset += nbl[i]->nexcl;
+ sci_offset -= nbl[i]->sci.size();
+ cj4_offset -= nbl[i]->cj4.size();
+ excl_offset -= nbl[i]->excl.size();
}
- nbli = nbl[n];
+ const NbnxnPairlistGpu &nbli = *nbl[n];
- for (int i = 0; i < nbli->nsci; i++)
+ for (size_t i = 0; i < nbli.sci.size(); i++)
{
- nblc->sci[sci_offset+i] = nbli->sci[i];
- nblc->sci[sci_offset+i].cj4_ind_start += cj4_offset;
- nblc->sci[sci_offset+i].cj4_ind_end += cj4_offset;
+ nblc->sci[sci_offset + i] = nbli.sci[i];
+ nblc->sci[sci_offset + i].cj4_ind_start += cj4_offset;
+ nblc->sci[sci_offset + i].cj4_ind_end += cj4_offset;
}
- for (int j4 = 0; j4 < nbli->ncj4; j4++)
+ for (size_t j4 = 0; j4 < nbli.cj4.size(); j4++)
{
- nblc->cj4[cj4_offset+j4] = nbli->cj4[j4];
- nblc->cj4[cj4_offset+j4].imei[0].excl_ind += excl_offset;
- nblc->cj4[cj4_offset+j4].imei[1].excl_ind += excl_offset;
+ nblc->cj4[cj4_offset + j4] = nbli.cj4[j4];
+ nblc->cj4[cj4_offset + j4].imei[0].excl_ind += excl_offset;
+ nblc->cj4[cj4_offset + j4].imei[1].excl_ind += excl_offset;
}
- for (int j4 = 0; j4 < nbli->nexcl; j4++)
+ for (size_t j4 = 0; j4 < nbli.excl.size(); j4++)
{
- nblc->excl[excl_offset+j4] = nbli->excl[j4];
+ nblc->excl[excl_offset + j4] = nbli.excl[j4];
}
}
GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
for (int n = 0; n < nnbl; n++)
{
- nblc->nsci += nbl[n]->nsci;
- nblc->ncj4 += nbl[n]->ncj4;
nblc->nci_tot += nbl[n]->nci_tot;
- nblc->nexcl += nbl[n]->nexcl;
}
}
}
/* Returns the next ci to be processes by our thread */
-static gmx_bool next_ci(const nbnxn_grid_t *grid,
+static gmx_bool next_ci(const nbnxn_grid_t &grid,
int nth, int ci_block,
int *ci_x, int *ci_y,
int *ci_b, int *ci)
*ci_b = 0;
}
- if (*ci >= grid->nc)
+ if (*ci >= grid.nc)
{
return FALSE;
}
- while (*ci >= grid->cxy_ind[*ci_x*grid->numCells[YY] + *ci_y + 1])
+ while (*ci >= grid.cxy_ind[*ci_x*grid.numCells[YY] + *ci_y + 1])
{
*ci_y += 1;
- if (*ci_y == grid->numCells[YY])
+ if (*ci_y == grid.numCells[YY])
{
*ci_x += 1;
*ci_y = 0;
/* Returns the distance^2 for which we put cell pairs in the list
* without checking atom pair distances. This is usually < rlist^2.
*/
-static float boundingbox_only_distance2(const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj,
+static float boundingbox_only_distance2(const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid,
real rlist,
gmx_bool simple)
{
real bbx, bby;
real rbb2;
- bbx = 0.5*(gridi->cellSize[XX] + gridj->cellSize[XX]);
- bby = 0.5*(gridi->cellSize[YY] + gridj->cellSize[YY]);
+ bbx = 0.5*(iGrid.cellSize[XX] + jGrid.cellSize[XX]);
+ bby = 0.5*(iGrid.cellSize[YY] + jGrid.cellSize[YY]);
if (!simple)
{
bbx /= c_gpuNumClusterPerCellX;
#endif
}
-static int get_ci_block_size(const nbnxn_grid_t *gridi,
+static int get_ci_block_size(const nbnxn_grid_t &iGrid,
gmx_bool bDomDec, int nth)
{
const int ci_block_enum = 5;
* zone boundaries with 3D domain decomposition. At the same time
* the blocks will not become too small.
*/
- ci_block = (gridi->nc*ci_block_enum)/(ci_block_denom*gridi->numCells[XX]*nth);
+ ci_block = (iGrid.nc*ci_block_enum)/(ci_block_denom*iGrid.numCells[XX]*nth);
/* Ensure the blocks are not too small: avoids cache invalidation */
- if (ci_block*gridi->na_sc < ci_block_min_atoms)
+ if (ci_block*iGrid.na_sc < ci_block_min_atoms)
{
- ci_block = (ci_block_min_atoms + gridi->na_sc - 1)/gridi->na_sc;
+ ci_block = (ci_block_min_atoms + iGrid.na_sc - 1)/iGrid.na_sc;
}
/* Without domain decomposition
* or with less than 3 blocks per task, divide in nth blocks.
*/
- if (!bDomDec || nth*3*ci_block > gridi->nc)
+ if (!bDomDec || nth*3*ci_block > iGrid.nc)
{
- ci_block = (gridi->nc + nth - 1)/nth;
+ ci_block = (iGrid.nc + nth - 1)/nth;
}
- if (ci_block > 1 && (nth - 1)*ci_block >= gridi->nc)
+ if (ci_block > 1 && (nth - 1)*ci_block >= iGrid.nc)
{
/* Some threads have no work. Although reducing the block size
* does not decrease the block count on the first few threads,
return bufferFlagShift;
}
+static bool pairlistIsSimple(const NbnxnPairlistCpu gmx_unused &pairlist)
+{
+ return true;
+}
+
+static bool pairlistIsSimple(const NbnxnPairlistGpu gmx_unused &pairlist)
+{
+ return false;
+}
+
+static void makeClusterListWrapper(NbnxnPairlistCpu *nbl,
+ const nbnxn_grid_t gmx_unused &iGrid,
+ const int ci,
+ const nbnxn_grid_t &jGrid,
+ const int firstCell,
+ const int lastCell,
+ const bool excludeSubDiagonal,
+ const nbnxn_atomdata_t *nbat,
+ const real rlist2,
+ const real rbb2,
+ const int nb_kernel_type,
+ int *numDistanceChecks)
+{
+ switch (nb_kernel_type)
+ {
+ case nbnxnk4x4_PlainC:
+ makeClusterListSimple(jGrid,
+ nbl, ci, firstCell, lastCell,
+ excludeSubDiagonal,
+ nbat->x().data(),
+ rlist2, rbb2,
+ numDistanceChecks);
+ break;
+#ifdef GMX_NBNXN_SIMD_4XN
+ case nbnxnk4xN_SIMD_4xN:
+ makeClusterListSimd4xn(jGrid,
+ nbl, ci, firstCell, lastCell,
+ excludeSubDiagonal,
+ nbat->x().data(),
+ rlist2, rbb2,
+ numDistanceChecks);
+ break;
+#endif
+#ifdef GMX_NBNXN_SIMD_2XNN
+ case nbnxnk4xN_SIMD_2xNN:
+ makeClusterListSimd2xnn(jGrid,
+ nbl, ci, firstCell, lastCell,
+ excludeSubDiagonal,
+ nbat->x().data(),
+ rlist2, rbb2,
+ numDistanceChecks);
+ break;
+#endif
+ }
+}
+
+static void makeClusterListWrapper(NbnxnPairlistGpu *nbl,
+ const nbnxn_grid_t &gmx_unused iGrid,
+ const int ci,
+ const nbnxn_grid_t &jGrid,
+ const int firstCell,
+ const int lastCell,
+ const bool excludeSubDiagonal,
+ const nbnxn_atomdata_t *nbat,
+ const real rlist2,
+ const real rbb2,
+ const int gmx_unused nb_kernel_type,
+ int *numDistanceChecks)
+{
+ for (int cj = firstCell; cj <= lastCell; cj++)
+ {
+ make_cluster_list_supersub(iGrid, jGrid,
+ nbl, ci, cj,
+ excludeSubDiagonal,
+ nbat->xstride, nbat->x().data(),
+ rlist2, rbb2,
+ numDistanceChecks);
+ }
+}
+
+static int getNumSimpleJClustersInList(const NbnxnPairlistCpu &nbl)
+{
+ return nbl.cj.size();
+}
+
+static int getNumSimpleJClustersInList(const gmx_unused NbnxnPairlistGpu &nbl)
+{
+ return 0;
+}
+
+static void incrementNumSimpleJClustersInList(NbnxnPairlistCpu *nbl,
+ int ncj_old_j)
+{
+ nbl->ncjInUse += nbl->cj.size() - ncj_old_j;
+}
+
+static void incrementNumSimpleJClustersInList(NbnxnPairlistGpu gmx_unused *nbl,
+ int gmx_unused ncj_old_j)
+{
+}
+
+static void checkListSizeConsistency(const NbnxnPairlistCpu &nbl,
+ const bool haveFreeEnergy)
+{
+ GMX_RELEASE_ASSERT(static_cast<size_t>(nbl.ncjInUse) == nbl.cj.size() || haveFreeEnergy,
+ "Without free-energy all cj pair-list entries should be in use. "
+ "Note that subsequent code does not make use of the equality, "
+ "this check is only here to catch bugs");
+}
+
+static void checkListSizeConsistency(const NbnxnPairlistGpu gmx_unused &nbl,
+ bool gmx_unused haveFreeEnergy)
+{
+ /* We currently can not check consistency here */
+}
+
+/* Set the buffer flags for newly added entries in the list */
+static void setBufferFlags(const NbnxnPairlistCpu &nbl,
+ const int ncj_old_j,
+ const int gridj_flag_shift,
+ gmx_bitmask_t *gridj_flag,
+ const int th)
+{
+ if (static_cast<gmx::index>(nbl.cj.size()) > ncj_old_j)
+ {
+ int cbFirst = nbl.cj[ncj_old_j].cj >> gridj_flag_shift;
+ int cbLast = nbl.cj.back().cj >> gridj_flag_shift;
+ for (int cb = cbFirst; cb <= cbLast; cb++)
+ {
+ bitmask_init_bit(&gridj_flag[cb], th);
+ }
+ }
+}
+
+static void setBufferFlags(const NbnxnPairlistGpu gmx_unused &nbl,
+ int gmx_unused ncj_old_j,
+ int gmx_unused gridj_flag_shift,
+ gmx_bitmask_t gmx_unused *gridj_flag,
+ int gmx_unused th)
+{
+ GMX_ASSERT(false, "This function should never be called");
+}
+
/* Generates the part of pair-list nbl assigned to our thread */
+template <typename T>
static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
- const nbnxn_grid_t *gridi,
- const nbnxn_grid_t *gridj,
+ const nbnxn_grid_t &iGrid,
+ const nbnxn_grid_t &jGrid,
nbnxn_search_work_t *work,
const nbnxn_atomdata_t *nbat,
const t_blocka &exclusions,
gmx_bool progBal,
float nsubpair_tot_est,
int th, int nth,
- nbnxn_pairlist_t *nbl,
+ T *nbl,
t_nblist *nbl_fep)
{
int na_cj_2log;
matrix box;
real rlist2, rl_fep2 = 0;
float rbb2;
- int ci_b, ci, ci_x, ci_y, ci_xy, cj;
+ int ci_b, ci, ci_x, ci_y, ci_xy;
ivec shp;
- int shift;
- real shx, shy, shz;
real bx0, bx1, by0, by1, bz0, bz1;
real bz1_frac;
real d2cx, d2z, d2z_cx, d2z_cy, d2zx, d2zxy, d2xy;
nbs_cycle_start(&work->cc[enbsCCsearch]);
- if (gridj->bSimple != nbl->bSimple || gridi->bSimple != nbl->bSimple)
+ if (jGrid.bSimple != pairlistIsSimple(*nbl) ||
+ iGrid.bSimple != pairlistIsSimple(*nbl))
{
gmx_incons("Grid incompatible with pair-list");
}
sync_work(nbl);
- nbl->na_sc = gridj->na_sc;
- nbl->na_ci = gridj->na_c;
+ GMX_ASSERT(nbl->na_ci == jGrid.na_c, "The cluster sizes in the list and grid should match");
nbl->na_cj = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
na_cj_2log = get_2log(nbl->na_cj);
rlist2 = nbl->rlist*nbl->rlist;
- if (nbs->bFEP && !nbl->bSimple)
+ if (nbs->bFEP && !pairlistIsSimple(*nbl))
{
/* Determine an atom-pair list cut-off distance for FEP atom pairs.
* We should not simply use rlist, since then we would not have
* The buffer is on overestimate, but the resulting cost for pairs
* beyond rlist is neglible compared to the FEP pairs within rlist.
*/
- rl_fep2 = nbl->rlist + effective_buffer_1x1_vs_MxN(gridi, gridj);
+ rl_fep2 = nbl->rlist + effective_buffer_1x1_vs_MxN(iGrid, jGrid);
if (debug)
{
rl_fep2 = rl_fep2*rl_fep2;
}
- rbb2 = boundingbox_only_distance2(gridi, gridj, nbl->rlist, nbl->bSimple);
+ rbb2 = boundingbox_only_distance2(iGrid, jGrid, nbl->rlist, pairlistIsSimple(*nbl));
if (debug)
{
fprintf(debug, "nbl bounding box only distance %f\n", std::sqrt(rbb2));
}
+ const bool isIntraGridList = (&iGrid == &jGrid);
+
/* Set the shift range */
for (int d = 0; d < DIM; d++)
{
}
else
{
- const real listRangeCellToCell = listRangeForGridCellToGridCell(rlist, *gridi, *gridj);
+ const real listRangeCellToCell = listRangeForGridCellToGridCell(rlist, iGrid, jGrid);
if (d == XX &&
box[XX][XX] - fabs(box[YY][XX]) - fabs(box[ZZ][XX]) < listRangeCellToCell)
{
}
}
}
- const bool bSimple = nbl->bSimple;
+ const bool bSimple = pairlistIsSimple(*nbl);
gmx::ArrayRef<const nbnxn_bb_t> bb_i;
#if NBNXN_BBXXXX
gmx::ArrayRef<const float> pbb_i;
if (bSimple)
{
- bb_i = gridi->bb;
+ bb_i = iGrid.bb;
}
else
{
- pbb_i = gridi->pbb;
+ pbb_i = iGrid.pbb;
}
#else
/* We use the normal bounding box format for both grid types */
- bb_i = gridi->bb;
+ bb_i = iGrid.bb;
#endif
- gmx::ArrayRef<const float> bbcz_i = gridi->bbcz;
- gmx::ArrayRef<const int> flags_i = gridi->flags;
- gmx::ArrayRef<const float> bbcz_j = gridj->bbcz;
- int cell0_i = gridi->cell0;
+ gmx::ArrayRef<const float> bbcz_i = iGrid.bbcz;
+ gmx::ArrayRef<const int> flags_i = iGrid.flags;
+ gmx::ArrayRef<const float> bbcz_j = jGrid.bbcz;
+ int cell0_i = iGrid.cell0;
if (debug)
{
fprintf(debug, "nbl nc_i %d col.av. %.1f ci_block %d\n",
- gridi->nc, gridi->nc/static_cast<double>(gridi->numCells[XX]*gridi->numCells[YY]), ci_block);
+ iGrid.nc, iGrid.nc/static_cast<double>(iGrid.numCells[XX]*iGrid.numCells[YY]), ci_block);
}
numDistanceChecks = 0;
- const real listRangeBBToJCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, *gridj));
+ const real listRangeBBToJCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, jGrid));
/* Initially ci_b and ci to 1 before where we want them to start,
* as they will both be incremented in next_ci.
ci = th*ci_block - 1;
ci_x = 0;
ci_y = 0;
- while (next_ci(gridi, nth, ci_block, &ci_x, &ci_y, &ci_b, &ci))
+ while (next_ci(iGrid, nth, ci_block, &ci_x, &ci_y, &ci_b, &ci))
{
if (bSimple && flags_i[ci] == 0)
{
continue;
}
- ncj_old_i = nbl->ncj;
+ ncj_old_i = getNumSimpleJClustersInList(*nbl);
d2cx = 0;
- if (gridj != gridi && shp[XX] == 0)
+ if (!isIntraGridList && shp[XX] == 0)
{
if (bSimple)
{
}
else
{
- bx1 = gridi->c0[XX] + (ci_x+1)*gridi->cellSize[XX];
+ bx1 = iGrid.c0[XX] + (ci_x+1)*iGrid.cellSize[XX];
}
- if (bx1 < gridj->c0[XX])
+ if (bx1 < jGrid.c0[XX])
{
- d2cx = gmx::square(gridj->c0[XX] - bx1);
+ d2cx = gmx::square(jGrid.c0[XX] - bx1);
if (d2cx >= listRangeBBToJCell2)
{
}
}
- ci_xy = ci_x*gridi->numCells[YY] + ci_y;
+ ci_xy = ci_x*iGrid.numCells[YY] + ci_y;
/* Loop over shift vectors in three dimensions */
for (int tz = -shp[ZZ]; tz <= shp[ZZ]; tz++)
{
- shz = tz*box[ZZ][ZZ];
+ const real shz = tz*box[ZZ][ZZ];
bz0 = bbcz_i[ci*NNBSBB_D ] + shz;
bz1 = bbcz_i[ci*NNBSBB_D+1] + shz;
continue;
}
- bz1_frac = bz1/(gridi->cxy_ind[ci_xy+1] - gridi->cxy_ind[ci_xy]);
+ bz1_frac = bz1/(iGrid.cxy_ind[ci_xy+1] - iGrid.cxy_ind[ci_xy]);
if (bz1_frac < 0)
{
bz1_frac = 0;
for (int ty = -shp[YY]; ty <= shp[YY]; ty++)
{
- shy = ty*box[YY][YY] + tz*box[ZZ][YY];
+ const real shy = ty*box[YY][YY] + tz*box[ZZ][YY];
if (bSimple)
{
}
else
{
- by0 = gridi->c0[YY] + (ci_y )*gridi->cellSize[YY] + shy;
- by1 = gridi->c0[YY] + (ci_y+1)*gridi->cellSize[YY] + shy;
+ by0 = iGrid.c0[YY] + (ci_y )*iGrid.cellSize[YY] + shy;
+ by1 = iGrid.c0[YY] + (ci_y+1)*iGrid.cellSize[YY] + shy;
}
get_cell_range<YY>(by0, by1,
- *gridj,
+ jGrid,
d2z_cx, rlist,
&cyf, &cyl);
}
d2z_cy = d2z;
- if (by1 < gridj->c0[YY])
+ if (by1 < jGrid.c0[YY])
{
- d2z_cy += gmx::square(gridj->c0[YY] - by1);
+ d2z_cy += gmx::square(jGrid.c0[YY] - by1);
}
- else if (by0 > gridj->c1[YY])
+ else if (by0 > jGrid.c1[YY])
{
- d2z_cy += gmx::square(by0 - gridj->c1[YY]);
+ d2z_cy += gmx::square(by0 - jGrid.c1[YY]);
}
for (int tx = -shp[XX]; tx <= shp[XX]; tx++)
{
- shift = XYZ2IS(tx, ty, tz);
+ const int shift = XYZ2IS(tx, ty, tz);
+
+ const bool excludeSubDiagonal = (isIntraGridList && shift == CENTRAL);
- if (c_pbcShiftBackward && gridi == gridj && shift > CENTRAL)
+ if (c_pbcShiftBackward && isIntraGridList && shift > CENTRAL)
{
continue;
}
- shx = tx*box[XX][XX] + ty*box[YY][XX] + tz*box[ZZ][XX];
+ const real shx = tx*box[XX][XX] + ty*box[YY][XX] + tz*box[ZZ][XX];
if (bSimple)
{
}
else
{
- bx0 = gridi->c0[XX] + (ci_x )*gridi->cellSize[XX] + shx;
- bx1 = gridi->c0[XX] + (ci_x+1)*gridi->cellSize[XX] + shx;
+ bx0 = iGrid.c0[XX] + (ci_x )*iGrid.cellSize[XX] + shx;
+ bx1 = iGrid.c0[XX] + (ci_x+1)*iGrid.cellSize[XX] + shx;
}
get_cell_range<XX>(bx0, bx1,
- *gridj,
+ jGrid,
d2z_cy, rlist,
&cxf, &cxl);
continue;
}
- if (bSimple)
- {
- new_ci_entry(nbl, cell0_i+ci, shift, flags_i[ci]);
- }
- else
- {
- new_sci_entry(nbl, cell0_i+ci, shift);
- }
+ addNewIEntry(nbl, cell0_i+ci, shift, flags_i[ci]);
- if ((!c_pbcShiftBackward || (shift == CENTRAL &&
- gridi == gridj)) &&
+ if ((!c_pbcShiftBackward || excludeSubDiagonal) &&
cxf < ci_x)
{
/* Leave the pairs with i > j.
cxf = ci_x;
}
- if (bSimple)
- {
- set_icell_bb_simple(bb_i, ci, shx, shy, shz,
- nbl->work->bb_ci);
- }
- else
- {
-#if NBNXN_BBXXXX
- set_icell_bbxxxx_supersub(pbb_i, ci, shx, shy, shz,
- nbl->work->pbb_ci);
-#else
- set_icell_bb_supersub(bb_i, ci, shx, shy, shz,
- nbl->work->bb_ci);
-#endif
- }
+ set_icell_bb(iGrid, ci, shx, shy, shz,
+ nbl->work);
- nbs->icell_set_x(cell0_i+ci, shx, shy, shz,
- nbat->xstride, nbat->x,
- nbl->work);
+ icell_set_x(cell0_i+ci, shx, shy, shz,
+ nbat->xstride, nbat->x().data(),
+ nb_kernel_type,
+ nbl->work);
for (int cx = cxf; cx <= cxl; cx++)
{
d2zx = d2z;
- if (gridj->c0[XX] + cx*gridj->cellSize[XX] > bx1)
+ if (jGrid.c0[XX] + cx*jGrid.cellSize[XX] > bx1)
{
- d2zx += gmx::square(gridj->c0[XX] + cx*gridj->cellSize[XX] - bx1);
+ d2zx += gmx::square(jGrid.c0[XX] + cx*jGrid.cellSize[XX] - bx1);
}
- else if (gridj->c0[XX] + (cx+1)*gridj->cellSize[XX] < bx0)
+ else if (jGrid.c0[XX] + (cx+1)*jGrid.cellSize[XX] < bx0)
{
- d2zx += gmx::square(gridj->c0[XX] + (cx+1)*gridj->cellSize[XX] - bx0);
+ d2zx += gmx::square(jGrid.c0[XX] + (cx+1)*jGrid.cellSize[XX] - bx0);
}
- if (gridi == gridj &&
+ if (isIntraGridList &&
cx == 0 &&
(!c_pbcShiftBackward || shift == CENTRAL) &&
cyf < ci_y)
for (int cy = cyf_x; cy <= cyl; cy++)
{
- const int columnStart = gridj->cxy_ind[cx*gridj->numCells[YY] + cy];
- const int columnEnd = gridj->cxy_ind[cx*gridj->numCells[YY] + cy + 1];
+ const int columnStart = jGrid.cxy_ind[cx*jGrid.numCells[YY] + cy];
+ const int columnEnd = jGrid.cxy_ind[cx*jGrid.numCells[YY] + cy + 1];
d2zxy = d2zx;
- if (gridj->c0[YY] + cy*gridj->cellSize[YY] > by1)
+ if (jGrid.c0[YY] + cy*jGrid.cellSize[YY] > by1)
{
- d2zxy += gmx::square(gridj->c0[YY] + cy*gridj->cellSize[YY] - by1);
+ d2zxy += gmx::square(jGrid.c0[YY] + cy*jGrid.cellSize[YY] - by1);
}
- else if (gridj->c0[YY] + (cy+1)*gridj->cellSize[YY] < by0)
+ else if (jGrid.c0[YY] + (cy+1)*jGrid.cellSize[YY] < by0)
{
- d2zxy += gmx::square(gridj->c0[YY] + (cy+1)*gridj->cellSize[YY] - by0);
+ d2zxy += gmx::square(jGrid.c0[YY] + (cy+1)*jGrid.cellSize[YY] - by0);
}
if (columnStart < columnEnd && d2zxy < listRangeBBToJCell2)
{
}
#endif
- if (gridi == gridj)
+ if (isIntraGridList)
{
/* We want each atom/cell pair only once,
* only use cj >= ci.
GMX_ASSERT(firstCell >= columnStart && lastCell < columnEnd, "The range should reside within the current grid column");
/* For f buffer flags with simple lists */
- ncj_old_j = nbl->ncj;
-
- if (bSimple)
- {
- /* We have a maximum of 2 j-clusters
- * per i-cluster sized cell.
- */
- check_cell_list_space_simple(nbl, 2*(lastCell - firstCell + 1));
- }
- else
- {
- check_cell_list_space_supersub(nbl, lastCell - firstCell + 1);
- }
-
- switch (nb_kernel_type)
- {
- case nbnxnk4x4_PlainC:
- makeClusterListSimple(gridj,
- nbl, ci, firstCell, lastCell,
- (gridi == gridj && shift == CENTRAL),
- nbat->x,
- rlist2, rbb2,
- &numDistanceChecks);
- break;
-#ifdef GMX_NBNXN_SIMD_4XN
- case nbnxnk4xN_SIMD_4xN:
- makeClusterListSimd4xn(gridj,
- nbl, ci, firstCell, lastCell,
- (gridi == gridj && shift == CENTRAL),
- nbat->x,
- rlist2, rbb2,
- &numDistanceChecks);
- break;
-#endif
-#ifdef GMX_NBNXN_SIMD_2XNN
- case nbnxnk4xN_SIMD_2xNN:
- makeClusterListSimd2xnn(gridj,
- nbl, ci, firstCell, lastCell,
- (gridi == gridj && shift == CENTRAL),
- nbat->x,
- rlist2, rbb2,
- &numDistanceChecks);
- break;
-#endif
- case nbnxnk8x8x8_PlainC:
- case nbnxnk8x8x8_GPU:
- for (cj = firstCell; cj <= lastCell; cj++)
- {
- make_cluster_list_supersub(gridi, gridj,
- nbl, ci, cj,
- (gridi == gridj && shift == CENTRAL && ci == cj),
- nbat->xstride, nbat->x,
- rlist2, rbb2,
- &numDistanceChecks);
- }
- break;
- }
-
- if (bFBufferFlag && nbl->ncj > ncj_old_j)
+ ncj_old_j = getNumSimpleJClustersInList(*nbl);
+
+ makeClusterListWrapper(nbl,
+ iGrid, ci,
+ jGrid, firstCell, lastCell,
+ excludeSubDiagonal,
+ nbat,
+ rlist2, rbb2,
+ nb_kernel_type,
+ &numDistanceChecks);
+
+ if (bFBufferFlag)
{
- int cbf = nbl->cj[ncj_old_j].cj >> gridj_flag_shift;
- int cbl = nbl->cj[nbl->ncj-1].cj >> gridj_flag_shift;
- for (int cb = cbf; cb <= cbl; cb++)
- {
- bitmask_init_bit(&gridj_flag[cb], th);
- }
+ setBufferFlags(*nbl, ncj_old_j, gridj_flag_shift,
+ gridj_flag, th);
}
- nbl->ncjInUse += nbl->ncj - ncj_old_j;
+ incrementNumSimpleJClustersInList(nbl, ncj_old_j);
}
}
}
}
/* Set the exclusions for this ci list */
- if (bSimple)
+ setExclusionsForIEntry(nbs,
+ nbl,
+ excludeSubDiagonal,
+ na_cj_2log,
+ *getOpenIEntry(nbl),
+ exclusions);
+
+ if (nbs->bFEP)
{
- setExclusionsForSimpleIentry(nbs,
- nbl,
- shift == CENTRAL && gridi == gridj,
- na_cj_2log,
- nbl->ci[nbl->nci],
- exclusions);
-
- if (nbs->bFEP)
- {
- make_fep_list(nbs, nbat, nbl,
- shift == CENTRAL && gridi == gridj,
- &(nbl->ci[nbl->nci]),
- gridi, gridj, nbl_fep);
- }
- }
- else
- {
- setExclusionsForGpuIentry(nbs,
- nbl,
- shift == CENTRAL && gridi == gridj,
- nbl->sci[nbl->nsci],
- exclusions);
-
- if (nbs->bFEP)
- {
- make_fep_list_supersub(nbs, nbat, nbl,
- shift == CENTRAL && gridi == gridj,
- &(nbl->sci[nbl->nsci]),
- shx, shy, shz,
- rl_fep2,
- gridi, gridj, nbl_fep);
- }
+ make_fep_list(nbs, nbat, nbl,
+ excludeSubDiagonal,
+ getOpenIEntry(nbl),
+ shx, shy, shz,
+ rl_fep2,
+ iGrid, jGrid, nbl_fep);
}
/* Close this ci list */
- if (bSimple)
- {
- close_ci_entry_simple(nbl);
- }
- else
- {
- close_ci_entry_supersub(nbl,
- nsubpair_max,
- progBal, nsubpair_tot_est,
- th, nth);
- }
+ closeIEntry(nbl,
+ nsubpair_max,
+ progBal, nsubpair_tot_est,
+ th, nth);
}
}
}
- if (bFBufferFlag && nbl->ncj > ncj_old_i)
+ if (bFBufferFlag && getNumSimpleJClustersInList(*nbl) > ncj_old_i)
{
- bitmask_init_bit(&(work->buffer_flags.flag[(gridi->cell0+ci)>>gridi_flag_shift]), th);
+ bitmask_init_bit(&(work->buffer_flags.flag[(iGrid.cell0+ci) >> gridi_flag_shift]), th);
}
}
nbs_cycle_stop(&work->cc[enbsCCsearch]);
- GMX_ASSERT(nbl->ncjInUse == nbl->ncj || nbs->bFEP, "Without free-energy all cj pair-list entries should be in use. Note that subsequent code does not make use of the equality, this check is only here to catch bugs");
+ checkListSizeConsistency(*nbl, nbs->bFEP);
if (debug)
{
fprintf(debug, "number of distance checks %d\n", numDistanceChecks);
- if (bSimple)
- {
- print_nblist_statistics_simple(debug, nbl, nbs, rlist);
- }
- else
- {
- print_nblist_statistics_supersub(debug, nbl, nbs, rlist);
- }
+ print_nblist_statistics(debug, nbl, nbs, rlist);
if (nbs->bFEP)
{
*/
template<bool setFlags>
static void copySelectedListRange(const nbnxn_ci_t * gmx_restrict srcCi,
- const nbnxn_pairlist_t * gmx_restrict src,
- nbnxn_pairlist_t * gmx_restrict dest,
+ const NbnxnPairlistCpu * gmx_restrict src,
+ NbnxnPairlistCpu * gmx_restrict dest,
gmx_bitmask_t *flag,
int iFlagShift, int jFlagShift, int t)
{
- int ncj = srcCi->cj_ind_end - srcCi->cj_ind_start;
-
- if (dest->nci + 1 >= dest->ci_nalloc)
- {
- nb_realloc_ci(dest, dest->nci + 1);
- }
- check_cell_list_space_simple(dest, ncj);
+ const int ncj = srcCi->cj_ind_end - srcCi->cj_ind_start;
- dest->ci[dest->nci] = *srcCi;
- dest->ci[dest->nci].cj_ind_start = dest->ncj;
- dest->ci[dest->nci].cj_ind_end = dest->ncj + ncj;
+ dest->ci.push_back(*srcCi);
+ dest->ci.back().cj_ind_start = dest->cj.size();
+ dest->ci.back().cj_ind_end = dest->cj.size() + ncj;
if (setFlags)
{
for (int j = srcCi->cj_ind_start; j < srcCi->cj_ind_end; j++)
{
- dest->cj[dest->ncj++] = src->cj[j];
+ dest->cj.push_back(src->cj[j]);
if (setFlags)
{
bitmask_init_bit(&flag[src->cj[j].cj >> jFlagShift], t);
}
}
-
- dest->nci++;
}
/* This routine re-balances the pairlists such that all are nearly equally
* the original lists are quite balanced, this will only give minor overhead.
*/
static void rebalanceSimpleLists(int numLists,
- nbnxn_pairlist_t * const * const srcSet,
- nbnxn_pairlist_t **destSet,
+ NbnxnPairlistCpu * const * const srcSet,
+ NbnxnPairlistCpu **destSet,
gmx::ArrayRef<nbnxn_search_work_t> searchWork)
{
int ncjTotal = 0;
int cjEnd = ncjTarget*(t + 1);
/* The destination pair-list for task/thread t */
- nbnxn_pairlist_t *dest = destSet[t];
+ NbnxnPairlistCpu *dest = destSet[t];
clear_pairlist(dest);
- dest->bSimple = srcSet[0]->bSimple;
- dest->na_ci = srcSet[0]->na_ci;
dest->na_cj = srcSet[0]->na_cj;
/* Note that the flags in the work struct (still) contain flags
int cjGlobal = 0;
for (int s = 0; s < numLists && cjGlobal < cjEnd; s++)
{
- const nbnxn_pairlist_t *src = srcSet[s];
+ const NbnxnPairlistCpu *src = srcSet[s];
if (cjGlobal + src->ncjInUse > cjStart)
{
- for (int i = 0; i < src->nci && cjGlobal < cjEnd; i++)
+ for (gmx::index i = 0; i < static_cast<gmx::index>(src->ci.size()) && cjGlobal < cjEnd; i++)
{
const nbnxn_ci_t *srcCi = &src->ci[i];
int ncj = srcCi->cj_ind_end - srcCi->cj_ind_start;
}
}
- dest->ncjInUse = dest->ncj;
+ dest->ncjInUse = dest->cj.size();
}
#ifndef NDEBUG
* better load balancing than using a list sorted on exact load.
* This function swaps the pointer in the pair list to avoid a copy operation.
*/
-static void sort_sci(nbnxn_pairlist_t *nbl)
+static void sort_sci(NbnxnPairlistGpu *nbl)
{
- nbnxn_list_work_t *work;
- int m, s0, s1;
- nbnxn_sci_t *sci_sort;
-
- if (nbl->ncj4 <= nbl->nsci)
+ if (nbl->cj4.size() <= nbl->sci.size())
{
/* nsci = 0 or all sci have size 1, sorting won't change the order */
return;
}
- work = nbl->work;
+ NbnxnPairlistGpuWork &work = *nbl->work;
/* We will distinguish differences up to double the average */
- m = (2*nbl->ncj4)/nbl->nsci;
-
- if (m + 1 > work->sort_nalloc)
- {
- work->sort_nalloc = over_alloc_large(m + 1);
- srenew(work->sort, work->sort_nalloc);
- }
+ const int m = (2*nbl->cj4.size())/nbl->sci.size();
- if (work->sci_sort_nalloc != nbl->sci_nalloc)
- {
- work->sci_sort_nalloc = nbl->sci_nalloc;
- nbnxn_realloc_void(reinterpret_cast<void **>(&work->sci_sort),
- 0,
- work->sci_sort_nalloc*sizeof(*work->sci_sort),
- nbl->alloc, nbl->free);
- }
+ /* Resize work.sci_sort so we can sort into it */
+ work.sci_sort.resize(nbl->sci.size());
+ std::vector<int> &sort = work.sortBuffer;
+ /* Set up m + 1 entries in sort, initialized at 0 */
+ sort.clear();
+ sort.resize(m + 1, 0);
/* Count the entries of each size */
- for (int i = 0; i <= m; i++)
+ for (const nbnxn_sci_t &sci : nbl->sci)
{
- work->sort[i] = 0;
- }
- for (int s = 0; s < nbl->nsci; s++)
- {
- int i = std::min(m, nbl->sci[s].cj4_ind_end - nbl->sci[s].cj4_ind_start);
- work->sort[i]++;
+ int i = std::min(m, sci.numJClusterGroups());
+ sort[i]++;
}
/* Calculate the offset for each count */
- s0 = work->sort[m];
- work->sort[m] = 0;
+ int s0 = sort[m];
+ sort[m] = 0;
for (int i = m - 1; i >= 0; i--)
{
- s1 = work->sort[i];
- work->sort[i] = work->sort[i + 1] + s0;
- s0 = s1;
+ int s1 = sort[i];
+ sort[i] = sort[i + 1] + s0;
+ s0 = s1;
}
/* Sort entries directly into place */
- sci_sort = work->sci_sort;
- for (int s = 0; s < nbl->nsci; s++)
+ gmx::ArrayRef<nbnxn_sci_t> sci_sort = work.sci_sort;
+ for (const nbnxn_sci_t &sci : nbl->sci)
{
- int i = std::min(m, nbl->sci[s].cj4_ind_end - nbl->sci[s].cj4_ind_start);
- sci_sort[work->sort[i]++] = nbl->sci[s];
+ int i = std::min(m, sci.numJClusterGroups());
+ sci_sort[sort[i]++] = sci;
}
/* Swap the sci pointers so we use the new, sorted list */
- work->sci_sort = nbl->sci;
- nbl->sci = sci_sort;
+ std::swap(nbl->sci, work.sci_sort);
}
/* Make a local or non-local pair-list, depending on iloc */
int nb_kernel_type,
t_nrnb *nrnb)
{
- nbnxn_grid_t *gridi, *gridj;
- int nzi, zj0, zj1;
int nsubpair_target;
float nsubpair_tot_est;
int nnbl;
- nbnxn_pairlist_t **nbl;
int ci_block;
gmx_bool CombineNBLists;
gmx_bool progBal;
int np_tot, np_noq, np_hlj, nap;
nnbl = nbl_list->nnbl;
- nbl = nbl_list->nbl;
CombineNBLists = nbl_list->bCombined;
if (debug)
fprintf(debug, "ns making %d nblists\n", nnbl);
}
- nbat->bUseBufferFlags = (nbat->nout > 1);
+ nbat->bUseBufferFlags = (nbat->out.size() > 1);
/* We should re-init the flags before making the first list */
if (nbat->bUseBufferFlags && LOCAL_I(iloc))
{
- init_buffer_flags(&nbat->buffer_flags, nbat->natoms);
- }
-
- if (nbl_list->bSimple)
- {
-#if GMX_SIMD
- switch (nb_kernel_type)
- {
-#ifdef GMX_NBNXN_SIMD_4XN
- case nbnxnk4xN_SIMD_4xN:
- nbs->icell_set_x = icell_set_x_simd_4xn;
- break;
-#endif
-#ifdef GMX_NBNXN_SIMD_2XNN
- case nbnxnk4xN_SIMD_2xNN:
- nbs->icell_set_x = icell_set_x_simd_2xnn;
- break;
-#endif
- default:
- nbs->icell_set_x = icell_set_x_simple;
- break;
- }
-#else // GMX_SIMD
- /* MSVC 2013 complains about switch statements without case */
- nbs->icell_set_x = icell_set_x_simple;
-#endif // GMX_SIMD
- }
- else
- {
- nbs->icell_set_x = icell_set_x_supersub;
+ init_buffer_flags(&nbat->buffer_flags, nbat->numAtoms());
}
+ int nzi;
if (LOCAL_I(iloc))
{
/* Only zone (grid) 0 vs 0 */
nzi = 1;
- zj0 = 0;
- zj1 = 1;
}
else
{
/* Clear all pair-lists */
for (int th = 0; th < nnbl; th++)
{
- clear_pairlist(nbl[th]);
+ if (nbl_list->bSimple)
+ {
+ clear_pairlist(nbl_list->nbl[th]);
+ }
+ else
+ {
+ clear_pairlist(nbl_list->nblGpu[th]);
+ }
if (nbs->bFEP)
{
for (int zi = 0; zi < nzi; zi++)
{
- gridi = &nbs->grid[zi];
+ const nbnxn_grid_t &iGrid = nbs->grid[zi];
- if (NONLOCAL_I(iloc))
+ int zj0;
+ int zj1;
+ if (LOCAL_I(iloc))
+ {
+ zj0 = 0;
+ zj1 = 1;
+ }
+ else
{
zj0 = nbs->zones->izone[zi].j0;
zj1 = nbs->zones->izone[zi].j1;
}
for (int zj = zj0; zj < zj1; zj++)
{
- gridj = &nbs->grid[zj];
+ const nbnxn_grid_t &jGrid = nbs->grid[zj];
if (debug)
{
nbs_cycle_start(&nbs->cc[enbsCCsearch]);
- ci_block = get_ci_block_size(gridi, nbs->DomDec, nnbl);
+ ci_block = get_ci_block_size(iGrid, nbs->DomDec, nnbl);
/* With GPU: generate progressively smaller lists for
* load balancing for local only or non-local with 2 zones.
*/
if (nbat->bUseBufferFlags && ((zi == 0 && zj == 0)))
{
- init_buffer_flags(&nbs->work[th].buffer_flags, nbat->natoms);
+ init_buffer_flags(&nbs->work[th].buffer_flags, nbat->numAtoms());
}
if (CombineNBLists && th > 0)
{
- clear_pairlist(nbl[th]);
+ GMX_ASSERT(!nbl_list->bSimple, "Can only combine GPU lists");
+
+ clear_pairlist(nbl_list->nblGpu[th]);
}
/* Divide the i super cell equally over the nblists */
- nbnxn_make_pairlist_part(nbs, gridi, gridj,
- &nbs->work[th], nbat, *excl,
- rlist,
- nb_kernel_type,
- ci_block,
- nbat->bUseBufferFlags,
- nsubpair_target,
- progBal, nsubpair_tot_est,
- th, nnbl,
- nbl[th],
- nbl_list->nbl_fep[th]);
+ if (nbl_list->bSimple)
+ {
+ nbnxn_make_pairlist_part(nbs, iGrid, jGrid,
+ &nbs->work[th], nbat, *excl,
+ rlist,
+ nb_kernel_type,
+ ci_block,
+ nbat->bUseBufferFlags,
+ nsubpair_target,
+ progBal, nsubpair_tot_est,
+ th, nnbl,
+ nbl_list->nbl[th],
+ nbl_list->nbl_fep[th]);
+ }
+ else
+ {
+ nbnxn_make_pairlist_part(nbs, iGrid, jGrid,
+ &nbs->work[th], nbat, *excl,
+ rlist,
+ nb_kernel_type,
+ ci_block,
+ nbat->bUseBufferFlags,
+ nsubpair_target,
+ progBal, nsubpair_tot_est,
+ th, nnbl,
+ nbl_list->nblGpu[th],
+ nbl_list->nbl_fep[th]);
+ }
}
GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
}
if (nbl_list->bSimple)
{
- np_tot += nbl[th]->ncj;
- np_noq += nbl[th]->work->ncj_noq;
- np_hlj += nbl[th]->work->ncj_hlj;
+ NbnxnPairlistCpu *nbl = nbl_list->nbl[th];
+ np_tot += nbl->cj.size();
+ np_noq += nbl->work->ncj_noq;
+ np_hlj += nbl->work->ncj_hlj;
}
else
{
+ NbnxnPairlistGpu *nbl = nbl_list->nblGpu[th];
/* This count ignores potential subsequent pair pruning */
- np_tot += nbl[th]->nci_tot;
+ np_tot += nbl->nci_tot;
}
}
- nap = nbl[0]->na_ci*nbl[0]->na_cj;
+ if (nbl_list->bSimple)
+ {
+ nap = nbl_list->nbl[0]->na_ci*nbl_list->nbl[0]->na_cj;
+ }
+ else
+ {
+ nap = gmx::square(nbl_list->nblGpu[0]->na_ci);
+ }
nbl_list->natpair_ljq = (np_tot - np_noq)*nap - np_hlj*nap/2;
nbl_list->natpair_lj = np_noq*nap;
nbl_list->natpair_q = np_hlj*nap/2;
if (CombineNBLists && nnbl > 1)
{
+ GMX_ASSERT(!nbl_list->bSimple, "Can only combine GPU lists");
+ NbnxnPairlistGpu **nbl = nbl_list->nblGpu;
+
nbs_cycle_start(&nbs->cc[enbsCCcombine]);
combine_nblists(nnbl-1, nbl+1, nbl[0]);
rebalanceSimpleLists(nbl_list->nnbl, nbl_list->nbl, nbl_list->nbl_work, nbs->work);
/* Swap the pointer of the sets of pair lists */
- nbnxn_pairlist_t **tmp = nbl_list->nbl;
+ NbnxnPairlistCpu **tmp = nbl_list->nbl;
nbl_list->nbl = nbl_list->nbl_work;
nbl_list->nbl_work = tmp;
}
/* Sort the entries on size, large ones first */
if (CombineNBLists || nnbl == 1)
{
- sort_sci(nbl[0]);
+ sort_sci(nbl_list->nblGpu[0]);
}
else
{
{
try
{
- sort_sci(nbl[th]);
+ sort_sci(nbl_list->nblGpu[th]);
}
GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
}
balance_fep_lists(nbs, nbl_list);
}
- /* This is a fresh list, so not pruned, stored using ci and nci.
- * ciOuter and nciOuter are invalid at this point.
- */
- GMX_ASSERT(nbl_list->nbl[0]->nciOuter == -1, "nciOuter should have been set to -1 to signal that it is invalid");
+ if (nbl_list->bSimple)
+ {
+ /* This is a fresh list, so not pruned, stored using ci.
+ * ciOuter is invalid at this point.
+ */
+ GMX_ASSERT(nbl_list->nbl[0]->ciOuter.empty(), "ciOuter is invalid so it should be empty");
+ }
/* Special performance logging stuff (env.var. GMX_NBNXN_CYCLE) */
if (LOCAL_I(iloc))
{
for (int t = 0; t < nbl_list->nnbl; t++)
{
- print_nblist_statistics_simple(debug, nbl_list->nbl[t], nbs, rlist);
+ print_nblist_statistics(debug, nbl_list->nbl[t], nbs, rlist);
}
}
else
{
- print_nblist_statistics_supersub(debug, nbl_list->nbl[0], nbs, rlist);
+ print_nblist_statistics(debug, nbl_list->nblGpu[0], nbs, rlist);
}
}
}
else
{
- print_nblist_sci_cj(debug, nbl_list->nbl[0]);
+ print_nblist_sci_cj(debug, nbl_list->nblGpu[0]);
}
}
void nbnxnPrepareListForDynamicPruning(nbnxn_pairlist_set_t *listSet)
{
+ GMX_RELEASE_ASSERT(listSet->bSimple, "Should only be called for simple lists");
+
/* TODO: Restructure the lists so we have actual outer and inner
* list objects so we can set a single pointer instead of
* swapping several pointers.
for (int i = 0; i < listSet->nnbl; i++)
{
+ NbnxnPairlistCpu &list = *listSet->nbl[i];
+
/* The search produced a list in ci/cj.
* Swap the list pointers so we get the outer list is ciOuter,cjOuter
* and we can prune that to get an inner list in ci/cj.
*/
- nbnxn_pairlist_t *list = listSet->nbl[i];
- list->nciOuter = list->nci;
-
- nbnxn_ci_t *ciTmp = list->ciOuter;
- list->ciOuter = list->ci;
- list->ci = ciTmp;
-
- nbnxn_cj_t *cjTmp = list->cjOuter;
- list->cjOuter = list->cj;
- list->cj = cjTmp;
+ GMX_RELEASE_ASSERT(list.ciOuter.empty() && list.cjOuter.empty(),
+ "The outer lists should be empty before preparation");
- /* Signal that this inner list is currently invalid */
- list->nci = -1;
+ std::swap(list.ci, list.ciOuter);
+ std::swap(list.cj, list.cjOuter);
}
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/* Initializes a set of pair lists stored in nbnxn_pairlist_set_t */
void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
- gmx_bool simple, gmx_bool combined,
- nbnxn_alloc_t *alloc,
- nbnxn_free_t *free);
+ gmx_bool simple, gmx_bool combined);
/* Make a apir-list with radius rlist, store it in nbl.
* The parameter min_ci_balanced sets the minimum required
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* the research papers on the package. Check out http://www.gromacs.org.
*/
-#if GMX_SIMD_REAL_WIDTH >= 2*NBNXN_CPU_CLUSTER_I_SIZE
-#define STRIDE_S (GMX_SIMD_REAL_WIDTH/2)
-#else
-#define STRIDE_S NBNXN_CPU_CLUSTER_I_SIZE
-#endif
+/* Stride of the packed x coordinate array */
+static constexpr int c_xStride2xNN = c_nbnxnCpuIClusterSize;
/* Copies PBC shifted i-cell packed atom coordinates to working array */
static inline void
icell_set_x_simd_2xnn(int ci,
real shx, real shy, real shz,
int gmx_unused stride, const real *x,
- nbnxn_list_work_t *work)
+ NbnxnPairlistCpuWork *work)
{
int ia;
- real *x_ci_simd = work->x_ci_simd;
+ real *x_ci_simd = work->iClusterData.xSimd.data();
ia = xIndexFromCi<NbnxnLayout::Simd2xNN>(ci);
- store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*STRIDE_S + 0) + SimdReal(shx) );
- store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*STRIDE_S + 0) + SimdReal(shy) );
- store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*STRIDE_S + 0) + SimdReal(shz) );
- store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*STRIDE_S + 2) + SimdReal(shx) );
- store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*STRIDE_S + 2) + SimdReal(shy) );
- store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*STRIDE_S + 2) + SimdReal(shz) );
+ store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*c_xStride2xNN + 0) + SimdReal(shx) );
+ store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*c_xStride2xNN + 0) + SimdReal(shy) );
+ store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*c_xStride2xNN + 0) + SimdReal(shz) );
+ store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*c_xStride2xNN + 2) + SimdReal(shx) );
+ store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*c_xStride2xNN + 2) + SimdReal(shy) );
+ store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*c_xStride2xNN + 2) + SimdReal(shz) );
}
/* SIMD code for checking and adding cluster-pairs to the list using coordinates in packed format.
* Checks bouding box distances and possibly atom pair distances.
* This is an accelerated version of make_cluster_list_simple.
*
- * \param[in] gridj The j-grid
+ * \param[in] jGrid The j-grid
* \param[in,out] nbl The pair-list to store the cluster pairs in
* \param[in] icluster The index of the i-cluster
* \param[in] firstCell The first cluster in the j-range, using i-cluster size indexing
* \param[in,out] numDistanceChecks The number of distance checks performed
*/
static inline void
-makeClusterListSimd2xnn(const nbnxn_grid_t * gridj,
- nbnxn_pairlist_t * nbl,
+makeClusterListSimd2xnn(const nbnxn_grid_t &jGrid,
+ NbnxnPairlistCpu * nbl,
int icluster,
int firstCell,
int lastCell,
int * gmx_restrict numDistanceChecks)
{
using namespace gmx;
- const real * gmx_restrict x_ci_simd = nbl->work->x_ci_simd;
- const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->bb_ci;
+ const real * gmx_restrict x_ci_simd = nbl->work->iClusterData.xSimd.data();
+ const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->iClusterData.bb.data();
SimdReal jx_S, jy_S, jz_S;
float d2;
int xind_f, xind_l;
- int jclusterFirst = cjFromCi<NbnxnLayout::Simd2xNN>(firstCell);
- int jclusterLast = cjFromCi<NbnxnLayout::Simd2xNN>(lastCell);
+ int jclusterFirst = cjFromCi<NbnxnLayout::Simd2xNN, 0>(firstCell);
+ int jclusterLast = cjFromCi<NbnxnLayout::Simd2xNN, 1>(lastCell);
GMX_ASSERT(jclusterLast >= jclusterFirst, "We should have a non-empty j-cluster range, since the calling code should have ensured a non-empty cell range");
rc2_S = SimdReal(rlist2);
while (!InRange && jclusterFirst <= jclusterLast)
{
#if NBNXN_SEARCH_BB_SIMD4
- d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, gridj->bbj);
+ d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, jGrid.bbj);
#else
- d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bbj);
+ d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bbj);
#endif
*numDistanceChecks += 2;
}
else if (d2 < rlist2)
{
- xind_f = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jclusterFirst);
+ xind_f = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jclusterFirst);
- jx_S = loadDuplicateHsimd(x_j + xind_f + 0*STRIDE_S);
- jy_S = loadDuplicateHsimd(x_j + xind_f + 1*STRIDE_S);
- jz_S = loadDuplicateHsimd(x_j + xind_f + 2*STRIDE_S);
+ jx_S = loadDuplicateHsimd(x_j + xind_f + 0*c_xStride2xNN);
+ jy_S = loadDuplicateHsimd(x_j + xind_f + 1*c_xStride2xNN);
+ jz_S = loadDuplicateHsimd(x_j + xind_f + 2*c_xStride2xNN);
/* Calculate distance */
dx_S0 = load<SimdReal>(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH) - jx_S;
while (!InRange && jclusterLast > jclusterFirst)
{
#if NBNXN_SEARCH_BB_SIMD4
- d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, gridj->bbj);
+ d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, jGrid.bbj);
#else
- d2 = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bbj);
+ d2 = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bbj);
#endif
*numDistanceChecks += 2;
}
else if (d2 < rlist2)
{
- xind_l = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jclusterLast);
+ xind_l = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jclusterLast);
- jx_S = loadDuplicateHsimd(x_j + xind_l + 0*STRIDE_S);
- jy_S = loadDuplicateHsimd(x_j + xind_l + 1*STRIDE_S);
- jz_S = loadDuplicateHsimd(x_j + xind_l + 2*STRIDE_S);
+ jx_S = loadDuplicateHsimd(x_j + xind_l + 0*c_xStride2xNN);
+ jy_S = loadDuplicateHsimd(x_j + xind_l + 1*c_xStride2xNN);
+ jz_S = loadDuplicateHsimd(x_j + xind_l + 2*c_xStride2xNN);
/* Calculate distance */
dx_S0 = load<SimdReal>(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH) - jx_S;
for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
{
/* Store cj and the interaction mask */
- nbl->cj[nbl->ncj].cj = cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jcluster;
- nbl->cj[nbl->ncj].excl = get_imask_simd_2xnn(excludeSubDiagonal, icluster, jcluster);
- nbl->ncj++;
+ nbnxn_cj_t cjEntry;
+ cjEntry.cj = cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jcluster;
+ cjEntry.excl = get_imask_simd_2xnn(excludeSubDiagonal, icluster, jcluster);
+ nbl->cj.push_back(cjEntry);
}
- /* Increase the closing index in i super-cell list */
- nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+ /* Increase the closing index in the i list */
+ nbl->ci.back().cj_ind_end = nbl->cj.size();
}
}
-
-#undef STRIDE_S
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* the research papers on the package. Check out http://www.gromacs.org.
*/
-#if GMX_SIMD_REAL_WIDTH >= NBNXN_CPU_CLUSTER_I_SIZE
-#define STRIDE_S (GMX_SIMD_REAL_WIDTH)
-#else
-#define STRIDE_S NBNXN_CPU_CLUSTER_I_SIZE
-#endif
+/* Stride of the packed x coordinate array */
+static constexpr int c_xStride4xN = (GMX_SIMD_REAL_WIDTH > c_nbnxnCpuIClusterSize ? GMX_SIMD_REAL_WIDTH : c_nbnxnCpuIClusterSize);
/* Copies PBC shifted i-cell packed atom coordinates to working array */
static inline void
icell_set_x_simd_4xn(int ci,
real shx, real shy, real shz,
int gmx_unused stride, const real *x,
- nbnxn_list_work_t *work)
+ NbnxnPairlistCpuWork *work)
{
int ia;
- real *x_ci_simd = work->x_ci_simd;
+ real *x_ci_simd = work->iClusterData.xSimd.data();
ia = xIndexFromCi<NbnxnLayout::Simd4xN>(ci);
- store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S ] + shx) );
- store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S ] + shy) );
- store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S ] + shz) );
- store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 1] + shx) );
- store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 1] + shy) );
- store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 1] + shz) );
- store(x_ci_simd + 6*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 2] + shx) );
- store(x_ci_simd + 7*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 2] + shy) );
- store(x_ci_simd + 8*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 2] + shz) );
- store(x_ci_simd + 9*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 3] + shx) );
- store(x_ci_simd + 10*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 3] + shy) );
- store(x_ci_simd + 11*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 3] + shz) );
+ store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN ] + shx) );
+ store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN ] + shy) );
+ store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN ] + shz) );
+ store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 1] + shx) );
+ store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 1] + shy) );
+ store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 1] + shz) );
+ store(x_ci_simd + 6*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 2] + shx) );
+ store(x_ci_simd + 7*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 2] + shy) );
+ store(x_ci_simd + 8*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 2] + shz) );
+ store(x_ci_simd + 9*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 3] + shx) );
+ store(x_ci_simd + 10*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 3] + shy) );
+ store(x_ci_simd + 11*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 3] + shz) );
}
/* SIMD code for checking and adding cluster-pairs to the list using coordinates in packed format.
* Checks bouding box distances and possibly atom pair distances.
* This is an accelerated version of make_cluster_list_simple.
*
- * \param[in] gridj The j-grid
+ * \param[in] jGrid The j-grid
* \param[in,out] nbl The pair-list to store the cluster pairs in
* \param[in] icluster The index of the i-cluster
* \param[in] firstCell The first cluster in the j-range, using i-cluster size indexing
* \param[in,out] numDistanceChecks The number of distance checks performed
*/
static inline void
-makeClusterListSimd4xn(const nbnxn_grid_t * gridj,
- nbnxn_pairlist_t * nbl,
+makeClusterListSimd4xn(const nbnxn_grid_t &jGrid,
+ NbnxnPairlistCpu * nbl,
int icluster,
int firstCell,
int lastCell,
int * gmx_restrict numDistanceChecks)
{
using namespace gmx;
- const real * gmx_restrict x_ci_simd = nbl->work->x_ci_simd;
- const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->bb_ci;
+ const real * gmx_restrict x_ci_simd = nbl->work->iClusterData.xSimd.data();
+ const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->iClusterData.bb.data();
SimdReal jx_S, jy_S, jz_S;
int xind_f, xind_l;
/* Convert the j-range from i-cluster size indexing to j-cluster indexing */
- int jclusterFirst = cjFromCi<NbnxnLayout::Simd4xN>(firstCell);
-#if GMX_SIMD_REAL_WIDTH >= NBNXN_CPU_CLUSTER_I_SIZE
- int jclusterLast = cjFromCi<NbnxnLayout::Simd4xN>(lastCell);
-#else
- /* Set the correct last j-cluster with a j-cluster size of 2 */
- int jclusterLast = cjFromCi<NbnxnLayout::Simd4xN>(lastCell + 1) - 1;
-#endif
+ int jclusterFirst = cjFromCi<NbnxnLayout::Simd4xN, 0>(firstCell);
+ int jclusterLast = cjFromCi<NbnxnLayout::Simd4xN, 1>(lastCell);
GMX_ASSERT(jclusterLast >= jclusterFirst, "We should have a non-empty j-cluster range, since the calling code should have ensured a non-empty cell range");
rc2_S = SimdReal(rlist2);
while (!InRange && jclusterFirst <= jclusterLast)
{
#if NBNXN_SEARCH_BB_SIMD4
- d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, gridj->bbj);
+ d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, jGrid.bbj);
#else
- d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bbj);
+ d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bbj);
#endif
*numDistanceChecks += 2;
}
else if (d2 < rlist2)
{
- xind_f = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jclusterFirst);
+ xind_f = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jclusterFirst);
- jx_S = load<SimdReal>(x_j + xind_f + 0*STRIDE_S);
- jy_S = load<SimdReal>(x_j + xind_f + 1*STRIDE_S);
- jz_S = load<SimdReal>(x_j + xind_f + 2*STRIDE_S);
+ jx_S = load<SimdReal>(x_j + xind_f + 0*c_xStride4xN);
+ jy_S = load<SimdReal>(x_j + xind_f + 1*c_xStride4xN);
+ jz_S = load<SimdReal>(x_j + xind_f + 2*c_xStride4xN);
/* Calculate distance */
while (!InRange && jclusterLast > jclusterFirst)
{
#if NBNXN_SEARCH_BB_SIMD4
- d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, gridj->bbj);
+ d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, jGrid.bbj);
#else
- d2 = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bbj);
+ d2 = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bbj);
#endif
*numDistanceChecks += 2;
}
else if (d2 < rlist2)
{
- xind_l = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jclusterLast);
+ xind_l = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jclusterLast);
- jx_S = load<SimdReal>(x_j +xind_l + 0*STRIDE_S);
- jy_S = load<SimdReal>(x_j +xind_l + 1*STRIDE_S);
- jz_S = load<SimdReal>(x_j +xind_l + 2*STRIDE_S);
+ jx_S = load<SimdReal>(x_j +xind_l + 0*c_xStride4xN);
+ jy_S = load<SimdReal>(x_j +xind_l + 1*c_xStride4xN);
+ jz_S = load<SimdReal>(x_j +xind_l + 2*c_xStride4xN);
/* Calculate distance */
dx_S0 = load<SimdReal>(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH) - jx_S;
for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
{
/* Store cj and the interaction mask */
- nbl->cj[nbl->ncj].cj = cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jcluster;
- nbl->cj[nbl->ncj].excl = get_imask_simd_4xn(excludeSubDiagonal, icluster, jcluster);
- nbl->ncj++;
+ nbnxn_cj_t cjEntry;
+ cjEntry.cj = cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jcluster;
+ cjEntry.excl = get_imask_simd_4xn(excludeSubDiagonal, icluster, jcluster);
+ nbl->cj.push_back(cjEntry);
}
- /* Increase the closing index in i super-cell list */
- nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+ /* Increase the closing index in the i list */
+ nbl->ci.back().cj_ind_end = nbl->cj.size();
}
}
-
-#undef STRIDE_S
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
case nbnxnk4x4_PlainC:
case nbnxnk4xN_SIMD_4xN:
case nbnxnk4xN_SIMD_2xNN:
- return NBNXN_CPU_CLUSTER_I_SIZE;
+ return c_nbnxnCpuIClusterSize;
case nbnxnk8x8x8_GPU:
case nbnxnk8x8x8_PlainC:
/* The cluster size for super/sub lists is only set here.
switch (nb_kernel_type)
{
case nbnxnk4x4_PlainC:
- cj_size = NBNXN_CPU_CLUSTER_I_SIZE;
+ cj_size = c_nbnxnCpuIClusterSize;
break;
case nbnxnk4xN_SIMD_4xN:
cj_size = nbnxn_simd_width;
void done_ns(gmx_ns_t *ns, int numEnergyGroups)
{
+ if (ns->bexcl != nullptr)
+ {
+ sfree(ns->bexcl);
+ }
sfree(ns->bExcludeAlleg);
if (ns->ns_buf)
{
}
sfree(ns->ns_buf);
}
+ if (ns->nl_sr != nullptr)
+ {
+ for (int i = 0; i < numEnergyGroups; i++)
+ {
+ if (ns->nl_sr[i] != nullptr)
+ {
+ sfree(ns->nl_sr[i]);
+ }
+ }
+ sfree(ns->nl_sr);
+ }
sfree(ns->simple_aaj);
sfree(ns->bHaveVdW);
+ sfree(ns->nsr);
done_grid(ns->grid);
sfree(ns);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
} /* mk_QMMMrec */
#endif
+std::vector<int> qmmmAtomIndices(const t_inputrec &ir, const gmx_mtop_t &mtop)
+{
+ const int numQmmmGroups = ir.opts.ngQM;
+ const gmx_groups_t &groups = mtop.groups;
+ std::vector<int> qmmmAtoms;
+ for (int i = 0; i < numQmmmGroups; i++)
+ {
+ for (const AtomProxy &atomP : AtomRange(mtop))
+ {
+ int index = atomP.globalAtomNumber();
+ if (getGroupType(groups, egcQMMM, index) == i)
+ {
+ qmmmAtoms.push_back(index);
+ }
+ }
+ if (ir.QMMMscheme == eQMMMschemeoniom)
+ {
+ /* I assume that users specify the QM groups from small to
+ * big(ger) in the mdp file
+ */
+ gmx_mtop_ilistloop_all_t iloop = gmx_mtop_ilistloop_all_init(&mtop);
+ int nral1 = 1 + NRAL(F_VSITE2);
+ int atomOffset = 0;
+ while (const InteractionLists *ilists = gmx_mtop_ilistloop_all_next(iloop, &atomOffset))
+ {
+ const InteractionList &ilist = (*ilists)[F_VSITE2];
+ for (int j = 0; j < ilist.size(); j += nral1)
+ {
+ const int vsite = atomOffset + ilist.iatoms[j ]; /* the vsite */
+ const int ai = atomOffset + ilist.iatoms[j+1]; /* constructing atom */
+ const int aj = atomOffset + ilist.iatoms[j+2]; /* constructing atom */
+ if (getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, ai)
+ &&
+ getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, aj))
+ {
+ /* this dummy link atom needs to be removed from qmmmAtoms
+ * before making the QMrec of this layer!
+ */
+ qmmmAtoms.erase(std::remove_if(qmmmAtoms.begin(),
+ qmmmAtoms.end(),
+ [&vsite](int atom){return atom == vsite; }),
+ qmmmAtoms.end());
+ }
+ }
+ }
+ }
+ }
+ return qmmmAtoms;
+}
+
+void removeQmmmAtomCharges(gmx_mtop_t *mtop, gmx::ArrayRef<const int> qmmmAtoms)
+{
+ int molb = 0;
+ for (int i = 0; i < qmmmAtoms.size(); i++)
+ {
+ int indexInMolecule;
+ mtopGetMolblockIndex(mtop, qmmmAtoms[i], &molb, nullptr, &indexInMolecule);
+ t_atom *atom = &mtop->moltype[mtop->molblock[molb].type].atoms.atom[indexInMolecule];
+ atom->q = 0.0;
+ atom->qB = 0.0;
+ }
+}
+
void init_QMMMrec(const t_commrec *cr,
const gmx_mtop_t *mtop,
const t_inputrec *ir,
* simply contains true/false for QM and MM (the other) atoms.
*/
- int *qm_arr = nullptr, vsite, ai, aj;
- int qm_max = 0, qm_nr = 0, i, j, jmax, k, l;
t_QMMMrec *qr;
t_MMrec *mm;
- gmx_mtop_atomloop_all_t aloop;
- int a_offset;
if (!GMX_QMMM)
{
/* small problem if there is only QM.... so no MM */
- jmax = ir->opts.ngQM;
+ int numQmmmGroups = ir->opts.ngQM;
if (qr->QMMMscheme == eQMMMschemeoniom)
{
- qr->nrQMlayers = jmax;
+ qr->nrQMlayers = numQmmmGroups;
}
else
{
qr->nrQMlayers = 1;
}
- const gmx_groups_t *groups = &mtop->groups;
-
- /* there are jmax groups of QM atoms. In case of multiple QM groups
+ /* there are numQmmmGroups groups of QM atoms. In case of multiple QM groups
* I assume that the users wants to do ONIOM. However, maybe it
* should also be possible to define more than one QM subsystem with
* independent neighbourlists. I have to think about
* that.. 11-11-2003
*/
- snew(qr->qm, jmax);
- for (j = 0; j < jmax; j++)
+ std::vector<int> qmmmAtoms = qmmmAtomIndices(*ir, *mtop);
+ snew(qr->qm, numQmmmGroups);
+ for (int i = 0; i < numQmmmGroups; i++)
{
/* new layer */
- aloop = gmx_mtop_atomloop_all_init(mtop);
- const t_atom *atom;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
- {
- if (qm_nr >= qm_max)
- {
- qm_max += 1000;
- srenew(qm_arr, qm_max);
- }
- if (getGroupType(groups, egcQMMM, i) == j)
- {
- /* hack for tip4p */
- qm_arr[qm_nr++] = i;
- }
- }
if (qr->QMMMscheme == eQMMMschemeoniom)
{
/* add the atoms to the bQMMM array
/* I assume that users specify the QM groups from small to
* big(ger) in the mdp file
*/
- qr->qm[j] = mk_QMrec();
- /* we need to throw out link atoms that in the previous layer
- * existed to separate this QMlayer from the previous
- * QMlayer. We use the iatoms array in the idef for that
- * purpose. If all atoms defining the current Link Atom (Dummy2)
- * are part of the current QM layer it needs to be removed from
- * qm_arr[]. */
-
- gmx_mtop_ilistloop_all_t iloop = gmx_mtop_ilistloop_all_init(mtop);
- int nral1 = 1 + NRAL(F_VSITE2);
- while (const InteractionLists *ilists = gmx_mtop_ilistloop_all_next(iloop, &a_offset))
- {
- const InteractionList &ilist = (*ilists)[F_VSITE2];
- for (int i = 0; i < ilist.size(); i += nral1)
- {
- vsite = a_offset + ilist.iatoms[i ]; /* the vsite */
- ai = a_offset + ilist.iatoms[i+1]; /* constructing atom */
- aj = a_offset + ilist.iatoms[i+2]; /* constructing atom */
- if (getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, ai)
- &&
- getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, aj))
- {
- /* this dummy link atom needs to be removed from the qm_arr
- * before making the QMrec of this layer!
- */
- for (i = 0; i < qm_nr; i++)
- {
- if (qm_arr[i] == vsite)
- {
- /* drop the element */
- for (l = i; l < qm_nr; l++)
- {
- qm_arr[l] = qm_arr[l+1];
- }
- qm_nr--;
- }
- }
- }
- }
- }
-
+ qr->qm[i] = mk_QMrec();
/* store QM atoms in this layer in the QMrec and initialise layer
*/
- init_QMrec(j, qr->qm[j], qm_nr, qm_arr, mtop, ir);
+ init_QMrec(i, qr->qm[i], qmmmAtoms.size(), qmmmAtoms.data(), mtop, ir);
}
}
if (qr->QMMMscheme != eQMMMschemeoniom)
* TODO: Consider doing this in grompp instead.
*/
- int molb = 0;
- for (k = 0; k < qm_nr; k++)
- {
- int indexInMolecule;
- mtopGetMolblockIndex(mtop, qm_arr[k], &molb, nullptr, &indexInMolecule);
- t_atom *atom = &mtop->moltype[mtop->molblock[molb].type].atoms.atom[indexInMolecule];
- atom->q = 0.0;
- atom->qB = 0.0;
- }
qr->qm[0] = mk_QMrec();
/* store QM atoms in the QMrec and initialise
*/
- init_QMrec(0, qr->qm[0], qm_nr, qm_arr, mtop, ir);
+ init_QMrec(0, qr->qm[0], qmmmAtoms.size(), qmmmAtoms.data(), mtop, ir);
/* MM rec creation */
mm = mk_MMrec();
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "config.h"
+#include <vector>
+
#include "gromacs/math/vectypes.h"
#include "gromacs/mdlib/tgroup.h"
+#include "gromacs/utility/arrayref.h"
#define GMX_QMMM (GMX_QMMM_MOPAC || GMX_QMMM_GAMESS || GMX_QMMM_GAUSSIAN || GMX_QMMM_ORCA)
* called by system().
*/
+/*! \brief
+ * Return vector of atom indices for atoms in the QMMM region.
+ *
+ * \param[in] mtop Topology to use for populating array.
+ * \param[in] ir Inputrec used in simulation.
+ * \returns Vector of atoms.
+ */
+std::vector<int> qmmmAtomIndices(const t_inputrec &ir, const gmx_mtop_t &mtop);
+
+/*! \brief
+ * Remove charges from QMMM atoms.
+ *
+ * \param[in] mtop Topology used for removing atoms.
+ * \param[in] qmmmAtoms ArrayRef to vector conatining qmmm atom indices.
+ */
+void removeQmmmAtomCharges(gmx_mtop_t *mtop, gmx::ArrayRef<const int> qmmmAtoms);
+
#endif
return d;
}
+void done_shake(shakedata *d)
+{
+ sfree(d->rij);
+ sfree(d->half_of_reduced_mass);
+ sfree(d->distance_squared_tolerance);
+ sfree(d->constraint_distance_squared);
+ sfree(d->sblock);
+ sfree(d->scaled_lagrange_multiplier);
+ sfree(d);
+}
+
typedef struct {
int iatom[3];
int blocknr;
ncons = idef->il[F_CONSTR].nr/3;
init_blocka(&sblocks);
+ sfree(sblocks.index); // To solve memory leak
gen_sblocks(nullptr, 0, md.homenr, idef, &sblocks, FALSE);
/*
/*! \brief Initializes and return the SHAKE data structure */
shakedata *shake_init();
+//! Destroy SHAKE. Needed to solve memory leaks.
+void done_shake(shakedata *d);
+
//! Make SHAKE blocks when not using DD.
void
make_shake_sblock_serial(shakedata *shaked,
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
gmx_shellfc_t *shfc;
t_shell *shell;
int *shell_index = nullptr, *at2cg;
- const t_atom *atom;
int ns, nshell, nsi;
int i, j, type, a_offset, cg, mol, ftype, nra;
int aS, aN = 0; /* Shell and nucleus */
int bondtypes[] = { F_BONDS, F_HARMONIC, F_CUBICBONDS, F_POLARIZATION, F_ANHARM_POL, F_WATER_POL };
#define NBT asize(bondtypes)
- gmx_mtop_atomloop_all_t aloop;
const gmx_ffparams_t *ffparams;
std::array<int, eptNR> n = countPtypes(fplog, mtop);
/* Global system sized array, this should be avoided */
snew(shell_index, mtop->natoms);
- aloop = gmx_mtop_atomloop_all_init(mtop);
nshell = 0;
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- if (atom->ptype == eptShell)
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ if (local.ptype == eptShell)
{
shell_index[i] = nshell++;
}
}
}
- atom = molt->atoms.atom;
+ const t_atom *atom = molt->atoms.atom;
for (mol = 0; mol < molb->nmol; mol++)
{
for (j = 0; (j < NBT); j++)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/gmxmpi.h"
#include "gromacs/utility/logger.h"
-#include "gromacs/utility/pleasecite.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strconvert.h"
#include "gromacs/utility/sysinfo.h"
break;
case nbnxnk8x8x8_PlainC:
- nbnxn_kernel_gpu_ref(nbvg->nbl_lists.nbl[0],
+ nbnxn_kernel_gpu_ref(nbvg->nbl_lists.nblGpu[0],
nbv->nbat, ic,
fr->shift_vec,
flags,
nonbonded_verlet_t *nbv = fr->nbv;
bStateChanged = ((flags & GMX_FORCE_STATECHANGED) != 0);
- bNS = ((flags & GMX_FORCE_NS) != 0) && (!fr->bAllvsAll);
+ bNS = ((flags & GMX_FORCE_NS) != 0);
bFillGrid = (bNS && bStateChanged);
bCalcCGCM = (bFillGrid && !DOMAINDECOMP(cr));
bDoForces = ((flags & GMX_FORCE_FORCES) != 0);
{
/* initialize local pair-list on the GPU */
nbnxn_gpu_init_pairlist(nbv->gpu_nbv,
- nbv->grp[eintLocal].nbl_lists.nbl[0],
+ nbv->grp[eintLocal].nbl_lists.nblGpu[0],
eintLocal);
}
wallcycle_stop(wcycle, ewcNS);
{
/* initialize non-local pair-list on the GPU */
nbnxn_gpu_init_pairlist(nbv->gpu_nbv,
- nbv->grp[eintNonlocal].nbl_lists.nbl[0],
+ nbv->grp[eintNonlocal].nbl_lists.nblGpu[0],
eintNonlocal);
}
wallcycle_stop(wcycle, ewcNS);
}
/* skip the reduction if there was no non-local work to do */
- if (nbv->grp[eintNonlocal].nbl_lists.nbl[0]->nsci > 0)
+ if (!nbv->grp[eintNonlocal].nbl_lists.nblGpu[0]->sci.empty())
{
nbnxn_atomdata_add_nbat_f_to_f(nbv->nbs.get(), eatNonlocal,
nbv->nbat, f, wcycle);
}
bStateChanged = ((flags & GMX_FORCE_STATECHANGED) != 0);
- bNS = ((flags & GMX_FORCE_NS) != 0) && (!fr->bAllvsAll);
+ bNS = ((flags & GMX_FORCE_NS) != 0);
/* Should we perform the long-range nonbonded evaluation inside the neighborsearching? */
bFillGrid = (bNS && bStateChanged);
bCalcCGCM = (bFillGrid && !DOMAINDECOMP(cr));
}
}
-extern void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef<real> lambda, double *lam0)
+void initialize_lambdas(FILE *fplog,
+ const t_inputrec &ir,
+ bool isMaster,
+ int *fep_state,
+ gmx::ArrayRef<real> lambda,
+ double *lam0)
{
- /* this function works, but could probably use a logic rewrite to keep all the different
- types of efep straight. */
+ /* TODO: Clean up initialization of fep_state and lambda in
+ t_state. This function works, but could probably use a logic
+ rewrite to keep all the different types of efep straight. */
- if ((ir->efep == efepNO) && (!ir->bSimTemp))
+ if ((ir.efep == efepNO) && (!ir.bSimTemp))
{
return;
}
- t_lambda *fep = ir->fepvals;
- *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint
- if checkpoint is set -- a kludge is in for now
- to prevent this.*/
+ const t_lambda *fep = ir.fepvals;
+ if (isMaster)
+ {
+ *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint
+ if checkpoint is set -- a kludge is in for now
+ to prevent this.*/
+ }
for (int i = 0; i < efptNR; i++)
{
+ double thisLambda;
/* overwrite lambda state with init_lambda for now for backwards compatibility */
- if (fep->init_lambda >= 0) /* if it's -1, it was never initializd */
+ if (fep->init_lambda >= 0) /* if it's -1, it was never initialized */
{
- lambda[i] = fep->init_lambda;
- if (lam0)
- {
- lam0[i] = lambda[i];
- }
+ thisLambda = fep->init_lambda;
}
else
{
- lambda[i] = fep->all_lambda[i][*fep_state];
- if (lam0)
- {
- lam0[i] = lambda[i];
- }
+ thisLambda = fep->all_lambda[i][fep->init_fep_state];
+ }
+ if (isMaster)
+ {
+ lambda[i] = thisLambda;
+ }
+ if (lam0 != nullptr)
+ {
+ lam0[i] = thisLambda;
}
}
- if (ir->bSimTemp)
+ if (ir.bSimTemp)
{
/* need to rescale control temperatures to match current state */
- for (int i = 0; i < ir->opts.ngtc; i++)
+ for (int i = 0; i < ir.opts.ngtc; i++)
{
- if (ir->opts.ref_t[i] > 0)
+ if (ir.opts.ref_t[i] > 0)
{
- ir->opts.ref_t[i] = ir->simtempvals->temperatures[*fep_state];
+ ir.opts.ref_t[i] = ir.simtempvals->temperatures[fep->init_fep_state];
}
}
}
fprintf(fplog, "]\n");
}
}
-
-
-void init_md(FILE *fplog,
- const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
- t_inputrec *ir, const gmx_output_env_t *oenv,
- const MdrunOptions &mdrunOptions,
- double *t, double *t0,
- t_state *globalState, double *lam0,
- t_nrnb *nrnb, gmx_mtop_t *mtop,
- gmx_update_t **upd,
- gmx::BoxDeformation *deform,
- int nfile, const t_filenm fnm[],
- gmx_mdoutf_t *outf, t_mdebin **mdebin,
- tensor force_vir, tensor shake_vir,
- tensor total_vir, tensor pres, rvec mu_tot,
- gmx_bool *bSimAnn, t_vcm **vcm,
- gmx_wallcycle_t wcycle)
-{
- int i;
-
- /* Initial values */
- *t = *t0 = ir->init_t;
-
- *bSimAnn = FALSE;
- for (i = 0; i < ir->opts.ngtc; i++)
- {
- /* set bSimAnn if any group is being annealed */
- if (ir->opts.annealing[i] != eannNO)
- {
- *bSimAnn = TRUE;
- }
- }
-
- /* Initialize lambda variables */
- /* TODO: Clean up initialization of fep_state and lambda in t_state.
- * We currently need to call initialize_lambdas on non-master ranks
- * to initialize lam0.
- */
- if (MASTER(cr))
- {
- initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0);
- }
- else
- {
- int tmpFepState;
- std::array<real, efptNR> tmpLambda;
- initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0);
- }
-
- // TODO upd is never NULL in practice, but the analysers don't know that
- if (upd)
- {
- *upd = init_update(ir, deform);
- }
- if (*bSimAnn)
- {
- update_annealing_target_temp(ir, ir->init_t, upd ? *upd : nullptr);
- }
-
- if (vcm != nullptr)
- {
- *vcm = init_vcm(fplog, &mtop->groups, ir);
- }
-
- if (EI_DYNAMICS(ir->eI) && !mdrunOptions.continuationOptions.appendFiles)
- {
- if (ir->etc == etcBERENDSEN)
- {
- please_cite(fplog, "Berendsen84a");
- }
- if (ir->etc == etcVRESCALE)
- {
- please_cite(fplog, "Bussi2007a");
- }
- if (ir->eI == eiSD1)
- {
- please_cite(fplog, "Goga2012");
- }
- }
- init_nrnb(nrnb);
-
- if (nfile != -1)
- {
- *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, mtop, oenv, wcycle);
-
- *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(*outf),
- mtop, ir, mdoutf_get_fp_dhdl(*outf));
- }
-
- /* Initiate variables */
- clear_mat(force_vir);
- clear_mat(shake_vir);
- clear_rvec(mu_tot);
- clear_mat(total_vir);
- clear_mat(pres);
-}
-
-void init_rerun(FILE *fplog,
- const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
- t_inputrec *ir, const gmx_output_env_t *oenv,
- const MdrunOptions &mdrunOptions,
- t_state *globalState, double *lam0,
- t_nrnb *nrnb, gmx_mtop_t *mtop,
- int nfile, const t_filenm fnm[],
- gmx_mdoutf_t *outf, t_mdebin **mdebin,
- gmx_wallcycle_t wcycle)
-{
- /* Initialize lambda variables */
- /* TODO: Clean up initialization of fep_state and lambda in t_state.
- * We currently need to call initialize_lambdas on non-master ranks
- * to initialize lam0.
- */
- if (MASTER(cr))
- {
- initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0);
- }
- else
- {
- int tmpFepState;
- std::array<real, efptNR> tmpLambda;
- initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0);
- }
-
- init_nrnb(nrnb);
-
- if (nfile != -1)
- {
- *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, mtop, oenv, wcycle);
- *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(*outf),
- mtop, ir, mdoutf_get_fp_dhdl(*outf), true);
- }
-}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
struct gmx_output_env_t;
struct gmx_pme_t;
-struct gmx_update_t;
struct MdrunOptions;
struct nonbonded_verlet_t;
struct t_forcerec;
class Constraints;
class IMDOutputProvider;
class MDLogger;
+class Update;
}
typedef struct gmx_global_stat *gmx_global_stat_t;
const matrix box, real lambda, tensor pres, tensor virial,
real *prescorr, real *enercorr, real *dvdlcorr);
-void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef<real> lambda, double *lam0);
+/*! \brief Fills fep_state, lambda, and lam0 if needed
+ *
+ * If FEP or simulated tempering is in use:
+ *
+ * fills non-null lam0 with the initial lambda values, and
+ * on master rank fills fep_state and lambda.
+ *
+ * Reports the initial lambda state to the log file. */
+void initialize_lambdas(FILE *fplog,
+ const t_inputrec &ir,
+ bool isMaster,
+ int *fep_state,
+ gmx::ArrayRef<real> lambda,
+ double *lam0);
void do_constrain_first(FILE *log, gmx::Constraints *constr,
const t_inputrec *inputrec, const t_mdatoms *md,
t_state *state);
-void init_md(FILE *fplog,
- const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
- t_inputrec *ir, const gmx_output_env_t *oenv,
- const MdrunOptions &mdrunOptions,
- double *t, double *t0,
- t_state *globalState, double *lam0,
- t_nrnb *nrnb, gmx_mtop_t *mtop,
- gmx_update_t **upd,
- gmx::BoxDeformation *deform,
- int nfile, const t_filenm fnm[],
- gmx_mdoutf_t *outf, t_mdebin **mdebin,
- tensor force_vir, tensor shake_vir,
- tensor total_vir, tensor pres,
- rvec mu_tot,
- gmx_bool *bSimAnn, t_vcm **vcm,
- gmx_wallcycle_t wcycle);
-
-void init_rerun(FILE *fplog,
- const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
- t_inputrec *ir, const gmx_output_env_t *oenv,
- const MdrunOptions &mdrunOptions,
- t_state *globalState, double *lam0,
- t_nrnb *nrnb, gmx_mtop_t *mtop,
- int nfile, const t_filenm fnm[],
- gmx_mdoutf_t *outf, t_mdebin **mdebin,
- gmx_wallcycle_t wcycle);
-
/* Routine in sim_util.c */
gmx_bool use_GPU(const nonbonded_verlet_t *nbv);
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
if (vcm)
{
icm = add_binr(rb, DIM*vcm->nr, vcm->group_p[0]);
- imass = add_binr(rb, vcm->nr, vcm->group_mass);
+ imass = add_binr(rb, vcm->nr, vcm->group_mass.data());
if (vcm->mode == ecmANGULAR)
{
icj = add_binr(rb, DIM*vcm->nr, vcm->group_j[0]);
if (vcm)
{
extract_binr(rb, icm, DIM*vcm->nr, vcm->group_p[0]);
- extract_binr(rb, imass, vcm->nr, vcm->group_mass);
+ extract_binr(rb, imass, vcm->nr, vcm->group_mass.data());
if (vcm->mode == ecmANGULAR)
{
extract_binr(rb, icj, DIM*vcm->nr, vcm->group_j[0]);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
if (!GMX_THREAD_MPI || isMaster)
{
- // TODO: Use unique_ptr once we switch to C++14 (unique_ptr can not easily be
- // captured in lambda functions in C++11)
+ // Using shared ptr because move-only callable not supported by std::function.
+ // Would require replacement such as fu2::function or cxx_function.
auto stopConditionSignal = std::make_shared<StopConditionSignal>(
nstList, makeBinaryReproducibleSimulation, nstSignalComm);
registerStopCondition(
if (isMaster && maximumHoursToRun > 0)
{
- // TODO: Use unique_ptr once we switch to C++14 (unique_ptr can not easily be
- // captured in lambda functions in C++11)
auto stopConditionTime = std::make_shared<StopConditionTime>(
nstList, maximumHoursToRun, nstSignalComm);
registerStopCondition(
gmx_add_unit_test(MdlibUnitTest mdlib-test
calc_verletbuf.cpp
+ constr.cpp
mdebin.cpp
settle.cpp
shake.cpp
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief SHAKE and LINCS tests.
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ * \ingroup module_mdlib
+ */
+
+#include "gmxpre.h"
+
+#include "gromacs/mdlib/constr.h"
+
+#include <assert.h>
+
+#include <cmath>
+
+#include <algorithm>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/fileio/gmxfio.h"
+#include "gromacs/gmxlib/nonbonded/nonbonded.h"
+#include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
+#include "gromacs/mdlib/gmx_omp_nthreads.h"
+#include "gromacs/mdlib/lincs.h"
+#include "gromacs/mdlib/shake.h"
+#include "gromacs/mdtypes/commrec.h"
+#include "gromacs/mdtypes/inputrec.h"
+#include "gromacs/mdtypes/mdatom.h"
+#include "gromacs/pbcutil/pbc.h"
+#include "gromacs/topology/block.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/topology/topology.h"
+#include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
+#include "gromacs/utility/unique_cptr.h"
+
+#include "testutils/refdata.h"
+#include "testutils/testasserts.h"
+
+#include "constrdata.h"
+
+namespace gmx
+{
+namespace test
+{
+
+/*! \brief Test fixture for SHAKE and LINCS
+ *
+ * The fixture uses three simple and one real-life system for testing.
+ * Simple systems include:
+ * 1.1. Two atoms, connected with one constrain.
+ * 1.2. Three atoms, connected consequently with two constraints
+ * 1.3. Four atoms, connected by two independent constraints.
+ * 1.4. Three atoms, connected by three constraints in a triangle.
+ * 1.5. Four atoms, connected by three consequentive constraints.
+ * The real-life system is a Cys-Val-Trp peptide with constraints
+ * on:
+ * 2.1. Bonds, containing hydrogens (SHAKE and LINCS)
+ * 2.2. All bonds (SHAKE and LINCS).
+ * 2.3. Angles with hydrogens and all bonds (SHAKE).
+ * 2.4. All angles and all bonds (disabled).
+ *
+ * For all systems, the final length of the constraints is tested ageinst the
+ * reference values. For systems 2.1 and 2.2, the exact final coordinates of
+ * all atoms are also tested against the reference values.
+ */
+class ConstraintsTest : public ::testing::Test
+{
+ public:
+
+ /*! \brief
+ * Cleaning up the memory.
+ */
+ void TearDown() override
+ {
+ sfree(idef.il[F_CONSTR].iatoms);
+ sfree(idef.iparams);
+ sfree(x);
+ sfree(xprime);
+ sfree(xprime2);
+ sfree(v);
+ gmx_fio_close(log);
+ }
+
+ /*! \brief
+ * Method used to initialize atoms, constraints and their parameters.
+ *
+ * This method constructs stubs for all the data structures, required to initialize
+ * and apply LINCS and SHAKE constraints. The constraints data is also saved as a field
+ * to check if the target distances are achieved after the constraints are applied.
+ *
+ * \param[in] natom Number of atoms in the system.
+ * \param[in] masses Atom masses. Size of this vector should be equal to natom.
+ * \param[in] constraints List of constraints, organized in tripples of integers.
+ * First integer is the index of type for a constrain, second
+ * and third are the indices of constrained atoms. The types
+ * of constraints should be sequential but not nesseseraly
+ * start from zero (which is the way they normally are in
+ * GROMACS).
+ * \param[in] constraintsR0 Target values for bond lengths for bonds of each type. The
+ * size of this vector should be equal to the total number of
+ * unique types in constraints vector.
+ * \param[in] firstType The index of first interaction type used for constraints
+ * (i.e. the lowest number that appear as type in constraints
+ * vector). This is not fail-safe, since technically the
+ * numbering of the types may not be sequantial, but (i) this
+ * is the way things are in GROMACS, (ii) everything is fine
+ * in the examples provided for the test.
+ * \param[in] epbc Type of PBC (epbcXYZ / epbcNONE are used in this test,
+ * see src/gromacs/pbcutil/pbc.h for details).
+ * \param[in] box The PBC box.
+ * \param[in] init_t Initial time.
+ * \param[in] delta_t Timestep.
+ * \param[in] coordinates Initial (unconstrained) coordinates.
+ *
+ */
+ void initSystem(int natom, std::vector<real> masses,
+ std::vector<int> constraints, std::vector<real> constraintsR0, int firstType,
+ int epbc, const matrix box,
+ real init_t, real delta_t,
+ std::vector<RVec> coordinates)
+
+ {
+
+ this->n = natom; // Number of atoms
+
+ invmass.resize(n); // Vector of inverce masses
+
+ for (int i = 0; i < n; i++)
+ {
+ invmass.at(i) = 1.0/masses.at(i);
+ }
+
+ // Saving constraints to check if they are satisfied after algorithm was applied
+ this->constraints = constraints; // Constraints indexes (in type-i-j format)
+ this->constraintsR0 = constraintsR0; // Euilibrium distances for each type of constraint
+ this->firstType = firstType; // The first type index used for constraints
+
+ // PBC initialization
+ this->epbc = epbc;
+ for (int i = 0; i < DIM; i++)
+ {
+ for (int j = 0; j < DIM; j++)
+ {
+ this->box[i][j] = box[i][j]; // Periodic box
+ }
+ }
+ set_pbc(&pbc, epbc, box);
+
+ this->invdt = 1.0/delta_t; // Inverse timestep
+
+ // Communication record
+ cr.nnodes = 1;
+ cr.dd = nullptr;
+
+ // Input record - data that usualy comes from configurtion file (.mdp)
+ ir.efep = 0;
+ ir.init_t = init_t;
+ ir.delta_t = delta_t;
+ ir.eI = 0;
+
+ // MD atoms data
+ md.nMassPerturbed = 0;
+ md.lambda = 0.0;
+ md.invmass = invmass.data();
+ md.nr = n;
+ md.homenr = n;
+
+ // Constraints and their parameters in old data format (local topology)
+ for (int i = 0; i < F_NRE; i++)
+ {
+ idef.il[i].nr = 0;
+ }
+ idef.il[F_CONSTR].nr = constraints.size();
+
+ snew(idef.il[F_CONSTR].iatoms, constraints.size());
+ int maxType = 0;
+ for (unsigned i = 0; i < constraints.size(); i++)
+ {
+ if (i % 3 == 0)
+ {
+ if (maxType < constraints.at(i))
+ {
+ maxType = constraints.at(i);
+ }
+ }
+ idef.il[F_CONSTR].iatoms[i] = constraints.at(i);
+ }
+ snew(idef.iparams, maxType + 1);
+ for (unsigned i = 0; i < constraints.size()/3; i++)
+ {
+ idef.iparams[constraints.at(3*i)].constr.dA = constraintsR0.at(constraints.at(3*i) - firstType);
+ idef.iparams[constraints.at(3*i)].constr.dB = constraintsR0.at(constraints.at(3*i) - firstType);
+ }
+
+
+ // Constraints and their parameters in new data format (global topology)
+ InteractionList ilist;
+ ilist.iatoms.resize(constraints.size());
+ for (unsigned i = 0; i < constraints.size(); i++)
+ {
+ ilist.iatoms.at(i) = constraints.at(i);
+ }
+ InteractionList ilistEmpty;
+ ilistEmpty.iatoms.resize(0);
+
+ gmx_moltype_t moltype;
+ moltype.atoms.nr = n;
+ moltype.ilist.at(F_CONSTR) = ilist;
+ moltype.ilist.at(F_CONSTRNC) = ilistEmpty;
+ mtop.moltype.push_back(moltype);
+
+ gmx_molblock_t molblock;
+ molblock.type = 0;
+ molblock.nmol = 1;
+ mtop.molblock.push_back(molblock);
+
+ mtop.natoms = n;
+ mtop.ffparams.iparams.resize(maxType + 1);
+ for (int i = 0; i <= maxType; i++)
+ {
+ mtop.ffparams.iparams.at(i) = idef.iparams[i];
+ }
+ mtop.bIntermolecularInteractions = false;
+
+ // Log file may be here. Redirect it somewhere usefull?
+ log = gmx_fio_open("constraintstest.log", "w");
+
+ // Set the coordinates in convinient format
+ snew(x, n);
+ snew(xprime, n);
+ snew(xprime2, n);
+
+ for (int i = 0; i < n; i++)
+ {
+ for (int j = 0; j < DIM; j++)
+ {
+ x[i][j] = coordinates.at(i)[j];
+ xprime[i][j] = coordinates.at(i)[j];
+ }
+ }
+
+ // Velocities (not used)
+ snew(v, n);
+
+
+ }
+
+ /*! \brief
+ * This method initializes and applies LINCS constraints.
+ *
+ * \param[in] nLincsIter Number of iterations used to compute the inverse matrix.
+ * \param[in] nProjOrder The order for algorithm that adjusts the direction of the
+ * bond after constraints are applied.
+ * \param[in] LincsWarnAngle The value for the change in bond angle after which the
+ * program will issue a warning.
+ */
+ void applyConstraintsLincs(int nLincsIter, int nProjOrder, real LincsWarnAngle)
+ {
+
+ Lincs *lincsd;
+ int maxwarn = 100;
+ int warncount_lincs = 0;
+ ir.nLincsIter = nLincsIter;
+ ir.nProjOrder = nProjOrder;
+ ir.LincsWarnAngle = LincsWarnAngle;
+ gmx_omp_nthreads_set(emntLINCS, 1);
+
+ // Make blocka structure for faster LINCS setup
+ std::vector<t_blocka> at2con_mt;
+ at2con_mt.reserve(mtop.moltype.size());
+ for (const gmx_moltype_t &moltype : mtop.moltype)
+ {
+ // This function is in constr.cpp
+ at2con_mt.push_back(make_at2con(moltype,
+ mtop.ffparams.iparams,
+ flexibleConstraintTreatment(EI_DYNAMICS(ir.eI))));
+ }
+ // Initialie LINCS
+ lincsd = init_lincs(gmx_fio_getfp(log), mtop,
+ nflexcon, at2con_mt,
+ false,
+ ir.nLincsIter, ir.nProjOrder);
+ set_lincs(idef, md, EI_DYNAMICS(ir.eI), &cr, lincsd);
+
+ // Evaluate constraints
+ bool bOK = constrain_lincs(false, ir, 0, lincsd, md,
+ &cr,
+ nullptr,
+ x, xprime, xprime2,
+ box, &pbc, md.lambda, dvdlambda,
+ invdt, v,
+ computeVirial, vir_r_m_dr,
+ gmx::ConstraintVariable::Positions, &nrnb,
+ maxwarn, &warncount_lincs);
+ EXPECT_TRUE(bOK) << "Something went wrong: LINCS returned false value.";
+ EXPECT_EQ(warncount_lincs, 0) << "There were warnings in LINCS.";
+ for (unsigned int i = 0; i < mtop.moltype.size(); i++)
+ {
+ sfree(at2con_mt.at(i).index);
+ sfree(at2con_mt.at(i).a);
+ }
+ done_lincs(lincsd);
+ }
+
+ /*! \brief
+ * Initialize and apply SHAKE constraints.
+ *
+ * \param[in] shake_tol Target tolerance for SHAKE.
+ * \param[in] bShakeSOR Use successive over-relaxation method for SHAKE iterative process.
+ * The general formula is:
+ * x_n+1 = (1-omega)*x_n + omega*f(x_n),
+ * where omega = 1 if SOR is off and may be < 1 if SOR is on.
+ *
+ */
+ void applyConstraintsShake(real shake_tol, gmx_bool bShakeSOR)
+ {
+
+ ir.shake_tol = shake_tol;
+ ir.bShakeSOR = bShakeSOR;
+
+ shakedata* shaked = shake_init();
+ make_shake_sblock_serial(shaked, &idef, md);
+ bool bOK = constrain_shake(
+ gmx_fio_getfp(log),
+ shaked,
+ invmass.data(),
+ idef,
+ ir,
+ x,
+ xprime,
+ xprime2,
+ &nrnb,
+ md.lambda,
+ dvdlambda,
+ invdt,
+ v,
+ computeVirial,
+ vir_r_m_dr,
+ false,
+ gmx::ConstraintVariable::Positions);
+ EXPECT_TRUE(bOK) << "Something went wrong: SHAKE returned false value.";
+ done_shake(shaked); // Not yet implemented. We will have memory leaks without this.
+ }
+
+ /*! \brief
+ * The test on the final length of constrained bonds.
+ *
+ * Goes through all the constraints and checks if the final length of all the constraints is equal
+ * to the target lenght with provided tolerance.
+ *
+ * \param[in] tolerance Allowed tolerance in final lengths.
+ */
+
+ void checkConstrained(FloatingPointTolerance tolerance)
+ {
+
+ // Test if all the constraints are satisfied
+ for (unsigned c = 0; c < constraints.size()/3; c++)
+ {
+ real r0 = constraintsR0.at(constraints.at(3*c) - firstType);
+ int i = constraints.at(3*c + 1);
+ int j = constraints.at(3*c + 2);
+ rvec v0, v1;
+ real d0, d1;
+ if (this->epbc == epbcXYZ)
+ {
+ pbc_dx_aiuc(&pbc, x[i], x[j], v0);
+ pbc_dx_aiuc(&pbc, xprime[i], xprime[j], v1);
+ }
+ else
+ {
+ rvec_sub(x[i], x[j], v0);
+ rvec_sub(xprime[i], xprime[j], v1);
+ }
+ d0 = norm(v0);
+ d1 = norm(v1);
+ EXPECT_REAL_EQ_TOL(r0, d1, tolerance) << "rij = " << d1 << ", which is not equal to r0 = " << r0
+ << " for constraint #" << c << ", between atoms " << i << " and " << j
+ << " (before lincs rij was " << d0 << ").";
+ }
+ }
+
+ /*! \brief
+ * The test on the final coordinates.
+ *
+ * Goes through all atoms and checks if the final positions correspond to the
+ * provided reference set of coordinates.
+ *
+ * \param[in] finalCoordinates The reference set of coordinates.
+ * \param[in] finalCoordinatesTolerance Tolerance for the coordinaes test.
+ */
+ void checkFinalCoordinates(std::vector<RVec> finalCoordinates, FloatingPointTolerance finalCoordinatesTolerance)
+ {
+ for (int i = 0; i < n; i++)
+ {
+ for (int d = 0; d < DIM; d++)
+ {
+ EXPECT_REAL_EQ_TOL(finalCoordinates.at(i)[d], xprime[i][d], finalCoordinatesTolerance) <<
+ "Coordinates after constrains were applied differ from these in the reference set for atom #" << i << ".";
+ }
+ }
+ }
+
+
+ private:
+ int n; // Number of atoms
+ gmx_mtop_t mtop; // Topology
+ std::vector<real> invmass; // Inverse masses
+ int epbc; // PBC used (epbcNONE/epbcXYZ)
+ matrix box; // PBC box
+ t_pbc pbc; // PBC object
+ t_commrec cr; // Communication record
+ t_inputrec ir; // Input record (info that usually in .mdp file)
+ t_idef idef; // Local topology
+ t_mdatoms md; // MD atoms
+ t_nrnb nrnb;
+
+ real invdt = 1.0/0.001; // Inverse timestep
+ int nflexcon = 0; // Number of flexible constraints
+ real *dvdlambda = nullptr; // Free energy computation stub (not tested)
+ bool computeVirial = false; // If the virials should be conputed (not tested)
+ tensor vir_r_m_dr; // Virials stuff
+ rvec *x; // Coordinates before constraints are applied
+ rvec *xprime; // Coordinates after constraints are applied
+ rvec *xprime2; // Intermediate set of coordinates used by LINCS and
+ // SHAKE for different purposes
+ rvec *v; // Velocities (can also be constrained, this is not tested)
+ t_fileio *log; // log file (now set to "constraintstest.log")
+
+ // Fields to store constraints data for testing
+ int firstType; // First interaction type used for constraints
+ std::vector<int> constraints; // Constraints data (type1-i1-j1-type2-i2-j2-...)
+ std::vector<real> constraintsR0; // Target lengths for al the constrain
+};
+
+/*
+ *
+ * Tests that the interatomic distance along constraints correspond to the reference distances.
+ * Performed on basic systems of up to four constaints.
+ *
+ */
+
+/*
+ * Simple bond test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeOneBond)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ initSystem(2, c_oneBondMasses,
+ c_oneBondConstraints, c_oneBondConstraintsR0, c_oneBondConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_oneBondCoordinates);
+ applyConstraintsShake(0.0001, false);
+ checkConstrained(tolerance);
+}
+
+/*
+ * Simple bond test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsOneBond)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0000002);
+ initSystem(2, c_oneBondMasses,
+ c_oneBondConstraints, c_oneBondConstraintsR0, c_oneBondConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_oneBondCoordinates);
+ applyConstraintsLincs(1, 4, real(30.0));
+ checkConstrained(tolerance);
+}
+
+/*
+ * Two disjoint bonds test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeTwoDisjointBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.000001);
+ initSystem(4, c_twoDJBondsMasses,
+ c_twoDJBondsConstraints, c_twoDJBondsConstraintsR0, c_twoDJBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_twoDJBondsCoordinates);
+
+ applyConstraintsShake(0.000001, true);
+ checkConstrained(tolerance);
+}
+
+/*
+ * Two disjoint bonds test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsTwoDisjointBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0000002);
+ initSystem(4, c_twoDJBondsMasses,
+ c_twoDJBondsConstraints, c_twoDJBondsConstraintsR0, c_twoDJBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_twoDJBondsCoordinates);
+
+ applyConstraintsLincs(1, 4, real(30.0));
+ checkConstrained(tolerance);
+}
+
+/*
+ * Two consequentive constraints test for SHAKE.
+ */
+TEST_F(ConstraintsTest, ShakeTwoBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ initSystem(3, c_twoBondsMasses,
+ c_twoBondsConstraints, c_twoBondsConstraintsR0, c_twoBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_twoBondsCoordinates);
+
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+}
+
+/*
+ * Two consequentive constraints test for LINCS.
+ */
+TEST_F(ConstraintsTest, LincsTwoBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.000001);
+ initSystem(3, c_twoBondsMasses,
+ c_twoBondsConstraints, c_twoBondsConstraintsR0, c_twoBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_twoBondsCoordinates);
+
+ applyConstraintsLincs(1, 4, real(30.0));
+ checkConstrained(tolerance);
+}
+
+/*
+ * Triangle of constraints test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeTriangleOfBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ initSystem(3, c_triangleMasses,
+ c_triangleConstraints, c_triangleConstraintsR0, c_triangleConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_triangleCoordinates);
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+}
+
+/*
+ * Triangle of constraints test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsTriangleOfBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ initSystem(3, c_triangleMasses,
+ c_triangleConstraints, c_triangleConstraintsR0, c_triangleConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_triangleCoordinates);
+ applyConstraintsLincs(4, 4, real(30.0));
+ checkConstrained(tolerance);
+}
+
+/*
+ * Three consecutive constraints test for SHAKE.
+ */
+TEST_F(ConstraintsTest, ShakeThreeConsequativeConstraints)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.001);
+ initSystem(4, c_threeBondsMasses,
+ c_threeBondsConstraints, c_threeBondsConstraintsR0, c_threeBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_threeBondsCoordinates);
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+}
+
+/*
+ * Three consecutive constraints test for LINCS.
+ */
+TEST_F(ConstraintsTest, LincsThreeConsequativeConstraints)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.001);
+ initSystem(4, c_threeBondsMasses,
+ c_threeBondsConstraints, c_threeBondsConstraintsR0, c_threeBondsConstraintsFirstType,
+ epbcNONE, c_infinitesimalBox,
+ real(0.0), real(0.001), c_threeBondsCoordinates);
+ applyConstraintsLincs(4, 4, real(30.0));
+ checkConstrained(tolerance);
+}
+
+
+/*
+ *
+ * Tests of both final interatomic distances and final coordinates.
+ * Peformed on the peptide Cys-Val-Trp, with constraints along HBonds,
+ * AllBonds (for both SHAKE and LINCS), HAngles and AllAlngles (for
+ * SHAKE only).
+ */
+
+/*
+ * All bonds that involve hydrogen atom (HBonds) are constrained by SHAKE. Both final length
+ * of each constraint and final coordinates for each atom are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpHBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.0001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwHBondsConstraints, c_cvwHBondsConstraintsR0, c_cvwHBondsConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+ checkFinalCoordinates(c_cvwFinalCoordinatesHBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds that involve hydrogen atom (HBonds) are constrained by LINCS. Both final length
+ * of each constraint and final coordinates for each atom are tested.
+ */
+TEST_F(ConstraintsTest, LincsCysValTrpHBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.00001);
+ FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.0001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwHBondsConstraints, c_cvwHBondsConstraintsR0, c_cvwHBondsConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsLincs(1, 4, real(30.0));
+ checkConstrained(tolerance);
+ checkFinalCoordinates(c_cvwFinalCoordinatesHBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds are constrained by SHAKE. Both final length of each constraint and final coordinates
+ * for each atom are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpAllBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwAllBondsConstraints, c_cvwAllBondsConstraintsR0, c_cvwAllBondsConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+ checkFinalCoordinates(c_cvwFinalCoordinatesAllBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds are constrained by LINCS. Both final length of each constraint and final coordinates
+ * for each atom are tested.
+ */
+TEST_F(ConstraintsTest, LincsCysValTrpAllBonds)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+ FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwAllBondsConstraints, c_cvwAllBondsConstraintsR0, c_cvwAllBondsConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsLincs(4, 4, real(30.0));
+ checkConstrained(tolerance);
+ checkFinalCoordinates(c_cvwFinalCoordinatesAllBonds, coordinatesTolerance);
+}
+
+/*
+ * H angles and all bonds are constrained by SHAKE. Only final lengths of constraints are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpHAngles)
+{
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwHAnglesConstraints, c_cvwHAnglesConstraintsR0, c_cvwHAnglesConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsShake(0.0001, true);
+ checkConstrained(tolerance);
+}
+
+/*
+ * All angles and all bonds are constrained by SHAKE. Only final lengths of constraints are tested.
+ */
+/*TEST_F(ConstraintsTest, ShakeCysValTrpAllAngles)
+ {
+
+ FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.001);
+
+ initSystem(54, c_cvwMasses,
+ c_cvwAllAnglesConstraints, c_cvwAllAnglesConstraintsR0, c_cvwAllAnglesConstraintsFirstType,
+ epbcXYZ, c_cvwBox,
+ real(0.0), real(0.001), c_cvwInitialCoordinates);
+ applyConstraintsShake(0.000001, true);
+ checkConstrained(tolerance);
+ }
+ */
+} // namespace test
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Data used by LINCS tests.
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ * \ingroup module_mdlib
+ */
+
+#include "gromacs/math/vectypes.h"
+
+namespace gmx
+{
+
+namespace test
+{
+
+//! A box with zero sides to check if PBC are actually disabled.
+static const matrix c_infinitesimalBox = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0} };
+
+/*
+ * System of two connected atoms.
+ */
+//! System of two connected atoms: one constraint (type, i, j).
+static const std::vector<int> c_oneBondConstraints( {0, 0, 1} );
+//! System of two connected atoms: equilibrium distance.
+static const std::vector<real> c_oneBondConstraintsR0( {0.1} );
+//! System of two connected atoms: starting type id for constraints.
+static const int c_oneBondConstraintsFirstType = 0;
+//! System of two connected atoms: coordinates.
+static const std::vector<RVec> c_oneBondCoordinates(
+ {{
+ { 0.10, -0.13, 0.05 },
+ { -0.13, 0.05, -0.10 }
+ }} );
+//! System of two connected atoms: masses.
+static const std::vector<real> c_oneBondMasses ( {1.0, 12.0} );
+
+/*
+ * Two disjoint bonds (taken from the SHAKE test).
+ */
+//! Two disjoint bonds: two constraint (type1, i1, j1, type2, i2, j2).
+static const std::vector<int> c_twoDJBondsConstraints( {0, 0, 1, 1, 2, 3} );
+//! Two disjoint bonds: equilibrium distances.
+static const std::vector<real> c_twoDJBondsConstraintsR0( {2.0, 1.0} );
+//! Two disjoint bonds: starting type id for constraints.
+static const int c_twoDJBondsConstraintsFirstType = 0;
+//! Two disjoint bonds: coordinates.
+static const std::vector<RVec> c_twoDJBondsCoordinates(
+ {{
+ { 2.50, -3.10, 15.70 },
+ { 0.51, -3.02, 15.55 },
+ { -0.50, -3.00, 15.20 },
+ { -1.51, -2.95, 15.05 }
+ }} );
+//! Two disjoint bonds: masses.
+static const std::vector<real> c_twoDJBondsMasses ( {0.5, 1.0/3.0, 0.25, 1.0} );
+
+
+/*
+ * Three atoms, connected longitudaly.
+ */
+//! Three atoms, connected longitudaly: two constraints (type1, i1, j1, type2, i2, j2).
+static const std::vector<int> c_twoBondsConstraints( {0, 0, 1, 1, 1, 2} );
+//! Three atoms, connected longitudaly: two distances.
+static const std::vector<real> c_twoBondsConstraintsR0( {0.1, 0.2} );
+//! Three atoms, connected longitudaly: starting type id for constraints.
+static const int c_twoBondsConstraintsFirstType = 0;
+//! Three atoms, connected longitudaly: coordinates.
+static const std::vector<RVec> c_twoBondsCoordinates(
+ {{
+ { 0.08, 0.05, 0.01 },
+ { -0.02, 0.03, -0.02 },
+ { 0.14, 0.02, 0.01 }
+ }} );
+//! Three atoms, connected longitudaly: masses.
+static const std::vector<real> c_twoBondsMasses ( {1.0, 12.0, 16.0 } );
+
+/*
+ * Four atoms, connected longitudaly (taken from SHAKE test).
+ */
+//! Four atoms, connected longitudaly: two constraints (type1, i1, j1, type2, i2, j2).
+static const std::vector<int> c_threeBondsConstraints( {0, 0, 1, 1, 1, 2, 2, 2, 3} );
+//! Four atoms, connected longitudaly: two distances.
+static const std::vector<real> c_threeBondsConstraintsR0( {2.0, 1.0, 1.0} );
+//! Four atoms, connected longitudaly: starting type id for constraints.
+static const int c_threeBondsConstraintsFirstType = 0;
+//! Four atoms, connected longitudaly: coordinates.
+static const std::vector<RVec> c_threeBondsCoordinates(
+ {{
+ { 2.50, -3.10, 15.70 },
+ { 0.51, -3.02, 15.55 },
+ { -0.50, -3.00, 15.20 },
+ { -1.51, -2.95, 15.05 }
+ }} );
+//! Four atoms, connected longitudaly: masses.
+static const std::vector<real> c_threeBondsMasses ( {0.5, 1.0/3.0, 0.25, 1.0} );
+
+/*
+ * Basic triangle (tree atoms, connected with each other).
+ */
+//! Basic triangle: three constraints (type1, i1, j1, type2, i2, j2, type3, i3, j3).
+static const std::vector<int> c_triangleConstraints( {0, 0, 1, 2, 0, 2, 1, 1, 2} );
+//! Basic triangle: euilibrium distances.
+static const std::vector<real> c_triangleConstraintsR0( {0.1, 0.1, 0.1} );
+//! Basic triangle: starting type id for constraints.
+static const int c_triangleConstraintsFirstType = 0;
+//! Basic triangle: coordinates.
+static const std::vector<RVec> c_triangleCoordinates(
+ {{
+ { 0.09, -0.02, 0.01 },
+ { -0.02, 0.10, -0.02 },
+ { 0.03, -0.01, 0.07 }
+ }} );
+//! Basic triangle: masses.
+static const std::vector<real> c_triangleMasses ( {1.0, 1.0, 1.0} );
+
+
+
+/*
+ * Real-life system: Cys-Val-Trp peptide.
+ */
+//! CVW peptide: periodic box.
+static const matrix c_cvwBox = {{real(2.570950), 0, 0}, {0, real(2.570950), 0}, {0, 0, real(2.570950)}};
+
+
+/*
+ * Constraints only on covalent bonds with hydrogens.
+ */
+//! CVW peptide: constraints on bonds with hydrogens (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwHBondsConstraints(
+ {465, 0, 1, 465, 0, 2, 465, 0, 3, 466, 4, 5, 467, 6, 7, 467, 6, 8, 468, 9, 10, 469, 13, 14,
+ 466, 15, 16, 467, 17, 18, 467, 19, 20, 467, 19, 21, 467, 19, 22, 467, 23, 24, 467, 23, 25, 467, 23, 26,
+ 469, 29, 30, 466, 31, 32, 467, 33, 34, 467, 33, 35, 466, 37, 38, 470, 39, 40, 466, 43, 44, 466, 45, 46,
+ 466, 47, 48, 466, 49, 50} );
+//! CVW peptide: equilibrium distances (one for each type of HBond).
+static const std::vector<real> c_cvwHBondsConstraintsR0(
+ {0.104000, 0.108000, 0.111100, 0.132500, 0.099700, 0.097600} );
+//! CVW peptide: first type id used for constraints when HBonds are constrained.
+static const int c_cvwHBondsConstraintsFirstType = 465;
+
+
+/*
+ * Constraints on all covalent bonds.
+ */
+//! CVW peptide: constraints on all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwAllBondsConstraints(
+ {447, 0, 1, 447, 0, 2, 447, 0, 3, 448, 0, 4, 449, 4, 5, 450, 4, 6, 451, 4, 11, 452, 6, 7,
+ 452, 6, 8, 453, 6, 9, 454, 9, 10, 455, 11, 12, 456, 11, 13, 457, 13, 14, 458, 13, 15, 449, 15, 16,
+ 459, 15, 17, 451, 15, 27, 452, 17, 18, 450, 17, 19, 450, 17, 23, 452, 19, 20, 452, 19, 21, 452, 19, 22,
+ 452, 23, 24, 452, 23, 25, 452, 23, 26, 455, 27, 28, 456, 27, 29, 457, 29, 30, 458, 29, 31, 449, 31, 32,
+ 450, 31, 33, 460, 31, 51, 452, 33, 34, 452, 33, 35, 461, 33, 36, 462, 36, 37, 463, 36, 42, 449, 37, 38,
+ 464, 37, 39, 465, 39, 40, 466, 39, 41, 467, 41, 42, 468, 41, 47, 468, 42, 43, 449, 43, 44, 466, 43, 45,
+ 449, 45, 46, 466, 45, 49, 449, 47, 48, 466, 47, 49, 449, 49, 50, 469, 51, 52, 469, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of bond).
+static const std::vector<real> c_cvwAllBondsConstraintsR0(
+ {0.104000, 0.148000, 0.108000, 0.153800, 0.149000, 0.111100, 0.181800, 0.132500, 0.123000, 0.134500,
+ 0.099700, 0.143000, 0.150000, 0.152200, 0.151000, 0.136500, 0.144000, 0.137000, 0.097600, 0.137500,
+ 0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used for constraints when all bonds are constrained.
+static const int c_cvwAllBondsConstraintsFirstType = 447;
+
+
+/*
+ * Constraints on all covalent bonds and all angles with hydrogens.
+ */
+//! CVW peptide: constraints on angles with hydrogens and all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwHAnglesConstraints(
+ {444, 1, 2, 444, 1, 3, 444, 2, 3, 445, 7, 8, 446, 20, 21, 446, 20, 22, 446, 21, 22, 446, 24, 25,
+ 446, 24, 26, 446, 25, 26, 445, 34, 35, 447, 0, 1, 447, 0, 2, 447, 0, 3, 448, 0, 4, 449, 4, 5,
+ 450, 4, 6, 451, 4, 11, 452, 6, 7, 452, 6, 8, 453, 6, 9, 454, 9, 10, 455, 11, 12, 456, 11, 13,
+ 457, 13, 14, 458, 13, 15, 449, 15, 16, 459, 15, 17, 451, 15, 27, 452, 17, 18, 450, 17, 19, 450, 17, 23,
+ 452, 19, 20, 452, 19, 21, 452, 19, 22, 452, 23, 24, 452, 23, 25, 452, 23, 26, 455, 27, 28, 456, 27, 29,
+ 457, 29, 30, 458, 29, 31, 449, 31, 32, 450, 31, 33, 460, 31, 51, 452, 33, 34, 452, 33, 35, 461, 33, 36,
+ 462, 36, 37, 463, 36, 42, 449, 37, 38, 464, 37, 39, 465, 39, 40, 466, 39, 41, 467, 41, 42, 468, 41, 47,
+ 468, 42, 43, 449, 43, 44, 466, 43, 45, 449, 45, 46, 466, 45, 49, 449, 47, 48, 466, 47, 49, 449, 49, 50,
+ 469, 51, 52, 469, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of constraint).
+static const std::vector<real> c_cvwHAnglesConstraintsR0(
+ {0.169861, 0.180896, 0.180218, 0.104000, 0.148000, 0.108000, 0.153800, 0.149000, 0.111100, 0.181800,
+ 0.132500, 0.123000, 0.134500, 0.099700, 0.143000, 0.150000, 0.152200, 0.151000, 0.136500, 0.144000,
+ 0.137000, 0.097600, 0.137500, 0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used.
+static const int c_cvwHAnglesConstraintsFirstType = 444;
+
+// Constrain all bonds and angles.
+//! CVW peptide: constraints on all angles and all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwAllAnglesConstraints(
+ {402, 1, 2, 403, 52, 53, 404, 31, 53, 404, 31, 52, 405, 47, 50, 405, 45, 50, 406, 45, 47, 405, 48, 49,
+ 407, 41, 49, 408, 41, 48, 405, 46, 49, 406, 43, 49, 405, 43, 46, 405, 44, 45, 407, 42, 45, 408, 42, 44,
+ 409, 41, 43, 410, 36, 43, 411, 36, 41, 409, 42, 47, 412, 39, 47, 413, 39, 42, 414, 40, 41, 415, 37, 41,
+ 416, 37, 40, 417, 38, 39, 418, 36, 39, 419, 36, 38, 420, 37, 42, 421, 33, 42, 422, 33, 37, 423, 35, 36,
+ 423, 34, 36, 424, 34, 35, 425, 31, 36, 426, 31, 35, 426, 31, 34, 427, 33, 51, 428, 32, 51, 429, 32, 33,
+ 430, 29, 51, 431, 29, 33, 432, 29, 32, 433, 30, 31, 434, 27, 31, 435, 27, 30, 436, 28, 29, 437, 15, 29,
+ 438, 15, 28, 439, 25, 26, 439, 24, 26, 439, 24, 25, 426, 17, 26, 426, 17, 25, 426, 17, 24, 439, 21, 22,
+ 439, 20, 22, 439, 20, 21, 426, 17, 22, 426, 17, 21, 426, 17, 20, 440, 19, 23, 441, 18, 23, 441, 18, 19,
+ 442, 15, 23, 442, 15, 19, 443, 15, 18, 444, 17, 27, 445, 16, 27, 446, 16, 17, 447, 13, 27, 448, 13, 17,
+ 432, 13, 16, 433, 14, 15, 434, 11, 15, 435, 11, 14, 436, 12, 13, 437, 4, 13, 438, 4, 12, 449, 6, 10,
+ 450, 8, 9, 450, 7, 9, 424, 7, 8, 451, 4, 9, 426, 4, 8, 426, 4, 7, 452, 6, 11, 445, 5, 11,
+ 429, 5, 6, 453, 0, 11, 454, 0, 6, 455, 0, 5, 456, 3, 4, 456, 2, 4, 402, 2, 3, 456, 1, 4,
+ 402, 1, 3, 457, 0, 1, 457, 0, 2, 457, 0, 3, 458, 0, 4, 459, 4, 5, 460, 4, 6, 461, 4, 11,
+ 462, 6, 7, 462, 6, 8, 463, 6, 9, 464, 9, 10, 465, 11, 12, 466, 11, 13, 467, 13, 14, 468, 13, 15,
+ 459, 15, 16, 469, 15, 17, 461, 15, 27, 462, 17, 18, 460, 17, 19, 460, 17, 23, 462, 19, 20, 462, 19, 21,
+ 462, 19, 22, 462, 23, 24, 462, 23, 25, 462, 23, 26, 465, 27, 28, 466, 27, 29, 467, 29, 30, 468, 29, 31,
+ 459, 31, 32, 460, 31, 33, 470, 31, 51, 462, 33, 34, 462, 33, 35, 471, 33, 36, 472, 36, 37, 473, 36, 42,
+ 459, 37, 38, 474, 37, 39, 475, 39, 40, 476, 39, 41, 477, 41, 42, 478, 41, 47, 478, 42, 43, 459, 43, 44,
+ 476, 43, 45, 459, 45, 46, 476, 45, 49, 459, 47, 48, 476, 47, 49, 459, 49, 50, 479, 51, 52, 479, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of constraint).
+static const std::vector<real> c_cvwAllAnglesConstraintsR0(
+ {0.169861, 0.222503, 0.238845, 0.213120, 0.238157, 0.235121, 0.214562, 0.242100, 0.255127, 0.228896,
+ 0.249204, 0.223650, 0.210257, 0.222075, 0.209794, 0.217730, 0.224038, 0.217273, 0.226106, 0.260490,
+ 0.259998, 0.215277, 0.180896, 0.255631, 0.218499, 0.247561, 0.214016, 0.217310, 0.237362, 0.248280,
+ 0.204103, 0.208169, 0.240360, 0.206488, 0.225825, 0.241196, 0.237083, 0.180218, 0.257975, 0.218499,
+ 0.246566, 0.215168, 0.241897, 0.211207, 0.213951, 0.234753, 0.245062, 0.234108, 0.245088, 0.279474,
+ 0.244987, 0.243289, 0.247242, 0.207800, 0.207355, 0.104000, 0.148000, 0.108000, 0.153800, 0.149000,
+ 0.111100, 0.181800, 0.132500, 0.123000, 0.134500, 0.099700, 0.143000, 0.150000, 0.152200, 0.151000,
+ 0.136500, 0.144000, 0.137000, 0.097600, 0.137500, 0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used.
+static const int c_cvwAllAnglesConstraintsFirstType = 402;
+
+
+//! Coordinates of all 54 atoms of the Cys-Val-Trp system before constraints were applied
+static const std::vector<RVec> c_cvwInitialCoordinates(
+ {{
+ { 1.746000, 1.404000, 1.052000 },
+ { 1.806000, 1.450000, 0.979000 },
+ { 1.672000, 1.473000, 1.086000 },
+ { 1.814000, 1.368000, 1.123000 },
+ { 1.681000, 1.283000, 0.992000 },
+ { 1.612000, 1.309000, 0.913000 },
+ { 1.801000, 1.204000, 0.919000 },
+ { 1.772000, 1.100000, 0.896000 },
+ { 1.814000, 1.266000, 0.827000 },
+ { 1.974000, 1.193000, 0.998000 },
+ { 2.058000, 1.204000, 0.896000 },
+ { 1.594000, 1.204000, 1.095000 },
+ { 1.568000, 1.083000, 1.091000 },
+ { 1.533000, 1.270000, 1.201000 },
+ { 1.540000, 1.372000, 1.213000 },
+ { 1.458000, 1.206000, 1.310000 },
+ { 1.457000, 1.094000, 1.307000 },
+ { 1.532000, 1.230000, 1.433000 },
+ { 1.527000, 1.340000, 1.449000 },
+ { 1.478000, 1.148000, 1.544000 },
+ { 1.544000, 1.157000, 1.633000 },
+ { 1.378000, 1.176000, 1.581000 },
+ { 1.461000, 1.043000, 1.518000 },
+ { 1.685000, 1.181000, 1.411000 },
+ { 1.747000, 1.243000, 1.345000 },
+ { 1.730000, 1.190000, 1.515000 },
+ { 1.688000, 1.075000, 1.377000 },
+ { 1.312000, 1.253000, 1.324000 },
+ { 1.268000, 1.367000, 1.318000 },
+ { 1.224000, 1.149000, 1.344000 },
+ { 1.264000, 1.058000, 1.349000 },
+ { 1.095000, 1.170000, 1.405000 },
+ { 1.103000, 1.263000, 1.454000 },
+ { 0.975000, 1.166000, 1.297000 },
+ { 1.025000, 1.113000, 1.214000 },
+ { 0.887000, 1.110000, 1.333000 },
+ { 0.924000, 1.306000, 1.265000 },
+ { 0.952000, 1.386000, 1.165000 },
+ { 1.017000, 1.361000, 1.079000 },
+ { 0.882000, 1.507000, 1.174000 },
+ { 0.911000, 1.589000, 1.129000 },
+ { 0.819000, 1.515000, 1.296000 },
+ { 0.840000, 1.389000, 1.355000 },
+ { 0.777000, 1.364000, 1.480000 },
+ { 0.785000, 1.264000, 1.522000 },
+ { 0.698000, 1.458000, 1.538000 },
+ { 0.640000, 1.433000, 1.626000 },
+ { 0.746000, 1.617000, 1.350000 },
+ { 0.719000, 1.711000, 1.307000 },
+ { 0.682000, 1.582000, 1.472000 },
+ { 0.631000, 1.668000, 1.515000 },
+ { 1.070000, 1.060000, 1.508000 },
+ { 1.150000, 0.960000, 1.515000 },
+ { 0.966000, 1.066000, 1.569000 }
+ }});
+
+//! Coordinates of 54 atoms of the Cys-Val-Trp system after H-Bonds were constrained
+static const std::vector<RVec> c_cvwFinalCoordinatesHBonds(
+ {{
+ { 1.745950, 1.404137, 1.052042 },
+ { 1.805376, 1.449522, 0.979759 },
+ { 1.673804, 1.471318, 1.085171 },
+ { 1.813515, 1.368257, 1.122494 },
+ { 1.680997, 1.283001, 0.991996 },
+ { 1.612038, 1.308986, 0.913044 },
+ { 1.801019, 1.204075, 0.918974 },
+ { 1.771832, 1.099398, 0.895867 },
+ { 1.813938, 1.265703, 0.827441 },
+ { 1.974002, 1.193000, 0.997998 },
+ { 2.057943, 1.203992, 0.896070 },
+ { 1.594000, 1.204000, 1.095000 },
+ { 1.568000, 1.083000, 1.091000 },
+ { 1.533015, 1.270216, 1.201025 },
+ { 1.539794, 1.369004, 1.212648 },
+ { 1.457997, 1.205687, 1.309992 },
+ { 1.457033, 1.097730, 1.307100 },
+ { 1.531999, 1.230013, 1.433002 },
+ { 1.527007, 1.339845, 1.448977 },
+ { 1.478082, 1.148102, 1.544007 },
+ { 1.543998, 1.157000, 1.632997 },
+ { 1.377262, 1.176207, 1.581273 },
+ { 1.460769, 1.041573, 1.517647 },
+ { 1.685022, 1.180937, 1.411234 },
+ { 1.747673, 1.243673, 1.344284 },
+ { 1.729067, 1.189813, 1.512844 },
+ { 1.687993, 1.075258, 1.377083 },
+ { 1.312000, 1.253000, 1.324000 },
+ { 1.268000, 1.367000, 1.318000 },
+ { 1.223995, 1.149011, 1.343999 },
+ { 1.264064, 1.057854, 1.349008 },
+ { 1.094985, 1.169824, 1.404907 },
+ { 1.103180, 1.265097, 1.455105 },
+ { 0.975024, 1.166056, 1.297020 },
+ { 1.025283, 1.112700, 1.213531 },
+ { 0.886430, 1.109637, 1.333233 },
+ { 0.924000, 1.306000, 1.265000 },
+ { 0.952121, 1.385953, 1.164840 },
+ { 1.015558, 1.361555, 1.080908 },
+ { 0.882007, 1.507018, 1.173990 },
+ { 0.910909, 1.588743, 1.129141 },
+ { 0.819000, 1.515000, 1.296000 },
+ { 0.840000, 1.389000, 1.355000 },
+ { 0.777004, 1.363946, 1.480023 },
+ { 0.784949, 1.264642, 1.521730 },
+ { 0.697987, 1.457994, 1.538020 },
+ { 0.640158, 1.433068, 1.625761 },
+ { 0.746023, 1.616921, 1.350036 },
+ { 0.718729, 1.711945, 1.306568 },
+ { 0.681970, 1.582051, 1.472026 },
+ { 0.631363, 1.667388, 1.514694 },
+ { 1.070000, 1.060000, 1.508000 },
+ { 1.150000, 0.960000, 1.515000 },
+ { 0.966000, 1.066000, 1.569000 }
+ }});
+
+//! Coordinates of 54 atoms of the Cys-Val-Trp system after all bonds were constrained
+static const std::vector<RVec> c_cvwFinalCoordinatesAllBonds(
+ {{
+ { 1.744192, 1.400876, 1.050408 },
+ { 1.804620, 1.448942, 0.980679 },
+ { 1.674799, 1.470390, 1.084714 },
+ { 1.812763, 1.368655, 1.121708 },
+ { 1.683948, 1.276865, 0.996242 },
+ { 1.616170, 1.307429, 0.917774 },
+ { 1.803010, 1.207954, 0.927155 },
+ { 1.773417, 1.105083, 0.897124 },
+ { 1.813404, 1.263159, 0.831216 },
+ { 1.970550, 1.193223, 0.996389 },
+ { 2.057327, 1.203912, 0.896817 },
+ { 1.595071, 1.207624, 1.094104 },
+ { 1.568932, 1.087338, 1.091143 },
+ { 1.533602, 1.264980, 1.199359 },
+ { 1.539437, 1.363790, 1.212034 },
+ { 1.455744, 1.209606, 1.306025 },
+ { 1.457067, 1.101535, 1.307202 },
+ { 1.536585, 1.230178, 1.430802 },
+ { 1.527027, 1.339398, 1.448912 },
+ { 1.477277, 1.146856, 1.545698 },
+ { 1.544449, 1.157061, 1.633605 },
+ { 1.376383, 1.176453, 1.581598 },
+ { 1.460628, 1.040705, 1.517432 },
+ { 1.681448, 1.182094, 1.411715 },
+ { 1.746716, 1.242717, 1.345302 },
+ { 1.728696, 1.189739, 1.511987 },
+ { 1.687955, 1.076581, 1.377507 },
+ { 1.313454, 1.250569, 1.323999 },
+ { 1.268736, 1.365093, 1.318100 },
+ { 1.224082, 1.152044, 1.344591 },
+ { 1.262989, 1.060300, 1.348874 },
+ { 1.093660, 1.168520, 1.401086 },
+ { 1.102950, 1.262423, 1.453696 },
+ { 0.977797, 1.168815, 1.299821 },
+ { 1.024283, 1.113760, 1.215191 },
+ { 0.888605, 1.111021, 1.332343 },
+ { 0.921772, 1.305848, 1.269492 },
+ { 0.951364, 1.387941, 1.164422 },
+ { 1.015236, 1.361678, 1.081333 },
+ { 0.882251, 1.505804, 1.174960 },
+ { 0.910507, 1.587606, 1.129765 },
+ { 0.819059, 1.513487, 1.296914 },
+ { 0.840064, 1.387880, 1.355340 },
+ { 0.778667, 1.365803, 1.475722 },
+ { 0.784710, 1.267623, 1.520478 },
+ { 0.698397, 1.459946, 1.535866 },
+ { 0.641444, 1.433622, 1.623810 },
+ { 0.745363, 1.614637, 1.352384 },
+ { 0.719425, 1.709521, 1.307677 },
+ { 0.683959, 1.580100, 1.470510 },
+ { 0.632793, 1.664977, 1.513489 },
+ { 1.072860, 1.060117, 1.505945 },
+ { 1.149574, 0.960533, 1.514963 },
+ { 0.964441, 1.066090, 1.569914 }
+ }});
+
+//! Masses of atoms in the Cys-Val-Trp system
+static const std::vector<real> c_cvwMasses ( {
+ 14.007000,
+ 1.008000,
+ 1.008000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 1.008000,
+ 32.060001,
+ 1.008000,
+ 12.011000,
+ 15.999000,
+ 14.007000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 1.008000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 1.008000,
+ 1.008000,
+ 12.011000,
+ 15.999000,
+ 14.007000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 1.008000,
+ 12.011000,
+ 12.011000,
+ 1.008000,
+ 14.007000,
+ 1.008000,
+ 12.011000,
+ 12.011000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 1.008000,
+ 12.011000,
+ 15.999400,
+ 15.999400
+ } );
+
+
+} // namespace test
+
+} // namespace gmx
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/futil.h"
#include "gromacs/utility/smalloc.h"
-static void init_grptcstat(int ngtc, t_grp_tcstat tcstat[])
-{
- int i;
-
- for (i = 0; (i < ngtc); i++)
- {
- tcstat[i].T = 0;
- clear_mat(tcstat[i].ekinh);
- clear_mat(tcstat[i].ekinh_old);
- clear_mat(tcstat[i].ekinf);
- }
-}
-
static void init_grpstat(const gmx_mtop_t *mtop, int ngacc, t_grp_acc gstat[])
{
- const gmx_groups_t *groups;
- gmx_mtop_atomloop_all_t aloop;
- int i, grp;
- const t_atom *atom;
-
if (ngacc > 0)
{
- groups = &mtop->groups;
- aloop = gmx_mtop_atomloop_all_init(mtop);
- while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+ const gmx_groups_t &groups = mtop->groups;
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- grp = getGroupType(groups, egcACC, i);
+ const t_atom &local = atomP.atom();
+ int i = atomP.globalAtomNumber();
+ int grp = getGroupType(groups, egcACC, i);
if ((grp < 0) && (grp >= ngacc))
{
gmx_incons("Input for acceleration groups wrong");
}
gstat[grp].nat++;
/* This will not work for integrator BD */
- gstat[grp].mA += atom->m;
- gstat[grp].mB += atom->mB;
+ gstat[grp].mA += local.m;
+ gstat[grp].mB += local.mB;
}
}
}
ekind->bNEMD = (opts->ngacc > 1 || norm2(opts->acc[0]) > 0);
ekind->ngtc = opts->ngtc;
- snew(ekind->tcstat, opts->ngtc);
- init_grptcstat(opts->ngtc, ekind->tcstat);
+ ekind->tcstat.resize(opts->ngtc);
/* Set Berendsen tcoupl lambda's to 1,
* so runs without Berendsen coupling are not affected.
*/
ekind->tcstat[i].ekinscalef_nhc = 1.0;
}
- nthread = gmx_omp_nthreads_get(emntUpdate);
-
+ nthread = gmx_omp_nthreads_get(emntUpdate);
+ ekind->nthreads = nthread;
snew(ekind->ekin_work_alloc, nthread);
snew(ekind->ekin_work, nthread);
snew(ekind->dekindl_work, nthread);
}
ekind->ngacc = opts->ngacc;
- snew(ekind->grpstat, opts->ngacc);
- init_grpstat(mtop, opts->ngacc, ekind->grpstat);
+ ekind->grpstat.resize(opts->ngacc);
+ init_grpstat(mtop, opts->ngacc, ekind->grpstat.data());
}
void accumulate_u(const t_commrec *cr, const t_grpopts *opts, gmx_ekindata_t *ekind)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <algorithm>
+#include "gromacs/compat/make_unique.h"
#include "gromacs/domdec/domdec_struct.h"
#include "gromacs/fileio/confio.h"
#include "gromacs/gmxlib/network.h"
using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
-typedef struct {
+struct gmx_sd_const_t {
double em;
-} gmx_sd_const_t;
+};
-typedef struct {
+struct gmx_sd_sigma_t {
real V;
-} gmx_sd_sigma_t;
+};
-typedef struct {
+struct gmx_stochd_t
+{
/* BD stuff */
- real *bd_rf;
+ std::vector<real> bd_rf;
/* SD stuff */
- gmx_sd_const_t *sdc;
- gmx_sd_sigma_t *sdsig;
+ std::vector<gmx_sd_const_t> sdc;
+ std::vector<gmx_sd_sigma_t> sdsig;
/* andersen temperature control stuff */
- gmx_bool *randomize_group;
- real *boltzfac;
-} gmx_stochd_t;
+ std::vector<bool> randomize_group;
+ std::vector<real> boltzfac;
+
+ explicit gmx_stochd_t(const t_inputrec *ir);
+};
-struct gmx_update_t
+//! pImpled implementation for Update
+class Update::Impl
{
- gmx_stochd_t *sd;
- /* xprime for constraint algorithms */
- PaddedVector<gmx::RVec> xp;
+ public:
+ //! Constructor
+ Impl(const t_inputrec *ir, BoxDeformation *boxDeformation);
+ //! Destructor
+ ~Impl() = default;
+ //! stochastic dynamics struct
+ std::unique_ptr<gmx_stochd_t> sd;
+ //! xprime for constraint algorithms
+ PaddedVector<RVec> xp;
+ //! Box deformation handler (or nullptr if inactive).
+ BoxDeformation *deform = nullptr;
+};
- /* Variables for the deform algorithm */
- int64_t deformref_step;
- matrix deformref_box;
+Update::Update(const t_inputrec *ir, BoxDeformation *boxDeformation)
+ : impl_(new Impl(ir, boxDeformation))
+{};
- //! Box deformation handler (or nullptr if inactive).
- gmx::BoxDeformation *deform;
-};
+Update::~Update()
+{};
+
+gmx_stochd_t* Update::sd() const
+{
+ return impl_->sd.get();
+}
+
+PaddedVector<RVec> * Update::xp()
+{
+ return &impl_->xp;
+}
+
+BoxDeformation * Update::deform() const
+{
+ return impl_->deform;
+}
static bool isTemperatureCouplingStep(int64_t step, const t_inputrec *ir)
{
template<NumTempScaleValues numTempScaleValues,
ApplyParrinelloRahmanVScaling applyPRVScaling>
static void
-updateMDLeapfrogSimple(int start,
- int nrend,
- real dt,
- real dtPressureCouple,
- const rvec * gmx_restrict invMassPerDim,
- const t_grp_tcstat * tcstat,
- const unsigned short * cTC,
- const rvec pRVScaleMatrixDiagonal,
- const rvec * gmx_restrict x,
- rvec * gmx_restrict xprime,
- rvec * gmx_restrict v,
- const rvec * gmx_restrict f)
+updateMDLeapfrogSimple(int start,
+ int nrend,
+ real dt,
+ real dtPressureCouple,
+ const rvec * gmx_restrict invMassPerDim,
+ gmx::ArrayRef<const t_grp_tcstat> tcstat,
+ const unsigned short * cTC,
+ const rvec pRVScaleMatrixDiagonal,
+ const rvec * gmx_restrict x,
+ rvec * gmx_restrict xprime,
+ rvec * gmx_restrict v,
+ const rvec * gmx_restrict f)
{
real lambdaGroup;
* \param[in] f Forces
*/
static void
-updateMDLeapfrogSimpleSimd(int start,
- int nrend,
- real dt,
- const real * gmx_restrict invMass,
- const t_grp_tcstat * tcstat,
- const rvec * gmx_restrict x,
- rvec * gmx_restrict xprime,
- rvec * gmx_restrict v,
- const rvec * gmx_restrict f)
+updateMDLeapfrogSimpleSimd(int start,
+ int nrend,
+ real dt,
+ const real * gmx_restrict invMass,
+ gmx::ArrayRef<const t_grp_tcstat> tcstat,
+ const rvec * gmx_restrict x,
+ rvec * gmx_restrict xprime,
+ rvec * gmx_restrict v,
+ const rvec * gmx_restrict f)
{
SimdReal timestep(dt);
SimdReal lambdaSystem(tcstat[0].lambda);
* Holian et al. Phys Rev E 52(3) : 2338, 1995
*/
- const unsigned short * cTC = md->cTC;
- const t_grp_tcstat * tcstat = ekind->tcstat;
-
- const unsigned short * cACC = md->cACC;
- const rvec * accel = ir->opts.acc;
- const t_grp_acc * grpstat = ekind->grpstat;
+ gmx::ArrayRef<const t_grp_tcstat> tcstat = ekind->tcstat;
+ gmx::ArrayRef<const t_grp_acc> grpstat = ekind->grpstat;
+ const unsigned short * cTC = md->cTC;
+ const unsigned short * cACC = md->cACC;
+ const rvec * accel = ir->opts.acc;
- const rvec * gmx_restrict invMassPerDim = md->invMassPerDim;
+ const rvec * gmx_restrict invMassPerDim = md->invMassPerDim;
/* Initialize group values, changed later when multiple groups are used */
int ga = 0;
bool haveSingleTempScaleValue = (!doTempCouple || ekind->ngtc == 1);
/* Extract some pointers needed by all cases */
- const unsigned short *cTC = md->cTC;
- const t_grp_tcstat *tcstat = ekind->tcstat;
- const rvec *invMassPerDim = md->invMassPerDim;
+ const unsigned short *cTC = md->cTC;
+ gmx::ArrayRef<const t_grp_tcstat> tcstat = ekind->tcstat;
+ const rvec *invMassPerDim = md->invMassPerDim;
if (doParrinelloRahman)
{
}
} /* do_update_vv_pos */
-static gmx_stochd_t *init_stochd(const t_inputrec *ir)
+gmx_stochd_t::gmx_stochd_t(const t_inputrec *ir)
{
- gmx_stochd_t *sd;
-
- snew(sd, 1);
-
const t_grpopts *opts = &ir->opts;
- int ngtc = opts->ngtc;
+ const int ngtc = opts->ngtc;
if (ir->eI == eiBD)
{
- snew(sd->bd_rf, ngtc);
+ bd_rf.resize(ngtc);
}
else if (EI_SD(ir->eI))
{
- snew(sd->sdc, ngtc);
- snew(sd->sdsig, ngtc);
-
- gmx_sd_const_t *sdc = sd->sdc;
+ sdc.resize(ngtc);
+ sdsig.resize(ngtc);
for (int gt = 0; gt < ngtc; gt++)
{
}
else if (ETC_ANDERSEN(ir->etc))
{
- snew(sd->randomize_group, ngtc);
- snew(sd->boltzfac, ngtc);
+ randomize_group.resize(ngtc);
+ boltzfac.resize(ngtc);
/* for now, assume that all groups, if randomized, are randomized at the same rate, i.e. tau_t is the same. */
/* since constraint groups don't necessarily match up with temperature groups! This is checked in readir.c */
real reft = std::max<real>(0, opts->ref_t[gt]);
if ((opts->tau_t[gt] > 0) && (reft > 0)) /* tau_t or ref_t = 0 means that no randomization is done */
{
- sd->randomize_group[gt] = TRUE;
- sd->boltzfac[gt] = BOLTZ*opts->ref_t[gt];
+ randomize_group[gt] = true;
+ boltzfac[gt] = BOLTZ*opts->ref_t[gt];
}
else
{
- sd->randomize_group[gt] = FALSE;
+ randomize_group[gt] = false;
}
}
}
-
- return sd;
}
-void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir)
+void update_temperature_constants(gmx_stochd_t *sd, const t_inputrec *ir)
{
if (ir->eI == eiBD)
{
{
for (int gt = 0; gt < ir->opts.ngtc; gt++)
{
- upd->sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]/(ir->bd_fric*ir->delta_t));
+ sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]/(ir->bd_fric*ir->delta_t));
}
}
else
{
for (int gt = 0; gt < ir->opts.ngtc; gt++)
{
- upd->sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]);
+ sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]);
}
}
}
{
real kT = BOLTZ*ir->opts.ref_t[gt];
/* The mass is accounted for later, since this differs per atom */
- upd->sd->sdsig[gt].V = std::sqrt(kT*(1 - upd->sd->sdc[gt].em*upd->sd->sdc[gt].em));
+ sd->sdsig[gt].V = std::sqrt(kT*(1 - sd->sdc[gt].em * sd->sdc[gt].em));
}
}
}
-gmx_update_t *init_update(const t_inputrec *ir,
- gmx::BoxDeformation *deform)
+Update::Impl::Impl(const t_inputrec *ir, BoxDeformation *boxDeformation)
{
- gmx_update_t *upd = new(gmx_update_t);
-
- if (ir->eI == eiBD || EI_SD(ir->eI) || ir->etc == etcVRESCALE || ETC_ANDERSEN(ir->etc))
- {
- upd->sd = init_stochd(ir);
- }
-
- update_temperature_constants(upd, ir);
-
- upd->xp.resizeWithPadding(0);
-
- upd->deform = deform;
-
- return upd;
+ sd = gmx::compat::make_unique<gmx_stochd_t>(ir);
+ update_temperature_constants(sd.get(), ir);
+ xp.resizeWithPadding(0);
+ deform = boxDeformation;
}
-void update_realloc(gmx_update_t *upd, int natoms)
+void Update::setNumAtoms(int nAtoms)
{
- GMX_ASSERT(upd, "upd must be allocated before its fields can be reallocated");
- upd->xp.resizeWithPadding(natoms);
+ impl_->xp.resizeWithPadding(nAtoms);
}
/*! \brief Sets the SD update type */
* two with only one contribution, and one with both contributions. */
template <SDUpdate updateType>
static void
-doSDUpdateGeneral(gmx_stochd_t *sd,
+doSDUpdateGeneral(const gmx_stochd_t &sd,
int start, int nrend, real dt,
const rvec accel[], const ivec nFreeze[],
const real invmass[], const unsigned short ptype[],
gmx::ThreeFry2x64<0> rng(seed, gmx::RandomDomain::UpdateCoordinates);
gmx::TabulatedNormalDistribution<real, 14> dist;
- gmx_sd_const_t *sdc = sd->sdc;
- gmx_sd_sigma_t *sig = sd->sdsig;
-
for (int n = start; n < nrend; n++)
{
int globalAtomIndex = gatindex ? gatindex[n] : n;
else if (updateType == SDUpdate::FrictionAndNoiseOnly)
{
real vn = v[n][d];
- v[n][d] = (vn*sdc[temperatureGroup].em +
- invsqrtMass*sig[temperatureGroup].V*dist(rng));
+ v[n][d] = (vn*sd.sdc[temperatureGroup].em +
+ invsqrtMass*sd.sdsig[temperatureGroup].V*dist(rng));
// The previous phase already updated the
// positions with a full v*dt term that must
// now be half removed.
else
{
real vn = v[n][d] + (inverseMass*f[n][d] + accel[accelerationGroup][d])*dt;
- v[n][d] = (vn*sdc[temperatureGroup].em +
- invsqrtMass*sig[temperatureGroup].V*dist(rng));
+ v[n][d] = (vn*sd.sdc[temperatureGroup].em +
+ invsqrtMass*sd.sdsig[temperatureGroup].V*dist(rng));
// Here we include half of the friction+noise
// update of v into the position update.
xprime[n][d] = x[n][d] + 0.5*(vn + v[n][d])*dt;
static void calc_ke_part_normal(const rvec v[], const t_grpopts *opts, const t_mdatoms *md,
gmx_ekindata_t *ekind, t_nrnb *nrnb, gmx_bool bEkinAveVel)
{
- int g;
- t_grp_tcstat *tcstat = ekind->tcstat;
- t_grp_acc *grpstat = ekind->grpstat;
- int nthread, thread;
+ int g;
+ gmx::ArrayRef<t_grp_tcstat> tcstat = ekind->tcstat;
+ gmx::ArrayRef<t_grp_acc> grpstat = ekind->grpstat;
+ int nthread, thread;
/* three main: VV with AveVel, vv with AveEkin, leap with AveEkin. Leap with AveVel is also
an option, but not supported now.
gmx_ekindata_t *ekind,
t_nrnb *nrnb, gmx_bool bEkinAveVel)
{
- int start = 0, homenr = md->homenr;
- int g, d, n, m, gt = 0;
- rvec v_corrt;
- real hm;
- t_grp_tcstat *tcstat = ekind->tcstat;
- t_cos_acc *cosacc = &(ekind->cosacc);
- real dekindl;
- real fac, cosz;
- double mvcos;
+ int start = 0, homenr = md->homenr;
+ int g, d, n, m, gt = 0;
+ rvec v_corrt;
+ real hm;
+ gmx::ArrayRef<t_grp_tcstat> tcstat = ekind->tcstat;
+ t_cos_acc *cosacc = &(ekind->cosacc);
+ real dekindl;
+ real fac, cosz;
+ double mvcos;
for (g = 0; g < opts->ngtc; g++)
{
}
}
-void constrain_coordinates(int64_t step,
- real *dvdlambda, /* the contribution to be added to the bonded interactions */
- t_state *state,
- tensor vir_part,
- gmx_update_t *upd,
- gmx::Constraints *constr,
- gmx_bool bCalcVir,
- bool do_log,
- bool do_ene)
+void constrain_coordinates(int64_t step,
+ real *dvdlambda, /* the contribution to be added to the bonded interactions */
+ t_state *state,
+ tensor vir_part,
+ Update *upd,
+ gmx::Constraints *constr,
+ gmx_bool bCalcVir,
+ bool do_log,
+ bool do_ene)
{
if (!constr)
{
/* Constrain the coordinates upd->xp */
constr->apply(do_log, do_ene,
step, 1, 1.0,
- state->x.rvec_array(), upd->xp.rvec_array(), nullptr,
+ state->x.rvec_array(), upd->xp()->rvec_array(), nullptr,
state->box,
state->lambda[efptBONDED], dvdlambda,
as_rvec_array(state->v.data()), bCalcVir ? &vir_con : nullptr, ConstraintVariable::Positions);
}
void
-update_sd_second_half(int64_t step,
- real *dvdlambda, /* the contribution to be added to the bonded interactions */
- const t_inputrec *inputrec, /* input record and box stuff */
- const t_mdatoms *md,
- t_state *state,
- const t_commrec *cr,
- t_nrnb *nrnb,
- gmx_wallcycle_t wcycle,
- gmx_update_t *upd,
- gmx::Constraints *constr,
- bool do_log,
- bool do_ene)
+update_sd_second_half(int64_t step,
+ real *dvdlambda, /* the contribution to be added to the bonded interactions */
+ const t_inputrec *inputrec, /* input record and box stuff */
+ const t_mdatoms *md,
+ t_state *state,
+ const t_commrec *cr,
+ t_nrnb *nrnb,
+ gmx_wallcycle_t wcycle,
+ Update *upd,
+ gmx::Constraints *constr,
+ bool do_log,
+ bool do_ene)
{
if (!constr)
{
getThreadAtomRange(nth, th, homenr, &start_th, &end_th);
doSDUpdateGeneral<SDUpdate::FrictionAndNoiseOnly>
- (upd->sd,
+ (*upd->sd(),
start_th, end_th, dt,
inputrec->opts.acc, inputrec->opts.nFreeze,
md->invmass, md->ptype,
md->cFREEZE, nullptr, md->cTC,
- state->x.rvec_array(), upd->xp.rvec_array(),
+ state->x.rvec_array(), upd->xp()->rvec_array(),
state->v.rvec_array(), nullptr,
step, inputrec->ld_seed,
DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
/* Constrain the coordinates upd->xp for half a time step */
constr->apply(do_log, do_ene,
step, 1, 0.5,
- state->x.rvec_array(), upd->xp.rvec_array(), nullptr,
+ state->x.rvec_array(), upd->xp()->rvec_array(), nullptr,
state->box,
state->lambda[efptBONDED], dvdlambda,
as_rvec_array(state->v.data()), nullptr, ConstraintVariable::Positions);
}
}
-void finish_update(const t_inputrec *inputrec, /* input record and box stuff */
- const t_mdatoms *md,
- t_state *state,
- const t_graph *graph,
- t_nrnb *nrnb,
- gmx_wallcycle_t wcycle,
- gmx_update_t *upd,
- const gmx::Constraints *constr)
+void finish_update(const t_inputrec *inputrec, /* input record and box stuff */
+ const t_mdatoms *md,
+ t_state *state,
+ const t_graph *graph,
+ t_nrnb *nrnb,
+ gmx_wallcycle_t wcycle,
+ Update *upd,
+ const gmx::Constraints *constr)
{
int homenr = md->homenr;
}
if (partialFreezeAndConstraints)
{
- auto xp = makeArrayRef(upd->xp).subArray(0, homenr);
+ auto xp = makeArrayRef(*upd->xp()).subArray(0, homenr);
auto x = makeConstArrayRef(state->x).subArray(0, homenr);
for (int i = 0; i < homenr; i++)
{
if (graph && (graph->nnodes > 0))
{
- unshift_x(graph, state->box, state->x.rvec_array(), upd->xp.rvec_array());
+ unshift_x(graph, state->box, state->x.rvec_array(), upd->xp()->rvec_array());
if (TRICLINIC(state->box))
{
inc_nrnb(nrnb, eNR_SHIFTX, 2*graph->nnodes);
}
else
{
- auto xp = makeConstArrayRef(upd->xp).subArray(0, homenr);
+ auto xp = makeConstArrayRef(*upd->xp()).subArray(0, homenr);
auto x = makeArrayRef(state->x).subArray(0, homenr);
#ifndef __clang_analyzer__
int gmx_unused nth = gmx_omp_nthreads_get(emntUpdate);
const matrix parrinellorahmanMu,
t_state *state,
t_nrnb *nrnb,
- gmx_update_t *upd)
+ Update *upd)
{
int start = 0;
int homenr = md->homenr;
break;
}
- if (upd->deform)
+ if (upd->deform())
{
auto localX = makeArrayRef(state->x).subArray(start, homenr);
- upd->deform->apply(localX, state->box, step);
+ upd->deform()->apply(localX, state->box, step);
}
}
const t_fcdata *fcd,
const gmx_ekindata_t *ekind,
const matrix M,
- gmx_update_t *upd,
+ Update *upd,
int UpdatePart,
const t_commrec *cr, /* these shouldn't be here -- need to think about it */
const gmx::Constraints *constr)
getThreadAtomRange(nth, th, homenr, &start_th, &end_th);
const rvec *x_rvec = state->x.rvec_array();
- rvec *xp_rvec = upd->xp.rvec_array();
+ rvec *xp_rvec = upd->xp()->rvec_array();
rvec *v_rvec = state->v.rvec_array();
const rvec *f_rvec = as_rvec_array(f.unpaddedArrayRef().data());
{
// With constraints, the SD update is done in 2 parts
doSDUpdateGeneral<SDUpdate::ForcesOnly>
- (upd->sd,
+ (*upd->sd(),
start_th, end_th, dt,
inputrec->opts.acc, inputrec->opts.nFreeze,
md->invmass, md->ptype,
else
{
doSDUpdateGeneral<SDUpdate::Combined>
- (upd->sd,
+ (*upd->sd(),
start_th, end_th, dt,
inputrec->opts.acc, inputrec->opts.nFreeze,
md->invmass, md->ptype,
md->cFREEZE, md->cTC,
x_rvec, xp_rvec, v_rvec, f_rvec,
inputrec->bd_fric,
- upd->sd->bd_rf,
+ upd->sd()->bd_rf.data(),
step, inputrec->ld_seed, DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
break;
case (eiVV):
extern gmx_bool update_randomize_velocities(const t_inputrec *ir, int64_t step, const t_commrec *cr,
const t_mdatoms *md,
gmx::ArrayRef<gmx::RVec> v,
- const gmx_update_t *upd,
+ const Update *upd,
const gmx::Constraints *constr)
{
if ((ir->etc == etcANDERSEN) || do_per_step(step, roundToInt(1.0/rate)))
{
andersen_tcoupl(ir, step, cr, md, v, rate,
- upd->sd->randomize_group, upd->sd->boltzfac);
+ upd->sd()->randomize_group,
+ upd->sd()->boltzfac);
return TRUE;
}
return FALSE;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/math/paddedvector.h"
#include "gromacs/math/vectypes.h"
+#include "gromacs/mdtypes/md_enums.h"
#include "gromacs/timing/wallcycle.h"
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
#include "gromacs/utility/real.h"
class ekinstate_t;
class t_state;
/* Abstract type for update */
-struct gmx_update_t;
+struct gmx_stochd_t;
namespace gmx
{
class BoxDeformation;
class Constraints;
-}
-/* Initialize the stochastic dynamics struct */
-gmx_update_t *init_update(const t_inputrec *ir,
- gmx::BoxDeformation *deform);
+
+/*! \libinternal
+ * \brief Contains data for update phase */
+class Update
+{
+ public:
+ //! Constructor
+ Update(const t_inputrec *ir, BoxDeformation *boxDeformation);
+ ~Update();
+ // TODO Get rid of getters when more free functions are incorporated as member methods
+ //! Returns handle to stochd_t struct
+ gmx_stochd_t * sd() const;
+ //! Returns pointer to PaddedVector xp
+ PaddedVector<gmx::RVec> * xp();
+ //! Returns handle to box deformation class
+ BoxDeformation * deform() const;
+ //! Resizes xp
+ void setNumAtoms(int nAtoms);
+ private:
+ //! Implementation type.
+ class Impl;
+ //! Implementation object.
+ PrivateImplPointer<Impl> impl_;
+};
+
+}; // namespace gmx
/* Update pre-computed constants that depend on the reference
* temperature for coupling.
*
* This could change e.g. in simulated annealing. */
-void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir);
+void update_temperature_constants(gmx_stochd_t *sd, const t_inputrec *ir);
/* Update the size of per-atom arrays (e.g. after DD re-partitioning,
which might increase the number of home atoms). */
-void update_realloc(gmx_update_t *upd, int natoms);
-
-/* Store the box at step step
- * as a reference state for simulations with box deformation.
- */
-void set_deform_reference_box(gmx_update_t *upd,
- int64_t step, matrix box);
void update_tcouple(int64_t step,
const t_inputrec *inputrec,
const matrix parrinellorahmanMu,
t_state *state,
t_nrnb *nrnb,
- gmx_update_t *upd);
-
-void update_coords(int64_t step,
- const t_inputrec *inputrec, /* input record and box stuff */
- const t_mdatoms *md,
- t_state *state,
- gmx::ArrayRefWithPadding<gmx::RVec> f, /* forces on home particles */
- const t_fcdata *fcd,
- const gmx_ekindata_t *ekind,
- const matrix M,
- gmx_update_t *upd,
- int bUpdatePart,
- const t_commrec *cr, /* these shouldn't be here -- need to think about it */
- const gmx::Constraints *constr);
+ gmx::Update *upd);
+
+void update_coords(int64_t step,
+ const t_inputrec *inputrec, /* input record and box stuff */
+ const t_mdatoms *md,
+ t_state *state,
+ gmx::ArrayRefWithPadding<gmx::RVec> f, /* forces on home particles */
+ const t_fcdata *fcd,
+ const gmx_ekindata_t *ekind,
+ const matrix M,
+ gmx::Update *upd,
+ int bUpdatePart,
+ const t_commrec *cr, /* these shouldn't be here -- need to think about it */
+ const gmx::Constraints *constr);
/* Return TRUE if OK, FALSE in case of Shake Error */
extern gmx_bool update_randomize_velocities(const t_inputrec *ir, int64_t step, const t_commrec *cr,
const t_mdatoms *md,
gmx::ArrayRef<gmx::RVec> v,
- const gmx_update_t *upd,
+ const gmx::Update *upd,
const gmx::Constraints *constr);
void constrain_velocities(int64_t step,
bool do_log,
bool do_ene);
-void constrain_coordinates(int64_t step,
- real *dvdlambda, /* the contribution to be added to the bonded interactions */
- t_state *state,
- tensor vir_part,
- gmx_update_t *upd,
- gmx::Constraints *constr,
- gmx_bool bCalcVir,
- bool do_log,
- bool do_ene);
-
-void update_sd_second_half(int64_t step,
- real *dvdlambda, /* the contribution to be added to the bonded interactions */
- const t_inputrec *inputrec, /* input record and box stuff */
- const t_mdatoms *md,
- t_state *state,
- const t_commrec *cr,
- t_nrnb *nrnb,
- gmx_wallcycle_t wcycle,
- gmx_update_t *upd,
- gmx::Constraints *constr,
- bool do_log,
- bool do_ene);
-
-void finish_update(const t_inputrec *inputrec,
- const t_mdatoms *md,
- t_state *state,
- const t_graph *graph,
- t_nrnb *nrnb,
- gmx_wallcycle_t wcycle,
- gmx_update_t *upd,
- const gmx::Constraints *constr);
+void constrain_coordinates(int64_t step,
+ real *dvdlambda, /* the contribution to be added to the bonded interactions */
+ t_state *state,
+ tensor vir_part,
+ gmx::Update *upd,
+ gmx::Constraints *constr,
+ gmx_bool bCalcVir,
+ bool do_log,
+ bool do_ene);
+
+void update_sd_second_half(int64_t step,
+ real *dvdlambda, /* the contribution to be added to the bonded interactions */
+ const t_inputrec *inputrec, /* input record and box stuff */
+ const t_mdatoms *md,
+ t_state *state,
+ const t_commrec *cr,
+ t_nrnb *nrnb,
+ gmx_wallcycle_t wcycle,
+ gmx::Update *upd,
+ gmx::Constraints *constr,
+ bool do_log,
+ bool do_ene);
+
+void finish_update(const t_inputrec *inputrec,
+ const t_mdatoms *md,
+ t_state *state,
+ const t_graph *graph,
+ t_nrnb *nrnb,
+ gmx_wallcycle_t wcycle,
+ gmx::Update *upd,
+ const gmx::Constraints *constr);
/* Return TRUE if OK, FALSE in case of Shake Error */
restore_ekinstate_from_state(const t_commrec *cr,
gmx_ekindata_t *ekind, const ekinstate_t *ekinstate);
-void berendsen_tcoupl(const t_inputrec *ir, const gmx_ekindata_t *ekind, real dt,
+void berendsen_tcoupl(const t_inputrec *ir, gmx_ekindata_t *ekind, real dt,
std::vector<double> &therm_integral); //NOLINT(google-runtime-references)
void andersen_tcoupl(const t_inputrec *ir, int64_t step,
const t_commrec *cr, const t_mdatoms *md,
gmx::ArrayRef<gmx::RVec> v,
- real rate, const gmx_bool *randomize, const real *boltzfac);
+ real rate, const std::vector<bool> &randomize,
+ gmx::ArrayRef<const real> boltzfac);
void nosehoover_tcoupl(const t_grpopts *opts, const gmx_ekindata_t *ekind, real dt,
double xi[], double vxi[], const t_extmass *MassQ);
void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
- const gmx_enerdata_t *enerd, t_state *state, const tensor vir, const t_mdatoms *md,
- const t_extmass *MassQ, const int * const *trotter_seqlist, int trotter_seqno);
+ const gmx_enerdata_t *enerd, t_state *state, const tensor vir,
+ const t_mdatoms *md, const t_extmass *MassQ,
+ gmx::ArrayRef < std::vector < int>> trotter_seqlist, int trotter_seqno);
-int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *Mass, gmx_bool bTrotter);
+std::array < std::vector < int>, ettTSEQMAX> init_npt_vars(const t_inputrec *ir, t_state *state,
+ t_extmass *Mass, gmx_bool bTrotter);
real NPT_energy(const t_inputrec *ir, const t_state *state, const t_extmass *MassQ);
/* computes all the pressure/tempertature control energy terms to get a conserved energy */
-// TODO: This doesn't seem to be used or implemented anywhere
-void NBaroT_trotter(t_grpopts *opts, real dt,
- double xi[], double vxi[], real *veta, t_extmass *MassQ);
-
void vrescale_tcoupl(const t_inputrec *ir, int64_t step,
gmx_ekindata_t *ekind, real dt,
double therm_integral[]);
int start, int end, rvec v[]);
/* Rescale the velocities with the scaling factor in ekind */
+//! Initialize simulated annealing.
+bool initSimulatedAnnealing(t_inputrec *ir,
+ gmx::Update *upd);
+
// TODO: This is the only function in update.h altering the inputrec
-void update_annealing_target_temp(t_inputrec *ir, real t, gmx_update_t *upd);
+void update_annealing_target_temp(t_inputrec *ir, real t, gmx::Update *upd);
/* Set reference temp for simulated annealing at time t*/
real calc_temp(real ekin, real nrdf);
rvec x[], const unsigned short cFREEZE[],
t_nrnb *nrnb);
-// TODO: This doesn't seem to be used or implemented anywhere
-void correct_ekin(FILE *log, int start, int end, rvec v[],
- rvec vcm, real mass[], real tmass, tensor ekin);
-/* Correct ekin for vcm */
+void pleaseCiteCouplingAlgorithms(FILE *fplog,
+ const t_inputrec &ir);
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/gmxomp.h"
#include "gromacs/utility/smalloc.h"
-t_vcm *init_vcm(FILE *fp, const gmx_groups_t *groups, const t_inputrec *ir)
+t_vcm::t_vcm(const gmx_groups_t &groups, const t_inputrec &ir)
{
- t_vcm *vcm;
- int g;
+ mode = (ir.nstcomm > 0) ? ir.comm_mode : ecmNO;
+ ndim = ndof_com(&ir);
+ timeStep = ir.nstcomm*ir.delta_t;
- snew(vcm, 1);
-
- vcm->mode = (ir->nstcomm > 0) ? ir->comm_mode : ecmNO;
- vcm->ndim = ndof_com(ir);
- vcm->timeStep = ir->nstcomm*ir->delta_t;
-
- if (vcm->mode == ecmANGULAR && vcm->ndim < 3)
+ if (mode == ecmANGULAR && ndim < 3)
{
gmx_fatal(FARGS, "Can not have angular comm removal with pbc=%s",
- epbc_names[ir->ePBC]);
+ epbc_names[ir.ePBC]);
}
- if (vcm->mode != ecmNO)
+ if (mode != ecmNO)
{
- vcm->nr = groups->grps[egcVCM].nr;
+ nr = groups.grps[egcVCM].nr;
/* Allocate one extra for a possible rest group */
- vcm->size = vcm->nr + 1;
+ size = nr + 1;
/* We need vcm->nr+1 elements per thread, but to avoid cache
* invalidation we add 2 elements to get a 152 byte separation.
*/
- vcm->stride = vcm->nr + 3;
- if (vcm->mode == ecmANGULAR)
+ stride = nr + 3;
+ if (mode == ecmANGULAR)
{
- snew(vcm->group_j, vcm->size);
- snew(vcm->group_x, vcm->size);
- snew(vcm->group_i, vcm->size);
- snew(vcm->group_w, vcm->size);
- }
- snew(vcm->group_p, vcm->size);
- snew(vcm->group_v, vcm->size);
- snew(vcm->group_mass, vcm->size);
- snew(vcm->group_name, vcm->size);
- snew(vcm->group_ndf, vcm->size);
- for (g = 0; (g < vcm->nr); g++)
- {
- vcm->group_ndf[g] = ir->opts.nrdf[g];
- }
+ snew(group_i, size);
+
+ group_j.resize(size);
+ group_x.resize(size);
+ group_w.resize(size);
- /* Copy pointer to group names and print it. */
- if (fp)
- {
- fprintf(fp, "Center of mass motion removal mode is %s\n",
- ECOM(vcm->mode));
- fprintf(fp, "We have the following groups for center of"
- " mass motion removal:\n");
}
- for (g = 0; (g < vcm->nr); g++)
+
+ group_name.resize(size);
+ group_p.resize(size);
+ group_v.resize(size);
+ group_mass.resize(size);
+ group_ndf.resize(size);
+ for (int g = 0; (g < nr); g++)
{
- vcm->group_name[g] = *groups->grpname[groups->grps[egcVCM].nm_ind[g]];
- if (fp)
- {
- fprintf(fp, "%3d: %s\n", g, vcm->group_name[g]);
- }
+ group_ndf[g] = ir.opts.nrdf[g];
+ group_name[g] = *groups.grpname[groups.grps[egcVCM].nm_ind[g]];
+
}
- snew(vcm->thread_vcm, gmx_omp_nthreads_get(emntDefault) * vcm->stride);
+ thread_vcm.resize(gmx_omp_nthreads_get(emntDefault) * stride);
}
- vcm->nFreeze = ir->opts.nFreeze;
+ nFreeze = ir.opts.nFreeze;
+}
- return vcm;
+t_vcm::~t_vcm()
+{
+ if (mode == ecmANGULAR)
+ {
+ sfree(group_i);
+ }
}
+void reportComRemovalInfo(FILE * fp, const t_vcm &vcm)
+{
+
+ /* Copy pointer to group names and print it. */
+ if (fp && vcm.mode != ecmNO)
+ {
+ fprintf(fp, "Center of mass motion removal mode is %s\n",
+ ECOM(vcm.mode));
+ fprintf(fp, "We have the following groups for center of"
+ " mass motion removal:\n");
+
+ for (int g = 0; (g < vcm.nr); g++)
+ {
+
+ fprintf(fp, "%3d: %s\n", g, vcm.group_name[g]);
+ }
+ }
+}
+
+
static void update_tensor(const rvec x, real m0, tensor I)
{
real xy, xz, yz;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <stdio.h>
+#include <vector>
+
#include "gromacs/math/vectypes.h"
#include "gromacs/mdtypes/mdatom.h"
#include "gromacs/utility/basedefinitions.h"
struct t_inputrec;
struct t_mdatoms;
-typedef struct {
- rvec p; /* Linear momentum */
- rvec x; /* Center of mass */
- rvec j; /* Angular momentum */
- tensor i; /* Moment of inertia */
- real mass; /* Mass */
-} t_vcm_thread;
+struct t_vcm_thread{
+ rvec p = {0}; /* Linear momentum */
+ rvec x = {0}; /* Center of mass */
+ rvec j = {0}; /* Angular momentum */
+ tensor i = {{0}}; /* Moment of inertia */
+ real mass = 0; /* Mass */
+};
+
+struct t_vcm
+{
+ int nr; /* Number of groups */
+ int size; /* Size of group arrays */
+ int stride; /* Stride for thread data */
+ int mode; /* One of the enums above */
+ int ndim; /* The number of dimensions for corr. */
+ real timeStep; /* The time step for COMM removal */
+ std::vector<real> group_ndf; /* Number of degrees of freedom */
+ std::vector<real> group_mass; /* Mass per group */
+ std::vector<gmx::RVec> group_p; /* Linear momentum per group */
+ std::vector<gmx::RVec> group_v; /* Linear velocity per group */
+ std::vector<gmx::RVec> group_x; /* Center of mass per group */
+ std::vector<gmx::RVec> group_j; /* Angular momentum per group */
+ std::vector<gmx::RVec> group_w; /* Angular velocity (omega) */
+ tensor *group_i; /* Moment of inertia per group */
+ std::vector<char *> group_name; /* These two are copies to pointers in */
+ ivec *nFreeze; /* Tells whether dimensions are frozen per freeze group */
+ std::vector<t_vcm_thread> thread_vcm; /* Temporary data per thread and group */
+
+ t_vcm(const gmx_groups_t &groups, const t_inputrec &ir);
+ ~t_vcm();
+};
-typedef struct {
- int nr; /* Number of groups */
- int size; /* Size of group arrays */
- int stride; /* Stride for thread data */
- int mode; /* One of the enums above */
- int ndim; /* The number of dimensions for corr. */
- real timeStep; /* The time step for COMM removal */
- real *group_ndf; /* Number of degrees of freedom */
- rvec *group_p; /* Linear momentum per group */
- rvec *group_v; /* Linear velocity per group */
- rvec *group_x; /* Center of mass per group */
- rvec *group_j; /* Angular momentum per group */
- rvec *group_w; /* Angular velocity (omega) */
- tensor *group_i; /* Moment of inertia per group */
- real *group_mass; /* Mass per group */
- char **group_name; /* These two are copies to pointers in */
- ivec *nFreeze; /* Tells whether dimensions are frozen per freeze group */
- t_vcm_thread *thread_vcm; /* Temporary data per thread and group */
-} t_vcm;
+/* print COM removal info to log */
+void reportComRemovalInfo(FILE * fp, const t_vcm &vcm);
-t_vcm *init_vcm(FILE *fp, const gmx_groups_t *groups, const t_inputrec *ir);
/* Do a per group center of mass things */
void calc_vcm_grp(int start, int homenr, t_mdatoms *md,
{
done_commrec(cr);
}
+ output_env_done(oenv);
done_multisim(ms);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
// t_inputrec is being replaced by IMdpOptionsProvider, so this
// will go away eventually.
t_inputrec *ir = inputrec;
- gmx_mdoutf *outf = nullptr;
int64_t step, step_rel;
- double t, t0, lam0[efptNR];
+ double t = ir->init_t, t0 = ir->init_t, lam0[efptNR];
gmx_bool bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
- gmx_bool bNS, bNStList, bSimAnn, bStopCM,
+ gmx_bool bNS, bNStList, bStopCM,
bFirstStep, bInitStep, bLastStep = FALSE;
gmx_bool bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
gmx_bool do_ene, do_log, do_verbose;
gmx_bool bMasterState;
int force_flags, cglo_flags;
- tensor force_vir, shake_vir, total_vir, tmp_vir, pres;
+ tensor force_vir = {{0}}, shake_vir = {{0}}, total_vir = {{0}},
+ tmp_vir = {{0}}, pres = {{0}};
int i, m;
rvec mu_tot;
- t_vcm *vcm;
matrix parrinellorahmanMu, M;
gmx_repl_ex_t repl_ex = nullptr;
- gmx_localtop_t *top;
- t_mdebin *mdebin = nullptr;
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
PaddedVector<gmx::RVec> f {};
gmx_global_stat_t gstat;
- gmx_update_t *upd = nullptr;
t_graph *graph = nullptr;
gmx_groups_t *groups;
- gmx_ekindata_t *ekind;
gmx_shellfc_t *shellfc;
gmx_bool bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
gmx_bool bTemp, bPres, bTrotter;
real saved_conserved_quantity = 0;
real last_ekin = 0;
t_extmass MassQ;
- int **trotter_seq;
char sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
/* PME load balancing data for GPU kernels */
- pme_load_balancing_t *pme_loadbal = nullptr;
gmx_bool bPMETune = FALSE;
gmx_bool bPMETunePrinting = FALSE;
oenv, mdrunOptions.continuationOptions.appendFiles);
}
- /* Initial values */
- init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
- &t, &t0, state_global, lam0,
- nrnb, top_global, &upd, deform,
- nfile, fnm, &outf, &mdebin,
- force_vir, shake_vir, total_vir, pres, mu_tot, &bSimAnn, &vcm, wcycle);
+ initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+ Update upd(ir, deform);
+ bool doSimulatedAnnealing = initSimulatedAnnealing(ir, &upd);
+ if (!mdrunOptions.continuationOptions.appendFiles)
+ {
+ pleaseCiteCouplingAlgorithms(fplog, *ir);
+ }
+ init_nrnb(nrnb);
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr,
+ outputProvider, ir, top_global, oenv, wcycle);
+ t_mdebin *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+ top_global, ir, mdoutf_get_fp_dhdl(outf));
/* Energy terms and groups */
snew(enerd, 1);
enerd);
/* Kinetic energy data */
- snew(ekind, 1);
+ std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+ gmx_ekindata_t *ekind = eKinData.get();
init_ekindata(fplog, top_global, &(ir->opts), ekind);
/* Copy the cos acceleration to the groups struct */
ekind->cosacc.cos_accel = ir->cos_accel;
if (DOMAINDECOMP(cr))
{
- top = dd_init_local_top(top_global);
+ dd_init_local_top(*top_global, &top);
stateInstance = compat::make_unique<t_state>();
state = stateInstance.get();
/* Distribute the charge groups over the nodes from the master node */
dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, nullptr, FALSE);
shouldCheckNumberOfBondedInteractions = true;
- update_realloc(upd, state->natoms);
+ upd.setNumAtoms(state->natoms);
}
else
{
/* Copy the pointer to the global state */
state = state_global;
- snew(top, 1);
- mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+ /* Generate and initialize new topology */
+ mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
&graph, mdAtoms, constr, vsite, shellfc);
- update_realloc(upd, state->natoms);
+ upd.setNumAtoms(state->natoms);
}
auto mdatoms = mdAtoms->mdatoms();
* Coulomb. It is not supported with only LJ PME. */
bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) &&
!mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
+
+ pme_load_balancing_t *pme_loadbal = nullptr;
if (bPMETune)
{
pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
{
/* Construct the virtual sites for the initial configuration */
construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, nullptr,
- top->idef.iparams, top->idef.il,
+ top.idef.iparams, top.idef.il,
fr->ePBC, fr->bMolPBC, cr, state->box);
}
}
| (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
bSumEkinhOld = FALSE;
+
+ t_vcm vcm(top_global->groups, *ir);
+ reportComRemovalInfo(fplog, vcm);
+
/* To minimize communication, compute_globals computes the COM velocity
* and the kinetic energy for the velocities without COM motion removed.
* Thus to get the kinetic energy without the COM contribution, we need
cglo_flags_iteration |= CGLO_STOPCM;
cglo_flags_iteration &= ~CGLO_TEMPERATURE;
}
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
constr, &nullSignaller, state->box,
&totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
| (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
}
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
if (ir->eI == eiVVAK)
{
kinetic energy calculation. This minimized excess variables, but
perhaps loses some logic?*/
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
constr, &nullSignaller, state->box,
nullptr, &bSumEkinhOld,
/* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
temperature control */
- trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
+ auto trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
if (MASTER(cr))
{
bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
do_per_step(step, replExParams.exchangeInterval));
- if (bSimAnn)
+ if (doSimulatedAnnealing)
{
- update_annealing_target_temp(ir, t, upd);
+ update_annealing_target_temp(ir, t, &upd);
}
/* Stop Center of Mass motion */
/* Repartition the domain decomposition */
dd_partition_system(fplog, mdlog, step, cr,
bMasterState, nstglobalcomm,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, wcycle,
do_verbose && !bPMETunePrinting);
shouldCheckNumberOfBondedInteractions = true;
- update_realloc(upd, state->natoms);
+ upd.setNumAtoms(state->natoms);
}
}
/* We need the kinetic energy at minus the half step for determining
* the full step kinetic energy and possibly for T-coupling.*/
/* This may not be quite working correctly yet . . . . */
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
constr, &nullSignaller, state->box,
&totalNumberOfBondedInteractions, &bSumEkinhOld,
CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
}
clear_mat(force_vir);
/* Now is the time to relax the shells */
relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
enforcedRotation, step,
- ir, bNS, force_flags, top,
+ ir, bNS, force_flags, &top,
constr, enerd, fcd,
state, f.arrayRefWithPadding(), force_vir, mdatoms,
nrnb, wcycle, graph, groups,
* Check comments in sim_util.c
*/
do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
- step, nrnb, wcycle, top, groups,
+ step, nrnb, wcycle, &top, groups,
state->box, state->x.arrayRefWithPadding(), &state->hist,
f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
state->lambda, graph,
}
update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
- ekind, M, upd, etrtVELOCITY1,
+ ekind, M, &upd, etrtVELOCITY1,
cr, constr);
wallcycle_stop(wcycle, ewcUPDATE);
if (bGStat || do_per_step(step-1, nstglobalcomm))
{
wallcycle_stop(wcycle, ewcUPDATE);
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
constr, &nullSignaller, state->box,
&totalNumberOfBondedInteractions, &bSumEkinhOld,
b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
EkinAveVel because it's needed for the pressure */
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
wallcycle_start(wcycle, ewcUPDATE);
}
/* We need the kinetic energy at minus the half step for determining
* the full step kinetic energy and possibly for T-coupling.*/
/* This may not be quite working correctly yet . . . . */
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
constr, &nullSignaller, state->box,
nullptr, &bSumEkinhOld,
if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
{
gmx_bool bIfRandomize;
- bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, upd, constr);
+ bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, &upd, constr);
/* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
if (constr && bIfRandomize)
{
{
/* velocity half-step update */
update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
- ekind, M, upd, etrtVELOCITY2,
+ ekind, M, &upd, etrtVELOCITY2,
cr, constr);
}
}
update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
- ekind, M, upd, etrtPOSITION, cr, constr);
+ ekind, M, &upd, etrtPOSITION, cr, constr);
wallcycle_stop(wcycle, ewcUPDATE);
constrain_coordinates(step, &dvdl_constr, state,
shake_vir,
- upd, constr,
+ &upd, constr,
bCalcVir, do_log, do_ene);
update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
- cr, nrnb, wcycle, upd, constr, do_log, do_ene);
+ cr, nrnb, wcycle, &upd, constr, do_log, do_ene);
finish_update(ir, mdatoms,
state, graph,
- nrnb, wcycle, upd, constr);
+ nrnb, wcycle, &upd, constr);
if (ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
{
{
/* erase F_EKIN and F_TEMP here? */
/* just compute the kinetic energy at the half step to perform a trotter step */
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
constr, &nullSignaller, lastbox,
nullptr, &bSumEkinhOld,
copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
- ekind, M, upd, etrtPOSITION, cr, constr);
+ ekind, M, &upd, etrtPOSITION, cr, constr);
wallcycle_stop(wcycle, ewcUPDATE);
/* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
* For now, will call without actually constraining, constr=NULL*/
finish_update(ir, mdatoms,
state, graph,
- nrnb, wcycle, upd, nullptr);
+ nrnb, wcycle, &upd, nullptr);
}
if (EI_VV(ir->eI))
{
shift_self(graph, state->box, state->x.rvec_array());
}
construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, state->v.rvec_array(),
- top->idef.iparams, top->idef.il,
+ top.idef.iparams, top.idef.il,
fr->ePBC, fr->bMolPBC, cr, state->box);
if (graph != nullptr)
bool doIntraSimSignal = true;
SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
- compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+ compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
constr, &signaller,
lastbox,
| (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
);
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
}
}
update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
pres, force_vir, shake_vir,
parrinellorahmanMu,
- state, nrnb, upd);
+ state, nrnb, &upd);
/* ################# END UPDATE STEP 2 ################# */
/* #### We now have r(t+dt) and v(t+dt/2) ############# */
if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
{
dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, wcycle, FALSE);
shouldCheckNumberOfBondedInteractions = true;
- update_realloc(upd, state->natoms);
+ upd.setNumAtoms(state->natoms);
}
bFirstStep = FALSE;
walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
destroy_enerdata(enerd);
+
sfree(enerd);
- sfree(top);
+ global_stat_destroy(gstat);
+
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
void gmx::Integrator::do_mimic()
{
t_inputrec *ir = inputrec;
- gmx_mdoutf *outf = nullptr;
int64_t step, step_rel;
double t, lam0[efptNR];
bool isLastStep = false;
int force_flags;
tensor force_vir, shake_vir, total_vir, pres;
rvec mu_tot;
- gmx_localtop_t *top;
- t_mdebin *mdebin = nullptr;
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
PaddedVector<gmx::RVec> f {};
gmx_global_stat_t gstat;
t_graph *graph = nullptr;
gmx_groups_t *groups;
- gmx_ekindata_t *ekind;
gmx_shellfc_t *shellfc;
double cycles;
groups = &top_global->groups;
top_global->intermolecularExclusionGroup = genQmmmIndices(*top_global);
- /* Initial values */
- init_rerun(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
- state_global, lam0, nrnb, top_global,
- nfile, fnm, &outf, &mdebin, wcycle);
+ initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+ init_nrnb(nrnb);
+
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle);
+ t_mdebin *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+ top_global, ir, mdoutf_get_fp_dhdl(outf), true);
/* Energy terms and groups */
snew(enerd, 1);
enerd);
/* Kinetic energy data */
- snew(ekind, 1);
+ std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+ gmx_ekindata_t *ekind = eKinData.get();
init_ekindata(fplog, top_global, &(ir->opts), ekind);
/* Copy the cos acceleration to the groups struct */
ekind->cosacc.cos_accel = ir->cos_accel;
if (DOMAINDECOMP(cr))
{
- top = dd_init_local_top(top_global);
+ dd_init_local_top(*top_global, &top);
stateInstance = compat::make_unique<t_state>();
state = stateInstance.get();
/* Distribute the charge groups over the nodes from the master node */
dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, nullptr, FALSE);
shouldCheckNumberOfBondedInteractions = true;
/* Copy the pointer to the global state */
state = state_global;
- snew(top, 1);
- mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+ mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
&graph, mdAtoms, constr, vsite, shellfc);
}
&totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags);
}
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
if (MASTER(cr))
const bool bMasterState = true;
dd_partition_system(fplog, mdlog, step, cr,
bMasterState, nstglobalcomm,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, wcycle,
mdrunOptions.verbose);
/* Now is the time to relax the shells */
relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
enforcedRotation, step,
- ir, bNS, force_flags, top,
+ ir, bNS, force_flags, &top,
constr, enerd, fcd,
state, f.arrayRefWithPadding(), force_vir, mdatoms,
nrnb, wcycle, graph, groups,
Awh *awh = nullptr;
gmx_edsam *ed = nullptr;
do_force(fplog, cr, ms, ir, awh, enforcedRotation,
- step, nrnb, wcycle, top, groups,
+ step, nrnb, wcycle, &top, groups,
state->box, state->x.arrayRefWithPadding(), &state->hist,
f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
state->lambda, graph,
shift_self(graph, state->box, as_rvec_array(state->x.data()));
}
construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
- top->idef.iparams, top->idef.il,
+ top.idef.iparams, top.idef.il,
fr->ePBC, fr->bMolPBC, cr, state->box);
if (graph != nullptr)
| (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
);
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
}
destroy_enerdata(enerd);
sfree(enerd);
- sfree(top);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
const char *title,
const t_commrec *cr,
const gmx_multisim_t *ms,
- gmx::IMDOutputProvider *outputProvider,
t_inputrec *ir,
const MdrunOptions &mdrunOptions,
t_state *state_global, gmx_mtop_t *top_global,
- em_state_t *ems, gmx_localtop_t **top,
- t_nrnb *nrnb, rvec mu_tot,
- t_forcerec *fr, gmx_enerdata_t **enerd,
+ em_state_t *ems, gmx_localtop_t *top,
+ t_nrnb *nrnb,
+ t_forcerec *fr,
t_graph **graph, gmx::MDAtoms *mdAtoms, gmx_global_stat_t *gstat,
gmx_vsite_t *vsite, gmx::Constraints *constr, gmx_shellfc_t **shellfc,
- int nfile, const t_filenm fnm[],
- gmx_mdoutf_t *outf, t_mdebin **mdebin,
- gmx_wallcycle_t wcycle)
+ int nfile, const t_filenm fnm[])
{
real dvdl_constr;
fprintf(fplog, "Initiating %s\n", title);
}
- if (MASTER(cr))
- {
- state_global->ngtc = 0;
-
- /* Initialize lambda variables */
- initialize_lambdas(fplog, ir, &(state_global->fep_state), state_global->lambda, nullptr);
- }
+ state_global->ngtc = 0;
+ initialize_lambdas(fplog, *ir, MASTER(cr), &(state_global->fep_state), state_global->lambda, nullptr);
init_nrnb(nrnb);
auto mdatoms = mdAtoms->mdatoms();
if (DOMAINDECOMP(cr))
{
- *top = dd_init_local_top(top_global);
+ top->useInDomainDecomp_ = true;
+ dd_init_local_top(*top_global, top);
dd_init_local_state(cr->dd, state_global, &ems->s);
/* Distribute the charge groups over the nodes from the master node */
dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
- state_global, top_global, ir,
- &ems->s, &ems->f, mdAtoms, *top,
+ state_global, *top_global, ir,
+ &ems->s, &ems->f, mdAtoms, top,
fr, vsite, constr,
nrnb, nullptr, FALSE);
dd_store_state(cr->dd, &ems->s);
state_change_natoms(&ems->s, ems->s.natoms);
ems->f.resizeWithPadding(ems->s.natoms);
- snew(*top, 1);
- mdAlgorithmsSetupAtomData(cr, ir, top_global, *top, fr,
+ mdAlgorithmsSetupAtomData(cr, ir, *top_global, top, fr,
graph, mdAtoms,
constr, vsite, shellfc ? *shellfc : nullptr);
if (vsite)
{
- set_vsite_top(vsite, *top, mdatoms);
+ set_vsite_top(vsite, top, mdatoms);
}
}
*gstat = nullptr;
}
- *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, nullptr, wcycle);
-
- snew(*enerd, 1);
- init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
- *enerd);
-
- if (mdebin != nullptr)
- {
- /* Init bin for energy stuff */
- *mdebin = init_mdebin(mdoutf_get_fp_ene(*outf), top_global, ir, nullptr);
- }
-
- clear_rvec(mu_tot);
calc_shifts(ems->s.box, fr->shift_vec);
}
{
/* Repartition the domain decomposition */
dd_partition_system(fplog, mdlog, step, cr, FALSE, 1,
- nullptr, top_global, ir,
+ nullptr, *top_global, ir,
&ems->s, &ems->f,
mdAtoms, top, fr, vsite, constr,
nrnb, wcycle, FALSE);
void
Integrator::do_cg()
{
- const char *CG = "Polak-Ribiere Conjugate Gradients";
+ const char *CG = "Polak-Ribiere Conjugate Gradients";
- gmx_localtop_t *top;
- gmx_enerdata_t *enerd;
- gmx_global_stat_t gstat;
- t_graph *graph;
- double tmp, minstep;
- real stepsize;
- real a, b, c, beta = 0.0;
- real epot_repl = 0;
- real pnorm;
- t_mdebin *mdebin;
- gmx_bool converged, foundlower;
- rvec mu_tot;
- gmx_bool do_log = FALSE, do_ene = FALSE, do_x, do_f;
- tensor vir, pres;
- int number_steps, neval = 0, nstcg = inputrec->nstcgsteep;
- gmx_mdoutf_t outf;
- int m, step, nminstep;
- auto mdatoms = mdAtoms->mdatoms();
+ gmx_localtop_t top;
+ gmx_enerdata_t *enerd;
+ gmx_global_stat_t gstat;
+ t_graph *graph;
+ double tmp, minstep;
+ real stepsize;
+ real a, b, c, beta = 0.0;
+ real epot_repl = 0;
+ real pnorm;
+ gmx_bool converged, foundlower;
+ rvec mu_tot = {0};
+ gmx_bool do_log = FALSE, do_ene = FALSE, do_x, do_f;
+ tensor vir, pres;
+ int number_steps, neval = 0, nstcg = inputrec->nstcgsteep;
+ int m, step, nminstep;
+ auto mdatoms = mdAtoms->mdatoms();
GMX_LOG(mdlog.info).asParagraph().
appendText("Note that activating conjugate gradient energy minimization via the "
em_state_t *s_c = &s3;
/* Init em and store the local state in s_min */
- init_em(fplog, mdlog, CG, cr, ms, outputProvider, inputrec, mdrunOptions,
+ init_em(fplog, mdlog, CG, cr, ms, inputrec, mdrunOptions,
state_global, top_global, s_min, &top,
- nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+ nrnb, fr, &graph, mdAtoms, &gstat,
vsite, constr, nullptr,
- nfile, fnm, &outf, &mdebin, wcycle);
+ nfile, fnm);
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+ snew(enerd, 1);
+ init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+ t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
/* Print to log file */
print_em_start(fplog, cr, walltime_accounting, wcycle, CG);
EnergyEvaluator energyEvaluator {
fplog, mdlog, cr, ms,
- top_global, top,
+ top_global, &top,
inputrec, nrnb, wcycle, gstat,
vsite, constr, fcd, graph,
mdAtoms, fr, ppForceWorkload, enerd
if (DOMAINDECOMP(cr) && s_min->s.ddp_count < cr->dd->ddp_count)
{
em_dd_partition_system(fplog, mdlog, step, cr, top_global, inputrec,
- s_min, top, mdAtoms, fr, vsite, constr,
+ s_min, &top, mdAtoms, fr, vsite, constr,
nrnb, wcycle);
}
{
/* Reload the old state */
em_dd_partition_system(fplog, mdlog, -1, cr, top_global, inputrec,
- s_min, top, mdAtoms, fr, vsite, constr,
+ s_min, &top, mdAtoms, fr, vsite, constr,
nrnb, wcycle);
}
{
static const char *LBFGS = "Low-Memory BFGS Minimizer";
em_state_t ems;
- gmx_localtop_t *top;
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
gmx_global_stat_t gstat;
t_graph *graph;
real a, b, c, maxdelta, delta;
real diag, Epot0;
real dgdx, dgdg, sq, yr, beta;
- t_mdebin *mdebin;
gmx_bool converged;
- rvec mu_tot;
+ rvec mu_tot = {0};
gmx_bool do_log, do_ene, do_x, do_f, foundlower, *frozen;
tensor vir, pres;
int start, end, number_steps;
- gmx_mdoutf_t outf;
int i, k, m, n, gf, step;
int mdof_flags;
auto mdatoms = mdAtoms->mdatoms();
neval = 0;
/* Init em */
- init_em(fplog, mdlog, LBFGS, cr, ms, outputProvider, inputrec, mdrunOptions,
+ init_em(fplog, mdlog, LBFGS, cr, ms, inputrec, mdrunOptions,
state_global, top_global, &ems, &top,
- nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+ nrnb, fr, &graph, mdAtoms, &gstat,
vsite, constr, nullptr,
- nfile, fnm, &outf, &mdebin, wcycle);
+ nfile, fnm);
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+ snew(enerd, 1);
+ init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+ t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
start = 0;
end = mdatoms->homenr;
if (vsite)
{
construct_vsites(vsite, state_global->x.rvec_array(), 1, nullptr,
- top->idef.iparams, top->idef.il,
+ top.idef.iparams, top.idef.il,
fr->ePBC, fr->bMolPBC, cr, state_global->box);
}
neval++;
EnergyEvaluator energyEvaluator {
fplog, mdlog, cr, ms,
- top_global, top,
+ top_global, &top,
inputrec, nrnb, wcycle, gstat,
vsite, constr, fcd, graph,
mdAtoms, fr, ppForceWorkload, enerd
void
Integrator::do_steep()
{
- const char *SD = "Steepest Descents";
- gmx_localtop_t *top;
+ const char *SD = "Steepest Descents";
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
gmx_global_stat_t gstat;
t_graph *graph;
real stepsize;
real ustep;
- gmx_mdoutf_t outf;
- t_mdebin *mdebin;
gmx_bool bDone, bAbort, do_x, do_f;
tensor vir, pres;
- rvec mu_tot;
+ rvec mu_tot = {0};
int nsteps;
int count = 0;
int steps_accepted = 0;
em_state_t *s_try = &s1;
/* Init em and store the local state in s_try */
- init_em(fplog, mdlog, SD, cr, ms, outputProvider, inputrec, mdrunOptions,
+ init_em(fplog, mdlog, SD, cr, ms, inputrec, mdrunOptions,
state_global, top_global, s_try, &top,
- nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+ nrnb, fr, &graph, mdAtoms, &gstat,
vsite, constr, nullptr,
- nfile, fnm, &outf, &mdebin, wcycle);
+ nfile, fnm);
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+ snew(enerd, 1);
+ init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+ t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
/* Print to log file */
print_em_start(fplog, cr, walltime_accounting, wcycle, SD);
}
EnergyEvaluator energyEvaluator {
fplog, mdlog, cr, ms,
- top_global, top,
+ top_global, &top,
inputrec, nrnb, wcycle, gstat,
vsite, constr, fcd, graph,
mdAtoms, fr, ppForceWorkload, enerd
{
/* Reload the old state */
em_dd_partition_system(fplog, mdlog, count, cr, top_global, inputrec,
- s_min, top, mdAtoms, fr, vsite, constr,
+ s_min, &top, mdAtoms, fr, vsite, constr,
nrnb, wcycle);
}
}
Integrator::do_nm()
{
const char *NM = "Normal Mode Analysis";
- gmx_mdoutf_t outf;
int nnodes, node;
- gmx_localtop_t *top;
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
gmx_global_stat_t gstat;
t_graph *graph;
tensor vir, pres;
- rvec mu_tot;
+ rvec mu_tot = {0};
rvec *dfdx;
gmx_bool bSparse; /* use sparse matrix storage format */
size_t sz;
em_state_t state_work {};
/* Init em and store the local state in state_minimum */
- init_em(fplog, mdlog, NM, cr, ms, outputProvider, inputrec, mdrunOptions,
+ init_em(fplog, mdlog, NM, cr, ms, inputrec, mdrunOptions,
state_global, top_global, &state_work, &top,
- nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+ nrnb, fr, &graph, mdAtoms, &gstat,
vsite, constr, &shellfc,
- nfile, fnm, &outf, nullptr, wcycle);
+ nfile, fnm);
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+ snew(enerd, 1);
+ init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
std::vector<int> atom_index = get_atom_index(top_global);
std::vector<gmx::RVec> fneg(atom_index.size(), {0, 0, 0});
cr->nnodes = 1;
EnergyEvaluator energyEvaluator {
fplog, mdlog, cr, ms,
- top_global, top,
+ top_global, &top,
inputrec, nrnb, wcycle, gstat,
vsite, constr, fcd, graph,
mdAtoms, fr, ppForceWorkload, enerd
inputrec,
bNS,
force_flags,
- top,
+ &top,
constr,
enerd,
fcd,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
// t_inputrec is being replaced by IMdpOptionsProvider, so this
// will go away eventually.
t_inputrec *ir = inputrec;
- gmx_mdoutf *outf = nullptr;
int64_t step, step_rel;
double t, lam0[efptNR];
bool isLastStep = false;
t_trxstatus *status;
rvec mu_tot;
t_trxframe rerun_fr;
- gmx_localtop_t *top;
- t_mdebin *mdebin = nullptr;
+ gmx_localtop_t top;
gmx_enerdata_t *enerd;
PaddedVector<gmx::RVec> f {};
gmx_global_stat_t gstat;
t_graph *graph = nullptr;
gmx_groups_t *groups;
- gmx_ekindata_t *ekind;
gmx_shellfc_t *shellfc;
double cycles;
top_global->intermolecularExclusionGroup = genQmmmIndices(*top_global);
}
- /* Initial values */
- init_rerun(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
- state_global, lam0, nrnb, top_global,
- nfile, fnm, &outf, &mdebin, wcycle);
+ initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+ init_nrnb(nrnb);
+
+ gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle);
+ t_mdebin *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+ top_global, ir, mdoutf_get_fp_dhdl(outf), true);
/* Energy terms and groups */
snew(enerd, 1);
enerd);
/* Kinetic energy data */
- snew(ekind, 1);
+ std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+ gmx_ekindata_t *ekind = eKinData.get();
init_ekindata(fplog, top_global, &(ir->opts), ekind);
/* Copy the cos acceleration to the groups struct */
ekind->cosacc.cos_accel = ir->cos_accel;
if (DOMAINDECOMP(cr))
{
- top = dd_init_local_top(top_global);
+ dd_init_local_top(*top_global, &top);
stateInstance = compat::make_unique<t_state>();
state = stateInstance.get();
/* Distribute the charge groups over the nodes from the master node */
dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, nullptr, FALSE);
shouldCheckNumberOfBondedInteractions = true;
/* Copy the pointer to the global state */
state = state_global;
- snew(top, 1);
- mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+ mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
&graph, mdAtoms, constr, vsite, shellfc);
}
&totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags);
}
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
if (MASTER(cr))
gmx_fatal(FARGS, "Vsite recalculation with -rerun is not implemented with domain decomposition, "
"use a single rank");
}
- prepareRerunState(rerun_fr, state_global, constructVsites, vsite, top->idef, ir->delta_t, *fr, graph);
+ prepareRerunState(rerun_fr, state_global, constructVsites, vsite, top.idef, ir->delta_t, *fr, graph);
}
isLastStep = isLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
const bool bMasterState = true;
dd_partition_system(fplog, mdlog, step, cr,
bMasterState, nstglobalcomm,
- state_global, top_global, ir,
- state, &f, mdAtoms, top, fr,
+ state_global, *top_global, ir,
+ state, &f, mdAtoms, &top, fr,
vsite, constr,
nrnb, wcycle,
mdrunOptions.verbose);
/* Now is the time to relax the shells */
relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
enforcedRotation, step,
- ir, bNS, force_flags, top,
+ ir, bNS, force_flags, &top,
constr, enerd, fcd,
state, f.arrayRefWithPadding(), force_vir, mdatoms,
nrnb, wcycle, graph, groups,
Awh *awh = nullptr;
gmx_edsam *ed = nullptr;
do_force(fplog, cr, ms, ir, awh, enforcedRotation,
- step, nrnb, wcycle, top, groups,
+ step, nrnb, wcycle, &top, groups,
state->box, state->x.arrayRefWithPadding(), &state->hist,
f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
state->lambda, graph,
shift_self(graph, state->box, as_rvec_array(state->x.data()));
}
construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
- top->idef.iparams, top->idef.il,
+ top.idef.iparams, top.idef.il,
fr->ePBC, fr->bMolPBC, cr, state->box);
if (graph != nullptr)
| (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
);
checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
- top_global, top, state,
+ top_global, &top, state,
&shouldCheckNumberOfBondedInteractions);
}
destroy_enerdata(enerd);
sfree(enerd);
- sfree(top);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
gmx_fatal(FARGS, "The .mdp file specified an energy mininization or normal mode algorithm, and these are not compatible with mdrun -rerun");
}
- if (can_use_allvsall(inputrec, TRUE, cr, fplog) && DOMAINDECOMP(cr))
- {
- gmx_fatal(FARGS, "All-vs-all loops do not work with domain decomposition, use a single MPI rank");
- }
-
if (!(EEL_PME(inputrec->coulombtype) || EVDW_PME(inputrec->vdwtype)))
{
if (domdecOptions.numPmeRanks > 0)
pmedata,
EI_DYNAMICS(inputrec->eI) && !isMultiSim(ms));
+ // clean up cycle counter
+ wallcycle_destroy(wcycle);
+
// Free PME data
if (pmedata)
{
wait for that. */
if (PAR(cr) && MASTER(cr))
{
- done_commrec(cr);
tMPI_Finalize();
}
+ //TODO free commrec in MPI simulations
+ done_commrec(cr);
#endif
-
return rc;
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
void
Integrator::do_tpi()
{
- gmx_localtop_t *top;
+ gmx_localtop_t top;
gmx_groups_t *groups;
gmx_enerdata_t *enerd;
PaddedVector<gmx::RVec> f {};
nnodes = cr->nnodes;
- top = gmx_mtop_generate_local_top(top_global, inputrec->efep != efepNO);
+ gmx_mtop_generate_local_top(*top_global, &top, inputrec->efep != efepNO);
groups = &top_global->groups;
print_start(fplog, cr, walltime_accounting, "Test Particle Insertion");
/* The last charge group is the group to be inserted */
- cg_tp = top->cgs.nr - 1;
- a_tp0 = top->cgs.index[cg_tp];
- a_tp1 = top->cgs.index[cg_tp+1];
+ cg_tp = top.cgs.nr - 1;
+ a_tp0 = top.cgs.index[cg_tp];
+ a_tp1 = top.cgs.index[cg_tp+1];
if (debug)
{
fprintf(debug, "TPI cg %d, atoms %d-%d\n", cg_tp, a_tp0, a_tp1);
}
bRFExcl = (bCharge && EEL_RF(fr->ic->eeltype));
- calc_cgcm(fplog, cg_tp, cg_tp+1, &(top->cgs), state_global->x.rvec_array(), fr->cg_cm);
+ calc_cgcm(fplog, cg_tp, cg_tp+1, &(top.cgs), state_global->x.rvec_array(), fr->cg_cm);
if (bCavity)
{
if (norm(fr->cg_cm[cg_tp]) > 0.5*inputrec->rlist && fplog)
clear_mat(pres);
/* Set the charge group center of mass of the test particle */
- copy_rvec(x_init, fr->cg_cm[top->cgs.nr-1]);
+ copy_rvec(x_init, fr->cg_cm[top.cgs.nr-1]);
/* Calc energy (no forces) on new positions.
* Since we only need the intermolecular energy
std::fenv_t floatingPointEnvironment;
std::feholdexcept(&floatingPointEnvironment);
do_force(fplog, cr, ms, inputrec, nullptr, nullptr,
- step, nrnb, wcycle, top, &top_global->groups,
+ step, nrnb, wcycle, &top, &top_global->groups,
state_global->box, state_global->x.arrayRefWithPadding(), &state_global->hist,
f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
state_global->lambda,
--- /dev/null
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2018, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+if (BUILD_TESTING)
+ add_subdirectory(tests)
+endif()
--- /dev/null
+This directory contains a stripped-down and modified-for-GROMACS version
+of a reference implementation of the LEWG P0009 proposal, revision 8:
+"mdspan: A Non-Owning Multidimensional Array Reference"
+
+The full version is available from
+https://github.com/ORNL/cpp-proposals-pub/tree/master/P0009
+SHA1 of the commit used is f433984ba897298069b510aa1311145040dd860c.
+
+This work orginated from "Kokkos" and is distributed under the BSD license as
+stated in COPYING.
+
+The following modifications were carried out:
+* reformatted code with uncrustify
+* added GROMACS header to all files
+* added doxygen comments to all files
+* temporarily removed constexpr from functions, so they compile with C++11
+* put all headers from bits/ into this directory
+* use minimial includes in all header files instead of just including mdspan
+* move tests into a subdirectory tests and rename test_foo.cpp to foo.cpp
+* renamed tests and test fixture class to match GROMACS conventions
+* changed variable signature to match proposal P0009r8 where reference
+ implementation differed, (const to const & in constructors of basic_mdspan)
+* Updated the mdspan test to a typed test
+* added test for basic accessor policy
+* added test for mdspan declaration
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares accessor policies for mdspan.
+ *
+ * Implement ways how to convert a linear offset from a pointer to memory access.
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \libinternal
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_ACCESSOR_POLICY_H
+#define MDSPAN_ACCESSOR_POLICY_H
+
+#include <cstddef>
+
+namespace gmx
+{
+
+/*! \libinternal \brief The most basic memory access model for mdspan.
+ * \tparam ElementType the type held in memory to be accessed
+ */
+template<class ElementType>
+class accessor_basic
+{
+ public:
+ //! Type of element to be accessed.
+ using element_type = ElementType;
+ //! Pointer to element to be accessed.
+ using pointer = ElementType*;
+ //! How to determine a memory offset, provided by self accessor.
+ using offset_policy = accessor_basic;
+ //! Type of references.
+ using reference = ElementType&;
+
+ /*! \brief Shift a pointer by an offset.
+ * \param[in] p Pointer to reference memory location.
+ * \param[in] i offset from memory location.
+ * \returns pointer to offset memory location.
+ */
+ constexpr typename offset_policy::pointer
+ offset( pointer p, ptrdiff_t i ) const noexcept
+ { return typename offset_policy::pointer(p+i); }
+
+ /*! \brief Access element from an offset to given pointer.
+ * \param[in] p Pointer to reference memory location.
+ * \param[in] i offset from memory location.
+ * \returns reference to element stored at offset from memory location.
+ */
+ constexpr reference access( pointer p, ptrdiff_t i ) const noexcept
+ { return p[i]; }
+
+ /*! \brief Decay pointer to pointer to ElementType.
+ * NOTE This function does nothing, because it is the trivial implementation of an accessor.
+ * \returns input pointer as pointer to ElementType
+ */
+ constexpr ElementType* decay( pointer p ) const noexcept
+ { return p; }
+};
+
+} // namespace gmx
+#endif /* end of include guard: MDSPAN_ACCESSOR_POLICY_H */
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::extents for mdspan.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Ronan Keryell <ronan.keryell@xilinx.com>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_EXTENTS_H
+#define MDSPAN_EXTENTS_H
+
+#include <cstddef>
+
+#include <array>
+
+namespace gmx
+{
+
+/*! \brief Define constant that signals dynamic extent.
+ */
+enum : std::ptrdiff_t {
+ dynamic_extent = -1
+};
+
+template< std::ptrdiff_t ... StaticExtents >
+class extents;
+
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+bool operator==(const extents<LHS...> &lhs,
+ const extents<RHS...> &rhs) noexcept;
+
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+constexpr bool operator!=(const extents<LHS...> &lhs,
+ const extents<RHS...> &rhs) noexcept;
+
+namespace detail
+{
+
+template< int R, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse;
+
+/*! \libinternal \brief Enable querying extent of specific rank by splitting
+ * a static extents off the variadic template arguments.
+ *
+ */
+template< int R, std::ptrdiff_t E0, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse<R, E0, StaticExtents...> {
+
+ //! The extent analysis of the next lower rank.
+ using next_extents_analyse = extents_analyse<R-1, StaticExtents...>;
+
+ /*! \brief Accumulate the total rank from all extents.
+ * \returns incremented rank of the next extent
+ */
+ static constexpr std::size_t rank() noexcept { return next_extents_analyse::rank()+1; }
+ /*! \brief Accumulate the dynamic rank from all extents.
+ * This extent is static, so hand down query to the next extent analysis.
+ * \returns the dynamic rank of the next extent analysis.
+ */
+ static constexpr std::size_t rank_dynamic() noexcept { return next_extents_analyse::rank_dynamic(); }
+
+ //! Store analysis of the next extent of next lower rank.
+ next_extents_analyse next;
+
+ //! Trivial constructor.
+ extents_analyse() : next() {}
+
+ /*! \brief Construction from dynamic extents hands the extents down
+ * to the next extents analysis of lower rank.
+ * \param[in] de dynamic extents
+ */
+ template<class ... DynamicExtents>
+ extents_analyse(DynamicExtents... de) : next(de ...) {}
+
+ /*! \brief Construct from an array of dynamic extentes and rank.
+ * Hand down the dynamic rank parameters to the next extents analysis rank
+ * \param[in] de dynamic extents
+ * \param[in] r rank to read from the dynamic extent
+ */
+ template<std::size_t Rank>
+ extents_analyse(const std::array<std::ptrdiff_t, Rank> &de, const std::size_t r) : next(de, r) {}
+
+ //! Copy constructor.
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents_analyse(extents_analyse<R, OtherStaticExtents...> rhs) : next(rhs.next) {}
+
+ //! Assignment operator.
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents_analyse &operator= (extents_analyse<R, OtherStaticExtents...> rhs)
+ {
+ next = rhs.next;
+ return *this;
+ }
+
+ /*! \brief Report extent of dimension r.
+ * \param[in] r the dimension to query
+ * \returns the extent in dimension r.
+ */
+ constexpr std::ptrdiff_t extent(const std::size_t r) const noexcept
+ {
+ // TODO use early return and if instead of ternary operator
+ // after bumping requirements to C++14
+ return (r == R) ? E0 : next.extent(r);
+ }
+ /*! \brief Report the static extent of dimension r.
+ * \param[in] r the dimension to query
+ * \returns the static extent in dimension r.
+ */
+ static constexpr std::ptrdiff_t static_extent(const std::size_t r) noexcept
+ {
+ // TODO use early return and if instead of ternary operator
+ // after bumping requirements to C++14
+ return (r == R) ? E0 : next_extents_analyse::static_extent(r);
+ }
+};
+
+/*! \libinternal \brief Enable querying extent of specific rank by splitting
+ * a static extent off the variadic template arguments.
+ */
+template< int R, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse<R, dynamic_extent, StaticExtents...> {
+ //! The extent analysis of the next lower rank.
+ using next_extents_analyse = extents_analyse<R-1, StaticExtents...>;
+ /*! \brief Accumulate the total rank from all extents.
+ * \returns incremented rank of the next extent
+ */
+ static constexpr std::size_t rank() noexcept { return next_extents_analyse::rank()+1; }
+ /*! \brief Accumulate the dynamic rank from all extents.
+ * \returns the dynamic rank of the next extent analysis.
+ */
+ static constexpr std::size_t rank_dynamic() noexcept { return next_extents_analyse::rank_dynamic()+1; }
+
+ //! Store analysis of the next extent of next lower rank.
+ next_extents_analyse next;
+ //! The dynamic extent of this rank
+ std::ptrdiff_t this_extent;
+
+ //! Trivial constructor.
+ extents_analyse() : next(), this_extent(0) {}
+
+ /*! \brief Construction from dynamic extents hands the extents down
+ * to the next extents analysis of lower rank.
+ * \param[in] E the dynamic extent of this rank.
+ * \param[in] de dynamic extents
+ */
+ template<class ... DynamicExtents>
+ extents_analyse(std::ptrdiff_t E, DynamicExtents... de) : next(de ...), this_extent(E) {}
+
+ /*! \brief Construct from an array of dynamic extentes and rank.
+ * Hand down the dynamic rank parameters to the next extents analysis rank
+ * \param[in] de dynamic extents
+ * \param[in] r rank to read from the dynamic extent
+ */
+ template<std::size_t Rank>
+ extents_analyse(const std::array<std::ptrdiff_t, Rank> &de, const std::size_t r) : next(de, r+1), this_extent(de[r]) {}
+
+ //! Copy constructor.
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents_analyse(extents_analyse<R, OtherStaticExtents...> rhs) : next(rhs.next), this_extent(rhs.extent(R)) {}
+
+ //! Assignment operator.
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents_analyse &operator= (extents_analyse<R, OtherStaticExtents...> rhs)
+ {
+ next = rhs.next;
+ this_extent = rhs.extent(R);
+ return *this;
+ }
+
+ /*! \brief Report extent of dimension r.
+ * \param[in] r the dimension to query
+ * \returns the extent in dimension r.
+ */
+ constexpr std::ptrdiff_t extent(const std::size_t r) const noexcept
+ {
+ return (r == R) ? this_extent : next.extent(r); // TODO use early return and if instead of ternary operator after bumping requirements to C++14
+ }
+ /*! \brief Report the static extent of dimension r.
+ * \param[in] r the dimension to query
+ * \returns the static extent in dimension r.
+ */
+ static constexpr std::ptrdiff_t static_extent(const std::size_t r) noexcept
+ {
+ return (r == R) ? dynamic_extent : next_extents_analyse::static_extent(r); // TODO use early return and if instead of ternary operator after bumping requirements to C++14
+ }
+};
+
+/*! \libinternal \brief Specialisation for rank 0 extents analysis.
+ * Ends recursive rank analysis.
+ */
+template<>
+struct extents_analyse<0> {
+ /*! \brief Rank of extent of rank 0.
+ * \returns 0
+ */
+ static constexpr std::size_t rank() noexcept { return 0; }
+ /*! \brief Dynamic rank of extent of rank 0.
+ * \returns 0
+ */
+ static constexpr std::size_t rank_dynamic() noexcept { return 0; }
+
+ //! Trivial constructor.
+ extents_analyse() {}
+
+ //! Construct from array and rank, doing nothing.
+ template<std::size_t Rank>
+ extents_analyse(const std::array<std::ptrdiff_t, Rank> & /*de*/, const std::size_t /*r*/) {}
+
+ //extents_analyse & operator=(extents_analyse) = default;
+
+ /*! \brief Extent of rank 0 is 1, ensuring that product of extents yields required size and not zero.
+ * NOTE changed from ORNL reference implementation in making this static constexpr instead of constexpr .. const
+ */
+ static constexpr std::ptrdiff_t extent(const std::size_t /*r*/) noexcept
+ {
+ return 1;
+ }
+
+ //! Static extent of rank 0 is 1, ensuring that product of extents yields required size and not zero.
+ static constexpr std::ptrdiff_t static_extent(const std::size_t /*r*/) noexcept
+ {
+ return 1;
+ }
+
+};
+} // namespace detail
+
+
+/*! \libinternal \brief Multidimensional extents with static and dynamic dimensions.
+ *
+ * Describes a multidimensional index space of rank R.
+ * This is equivalent to the Cartesian product space of integer intervals
+ * [0, N_0) x [0, N_1) x ... x [0,N_{R-1} )
+ *
+ * Confer to P0009r8 of the Library Evolution Working Group and mdspan.extents
+ *
+ * \tparam StaticExtents rank number of extents, where the dynamic_extent
+ * constant for static extent is used to signal a dynamic extent.
+ */
+template< std::ptrdiff_t ... StaticExtents >
+class extents
+{
+ private:
+ using extents_analyse_t = detail::extents_analyse<sizeof ... (StaticExtents), StaticExtents...>;
+
+ public:
+ //! Type used to index elements.
+ using index_type = std::ptrdiff_t;
+ //! Trivial constructor
+ constexpr extents() noexcept {}
+ //! Move constructor
+ constexpr extents( extents && ) noexcept = default;
+ //! Copy constructor.
+ constexpr extents( const extents & ) noexcept = default;
+ /*! \brief Construct with dynamic extents.
+ *
+ * Allows for extents(u,v,w..) syntax when setting dynamic extents
+ *
+ * \tparam IndexType type of index
+ * \param[in] dn first dynamic index
+ * \param[in] DynamicExtents parameter pack
+ */
+ template< class ... IndexType >
+ constexpr extents( std::ptrdiff_t dn,
+ IndexType ... DynamicExtents ) noexcept
+ : impl( dn, DynamicExtents ... )
+ { static_assert( 1+sizeof ... (DynamicExtents) == rank_dynamic(), "" ); }
+
+ /*! \brief Construct from array of dynamic extents.
+ *
+ * Allows for extents({{u,v,w..}}) syntax when setting dynamic extents
+ *
+ * \param[in] dynamic_extents array of dynamic rank size containing extents
+ */
+ constexpr extents( const std::array<std::ptrdiff_t, extents_analyse_t::rank_dynamic()> dynamic_extents) noexcept
+ : impl(dynamic_extents, 0) {}
+
+ //! Copy constructor
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents( const extents<OtherStaticExtents...> &other )
+ : impl( other.impl ) {}
+
+ //! Default move assignment
+ extents &operator= ( extents && ) noexcept = default;
+ //! Default copy assignment
+ extents &operator= ( const extents & ) noexcept = default;
+ //! Copy assignment
+ template<std::ptrdiff_t... OtherStaticExtents>
+ extents &operator= ( const extents<OtherStaticExtents...> &other )
+ { impl = other.impl; return *this; }
+ //! Default destructor
+ ~extents() = default;
+
+ // [mdspan.extents.obs]
+ /*! \brief The rank of the extent.
+ * \returns the rank all extents together
+ */
+ static constexpr std::size_t rank() noexcept
+ { return sizeof ... (StaticExtents); }
+ /*! \brief The rank of the dynamic extents.
+ * \returns Only the dynamic extents.
+ */
+ static constexpr std::size_t rank_dynamic() noexcept
+ { return extents_analyse_t::rank_dynamic(); }
+ /*! \brief The rank of the static extents.
+ * \returns Only the static extents.
+ */
+ static constexpr index_type static_extent(std::size_t k) noexcept
+ { return extents_analyse_t::static_extent(rank()-k); }
+ /*! \brief The extent along a specific dimension.
+ * \param[in] k the dimension
+ * \returns the extent along that dimension
+ */
+ constexpr index_type extent(std::size_t k) const noexcept
+ { return impl.extent(rank()-k); }
+ private:
+ //! For copy assignment, extents are friends of extents.
+ template< std::ptrdiff_t... > friend class extents;
+ //! The implementation class.
+ extents_analyse_t impl;
+};
+
+
+/*! \brief Comparison operator.
+ * \returns true if extents are equal
+ * TODO add constexpr when C++14 is required
+ */
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+bool operator==(const extents<LHS...> &lhs,
+ const extents<RHS...> &rhs) noexcept
+{
+ bool equal = lhs.rank() == rhs.rank();
+ for (std::size_t r = 0; r < lhs.rank(); r++)
+ {
+ equal = equal && ( lhs.extent(r) == rhs.extent(r) );
+ }
+ return equal;
+}
+
+/*! \brief Check for non-equality.
+ * \returns true if extents are unequal
+ */
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+constexpr bool operator!=(const extents<LHS...> &lhs,
+ const extents<RHS...> &rhs) noexcept
+{
+ return !(lhs == rhs);
+}
+
+} // namespace gmx
+#endif /* end of include guard: MDSPAN_EXTENTS_H */
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::layout_right for mdspan.
+ *
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_LAYOUTS_H
+#define MDSPAN_LAYOUTS_H
+#include <cstddef>
+
+#include <type_traits>
+
+namespace gmx
+{
+
+/*! \libinternal \brief Right-aligned array layout indexer.
+ * Carries the mapping class performing the translation from multidimensional
+ * index to one-dimensional number.
+ */
+class layout_right
+{
+
+ public:
+ /*! \libinternal \brief Mapping from multidimensional indices within extents to 1D index.
+ * \tparam Extents the extents of the multidimensional integers for the mapping.
+ */
+ template<class Extents>
+ class mapping
+ {
+ private:
+ //! The extents.
+ Extents m_extents;
+
+ public:
+ //! exposing the type of indices
+ using index_type = ptrdiff_t;
+ //! exposing the type of the extents
+ using extents_type = Extents;
+ //! Default constructor.
+ constexpr mapping() noexcept = default;
+ //! Default move constructor.
+ constexpr mapping( mapping && ) noexcept = default;
+ //! Default copy constructor.
+ constexpr mapping( const mapping & ) noexcept = default;
+ //! Default move assignment
+ mapping &operator= ( mapping && ) noexcept = default;
+ //! Default copy assignment
+ mapping &operator= ( const mapping & ) noexcept = default;
+ /*! \brief Construct mapping, setting extents
+ * \param[in] ext the extents
+ */
+ constexpr mapping( const Extents &ext ) noexcept
+ : m_extents( ext ) {}
+ /*! \brief Return the extents.
+ * \returns extents
+ */
+ constexpr const Extents &extents() const noexcept { return m_extents; }
+
+ private:
+ /* \brief End recursion helper function for static offset calculation.
+ * \param[in] sum The accumulated offset over all dimensions
+ * \returns The offset.
+ */
+ static constexpr index_type
+ offset( const size_t /*r*/, const ptrdiff_t sum)
+ { return sum; }
+
+ /* \brief Statically calculate offset from index and extent.
+ * For a multidimensional index (i0,i1,..,in), in a right memory
+ * layout, 'i0' denotes the slowest moving dimension and
+ * 'in' the fastest moving dimension.
+ * The overall offset within extents N = (N0,..,Nn) is then
+ * offest = i0 * N1 * .. * Nn + i1 * N2 * .. * Nn + in-1 * Nn + in
+ * = (((i0*N1+i1)*N2+i2)*N3+i3) ...
+ * \param[in] r current rank
+ * \param[in] sum current sum up to this rank
+ * \param[in] i index
+ * \oaram[in] indices The rest of the paramter pack.
+ * \returns The offset.
+ */
+ template<class ... Indices >
+ inline constexpr index_type
+ offset( const size_t r, ptrdiff_t sum, const index_type i, Indices... indices) const noexcept
+ {
+ return offset( r+1, sum * m_extents.extent(r) + i, indices ...);
+ }
+
+ public:
+ /*! \brief Return the size of the underlying one-dimensional
+ * data structure, so that the mapping is always valid.
+ * \todo add constexpr when C++14 is required
+ *
+ * \returns number of span elements
+ */
+ index_type required_span_size() const noexcept
+ {
+ index_type size = 1;
+ for (size_t r = 0; r < m_extents.rank(); r++)
+ {
+ size *= m_extents.extent(r);
+ }
+ return size;
+ }
+
+ /*! \brief Map the multidimensional indices to 1D.
+ * Requires number of indicies have the same dimensionality as the mapping.
+ * \tparam Indices type of the indices to be mapped
+ * \param[in] indices the indices to be mapped
+ * \returns One-dimensional integer index.
+ * \todo C++14 activation of constexpr
+ */
+ template<class ... Indices >
+ typename std::enable_if<sizeof ... (Indices) == Extents::rank(), index_type>::type
+ operator()( Indices ... indices ) const noexcept
+ { return offset( 0, 0, indices ... ); }
+
+ //! Report that this mapping is always unique.
+ static constexpr bool is_always_unique() noexcept { return true; }
+ //! Report that this mapping is always contiguous.
+ static constexpr bool is_always_contiguous() noexcept { return true; }
+ //! Report that this mapping is always strided.
+ static constexpr bool is_always_strided() noexcept { return true; }
+
+ //! Report that this mapping is unique.
+ constexpr bool is_unique() const noexcept { return true; }
+ //! Report that this mapping is contiguous.
+ constexpr bool is_contiguous() const noexcept { return true; }
+ //! Report that this mapping is strided.
+ constexpr bool is_strided() const noexcept { return true; }
+ /*!\brief Return the stride of dimension r.
+ * \param[in] R rank of the stride to be queried.
+ * \returns the stride along dimension r.
+ * \todo C++14 activation of constexpr
+ */
+ index_type stride(const size_t R) const noexcept
+ {
+ ptrdiff_t stride = 1;
+ for (size_t r = m_extents.rank()-1; r > R; r--)
+ {
+ stride *= m_extents.extent(r);
+ }
+ return stride;
+ }
+
+ }; // class mapping
+
+}; // class layout_right
+
+} // namespace gmx
+#endif /* end of include guard: MDSPAN_LAYOUTS_H */
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::mdspan
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Ronan Keryell <ronan.keryell@xilinx.com>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \inlibraryapi
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_MDSPAN_H
+#define MDSPAN_MDSPAN_H
+
+#include <array>
+#include <type_traits>
+
+#include "accessor_policy.h"
+#include "extents.h"
+#include "layouts.h"
+
+namespace gmx
+{
+
+/*! \libinternal \brief Multidimensional array indexing and memory access with flexible mapping and access model.
+ *
+ * \tparam ElementType Type of elemnt to be viewed
+ * \tparam Extents The dimensions of the multidimenisonal array to view.
+ * \tparam LayoutPolicy Describes is the memory layout of the multidimensional array; right by default.
+ * \tparam AccessorPolicy Describes memory access model.
+ */
+template<class ElementType, class Extents, class LayoutPolicy = layout_right, class AccessorPolicy = accessor_basic<ElementType> >
+class basic_mdspan
+{
+ public:
+ //! Expose type used to define the extents of the data.
+ using extents_type = Extents;
+ //! Expose type used to define the layout of the data.
+ using layout_type = LayoutPolicy;
+ //! Expose type used to define the memory access model of the data.
+ using accessor_type = AccessorPolicy;
+ //! Expose type used to map multidimensional indices to one-dimensioal indices.
+ using mapping_type = typename layout_type::template mapping<extents_type>;
+ //! Exposes the type of stored element.
+ using element_type = typename accessor_type::element_type;
+ //! Expose the underlying type of the stored elements.
+ using value_type = typename std::remove_cv<element_type>::type;
+ //! Expose the type used for indexing.
+ using index_type = ptrdiff_t;
+ //! Expose type for index differences.
+ using difference_type = ptrdiff_t;
+ //! Expose underlying pointer to data type.
+ using pointer = typename accessor_type::pointer;
+ //! Expose reference to data type.
+ using reference = typename accessor_type::reference;
+
+ //! Trivial constructor
+ constexpr basic_mdspan() noexcept : acc_(), map_(), ptr_() {}
+ //! Move constructor
+ constexpr basic_mdspan(basic_mdspan &&other) noexcept = default;
+ //! copy constructor
+ constexpr basic_mdspan(const basic_mdspan &other) noexcept = default;
+ //! Copy assignment
+ basic_mdspan &operator=(const basic_mdspan &other) noexcept = default;
+ //! Move assignment
+ basic_mdspan &operator=(basic_mdspan &&other) noexcept = default;
+
+ //! Copy constructor
+ template<class OtherElementType,
+ class OtherExtents,
+ class OtherLayoutPolicy,
+ class OtherAccessor>
+ constexpr basic_mdspan(
+ const basic_mdspan<OtherElementType,
+ OtherExtents,
+ OtherLayoutPolicy,
+ OtherAccessor> &rhs ) noexcept
+ : acc_( rhs.acc_ ),
+ map_( rhs.map_ ),
+ ptr_( rhs.ptr_ )
+ {}
+ //! Copy assignment constructor
+ template<class OtherElementType,
+ class OtherExtents,
+ class OtherLayoutPolicy,
+ class OtherAccessor>
+ basic_mdspan &operator= (
+ const basic_mdspan<OtherElementType,
+ OtherExtents,
+ OtherLayoutPolicy,
+ OtherAccessor> &rhs ) noexcept
+ { acc_ = rhs.acc_; map_ = rhs.map_; ptr_ = rhs.ptr_; return *this; }
+
+ /*!\brief Construct mdspan by setting the dynamic extents and pointer to data.
+ * \param[in] ptr Pointer to data to be accessed by this span
+ * \param[in] DynamicExtents
+ * \tparam IndexType index type to describe dynamic extents
+ */
+ template<class ... IndexType >
+ explicit constexpr basic_mdspan
+ ( pointer ptr, IndexType ... DynamicExtents ) noexcept
+ : acc_(accessor_type()), map_( extents_type(DynamicExtents ...) ), ptr_(ptr) {}
+ /*! \brief Construct from array describing dynamic extents.
+ * \param[in] ptr Pointer to data to be accessed by this span
+ * \param[in] dynamic_extents Array the size of dynamic extents.
+ */
+ constexpr basic_mdspan( pointer ptr, const std::array<ptrdiff_t, extents_type::rank_dynamic()> &dynamic_extents)
+ : acc_(accessor_type()), map_( extents_type(dynamic_extents)), ptr_(ptr) {}
+ /*! \brief Construct from pointer and mapping.
+ * \param[in] ptr Pointer to data to be accessed by this span
+ * \param[in] m Mapping from multidimenisonal indices to one-dimensional offset.
+ */
+ constexpr basic_mdspan( pointer ptr, const mapping_type &m ) noexcept
+ : acc_(accessor_type()), map_( m ), ptr_(ptr) {}
+ /*! \brief Construct with pointer, mapping and accessor.
+ * \param[in] ptr Pointer to data to be accessed by this span
+ * \param[in] m Mapping from multidimenisonal indices to one-dimensional offset.
+ * \param[in] a Accessor implementing memory access model.
+ */
+ constexpr basic_mdspan( pointer ptr, const mapping_type &m, const accessor_type &a ) noexcept
+ : acc_(a), map_( m ), ptr_(ptr) {}
+
+ /*! \brief Brace operator to access multidimenisonal array element.
+ * \param[in] indices The multidimensional indices of the object.
+ * Requires rank() == sizeof...(IndexType). Slicing is implemented via sub_span.
+ * \returns reference to element at indices.
+ */
+ template<class... IndexType >
+ constexpr typename std::enable_if<sizeof ... (IndexType) == extents_type::rank(), reference>::type
+ operator()( IndexType... indices) const noexcept
+ { return acc_.access( ptr_, map_( indices ... ) ); }
+ /*! \brief Canonical bracket operator for one-dimensional arrays.
+ * Allows mdspan to act like array in one-dimension.
+ * Enabled only when rank==1.
+ * \param[in] i one-dimensional index
+ * \returns reference to element stored at position i
+ */
+ template<class IndexType>
+ constexpr typename std::enable_if<std::is_integral<IndexType>::value && 1 == extents_type::rank(), reference>::type
+ operator[]( const IndexType &i ) const noexcept
+ { return acc_.access( ptr_, map_(i) ); }
+ //! Report the rank.
+ static constexpr int rank() noexcept
+ { return extents_type::rank(); }
+ //! Report the dynamic rank.
+ static constexpr int rank_dynamic() noexcept
+ { return extents_type::rank_dynamic(); }
+ /*! \brief Return the static extent.
+ * \param[in] k dimension to query for static extent
+ * \returns static extent along specified dimension
+ */
+ constexpr index_type static_extent( size_t k ) const noexcept
+ { return map_.extents().static_extent( k ); }
+
+ /*! \brief Return the extent.
+ * \param[in] k dimension to query for extent
+ * \returns extent along specified dimension
+ */
+ constexpr index_type extent( int k ) const noexcept
+ { return map_.extents().extent( k ); }
+
+ //! Return all extents
+ constexpr const extents_type &extents() const noexcept
+ { return map_.extents(); }
+ //! Report if mappings for this basic_span is always unique.
+ static constexpr bool is_always_unique() noexcept { return mapping_type::is_always_unique(); }
+ //! Report if mapping for this basic_span is always strided
+ static constexpr bool is_always_strided() noexcept { return mapping_type::is_always_strided(); }
+ //! Report if mapping for this basic_span is always is_contiguous
+ static constexpr bool is_always_contiguous() noexcept { return mapping_type::is_always_contiguous(); }
+ //! Report if the currently applied map is unique
+ constexpr bool is_unique() const noexcept { return map_.is_unique(); }
+ //! Report if the currently applied map is strided
+ constexpr bool is_strided() const noexcept { return map_.is_strided(); }
+ //! Report if the currently applied map is contiguous
+ constexpr bool is_contiguous() const noexcept {return map_.is_contiguous(); }
+ //! Report stride along a specific rank.
+ constexpr index_type stride( size_t r ) const noexcept
+ { return map_.stride(r); }
+ //! Return the currently applied mapping.
+ constexpr mapping_type mapping() const noexcept { return map_; }
+ //! Return the memory access model.
+ constexpr accessor_type accessor() const noexcept { return acc_; }
+ //! Return pointer to underlying data
+ constexpr pointer data() const noexcept { return ptr_; }
+ private:
+ //! The memory access model
+ accessor_type acc_;
+ //! The transformation from multidimenisonal index to memory offset.
+ mapping_type map_;
+ //! Memory location handle
+ pointer ptr_;
+};
+
+//! basic_mdspan with wrapped indices, basic_accessor policiy and right-aligned memory layout.
+template<class T, ptrdiff_t... Indices>
+using mdspan = basic_mdspan<T, extents<Indices...>, layout_right, accessor_basic<T> >;
+
+} // namespace gmx
+
+#endif /* end of include guard: MDSPAN_MDSPAN_H */
--- /dev/null
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2018, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+gmx_add_unit_test(MDSpanTests mdspan-test
+ accessor_policy.cpp
+ extents.cpp
+ layouts.cpp
+ mdspan.cpp
+ )
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Testing gmx::accessor_policy.
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/accessor_policy.h"
+
+#include <array>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+class BasicAccessorPolicy : public ::testing::Test
+{
+ public:
+ std::array<float, 3> testdata = {{1., 2., 3.}};
+ accessor_basic<float> acc;
+};
+
+TEST_F(BasicAccessorPolicy, Decay) {
+ EXPECT_EQ(acc.decay(testdata.data()), testdata.data());
+}
+
+TEST_F(BasicAccessorPolicy, Access) {
+ for (size_t i = 0; i < testdata.size(); ++i)
+ {
+ EXPECT_EQ(acc.access(testdata.data(), i), testdata[i]);
+ }
+}
+
+TEST_F(BasicAccessorPolicy, Offset) {
+ for (size_t i = 0; i < testdata.size(); ++i)
+ {
+ EXPECT_EQ(acc.offset(testdata.data(), i), testdata.data() + i );
+ }
+}
+
+TEST_F(BasicAccessorPolicy, CopyAccessor) {
+ const auto newAcc = acc;
+
+ EXPECT_EQ(acc.decay(testdata.data()), newAcc.decay(testdata.data()));
+ for (size_t i = 0; i < testdata.size(); ++i)
+ {
+ EXPECT_EQ(acc.access(testdata.data(), i), newAcc.access(testdata.data(), i));
+ }
+
+ for (size_t i = 0; i < testdata.size(); ++i)
+ {
+ EXPECT_EQ(acc.offset(testdata.data(), i), newAcc.offset(testdata.data(), i));
+ }
+}
+
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \internal \file
+ * \brief Testing gmx::extents.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/extents.h"
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+template<ptrdiff_t ... E_STATIC>
+class ExtentsTest
+{
+ public:
+ using extents_type = gmx::extents<E_STATIC...>;
+
+ extents_type my_extents_explicit;
+ extents_type my_extents_array;
+ extents_type my_extents_copy;
+
+ ExtentsTest()
+ {
+ my_extents_explicit = extents<E_STATIC...>();
+ my_extents_array = extents<E_STATIC...>(std::array<ptrdiff_t, 0>());
+ my_extents_copy = extents<E_STATIC...>(my_extents_explicit);
+ }
+
+ template<class ... E>
+ ExtentsTest(E ... e)
+ {
+ my_extents_explicit = extents<E_STATIC...>(e ...);
+ my_extents_array = extents<E_STATIC...>(std::array<ptrdiff_t, 2>({{e ...}}));
+ my_extents_copy = extents<E_STATIC...>(my_extents_explicit);
+ }
+
+ void check_rank(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_extents_explicit.rank(), r);
+ EXPECT_EQ(my_extents_array.rank(), r);
+ EXPECT_EQ(my_extents_copy.rank(), r);
+ }
+ void check_rank_dynamic(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_extents_explicit.rank_dynamic(), r);
+ EXPECT_EQ(my_extents_array.rank_dynamic(), r);
+ EXPECT_EQ(my_extents_copy.rank_dynamic(), r);
+ }
+ template<class ... E>
+ void check_extents(E ... e)
+ {
+ std::array<ptrdiff_t, extents_type::rank()> s = {{E_STATIC ...}};
+ std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+ for (size_t r = 0; r < extents_type::rank(); r++)
+ {
+ EXPECT_EQ(my_extents_explicit.static_extent(r), s[r]);
+ EXPECT_EQ(my_extents_explicit.extent(r), a[r]);
+
+ EXPECT_EQ(my_extents_array.static_extent(r), s[r]);
+ EXPECT_EQ(my_extents_array.extent(r), a[r]);
+
+ EXPECT_EQ(my_extents_copy.static_extent(r), s[r]);
+ EXPECT_EQ(my_extents_copy.extent(r), a[r]);
+ }
+ EXPECT_EQ(my_extents_explicit.static_extent(extents_type::rank()+1), 1);
+ EXPECT_EQ(my_extents_explicit.extent(extents_type::rank()+1), 1);
+
+ EXPECT_EQ(my_extents_array.static_extent(extents_type::rank()+1), 1);
+ EXPECT_EQ(my_extents_array.extent(extents_type::rank()+1), 1);
+
+ EXPECT_EQ(my_extents_copy.static_extent(extents_type::rank()+1), 1);
+ EXPECT_EQ(my_extents_copy.extent(extents_type::rank()+1), 1);
+ }
+
+};
+
+TEST(ExtentsTest, Construction) {
+
+ // setting two dynamic extents
+ ExtentsTest<5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+ test.check_rank(5);
+ test.check_rank_dynamic(2);
+ test.check_extents(5, 4, 3, 2, 1);
+
+}
+
+TEST(ExtentsTest, PurelyStatic) {
+ ExtentsTest<5, 4, 3> test;
+ test.check_rank(3);
+ test.check_rank_dynamic(0);
+ test.check_extents(5, 4, 3);
+}
+
+TEST(ExtentsTest, RankNought) {
+ // Can construct extents of rank nought
+ ExtentsTest<> test;
+ test.check_rank(0);
+ test.check_rank_dynamic(0);
+}
+TEST(ExtentsTest, Assignment) {
+ extents<5, dynamic_extent, 3, dynamic_extent, 1> e1(4, 2);
+ extents<5, 4, 3, 2, 1> e2;
+ e2 = e1;
+ for (size_t r = 0; r < 5; r++)
+ {
+ EXPECT_EQ(e2.extent(r), e1.extent(r));
+ }
+ extents<dynamic_extent, dynamic_extent, dynamic_extent, dynamic_extent, dynamic_extent> e3(9, 8, 7, 6, 5);
+ for (int r = 0; r < 5; r++)
+ {
+ EXPECT_EQ(e3.extent(r), 9-r);
+ }
+ e3 = e1;
+ for (int r = 0; r < 5; r++)
+ {
+ EXPECT_EQ(e3.extent(r), e1.extent(r));
+ }
+}
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Testing gmx::extents.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/layouts.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/mdspan/extents.h"
+
+namespace gmx
+{
+
+template<class Layout, ptrdiff_t ... E_STATIC>
+struct LayoutTests {
+
+ typedef Layout layout_type;
+ typedef extents<E_STATIC...> extents_type;
+ typedef typename Layout::template mapping<extents_type> mapping_type;
+
+ mapping_type my_mapping_explicit, my_mapping_copy;
+
+ template<class ... E>
+ LayoutTests(E ... e)
+ {
+ my_mapping_explicit = mapping_type(extents_type(e ...));
+ my_mapping_copy = mapping_type(my_mapping_explicit);
+ }
+
+ void check_rank(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_mapping_explicit.extents().rank(), r);
+ EXPECT_EQ(my_mapping_copy.extents().rank(), r);
+ }
+ void check_rank_dynamic(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_mapping_explicit.extents().rank_dynamic(), r);
+ EXPECT_EQ(my_mapping_copy.extents().rank_dynamic(), r);
+ }
+ template<class ... E>
+ void check_extents(E ... e)
+ {
+ std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+ for (size_t r = 0; r < extents_type::rank(); r++)
+ {
+ EXPECT_EQ(my_mapping_explicit.extents().extent(r), a[r]);
+ EXPECT_EQ(my_mapping_copy.extents().extent(r), a[r]);
+ }
+ }
+ template<class ... E>
+ void check_strides(E ... e)
+ {
+ std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+ for (size_t r = 0; r < extents_type::rank(); r++)
+ {
+ EXPECT_EQ(my_mapping_explicit.stride(r), a[r]);
+ EXPECT_EQ(my_mapping_copy.stride(r), a[r]);
+ }
+ }
+ void check_required_span_size(ptrdiff_t size)
+ {
+ EXPECT_EQ(my_mapping_explicit.required_span_size(), size);
+ EXPECT_EQ(my_mapping_copy.required_span_size(), size);
+ }
+
+ void check_properties(bool always_unique, bool always_contiguous, bool always_strided,
+ bool unique, bool contiguous, bool strided)
+ {
+ EXPECT_EQ(my_mapping_explicit.is_always_unique() ? 1 : 0, always_unique ? 1 : 0);
+ EXPECT_EQ(my_mapping_explicit.is_always_contiguous() ? 1 : 0, always_contiguous ? 1 : 0);
+ EXPECT_EQ(my_mapping_explicit.is_always_strided() ? 1 : 0, always_strided ? 1 : 0);
+ EXPECT_EQ(my_mapping_explicit.is_unique() ? 1 : 0, unique ? 1 : 0);
+ EXPECT_EQ(my_mapping_explicit.is_contiguous() ? 1 : 0, contiguous ? 1 : 0);
+ EXPECT_EQ(my_mapping_explicit.is_strided() ? 1 : 0, strided ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_always_unique() ? 1 : 0, always_unique ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_always_contiguous() ? 1 : 0, always_contiguous ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_always_strided() ? 1 : 0, always_strided ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_unique() ? 1 : 0, unique ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_contiguous() ? 1 : 0, contiguous ? 1 : 0);
+ EXPECT_EQ(my_mapping_copy.is_strided() ? 1 : 0, strided ? 1 : 0);
+ }
+
+ template<class ... E>
+ void check_operator(ptrdiff_t offset, E ... e)
+ {
+ EXPECT_EQ(my_mapping_explicit(e ...), offset);
+ EXPECT_EQ(my_mapping_copy(e ...), offset);
+ }
+
+};
+
+TEST(LayoutTests, LayoutRightConstruction) {
+ LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+ test.check_rank(5);
+ test.check_rank_dynamic(2);
+ test.check_extents(5, 4, 3, 2, 1);
+ test.check_strides(24, 6, 2, 1, 1);
+}
+
+TEST(LayoutTests, LayoutRightProperties) {
+ LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+ test.check_properties(true, true, true, true, true, true);
+}
+
+TEST(LayoutTests, LayoutRightOperator) {
+ LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+ test.check_operator(107, 4, 1, 2, 1, 0);
+ test.check_operator(0, 0, 0, 0, 0, 0);
+}
+
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ * Kokkos v. 2.0
+ * Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \internal \file
+ * \brief Testing gmx::basic_mdspan.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/mdspan.h"
+
+#include <cstdio>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+namespace
+{
+
+
+// Test basic_mdspan with a mixture of dynamic and static extents, as well as extent of one.
+// The dynamic extents will be set to 4 and 2 repsectively so that we'll tests
+// a multidimensional array of extent 5 x 4 x 3 x 2 x 1, i.e. 120 elements
+
+//! View on int data with mixed static and dynamic extents
+using mdspan_int = basic_mdspan < int, extents<5, dynamic_extent, 3, dynamic_extent, 1>, layout_right, accessor_basic < int>>;
+
+TEST(MdSpanTest, MdSpanWrapsBasicMdSpanCorrectly)
+{
+ // Check that mdspan wraps basic_mdspan as expected
+ ::testing::StaticAssertTypeEq < mdspan_int, mdspan < int, 5, dynamic_extent, 3, dynamic_extent, 1>>();
+}
+
+//! View on float data with mixed static and dynamic extents
+using mdspan_float = basic_mdspan < float, extents<5, dynamic_extent, 3, dynamic_extent, 1>, layout_right, accessor_basic < float>>;
+//! Types to be tested
+using MdSpanTypes = ::testing::Types < mdspan_int, mdspan_float>;
+
+template<class ElementType, class Mapping>
+struct fill_raw_data {
+ static void fill(ElementType* p, Mapping m)
+ {
+ typename Mapping::extents_type e = m.extents();
+ for (ptrdiff_t i0 = 0; i0 < e.extent(0); i0++)
+ {
+ for (ptrdiff_t i1 = 0; i1 < e.extent(1); i1++)
+ {
+ for (ptrdiff_t i2 = 0; i2 < e.extent(2); i2++)
+ {
+ for (ptrdiff_t i3 = 0; i3 < e.extent(3); i3++)
+ {
+ for (ptrdiff_t i4 = 0; i4 < e.extent(4); i4++)
+ {
+ p[i0*m.stride(0)+i1*m.stride(1)+i2*m.stride(2)+i3*m.stride(3)+i4*m.stride(4)] =
+ ElementType(i0*10000+i1*1000+i2*100+i3*10+i4);
+ }
+ }
+ }
+ }
+ }
+ }
+};
+template<class MDSPAN>
+struct MdSpanTest : public ::testing::Test
+{
+ using mdspan_type = MDSPAN;
+ using element_type = typename mdspan_type::element_type;
+ using extents_type = typename mdspan_type::extents_type;
+ using mapping_type = typename mdspan_type::mapping_type;
+ using accessor_type = typename mdspan_type::accessor_type;
+ using pointer_type = typename mdspan_type::pointer;
+
+ mdspan_type my_mdspan_extents;
+ mdspan_type my_mdspan_array;
+ mdspan_type my_mdspan_mapping;
+ mdspan_type my_mdspan_map_acc;
+ mdspan_type my_mdspan_copy;
+
+ std::vector<element_type> rawData;
+
+ template<class ... ED>
+ void SetUp(ED ... e)
+ {
+ mapping_type map {extents_type(e ...)};
+ accessor_type acc;
+ rawData.resize(map.required_span_size());
+ fill_raw_data<element_type, mapping_type>::fill(rawData.data(), map);
+ pointer_type p(rawData.data());
+
+ my_mdspan_array = mdspan_type(p, std::array<ptrdiff_t, sizeof ... (ED)>({{e ...}}));
+ my_mdspan_mapping = mdspan_type(p, map);
+ my_mdspan_map_acc = mdspan_type(p, map, acc);
+ my_mdspan_extents = mdspan_type(p, e ...);
+ my_mdspan_copy = my_mdspan_mapping;
+ }
+
+ void check_rank(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_mdspan_mapping.rank(), r);
+ EXPECT_EQ(my_mdspan_map_acc.rank(), r);
+ EXPECT_EQ(my_mdspan_extents.rank(), r);
+ EXPECT_EQ(my_mdspan_copy.rank(), r);
+ }
+ void check_rank_dynamic(ptrdiff_t r)
+ {
+ EXPECT_EQ(my_mdspan_mapping.rank_dynamic(), r);
+ EXPECT_EQ(my_mdspan_map_acc.rank_dynamic(), r);
+ EXPECT_EQ(my_mdspan_extents.rank_dynamic(), r);
+ EXPECT_EQ(my_mdspan_copy.rank_dynamic(), r);
+ }
+ template<class ... E>
+ void check_extents(E ... e)
+ {
+ std::array<ptrdiff_t, extents_type::rank()> a {{e ...}};
+ for (size_t r = 0; r < extents_type::rank(); r++)
+ {
+ EXPECT_EQ(my_mdspan_mapping.extent(r), a[r]);
+ EXPECT_EQ(my_mdspan_map_acc.extent(r), a[r]);
+ EXPECT_EQ(my_mdspan_extents.extent(r), a[r]);
+ EXPECT_EQ(my_mdspan_copy.extent(r), a[r]);
+ }
+ }
+ template<class ... E>
+ void check_strides(E ... e)
+ {
+ std::array<ptrdiff_t, extents_type::rank()> a {{e ...}};
+ for (size_t r = 0; r < extents_type::rank(); r++)
+ {
+ EXPECT_EQ(my_mdspan_mapping.stride(r), a[r]);
+ EXPECT_EQ(my_mdspan_map_acc.stride(r), a[r]);
+ EXPECT_EQ(my_mdspan_extents.stride(r), a[r]);
+ EXPECT_EQ(my_mdspan_copy.stride(r), a[r]);
+ }
+ }
+
+ void check_properties_internal(mdspan_type my_mdspan, bool always_unique, bool always_contiguous, bool always_strided,
+ bool unique, bool contiguous, bool strided)
+ {
+ EXPECT_EQ(my_mdspan.is_always_unique(), always_unique);
+ EXPECT_EQ(my_mdspan.is_always_contiguous(), always_contiguous);
+ EXPECT_EQ(my_mdspan.is_always_strided(), always_strided);
+ EXPECT_EQ(my_mdspan.is_unique(), unique);
+ EXPECT_EQ(my_mdspan.is_contiguous(), contiguous);
+ EXPECT_EQ(my_mdspan.is_strided(), strided);
+ }
+
+ void check_properties(bool always_unique, bool always_contiguous, bool always_strided,
+ bool unique, bool contiguous, bool strided)
+ {
+ check_properties_internal(my_mdspan_mapping, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+ check_properties_internal(my_mdspan_map_acc, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+ check_properties_internal(my_mdspan_extents, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+ check_properties_internal(my_mdspan_copy, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+ }
+
+ void check_operator()
+ {
+ extents_type e = my_mdspan_mapping.extents();
+ for (ptrdiff_t i0 = 0; i0 < e.extent(0); i0++)
+ {
+ for (ptrdiff_t i1 = 0; i1 < e.extent(1); i1++)
+ {
+ for (ptrdiff_t i2 = 0; i2 < e.extent(2); i2++)
+ {
+ for (ptrdiff_t i3 = 0; i3 < e.extent(3); i3++)
+ {
+ for (ptrdiff_t i4 = 0; i4 < e.extent(4); i4++)
+ {
+ element_type value = i0*10000+i1*1000+i2*100+i3*10+i4;
+ EXPECT_EQ(my_mdspan_mapping(i0, i1, i2, i3, i4), value);
+ EXPECT_EQ(my_mdspan_map_acc(i0, i1, i2, i3, i4), value);
+ EXPECT_EQ(my_mdspan_extents(i0, i1, i2, i3, i4), value);
+ EXPECT_EQ(my_mdspan_copy (i0, i1, i2, i3, i4), value);
+ }
+ }
+ }
+ }
+ }
+ }
+};
+
+TYPED_TEST_CASE(MdSpanTest, MdSpanTypes);
+
+TYPED_TEST(MdSpanTest, Rank) {
+ this->SetUp(4, 2);
+ this->check_rank(5);
+}
+
+TYPED_TEST(MdSpanTest, DynamicRank) {
+ this->SetUp(4, 2);
+ this->check_rank_dynamic(2);
+}
+
+TYPED_TEST(MdSpanTest, Extents) {
+ this->SetUp(4, 2);
+ this->check_extents(5, 4, 3, 2, 1);
+}
+
+TYPED_TEST(MdSpanTest, Strides) {
+ this->SetUp(4, 2);
+ this->check_strides(24, 6, 2, 1, 1);
+}
+
+TYPED_TEST(MdSpanTest, Properties) {
+ this->SetUp(4, 2);
+ const bool always_unique = true;
+ const bool always_contiguous = true;
+ const bool always_strided = true;
+ const bool unique = true;
+ const bool contiguous = true;
+ const bool strided = true;
+ this->check_properties(always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+}
+
+TYPED_TEST(MdSpanTest, Operator) {
+ this->SetUp(4, 2);
+ this->check_operator();
+}
+
+} // namespace
+
+} // namespace gmx
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
int nbkernel_elec_modifier;
int nbkernel_vdw_modifier;
- /* Use special N*N kernels? */
- gmx_bool bAllvsAll;
- /* Private work data */
- void *AllvsAll_work;
-
/* Cut-Off stuff.
* Infinite cut-off's will be GMX_CUTOFF_INF (unlike in t_inputrec: 0).
*/
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Implements classes from group.h.
+ *
+ * \author Kevin Boyd <kevin.boyd@uconn.edu>
+ * \ingroup module_mdtypes
+ */
+#include "gmxpre.h"
+
+#include "group.h"
+
+gmx_ekindata_t::~gmx_ekindata_t()
+{
+ for (int i = 0; i < nthreads; i++)
+ {
+ sfree(ekin_work_alloc[i]);
+ }
+ sfree(ekin_work_alloc);
+ sfree(ekin_work);
+ sfree(dekindl_work);
+}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_MDTYPES_GROUP_H
#define GMX_MDTYPES_GROUP_H
+#include <vector>
+
#include "gromacs/math/vectypes.h"
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/real.h"
+#include "gromacs/utility/smalloc.h"
-typedef struct {
- real Th; /* Temperature at half step */
- real T; /* Temperature at full step */
- tensor ekinh; /* Kinetic energy at half step */
- tensor ekinh_old; /* Kinetic energy at old half step */
- tensor ekinf; /* Kinetic energy at full step */
- real lambda; /* Berendsen coupling lambda */
- double ekinscalef_nhc; /* Scaling factor for NHC- full step */
- double ekinscaleh_nhc; /* Scaling factor for NHC- half step */
- double vscale_nhc; /* Scaling factor for NHC- velocity */
-} t_grp_tcstat;
+struct t_grp_tcstat{
+ real Th = 0; /* Temperature at half step */
+ real T = 0; /* Temperature at full step */
+ tensor ekinh = {{0}}; /* Kinetic energy at half step */
+ tensor ekinh_old = {{0}}; /* Kinetic energy at old half step */
+ tensor ekinf = {{0}}; /* Kinetic energy at full step */
+ real lambda = 0; /* Berendsen coupling lambda */
+ double ekinscalef_nhc = 0; /* Scaling factor for NHC- full step */
+ double ekinscaleh_nhc = 0; /* Scaling factor for NHC- half step */
+ double vscale_nhc = 0; /* Scaling factor for NHC- velocity */
+};
-typedef struct {
+struct t_grp_acc {
int nat; /* Number of atoms in this group */
rvec u; /* Mean velocities of home particles */
rvec uold; /* Previous mean velocities of home particles */
double mA; /* Mass for topology A */
double mB; /* Mass for topology B */
-} t_grp_acc;
+};
-typedef struct {
+struct t_cos_acc{
real cos_accel; /* The acceleration for the cosine profile */
real mvcos; /* The cos momenta of home particles */
real vcos; /* The velocity of the cosine profile */
-} t_cos_acc;
+};
+
+struct gmx_ekindata_t {
+ gmx_bool bNEMD;
+ int ngtc; /* The number of T-coupling groups */
+ int nthreads; /* For size of ekin_work */
+ std::vector<t_grp_tcstat> tcstat; /* T-coupling data */
+ tensor **ekin_work_alloc; /* Allocated locations for *_work members */
+ tensor **ekin_work; /* Work arrays for tcstat per thread */
+ real **dekindl_work; /* Work location for dekindl per thread */
+ int ngacc; /* The number of acceleration groups */
+ std::vector<t_grp_acc> grpstat; /* Acceleration data */
+ tensor ekin; /* overall kinetic energy */
+ tensor ekinh; /* overall 1/2 step kinetic energy */
+ real dekindl; /* dEkin/dlambda at half step */
+ real dekindl_old; /* dEkin/dlambda at old half step */
+ t_cos_acc cosacc; /* Cosine acceleration data */
-typedef struct gmx_ekindata_t {
- gmx_bool bNEMD;
- int ngtc; /* The number of T-coupling groups */
- t_grp_tcstat *tcstat; /* T-coupling data */
- tensor **ekin_work_alloc; /* Allocated locations for *_work members */
- tensor **ekin_work; /* Work arrays for tcstat per thread */
- real **dekindl_work; /* Work location for dekindl per thread */
- int ngacc; /* The number of acceleration groups */
- t_grp_acc *grpstat; /* Acceleration data */
- tensor ekin; /* overall kinetic energy */
- tensor ekinh; /* overall 1/2 step kinetic energy */
- real dekindl; /* dEkin/dlambda at half step */
- real dekindl_old; /* dEkin/dlambda at old half step */
- t_cos_acc cosacc; /* Cosine acceleration data */
-} gmx_ekindata_t;
+ ~gmx_ekindata_t();
+};
#define GID(igid, jgid, gnr) (((igid) < (jgid)) ? ((igid)*(gnr)+(jgid)) : ((jgid)*(gnr)+(igid)))
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
struct AwhHistory;
}
+//! Convenience alias for until all is moved in the gmx namespace
+template <class T>
+using PaddedHostVector = gmx::PaddedHostVector<T>;
+
/*
* The t_state struct should contain all the (possibly) non-static
* information required to define the state of the system.
t_state();
// All things public
- int natoms; //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
- int ngtc; //!< The number of temperature coupling groups
- int nnhpres; //!< The NH-chain length for the MTTK barostat
- int nhchainlength; //!< The NH-chain length for temperature coupling
- int flags; //!< Set of bit-flags telling which entries are present, see enum at the top of the file
- int fep_state; //!< indicates which of the alchemical states we are in
- std::array<real, efptNR> lambda; //!< Free-energy lambda vector
- matrix box; //!< Matrix of box vectors
- matrix box_rel; //!< Relative box vectors to preserve box shape
- matrix boxv; //!< Box velocities for Parrinello-Rahman P-coupling
- matrix pres_prev; //!< Pressure of the previous step for pcoupl
- matrix svir_prev; //!< Shake virial for previous step for pcoupl
- matrix fvir_prev; //!< Force virial of the previous step for pcoupl
- std::vector<double> nosehoover_xi; //!< Nose-Hoover coordinates (ngtc)
- std::vector<double> nosehoover_vxi; //!< Nose-Hoover velocities (ngtc)
- std::vector<double> nhpres_xi; //!< Pressure Nose-Hoover coordinates
- std::vector<double> nhpres_vxi; //!< Pressure Nose-Hoover velocities
- std::vector<double> therm_integral; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
- double baros_integral; //!< For Berendsen P-coupling conserved quantity
- real veta; //!< Trotter based isotropic P-coupling
- real vol0; //!< Initial volume,required for computing MTTK conserved quantity
- gmx::HostVector<gmx::RVec> x; //!< The coordinates (natoms)
- PaddedVector<gmx::RVec> v; //!< The velocities (natoms)
- PaddedVector<gmx::RVec> cg_p; //!< p vector for conjugate gradient minimization
-
- ekinstate_t ekinstate; //!< The state of the kinetic energy
+ int natoms; //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
+ int ngtc; //!< The number of temperature coupling groups
+ int nnhpres; //!< The NH-chain length for the MTTK barostat
+ int nhchainlength; //!< The NH-chain length for temperature coupling
+ int flags; //!< Set of bit-flags telling which entries are present, see enum at the top of the file
+ int fep_state; //!< indicates which of the alchemical states we are in
+ std::array<real, efptNR> lambda; //!< Free-energy lambda vector
+ matrix box; //!< Matrix of box vectors
+ matrix box_rel; //!< Relative box vectors to preserve box shape
+ matrix boxv; //!< Box velocities for Parrinello-Rahman P-coupling
+ matrix pres_prev; //!< Pressure of the previous step for pcoupl
+ matrix svir_prev; //!< Shake virial for previous step for pcoupl
+ matrix fvir_prev; //!< Force virial of the previous step for pcoupl
+ std::vector<double> nosehoover_xi; //!< Nose-Hoover coordinates (ngtc)
+ std::vector<double> nosehoover_vxi; //!< Nose-Hoover velocities (ngtc)
+ std::vector<double> nhpres_xi; //!< Pressure Nose-Hoover coordinates
+ std::vector<double> nhpres_vxi; //!< Pressure Nose-Hoover velocities
+ std::vector<double> therm_integral; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
+ double baros_integral; //!< For Berendsen P-coupling conserved quantity
+ real veta; //!< Trotter based isotropic P-coupling
+ real vol0; //!< Initial volume,required for computing MTTK conserved quantity
+ PaddedHostVector<gmx::RVec> x; //!< The coordinates (natoms)
+ PaddedVector<gmx::RVec> v; //!< The velocities (natoms)
+ PaddedVector<gmx::RVec> cg_p; //!< p vector for conjugate gradient minimization
+
+ ekinstate_t ekinstate; //!< The state of the kinetic energy
/* History for special algorithms, should be moved to a history struct */
history_t hist; //!< Time history for restraints
* TODO: Move the next two structs out of state.h.
*/
-typedef struct t_extmass
+struct t_extmass
{
- double *Qinv; /* inverse mass of thermostat -- computed from inputs, but a good place to store */
- double *QPinv; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
- double Winv; /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
- tensor Winvm; /* inverse pressure mass tensor, computed */
-} t_extmass;
+ std::vector<double> Qinv; /* inverse mass of thermostat -- computed from inputs, but a good place to store */
+ std::vector<double> QPinv; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
+ double Winv; /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
+ tensor Winvm; /* inverse pressure mass tensor, computed */
+};
typedef struct
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
static void MCL_init_client(const char *) // NOLINT(readability-named-parameter)
{
- gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+ GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
}
/*! \brief Stub communication library function to call in case if
*/
static void MCL_send(void *, int, int, int) // NOLINT(readability-named-parameter)
{
- gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+ GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
}
/*! \brief Stub communication library function to call in case if
*/
static void MCL_receive(void *, int, int, int) // NOLINT(readability-named-parameter)
{
- gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+ GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
}
/*! \brief Stub communication library function to call in case if
* GROMACS is compiled without MiMiC. Calling causes GROMACS to exit!
*/
-static void MCL_destroy() // NOLINT(readability-named-parameter)
+static void MCL_destroy()
{
- gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+ GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
}
#endif
return MCL_init_client(path);
}
-void gmx::MimicCommunicator::sendInitData(gmx_mtop_t *mtop,
- HostVector<gmx::RVec> coords)
+void gmx::MimicCommunicator::sendInitData(gmx_mtop_t *mtop,
+ PaddedHostVector<gmx::RVec> coords)
{
MCL_send(&mtop->natoms, 1, TYPE_INT, 0);
MCL_send(&mtop->atomtypes.nr, 1, TYPE_INT, 0);
return steps;
}
-void gmx::MimicCommunicator::getCoords(HostVector<RVec> *x, const int natoms)
+void gmx::MimicCommunicator::getCoords(PaddedHostVector<RVec> *x, const int natoms)
{
std::vector<double> coords(natoms * 3);
MCL_receive(&*coords.begin(), 3 * natoms, TYPE_DOUBLE, 0);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* @param mtop global topology data
* @param coords coordinates of all atoms
*/
- void sendInitData(gmx_mtop_t *mtop,
- HostVector<gmx::RVec> coords);
+ void sendInitData(gmx_mtop_t *mtop,
+ PaddedHostVector<gmx::RVec> coords);
/*! \brief
* Gets the number of MD steps to perform from MiMiC
* @param x array of coordinates to fill
* @param natoms number of atoms in the system
*/
- void getCoords(HostVector<RVec> *x, int natoms);
+ void getCoords(PaddedHostVector<RVec> *x, int natoms);
/*! \brief
* Send the potential energy value to MiMiC
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/options/abstractoptionstorage.h"
#include "gromacs/options/optionflags.h"
+#include "gromacs/utility/any.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
#include "basicoptionstorage.h"
bSetValuesHadErrors_ = false;
}
-void AbstractOptionStorage::appendValue(const Variant &value)
+void AbstractOptionStorage::appendValue(const Any &value)
{
GMX_RELEASE_ASSERT(bInSet_, "startSet() not called");
try
return description;
}
-std::vector<Variant> OptionInfo::defaultValues() const
+std::vector<Any> OptionInfo::defaultValues() const
{
return option().defaultValues();
}
return option().defaultValuesAsStrings();
}
-std::vector<Variant> OptionInfo::normalizeValues(const std::vector<Variant> &values) const
+std::vector<Any> OptionInfo::normalizeValues(const std::vector<Any> &values) const
{
return option().normalizeValues(values);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
class AbstractOptionStorage;
template <typename T> class OptionStorageTemplate;
class OptionManagerContainer;
-class Variant;
+class Any;
namespace internal
{
* Returns the default value(s) of the option.
*
* The returned values should all be of the same type, but returning
- * each as a separate variant is currently simpler.
+ * each as a separate any is currently simpler.
*
* Currently, this can only be called before option values have been
* assigned.
*/
- std::vector<Variant> defaultValues() const;
+ std::vector<Any> defaultValues() const;
/*! \brief
* Returns the default value(s) of the option as strings.
*
* value of the option, and the current value in the option is not
* changed.
*/
- std::vector<Variant> normalizeValues(const std::vector<Variant> &values) const;
+ std::vector<Any> normalizeValues(const std::vector<Any> &values) const;
protected:
/*! \cond libapi */
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2014,2015,2016,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
class AbstractOption;
class OptionInfo;
class Options;
-class Variant;
+class Any;
/*! \libinternal \brief
* Abstract base class for converting, validating, and storing option values.
*/
virtual int valueCount() const = 0;
//! \copydoc OptionInfo::defaultValues()
- virtual std::vector<Variant> defaultValues() const = 0;
+ virtual std::vector<Any> defaultValues() const = 0;
//! \copydoc OptionInfo::defaultValuesAsStrings()
virtual std::vector<std::string> defaultValuesAsStrings() const = 0;
//! \copydoc OptionInfo::normalizeValues()
- virtual std::vector<Variant> normalizeValues(const std::vector<Variant> &values) const = 0;
+ virtual std::vector<Any> normalizeValues(const std::vector<Any> &values) const = 0;
/*! \brief
* Starts adding values from a new source for the option.
* This method should only be called between startSet() and
* finishSet().
*/
- void appendValue(const Variant &value);
+ void appendValue(const Any &value);
/*! \brief
* Performs validation and/or actions once a set of values has been
* added.
*
* \see OptionStorageTemplate::convertValue()
*/
- virtual void convertValue(const Variant &value) = 0;
+ virtual void convertValue(const Any &value) = 0;
/*! \brief
* Performs validation and/or actions once a set of values has been
* added.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
return allowed_[value];
}
-Variant EnumOptionStorage::normalizeValue(const int &value) const
+Any EnumOptionStorage::normalizeValue(const int &value) const
{
- return Variant::create<std::string>(formatSingleValue(value));
+ return Any::create<std::string>(formatSingleValue(value));
}
void EnumOptionStorage::initConverter(ConverterType *converter)
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
std::string typeString() const override { return "enum"; }
std::string formatExtraDescription() const override;
std::string formatSingleValue(const int &value) const override;
- Variant normalizeValue(const int &value) const override;
+ Any normalizeValue(const int &value) const override;
//! \copydoc EnumOptionInfo::allowedValues()
const std::vector<std::string> &allowedValues() const { return allowed_; }
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/options/abstractoptionstorage.h"
#include "gromacs/options/options.h"
+#include "gromacs/utility/any.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
#include "options-impl.h"
void OptionsAssigner::appendValue(const std::string &value)
{
- appendValue(Variant(value));
+ appendValue(Any(value));
}
-void OptionsAssigner::appendValue(const Variant &value)
+void OptionsAssigner::appendValue(const Any &value)
{
AbstractOptionStorage *option = impl_->currentOption_;
GMX_RELEASE_ASSERT(option != nullptr, "startOption() not called");
if (impl_->currentValueCount_ == 0)
{
// Should not throw, otherwise something is wrong.
- option->appendValue(Variant::create<bool>(!impl_->reverseBoolean_));
+ option->appendValue(Any::create<bool>(!impl_->reverseBoolean_));
}
else if (impl_->reverseBoolean_)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
class Options;
-class Variant;
+class Any;
/*! \libinternal \brief
* Decorator class for assigning values to Options.
* OptionStorageTemplate::convertValue() method of the storage class
* implementing the option where the value is assigned to.
*/
- void appendValue(const Variant &value);
+ void appendValue(const Any &value);
/*! \brief
* Appends a value to the value list of the current option.
*
* \param[in] value Value to assign.
*
- * See appendValue(const Variant &) for more details.
+ * See appendValue(const Any &) for more details.
*/
void appendValue(const std::string &value);
/*! \brief
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/options/abstractoption.h"
#include "gromacs/options/abstractoptionstorage.h"
#include "gromacs/options/valuestore.h"
+#include "gromacs/utility/any.h"
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/basedefinitions.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
#include "valueconverter.h"
//! \copydoc gmx::AbstractOptionStorage::valueCount()
int valueCount() const override { return store_->valueCount(); }
//! \copydoc gmx::AbstractOptionStorage::defaultValues()
- std::vector<Variant> defaultValues() const override;
+ std::vector<Any> defaultValues() const override;
/*! \copydoc gmx::AbstractOptionStorage::defaultValuesAsStrings()
*
* OptionStorageTemplate implements handling of defaultValueIfSet()
* should be considered whether the implementation can be made strongly
* exception safe.
*/
- void convertValue(const Variant &value) override = 0;
+ void convertValue(const Any &value) override = 0;
/*! \brief
* Processes values for a set after all have been converted.
*
/*! \brief
* Provides derived classes access to the current list of values.
*
- * The non-const variant should only be used from processAll() in
+ * The non-const any should only be used from processAll() in
* derived classes if necessary.
*/
ArrayRef<T> values() { return store_->values(); }
{
}
- std::vector<Variant>
- normalizeValues(const std::vector<Variant> &values) const override
+ std::vector<Any>
+ normalizeValues(const std::vector<Any> &values) const override
{
const_cast<MyBase *>(this)->ensureConverterInitialized();
- std::vector<Variant> result;
+ std::vector<Any> result;
result.reserve(values.size());
for (const auto &value : values)
{
* This can be overridden to serialize a different type than `T`
* when using the option with KeyValueTreeObject.
*/
- virtual Variant normalizeValue(const T &value) const
+ virtual Any normalizeValue(const T &value) const
{
- return Variant::create<T>(processValue(value));
+ return Any::create<T>(processValue(value));
}
private:
- void convertValue(const Variant &variant) override
+ void convertValue(const Any &any) override
{
ensureConverterInitialized();
- this->addValue(processValue(converter_.convert(variant)));
+ this->addValue(processValue(converter_.convert(any)));
}
void ensureConverterInitialized()
{
template <typename T>
-std::vector<Variant> OptionStorageTemplate<T>::defaultValues() const
+std::vector<Any> OptionStorageTemplate<T>::defaultValues() const
{
- std::vector<Variant> result;
+ std::vector<Any> result;
if (hasFlag(efOption_NoDefaultValue))
{
return result;
"Current option implementation can only provide default values before assignment");
for (const auto &value : values())
{
- result.push_back(Variant::create<T>(value));
+ result.push_back(Any::create<T>(value));
}
return normalizeValues(result);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
{
return "";
}
- std::vector<gmx::Variant>
- normalizeValues(const std::vector<gmx::Variant> &values) const override
+ std::vector<gmx::Any>
+ normalizeValues(const std::vector<gmx::Any> &values) const override
{
return values;
}
- void convertValue(const gmx::Variant &value) override
+ void convertValue(const gmx::Any &value) override
{
convertValue(value.cast<std::string>());
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/options/basicoptions.h"
#include "gromacs/options/options.h"
#include "gromacs/options/optionsection.h"
+#include "gromacs/utility/any.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/stringutil.h"
-#include "gromacs/utility/variant.h"
#include "testutils/testasserts.h"
gmx::OptionsAssigner assigner(&options);
EXPECT_NO_THROW(assigner.start());
ASSERT_NO_THROW(assigner.startOption("p"));
- ASSERT_NO_THROW(assigner.appendValue(gmx::Variant::create<float>(2.7)));
+ ASSERT_NO_THROW(assigner.appendValue(gmx::Any::create<float>(2.7)));
EXPECT_NO_THROW(assigner.finishOption());
EXPECT_NO_THROW(assigner.finish());
EXPECT_NO_THROW(options.finish());
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
assigner_.startOption(prop.key().c_str());
try
{
- assigner_.appendValue(prop.value().asVariant());
+ assigner_.appendValue(prop.value().asAny());
}
catch (UserInputError &ex)
{
assigner_.startOption(key.c_str());
for (const KeyValueTreeValue &value : array.values())
{
- assigner_.appendValue(value.asVariant());
+ assigner_.appendValue(value.asAny());
}
assigner_.finishOption();
}
const std::string &name = option.name();
if (currentSourceObject_ == nullptr || !currentSourceObject_->keyExists(name))
{
- std::vector<Variant> values = option.defaultValues();
+ std::vector<Any> values = option.defaultValues();
if (values.size() == 1)
{
currentObjectBuilder_.addRawValue(name, std::move(values[0]));
else if (values.size() > 1)
{
auto arrayBuilder = currentObjectBuilder_.addArray(name);
- for (Variant &value : values)
+ for (Any &value : values)
{
arrayBuilder.addRawValue(std::move(value));
}
{
const KeyValueTreeValue &value = (*currentSourceObject_)[name];
GMX_RELEASE_ASSERT(!value.isObject(), "Value objects not supported in this context");
- std::vector<Variant> values;
+ std::vector<Any> values;
if (value.isArray())
{
for (const auto &arrayValue : value.asArray().values())
{
GMX_RELEASE_ASSERT(!value.isObject() && !value.isArray(),
"Complex values not supported in this context");
- values.push_back(arrayValue.asVariant());
+ values.push_back(arrayValue.asAny());
}
}
else
{
- values.push_back(value.asVariant());
+ values.push_back(value.asAny());
}
values = option.normalizeValues(values);
if (values.empty())
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016, by the GROMACS development team, led by
+ * Copyright (c) 2016,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <map>
#include <typeindex>
+#include "gromacs/utility/any.h"
#include "gromacs/utility/exceptions.h"
-#include "gromacs/utility/variant.h"
namespace gmx
{
/*! \libinternal \brief
- * Helper for converting from Variant to a given type.
+ * Helper for converting from Any to a given type.
*
* \tparam OutType Type this converter converts to.
*
* Default-constructed converter only supports identity mapping from the a
- * Variant holding `OutType`. To add support for additional input types,
+ * Any holding `OutType`. To add support for additional input types,
* provide conversion functions with addConverter(). To use a non-identity
* mapping for an `OutType` -> `OutType` conversion, provide an alternative
* conversion from `OutType` with addConverter().
{
public:
/*! \brief
- * Converts a Variant value to the output type.
+ * Converts a Any value to the output type.
*
* \returns Converted value.
- * \throws InvalidInputError If the input Variant has a type that is
+ * \throws InvalidInputError If the input Any has a type that is
* not recognized by any conversion.
*/
- OutType convert(const Variant &value) const
+ OutType convert(const Any &value) const
{
std::type_index type(value.type());
auto iter = converters_.find(type);
void addConverter(std::function<OutType(const InType &)> func)
{
converters_[std::type_index(typeid(InType))] =
- [func] (const Variant &value)
+ [func] (const Any &value)
{
return func(value.cast<InType>());
};
void addCastConversion()
{
converters_[std::type_index(typeid(InType))] =
- [] (const Variant &value)
+ [] (const Any &value)
{
return static_cast<OutType>(value.cast<InType>());
};
}
private:
- typedef std::function<OutType(const Variant &value)> ConversionFunction;
+ typedef std::function<OutType(const Any &value)> ConversionFunction;
std::map<std::type_index, ConversionFunction> converters_;
};
/* In parallel, store we need to extract localWeights from weights at DD time */
std::vector<real> &weights = ((cr && PAR(cr)) ? pg->globalWeights : pg->localWeights);
- const gmx_groups_t *groups = &mtop->groups;
+ const gmx_groups_t &groups = mtop->groups;
/* Count frozen dimensions and (weighted) mass */
int nfrozen = 0;
}
else
{
- if (groups->grpnr[egcTC] == nullptr)
+ if (groups.grpnr[egcTC] == nullptr)
{
mbd = ir->delta_t/ir->opts.tau_t[0];
}
else
{
- mbd = ir->delta_t/ir->opts.tau_t[groups->grpnr[egcTC][ii]];
+ mbd = ir->delta_t/ir->opts.tau_t[groups.grpnr[egcTC][ii]];
}
}
w *= m/mbd;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
OptionInfo &optionInfo() override { return info_; }
std::string typeString() const override { return "file"; }
int valueCount() const override { return 0; }
- std::vector<Variant> defaultValues() const override { return {}; }
+ std::vector<Any> defaultValues() const override { return {}; }
std::vector<std::string> defaultValuesAsStrings() const override { return {}; }
- std::vector<Variant>
- normalizeValues(const std::vector<Variant> &values) const override { return values; }
+ std::vector<Any>
+ normalizeValues(const std::vector<Any> &values) const override { return values; }
private:
void clearSet() override;
- void convertValue(const Variant &value) override;
+ void convertValue(const Any &value) override;
void processSet() override;
void processAll() override {}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
-std::vector<Variant>
-SelectionOptionStorage::normalizeValues(const std::vector<Variant> & /*values*/) const
+std::vector<Any>
+SelectionOptionStorage::normalizeValues(const std::vector<Any> & /*values*/) const
{
GMX_THROW(NotImplementedError("Selection options not supported in this context"));
}
}
-void SelectionOptionStorage::convertValue(const Variant &value)
+void SelectionOptionStorage::convertValue(const Any &value)
{
manager_.convertOptionValue(this, value.cast<std::string>(), false);
}
bValueParsed_ = false;
}
-void SelectionFileOptionStorage::convertValue(const Variant &value)
+void SelectionFileOptionStorage::convertValue(const Any &value)
{
if (bValueParsed_)
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
OptionInfo &optionInfo() override { return info_; }
std::string typeString() const override { return "selection"; }
std::string formatSingleValue(const Selection &value) const override;
- std::vector<Variant>
- normalizeValues(const std::vector<Variant> &values) const override;
+ std::vector<Any>
+ normalizeValues(const std::vector<Any> &values) const override;
/*! \brief
* Adds selections to the storage.
void setSelectionFlag(SelectionFlag flag, bool bSet);
private:
- void convertValue(const Variant &value) override;
+ void convertValue(const Any &value) override;
void processSetValues(ValueList *values) override;
void processAll() override;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* This file is part of the GROMACS molecular simulation package.
*
* Copyright (c) 1991-2006 David van der Spoel, Erik Lindahl, Berk Hess, University of Groningen.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
return wc;
}
-/* TODO: Should be called from finish_run() or runner()
- void wallcycle_destroy(gmx_wallcycle_t wc)
- {
+void wallcycle_destroy(gmx_wallcycle_t wc)
+{
if (wc == nullptr)
{
return;
sfree(wc->wcsc);
}
sfree(wc);
- }
- */
+}
static void wallcycle_all_start(gmx_wallcycle_t wc, int ewc, gmx_cycles_t cycle)
{
* Returns NULL when cycle counting is not supported.
*/
+/* cleans up wallcycle structure */
+void wallcycle_destroy(gmx_wallcycle_t wc);
+
void wallcycle_start(gmx_wallcycle_t wc, int ewc);
/* Starts the cycle counter (and increases the call count) */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2013, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
t_inputrec *ir[2];
t_state state[2];
gmx_mtop_t mtop[2];
- t_topology top[2];
int i;
ff[0] = fn1;
if (fn2)
{
cmp_inputrec(stdout, ir[0], ir[1], ftol, abstol);
- /* Convert gmx_mtop_t to t_topology.
- * We should implement direct mtop comparison,
- * but it might be useful to keep t_topology comparison as an option.
- */
- top[0] = gmx_mtop_t_to_t_topology(&mtop[0], false);
- top[1] = gmx_mtop_t_to_t_topology(&mtop[1], false);
- cmp_top(stdout, &top[0], &top[1], ftol, abstol);
- cmp_groups(stdout, &mtop[0].groups, &mtop[1].groups,
- mtop[0].natoms, mtop[1].natoms);
+ compareMtop(stdout, mtop[0], mtop[1], ftol, abstol);
comp_state(&state[0], &state[1], bRMSD, ftol, abstol);
}
else
{
comp_pull_AB(stdout, ir[0]->pull, ftol, abstol);
}
- /* Convert gmx_mtop_t to t_topology.
- * We should implement direct mtop comparison,
- * but it might be useful to keep t_topology comparison as an option.
- */
- top[0] = gmx_mtop_t_to_t_topology(&mtop[0], true);
- cmp_top(stdout, &top[0], nullptr, ftol, abstol);
+ compareMtopAB(stdout, mtop[0], ftol, abstol);
}
}
}
static void chk_trj(const gmx_output_env_t *oenv, const char *fn, const char *tpr, real tol)
{
- t_trxframe fr;
- t_count count;
- t_fr_time first, last;
- int j = -1, new_natoms, natoms;
- real old_t1, old_t2;
- gmx_bool bShowTimestep = TRUE, newline = FALSE;
- t_trxstatus *status;
- gmx_mtop_t mtop;
- gmx_localtop_t *top = nullptr;
- t_state state;
- t_inputrec ir;
+ t_trxframe fr;
+ t_count count;
+ t_fr_time first, last;
+ int j = -1, new_natoms, natoms;
+ real old_t1, old_t2;
+ gmx_bool bShowTimestep = TRUE, newline = FALSE;
+ t_trxstatus *status;
+ gmx_mtop_t mtop;
+ gmx_localtop_t top;
+ t_state state;
+ t_inputrec ir;
if (tpr)
{
read_tpx_state(tpr, &ir, &state, &mtop);
- top = gmx_mtop_generate_local_top(&mtop, ir.efep != efepNO);
+ gmx_mtop_generate_local_top(mtop, &top, ir.efep != efepNO);
}
new_natoms = -1;
natoms = -1;
natoms = new_natoms;
if (tpr)
{
- chk_bonds(&top->idef, ir.ePBC, fr.x, fr.box, tol);
+ chk_bonds(&top.idef, ir.ePBC, fr.x, fr.box, tol);
}
if (fr.bX)
{
gmx_bool bV, bX, bB, bFirst, bOut;
real r2, ekin, temp1, temp2, dist2, vdwfac2, bonlo2, bonhi2;
real *atom_vdw;
- gmx_atomprop_t aps;
fprintf(stderr, "Checking coordinate file %s\n", fn);
read_tps_conf(fn, &top, &ePBC, &x, &v, box, TRUE);
"relative to sum of Van der Waals distance:\n",
vdw_fac, bon_lo, bon_hi);
snew(atom_vdw, natom);
- aps = gmx_atomprop_init();
+ AtomProperties aps;
for (i = 0; (i < natom); i++)
{
- gmx_atomprop_query(aps, epropVDW,
- *(atoms->resinfo[atoms->atom[i].resind].name),
- *(atoms->atomname[i]), &(atom_vdw[i]));
+ aps.setAtomProperty(epropVDW,
+ *(atoms->resinfo[atoms->atom[i].resind].name),
+ *(atoms->atomname[i]), &(atom_vdw[i]));
if (debug)
{
fprintf(debug, "%5d %4s %4s %7g\n", i+1,
atom_vdw[i]);
}
}
- gmx_atomprop_destroy(aps);
if (bB)
{
set_pbc(&pbc, ePBC, box);
t_state state;
t_tpxheader tpx;
gmx_mtop_t mtop;
- gmx_groups_t *groups;
t_topology top;
read_tpxheader(fn, &tpx, TRUE);
pr_rvecs(stdout, indent, "v", tpx.bV ? state.v.rvec_array() : nullptr, state.natoms);
}
- groups = &mtop.groups;
+ const gmx_groups_t &groups = mtop.groups;
snew(gcount, egcNR);
for (i = 0; (i < egcNR); i++)
{
- snew(gcount[i], groups->grps[i].nr);
+ snew(gcount[i], groups.grps[i].nr);
}
for (i = 0; (i < mtop.natoms); i++)
{
atot = 0;
printf("%-12s: ", gtypes[i]);
- for (j = 0; (j < groups->grps[i].nr); j++)
+ for (j = 0; (j < groups.grps[i].nr); j++)
{
printf(" %5d", gcount[i][j]);
atot += gcount[i][j];
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2014,2015,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
)
if (BUILD_TESTING)
-# add_subdirectory(tests)
+ add_subdirectory(tests)
endif()
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cstdio>
#include <cstring>
+#include <algorithm>
+
+#include "gromacs/compat/make_unique.h"
#include "gromacs/math/functions.h"
#include "gromacs/math/utilities.h"
#include "gromacs/topology/residuetypes.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strdb.h"
-typedef struct {
- gmx_bool bSet;
- int nprop, maxprop;
- char *db;
- double def;
- char **atomnm;
- char **resnm;
- gmx_bool *bAvail;
- real *value;
-} aprop_t;
-
-typedef struct gmx_atomprop {
- gmx_bool bWarned, bWarnVDW;
- aprop_t prop[epropNR];
- gmx_residuetype_t *restype;
-} gmx_atomprop;
-
-
-
/* NOTFOUND should be smallest, others larger in increasing priority */
enum {
NOTFOUND = -4, WILDCARD, WILDPROT, PROTEIN
};
-/* return number of matching characters,
- or NOTFOUND if not at least all characters in char *database match */
-static int dbcmp_len(const char *search, const char *database)
+//! Basic entries in AtomProperty.
+struct BaseEntry {
+ //! Default constructor.
+ BaseEntry(const std::string &aName, const std::string &rName)
+ : atomName(aName), residueName(rName), isAvailable(false), value(0.0)
+ {}
+ //! Name for atom.
+ std::string atomName;
+ //! Name for residue.
+ std::string residueName;
+ //! Is property available.
+ bool isAvailable;
+ //! Value set for property.
+ real value;
+};
+
+//! Conglomeration of atom property entries.
+struct AtomProperty {
+ //! Has property been set.
+ bool isSet = false;
+ //! Database the property is coming from.
+ std::string db;
+ //! Default value for property.
+ double def = 0.0;
+ //! Basic entries for properties.
+ std::vector<BaseEntry> entry;
+};
+
+//! Implementation detail type for Atomproperties.
+class AtomProperties::Impl
{
- int i;
+ public:
+ //! Should user be warned about error.
+ bool bWarned = false;
+ //! Should user be warned about vdW not found.
+ bool bWarnVDW = false;
+ //! The different atom properties.
+ AtomProperty prop[epropNR];
+ //! The residue types.
+ ResidueType restype;
+};
- i = 0;
- while (search[i] && database[i] && (search[i] == database[i]) )
+/*! \brief
+ * Find number of matching characters in entry.
+ *
+ * If not all characters are matching, return NOTFOUND.
+ * If the length of the database entry is different from the search,
+ * also return NOTFOUND.
+ *
+ * \param[in] search Entry to compare to database.
+ * \param[in] database Name of the database entry to compare to.
+ * \returns Number of matching characters or NOTFOUND.
+ */
+static int compareToDatabase(const std::string &search, const std::string &database)
+{
+ if (database.length() > search.length())
{
- i++;
+ return NOTFOUND;
}
-
- if (database[i])
+ size_t matches = 0;
+ for (size_t i = 0; i < database.length(); i++)
+ {
+ if (search[i] == database[i])
+ {
+ matches++;
+ }
+ }
+ if (matches == database.length())
{
- i = NOTFOUND;
+ return matches;
+ }
+ else
+ {
+ return NOTFOUND;
}
- return i;
}
-static int get_prop_index(aprop_t *ap, gmx_residuetype_t *restype,
- char *resnm, char *atomnm,
- gmx_bool *bExact)
+/*! \brief
+ * Finds the index for the property being searched.
+ *
+ * \param[in] ap Property to search for.
+ * \param[in] restype Residuetypes in database.
+ * \param[in] residueName The name of the residue to look for.
+ * \param[in] atomName The name of the atom to look for.
+ * \param[in] bExact Do we have the correct match.
+ * \returns The index for the property.
+ */
+static int findPropertyIndex(AtomProperty *ap, ResidueType *restype,
+ const std::string &residueName, const std::string &atomName,
+ gmx_bool *bExact)
{
- int i, j = NOTFOUND;
- long int alen, rlen;
- long int malen, mrlen;
- gmx_bool bProtein, bProtWild;
-
- bProtein = gmx_residuetype_is_protein(restype, resnm);
- bProtWild = (strcmp(resnm, "AAA") == 0);
- malen = NOTFOUND;
- mrlen = NOTFOUND;
- for (i = 0; (i < ap->nprop); i++)
+ int j = NOTFOUND;
+
+ bool bProtein = restype->namedResidueHasType(residueName, "Protein");
+ bool bProtWild = residueName == "AAA";
+ int malen = NOTFOUND;
+ int mrlen = NOTFOUND;
+ for (size_t i = 0; (i < ap->entry.size()); i++)
{
- rlen = dbcmp_len(resnm, ap->resnm[i]);
+ int rlen = compareToDatabase(residueName, ap->entry[i].residueName);
if (rlen == NOTFOUND)
{
- if ( (strcmp(ap->resnm[i], "*") == 0) ||
- (strcmp(ap->resnm[i], "???") == 0) )
+ if ( (ap->entry[i].residueName == "*") ||
+ (ap->entry[i].residueName == "???") )
{
rlen = WILDCARD;
}
- else if (strcmp(ap->resnm[i], "AAA") == 0)
+ else if (ap->entry[i].residueName == "AAA")
{
rlen = WILDPROT;
}
}
- alen = dbcmp_len(atomnm, ap->atomnm[i]);
+ int alen = compareToDatabase(atomName, ap->entry[i].atomName);
if ( (alen > NOTFOUND) && (rlen > NOTFOUND))
{
if ( ( (alen > malen) && (rlen >= mrlen)) ||
}
}
- *bExact = ((malen == static_cast<long int>(strlen(atomnm))) &&
- ((mrlen == static_cast<long int>(strlen(resnm))) ||
+ *bExact = ((malen == static_cast<long int>(atomName.length())) &&
+ ((mrlen == static_cast<long int>(residueName.length())) ||
((mrlen == WILDPROT) && bProtWild) ||
((mrlen == WILDCARD) && !bProtein && !bProtWild)));
if (debug)
{
- fprintf(debug, "searching residue: %4s atom: %4s\n", resnm, atomnm);
+ fprintf(debug, "searching residue: %4s atom: %4s\n", residueName.c_str(),
+ atomName.c_str());
if (j == NOTFOUND)
{
fprintf(debug, " not successful\n");
}
else
{
- fprintf(debug, " match: %4s %4s\n", ap->resnm[j], ap->atomnm[j]);
+ fprintf(debug, " match: %4s %4s\n",
+ ap->entry[j].residueName.c_str(), ap->entry[j].atomName.c_str());
}
}
return j;
}
-static void add_prop(aprop_t *ap, gmx_residuetype_t *restype,
- char *resnm, char *atomnm,
- real p, int line)
+/*! \brief
+ * Add new property to list.
+ *
+ * \param[in] ap Atomproperty to add.
+ * \param[in] restype Residue type database to use.
+ * \param[in] residueName Name of the residue.
+ * \param[in] atomName Name of the atom.
+ * \param[in] propValue Value of property.
+ * \param[in] line Where to add property.
+ */
+static void addProperty(AtomProperty *ap, ResidueType *restype,
+ const std::string &residueName, const std::string &atomName,
+ real propValue, int line)
{
- int i, j;
- gmx_bool bExact;
-
- j = get_prop_index(ap, restype, resnm, atomnm, &bExact);
+ bool bExact;
+ int j = findPropertyIndex(ap, restype, residueName, atomName, &bExact);
if (!bExact)
{
- if (ap->nprop >= ap->maxprop)
- {
- ap->maxprop += 10;
- srenew(ap->resnm, ap->maxprop);
- srenew(ap->atomnm, ap->maxprop);
- srenew(ap->value, ap->maxprop);
- srenew(ap->bAvail, ap->maxprop);
- for (i = ap->nprop; (i < ap->maxprop); i++)
- {
- ap->atomnm[i] = nullptr;
- ap->resnm[i] = nullptr;
- ap->value[i] = 0;
- ap->bAvail[i] = FALSE;
- }
- }
- ap->atomnm[ap->nprop] = gmx_strdup(atomnm);
- ap->resnm[ap->nprop] = gmx_strdup(resnm);
- j = ap->nprop;
- ap->nprop++;
+ ap->entry.emplace_back(BaseEntry(atomName, residueName));
+
+ j = ap->entry.size() - 1;
}
- if (ap->bAvail[j])
+ if (ap->entry[j].isAvailable)
{
- if (ap->value[j] == p)
+ if (ap->entry[j].value == propValue)
{
fprintf(stderr, "Warning double identical entries for %s %s %g on line %d in file %s\n",
- resnm, atomnm, p, line, ap->db);
+ residueName.c_str(), atomName.c_str(), propValue, line, ap->db.c_str());
}
else
{
fprintf(stderr, "Warning double different entries %s %s %g and %g on line %d in file %s\n"
"Using last entry (%g)\n",
- resnm, atomnm, p, ap->value[j], line, ap->db, p);
- ap->value[j] = p;
+ residueName.c_str(), atomName.c_str(),
+ propValue, ap->entry[j].value, line, ap->db.c_str(), propValue);
+ ap->entry[j].value = propValue;
}
}
else
{
- ap->bAvail[j] = TRUE;
- ap->value[j] = p;
+ ap->entry[j].isAvailable = TRUE;
+ ap->entry[j].value = propValue;
}
}
-static void read_prop(gmx_atomprop_t aps, int eprop, double factor)
+/*! \brief
+ * Read property value into structure.
+ *
+ * \param[in] ap Atomproperty to be read in.
+ * \param[in] restype Library of residue types.
+ * \param[in] factor Scaling factor for property.
+ */
+static void readProperty(AtomProperty *ap, ResidueType *restype, double factor)
{
- gmx_atomprop *ap2 = static_cast<gmx_atomprop*>(aps);
char line[STRLEN], resnm[32], atomnm[32];
- double pp;
- int line_no;
- aprop_t *ap;
-
- ap = &ap2->prop[eprop];
- gmx::FilePtr fp = gmx::openLibraryFile(ap->db);
- line_no = 0;
+ gmx::FilePtr fp = gmx::openLibraryFile(ap->db);
+ int line_no = 0;
while (get_a_line(fp.get(), line, STRLEN))
{
line_no++;
+ double pp;
if (sscanf(line, "%31s %31s %20lf", resnm, atomnm, &pp) == 3)
{
pp *= factor;
- add_prop(ap, aps->restype, resnm, atomnm, pp, line_no);
+ addProperty(ap, restype, resnm, atomnm, pp, line_no);
}
else
{
fprintf(stderr, "WARNING: Error in file %s at line %d ignored\n",
- ap->db, line_no);
+ ap->db.c_str(), line_no);
}
}
- ap->bSet = TRUE;
+ ap->isSet = TRUE;
}
-static void set_prop(gmx_atomprop_t aps, int eprop)
+/*! \brief
+ * Set value for properties.
+ *
+ * \param[in] ap Atomproperty to set.
+ * \param[in] restype Library of residue types.
+ * \param[in] eprop Which property to set.
+ * \param[in] haveBeenWarned If we already set a warning before
+ * \returns True of warning should be printed.
+ */
+static bool setProperties(AtomProperty *ap, ResidueType *restype, int eprop, bool haveBeenWarned)
{
- gmx_atomprop *ap2 = static_cast<gmx_atomprop*>(aps);
- const char *fns[epropNR] = { "atommass.dat", "vdwradii.dat", "dgsolv.dat", "electroneg.dat", "elements.dat" };
- double fac[epropNR] = { 1.0, 1.0, 418.4, 1.0, 1.0 };
- double def[epropNR] = { 12.011, 0.14, 0.0, 2.2, -1 };
- aprop_t *ap;
-
- ap = &ap2->prop[eprop];
- if (!ap->bSet)
+ const char *fns[epropNR] = { "atommass.dat", "vdwradii.dat", "dgsolv.dat", "electroneg.dat", "elements.dat" };
+ double fac[epropNR] = { 1.0, 1.0, 418.4, 1.0, 1.0 };
+ double def[epropNR] = { 12.011, 0.14, 0.0, 2.2, -1 };
+
+ bool printWarning = false;
+ if (!ap->isSet)
{
- ap->db = gmx_strdup(fns[eprop]);
+ ap->db = fns[eprop];
ap->def = def[eprop];
- read_prop(aps, eprop, fac[eprop]);
+ readProperty(ap, restype, fac[eprop]);
if (debug)
{
- fprintf(debug, "Entries in %s: %d\n", ap->db, ap->nprop);
+ fprintf(debug, "Entries in %s: %zu\n", ap->db.c_str(), ap->entry.size());
}
- if ( ( (!aps->bWarned) && (eprop == epropMass) ) || (eprop == epropVDW))
+ if ( (!haveBeenWarned && (eprop == epropMass) ) || (eprop == epropVDW))
{
- printf("\n"
- "WARNING: Masses and atomic (Van der Waals) radii will be guessed\n"
- " based on residue and atom names, since they could not be\n"
- " definitively assigned from the information in your input\n"
- " files. These guessed numbers might deviate from the mass\n"
- " and radius of the atom type. Please check the output\n"
- " files if necessary.\n\n");
- aps->bWarned = TRUE;
+ printWarning = true;
}
+
}
+ return printWarning;
}
-gmx_atomprop_t gmx_atomprop_init()
+AtomProperties::AtomProperties()
+ : impl_(new Impl)
{
- gmx_atomprop *aps;
-
- snew(aps, 1);
-
- gmx_residuetype_init(&aps->restype);
- aps->bWarned = FALSE;
- aps->bWarnVDW = FALSE;
-
- return static_cast<gmx_atomprop_t>(aps);
}
-static void destroy_prop(aprop_t *ap)
+AtomProperties::~AtomProperties()
{
- int i;
-
- if (ap->bSet)
- {
- sfree(ap->db);
-
- for (i = 0; i < ap->nprop; i++)
- {
- sfree(ap->atomnm[i]);
- sfree(ap->resnm[i]);
- }
- sfree(ap->atomnm);
- sfree(ap->resnm);
- sfree(ap->bAvail);
- sfree(ap->value);
- }
}
-void gmx_atomprop_destroy(gmx_atomprop_t aps)
+AtomProperty *AtomProperties::prop(int eprop)
{
- gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
- int p;
-
- if (aps == nullptr)
- {
- printf("\nWARNING: gmx_atomprop_destroy called with a NULL pointer\n\n");
- return;
- }
-
- for (p = 0; p < epropNR; p++)
- {
- destroy_prop(&ap->prop[p]);
- }
+ return &impl_->prop[eprop];
+}
- gmx_residuetype_destroy(ap->restype);
+ResidueType *AtomProperties::restype()
+{
+ return &impl_->restype;
+}
- sfree(ap);
+//! Print warning that vdW radii and masses are guessed.
+static void printWarning()
+{
+ printf("\n"
+ "WARNING: Masses and atomic (Van der Waals) radii will be guessed\n"
+ " based on residue and atom names, since they could not be\n"
+ " definitively assigned from the information in your input\n"
+ " files. These guessed numbers might deviate from the mass\n"
+ " and radius of the atom type. Please check the output\n"
+ " files if necessary.\n\n");
}
-static void vdw_warning(FILE *fp)
+static void printvdwWarning(FILE *fp)
{
if (nullptr != fp)
{
}
}
-gmx_bool gmx_atomprop_query(gmx_atomprop_t aps,
- int eprop, const char *resnm, const char *atomnm,
- real *value)
+bool AtomProperties::setAtomProperty(int eprop,
+ const std::string &residueName,
+ const std::string &atomName,
+ real *value)
{
- gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
int j;
-#define MAXQ 32
- char atomname[MAXQ], resname[MAXQ];
+ std::string tmpAtomName, tmpResidueName;
gmx_bool bExact;
- set_prop(aps, eprop);
- if ((strlen(atomnm) > MAXQ-1) || (strlen(resnm) > MAXQ-1))
+ if (setProperties(prop(eprop), restype(), eprop, impl_->bWarned))
{
- if (debug)
- {
- fprintf(debug, "WARNING: will only compare first %d characters\n",
- MAXQ-1);
- }
+ printWarning();
+ impl_->bWarned = true;
}
- if (isdigit(atomnm[0]))
+ if (isdigit(atomName[0]))
{
- int i;
/* put digit after atomname */
- for (i = 1; i < MAXQ-1 && atomnm[i] != '\0'; i++)
- {
- atomname[i-1] = atomnm[i];
- }
- atomname[i-1] = atomnm[0];
- atomname[i] = '\0';
+ tmpAtomName.append(atomName.substr(1));
+ tmpAtomName.append(1, atomName[0]);
}
else
{
- strncpy(atomname, atomnm, MAXQ-1);
+ tmpAtomName = atomName;
}
- strncpy(resname, resnm, MAXQ-1);
-
- j = get_prop_index(&(ap->prop[eprop]), ap->restype, resname,
- atomname, &bExact);
+ j = findPropertyIndex(&(impl_->prop[eprop]), &impl_->restype, residueName,
+ tmpAtomName, &bExact);
- if (eprop == epropVDW && !ap->bWarnVDW)
+ if (eprop == epropVDW && !impl_->bWarnVDW)
{
- vdw_warning(stdout);
- ap->bWarnVDW = TRUE;
+ printvdwWarning(stdout);
+ impl_->bWarnVDW = true;
}
if (j >= 0)
{
- *value = ap->prop[eprop].value[j];
- return TRUE;
+ *value = impl_->prop[eprop].entry[j].value;
+ return true;
}
else
{
- *value = ap->prop[eprop].def;
- return FALSE;
+ *value = impl_->prop[eprop].def;
+ return false;
}
}
-char *gmx_atomprop_element(gmx_atomprop_t aps, int atomnumber)
-{
- gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
- int i;
- set_prop(aps, epropElement);
- for (i = 0; (i < ap->prop[epropElement].nprop); i++)
+const std::string AtomProperties::elementFromAtomNumber(int atomNumber)
+{
+ if (setProperties(prop(epropElement), restype(), epropElement, impl_->bWarned))
{
- if (std::round(ap->prop[epropElement].value[i]) == atomnumber)
+ printWarning();
+ impl_->bWarned = true;
+ }
+ for (const auto &e : prop(epropElement)->entry)
+ {
+ if (std::round(e.value) == atomNumber)
{
- return ap->prop[epropElement].atomnm[i];
+ return e.atomName;
}
}
- return nullptr;
+ return "";
}
-int gmx_atomprop_atomnumber(gmx_atomprop_t aps, const char *elem)
+int AtomProperties::atomNumberFromElement(const char *element)
{
- gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
- int i;
-
- set_prop(aps, epropElement);
- for (i = 0; (i < ap->prop[epropElement].nprop); i++)
+ if (setProperties(prop(epropElement), restype(), epropElement, impl_->bWarned))
+ {
+ printWarning();
+ impl_->bWarned = true;
+ }
+ for (const auto &e : prop(epropElement)->entry)
{
- if (gmx_strcasecmp(ap->prop[epropElement].atomnm[i], elem) == 0)
+ if (gmx_strcasecmp(e.atomName.c_str(), element) == 0)
{
- return gmx::roundToInt(ap->prop[epropElement].value[i]);
+ return gmx::roundToInt(e.value);
}
}
return -1;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_TOPOLOGY_ATOMPROP_H
#define GMX_TOPOLOGY_ATOMPROP_H
+#include <string>
+
#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
#include "gromacs/utility/real.h"
-/* Abstract type for the atom property database */
-typedef struct gmx_atomprop *gmx_atomprop_t;
-
enum {
epropMass, epropVDW, epropDGsol, epropElectroneg, epropElement,
epropNR
};
-gmx_atomprop_t gmx_atomprop_init();
-/* Initializes and returns the atom properties struct */
-
-void gmx_atomprop_destroy(gmx_atomprop_t aps);
-/* Get rid of memory after use */
+struct AtomProperty;
+class ResidueType;
+/*! \brief
+ * Holds all the atom property information loaded.
+ */
+class AtomProperties
+{
+ public:
+ //! Default constructor.
+ AtomProperties();
+ //! Default destructor
+ ~AtomProperties();
-char *gmx_atomprop_element(gmx_atomprop_t aps, int atomnumber);
+ /*! \brief
+ * Get element string from atom number.
+ *
+ * \param[in] atomNumber Atomnumber to check.
+ * \returns Name of the element.
+ *
+ * \todo This should be made const once the lazy
+ * implementation is done properly for the class.
+ */
+ const std::string elementFromAtomNumber(int atomNumber);
+ /*! \brief
+ * Get atom number from element string.
+ *
+ * \param[in] element Name of element.
+ * \returns AtomNumber that was being looked for.
+ *
+ * \todo This should be made const once the lazy
+ * implementation is done properly for the class.
+ */
+ int atomNumberFromElement(const char *element);
+ /*! \brief
+ * Set atom property based on atomname.
+ *
+ * Extract a \p value from the database. Returns true
+ * if this is successful, or false if not. Sets default value
+ * in the later case. The first time this function is called
+ * for this property the database will be initialized.
+ *
+ * \param[in] eprop Property to set.
+ * \param[in] residueName Residue name for entry.
+ * \param[in] atomName Atom name for entry.
+ * \param[out] value New value to set or default.
+ * \returns If the operation has been succesful.
+ */
+ bool setAtomProperty(int eprop,
+ const std::string &residueName,
+ const std::string &atomName,
+ real *value);
+ /*! \brief
+ * Get handle to property.
+ *
+ * \param[in] eprop Which property we need a handle to.
+ * \returns Pointer to property entry.
+ */
+ AtomProperty *prop(int eprop);
+ //! Get handle to residuetype library.
+ ResidueType *restype();
-int gmx_atomprop_atomnumber(gmx_atomprop_t aps, const char *element);
+ private:
+ //! Implementation pointer.
+ class Impl;
-gmx_bool gmx_atomprop_query(gmx_atomprop_t aps,
- int eprop, const char *resnm, const char *atomnm,
- real *value);
-/* Extract a value from the database. Returns TRUE on succes,
- * FALSE otherwise. In the latter case, value is a deafult value.
- * The first time this function is called for this property
- * the database will be read.
- */
+ gmx::PrivateImplPointer<Impl> impl_;
+};
#endif
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
}
-static void cmp_atom(FILE *fp, int index, const t_atom *a1, const t_atom *a2, real ftol, real abstol)
+static void compareAtom(FILE *fp, int index, const t_atom *a1, const t_atom *a2, real relativeTolerance, real absoluteTolerance)
{
if (a2)
{
cmp_us(fp, "atom.ptype", index, a1->ptype, a2->ptype);
cmp_int(fp, "atom.resind", index, a1->resind, a2->resind);
cmp_int(fp, "atom.atomnumber", index, a1->atomnumber, a2->atomnumber);
- cmp_real(fp, "atom.m", index, a1->m, a2->m, ftol, abstol);
- cmp_real(fp, "atom.q", index, a1->q, a2->q, ftol, abstol);
+ cmp_real(fp, "atom.m", index, a1->m, a2->m, relativeTolerance, absoluteTolerance);
+ cmp_real(fp, "atom.q", index, a1->q, a2->q, relativeTolerance, absoluteTolerance);
cmp_us(fp, "atom.typeB", index, a1->typeB, a2->typeB);
- cmp_real(fp, "atom.mB", index, a1->mB, a2->mB, ftol, abstol);
- cmp_real(fp, "atom.qB", index, a1->qB, a2->qB, ftol, abstol);
+ cmp_real(fp, "atom.mB", index, a1->mB, a2->mB, relativeTolerance, absoluteTolerance);
+ cmp_real(fp, "atom.qB", index, a1->qB, a2->qB, relativeTolerance, absoluteTolerance);
+ cmp_str(fp, "elem", index, a1->elem, a2->elem);
+
}
else
{
cmp_us(fp, "atom.type", index, a1->type, a1->typeB);
- cmp_real(fp, "atom.m", index, a1->m, a1->mB, ftol, abstol);
- cmp_real(fp, "atom.q", index, a1->q, a1->qB, ftol, abstol);
+ cmp_real(fp, "atom.m", index, a1->m, a1->mB, relativeTolerance, absoluteTolerance);
+ cmp_real(fp, "atom.q", index, a1->q, a1->qB, relativeTolerance, absoluteTolerance);
}
}
-void cmp_atoms(FILE *fp, const t_atoms *a1, const t_atoms *a2, real ftol, real abstol)
+static void compareResinfo(FILE *fp, int residue, const t_resinfo &r1, const t_resinfo &r2)
{
- int i;
+ fprintf(fp, "comparing t_resinfo\n");
+ cmp_str(fp, "name", residue, *r1.name, *r2.name);
+ cmp_int(fp, "nr", residue, r1.nr, r2.nr);
+ cmp_uc(fp, "ic", residue, r1.ic, r2.ic);
+ cmp_int(fp, "chainnum", residue, r1.chainnum, r2.chainnum);
+ cmp_uc(fp, "chainid", residue, r1.chainid, r2.chainid);
+ if ((r1.rtp || r2.rtp ) && (!r1.rtp || !r2.rtp))
+ {
+ fprintf(fp, "rtp info is present in topology %d but not in the other\n", r1.rtp ? 1 : 2);
+ }
+ if (r1.rtp && r2.rtp)
+ {
+ cmp_str(fp, "rtp", residue, *r1.rtp, *r2.rtp);
+ }
+}
+
+static void comparePdbinfo(FILE *fp, int pdb, const t_pdbinfo &pdb1, const t_pdbinfo &pdb2, real relativeTolerance, real absoluteTolerance)
+{
+ fprintf(fp, "comparing t_pdbinfo\n");
+ cmp_int(fp, "type", pdb, pdb1.type, pdb2.type);
+ cmp_int(fp, "atomnr", pdb, pdb1.atomnr, pdb2.atomnr);
+ cmp_uc(fp, "altloc", pdb, pdb1.altloc, pdb2.altloc);
+ cmp_str(fp, "atomnm", pdb, pdb1.atomnm, pdb2.atomnm);
+ cmp_real(fp, "occup", pdb, pdb1.occup, pdb2.occup, relativeTolerance, absoluteTolerance);
+ cmp_real(fp, "bfac", pdb, pdb1.bfac, pdb2.bfac, relativeTolerance, absoluteTolerance);
+ cmp_bool(fp, "bAnistropic", pdb, pdb1.bAnisotropic, pdb2.bAnisotropic);
+ for (int i = 0; i < 6; i++)
+ {
+ std::string buf = gmx::formatString("uij[%d]", i);
+ cmp_int(fp, buf.c_str(), pdb, pdb1.uij[i], pdb2.uij[i]);
+ }
+}
+
+void compareAtoms(FILE *fp,
+ const t_atoms *a1,
+ const t_atoms *a2,
+ real relativeTolerance,
+ real absoluteTolerance)
+{
fprintf(fp, "comparing atoms\n");
if (a2)
{
cmp_int(fp, "atoms->nr", -1, a1->nr, a2->nr);
- for (i = 0; i < std::min(a1->nr, a2->nr); i++)
+ cmp_int(fp, "atoms->nres", -1, a1->nres, a2->nres);
+ cmp_bool(fp, "atoms->haveMass", -1, a1->haveMass, a2->haveMass);
+ cmp_bool(fp, "atoms->haveCharge", -1, a1->haveCharge, a2->haveCharge);
+ cmp_bool(fp, "atoms->haveType", -1, a1->haveType, a2->haveType);
+ cmp_bool(fp, "atoms->haveBState", -1, a1->haveBState, a2->haveBState);
+ cmp_bool(fp, "atoms->havePdbInfo", -1, a1->havePdbInfo, a2->havePdbInfo);
+ for (int i = 0; i < std::min(a1->nr, a2->nr); i++)
+ {
+ compareAtom(fp, i, &(a1->atom[i]), &(a2->atom[i]), relativeTolerance, absoluteTolerance);
+ if (a1->atomname && a2->atomname)
+ {
+ cmp_str(fp, "atomname", i, *a1->atomname[i], *a2->atomname[i]);
+ }
+ if (a1->havePdbInfo && a2->havePdbInfo)
+ {
+ comparePdbinfo(fp, i, a1->pdbinfo[i], a2->pdbinfo[i], relativeTolerance, absoluteTolerance);
+ }
+ if (a1->haveType && a2->haveType)
+ {
+ cmp_str(fp, "atomtype", i, *a1->atomtype[i], *a2->atomtype[i]);
+ }
+ if (a1->haveBState && a2->haveBState)
+ {
+ cmp_str(fp, "atomtypeB", i, *a1->atomtypeB[i], *a2->atomtypeB[i]);
+ }
+ }
+ for (int i = 0; i < std::min(a1->nres, a2->nres); i++)
{
- cmp_atom(fp, i, &(a1->atom[i]), &(a2->atom[i]), ftol, abstol);
+ compareResinfo(fp, i, a1->resinfo[i], a2->resinfo[i]);
}
}
else
{
- for (i = 0; (i < a1->nr); i++)
+ for (int i = 0; (i < a1->nr); i++)
{
- cmp_atom(fp, i, &(a1->atom[i]), nullptr, ftol, abstol);
+ compareAtom(fp, i, &(a1->atom[i]), nullptr, relativeTolerance, absoluteTolerance);
}
}
}
int maxWarn = (printMissingMasses ? 10 : 0);
int numWarn = 0;
- gmx_atomprop_t aps = gmx_atomprop_init();
+ AtomProperties aps;
- gmx_bool haveMass = TRUE;
+ bool haveMass = true;
for (int i = 0; i < atoms->nr; i++)
{
- if (!gmx_atomprop_query(aps, epropMass,
- *atoms->resinfo[atoms->atom[i].resind].name,
- *atoms->atomname[i],
- &atoms->atom[i].m))
+ if (!aps.setAtomProperty(epropMass,
+ *atoms->resinfo[atoms->atom[i].resind].name,
+ *atoms->atomname[i],
+ &atoms->atom[i].m))
{
- haveMass = FALSE;
+ haveMass = false;
if (numWarn < maxWarn)
{
}
}
atoms->haveMass = haveMass;
-
- gmx_atomprop_destroy(aps);
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
void pr_atomtypes(FILE *fp, int indent, const char *title,
const t_atomtypes *atomtypes, gmx_bool bShowNumbers);
-void cmp_atoms(FILE *fp, const t_atoms *a1, const t_atoms *a2, real ftol, real abstol);
+/*! \brief Compare information in the t_atoms data structure.
+ *
+ * \param[in] fp Pointer to file to write to.
+ * \param[in] a1 Pointer to first data structure to compare.
+ * \param[in] a2 Pointer to second data structure or nullptr.
+ * \param[in] relativeTolerance Relative floating point comparison tolerance.
+ * \param[in] absoluteTolerance Absolute floating point comparison tolerance.
+ */
+void compareAtoms(FILE *fp,
+ const t_atoms *a1,
+ const t_atoms *a2,
+ real relativeTolerance,
+ real absoluteTolerance);
/*! \brief Set mass for each atom using the atom and residue names using a database
*
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
block->index[0] = 0;
}
+void init_block_null(t_block *block)
+{
+ block->nr = 0;
+ block->nalloc_index = 0;
+ block->index = nullptr;
+}
+
void init_blocka(t_blocka *block)
{
block->nr = 0;
block->a = nullptr;
}
+void init_blocka_null(t_blocka *block)
+{
+ block->nr = 0;
+ block->nra = 0;
+ block->nalloc_index = 0;
+ block->index = nullptr;
+ block->nalloc_a = 0;
+ block->a = nullptr;
+}
+
t_blocka *new_blocka()
{
t_blocka *block;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
int nalloc_a; /* The allocation size for a */
};
+/*! \brief
+ * Fully initialize t_block datastructure.
+ *
+ * Initializes a \p block and sets up the first index to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
void init_block(t_block *block);
+
+/*! \brief
+ * Fully initialize t_blocka datastructure.
+ *
+ * Initializes a \p block and sets up the first index to zero.
+ * The atom number array is initialized to nullptr.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
void init_blocka(t_blocka *block);
+
+/* TODO
+ * In general all t_block datastructures should be avoided
+ * in favour of RangePartitioning. This here is a simple cludge
+ * to use more modern initialization while we move to the use
+ * of RangePartitioning.
+ */
+
+/*! \brief
+ * Minimal initialization of t_block datastructure.
+ *
+ * Performs the equivalent to a snew on a t_block, setting all
+ * values to zero or nullptr. Needed for some cases where the topology
+ * handling expects a block to be valid initialized (e.g. during domain
+ * decomposition) but without the first block set to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
+void init_block_null(t_block *block);
+
+/*! \brief
+ * Minimal initialization of t_blocka datastructure.
+ *
+ * Performs the equivalent to a snew on a t_blocka, setting all
+ * values to zero or nullptr. Needed for some cases where the topology
+ * handling expects a block to be valid initialized (e.g. during domain
+ * decomposition) but without the first block set to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
+void init_blocka_null(t_blocka *block);
+
t_blocka *new_blocka();
/* allocate new block */
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
gmx_ffclose(out);
}
-void add_grp(t_blocka *b, char ***gnames, int nra, const int a[], const char *name)
+void add_grp(t_blocka *b, char ***gnames, gmx::ArrayRef<const int> a, const std::string &name)
{
- int i;
-
srenew(b->index, b->nr+2);
srenew(*gnames, b->nr+1);
- (*gnames)[b->nr] = gmx_strdup(name);
+ (*gnames)[b->nr] = gmx_strdup(name.c_str());
- srenew(b->a, b->nra+nra);
- for (i = 0; (i < nra); i++)
+ srenew(b->a, b->nra+a.size());
+ for (int i = 0; (i < a.size()); i++)
{
b->a[b->nra++] = a[i];
}
b->index[b->nr] = b->nra;
}
-/* compare index in `a' with group in `b' at `index',
- when `index'<0 it is relative to end of `b' */
-static gmx_bool grp_cmp(t_blocka *b, int nra, const int a[], int index)
+/*! \brief
+ * Compare index in groups.
+ *
+ * Checks the index in \p a to the one in \p b at \p index.
+ * If \p index is < 0, it is taken as relative to the end of \p b.
+ *
+ * \param[in] b Block with groups.
+ * \param[in] a New group to compare to.
+ * \param[in] index The index to check.
+ * \returns True if groups are the same.
+ */
+static bool grp_cmp(t_blocka *b, gmx::ArrayRef<const int> a, int index)
{
- int i;
-
if (index < 0)
{
index = b->nr-1+index;
gmx_fatal(FARGS, "no such index group %d in t_blocka (nr=%d)", index, b->nr);
}
/* compare sizes */
- if (nra != b->index[index+1] - b->index[index])
+ if (a.size() != b->index[index+1] - b->index[index])
{
return FALSE;
}
- for (i = 0; i < nra; i++)
+ for (int i = 0; i < a.size(); i++)
{
if (a[i] != b->a[b->index[index]+i])
{
- return FALSE;
+ return false;
}
}
- return TRUE;
+ return true;
}
-
-static void
-p_status(const char *const *restype, int nres,
- const char *const *typenames, int ntypes)
+//! Print out how many residues of a certain type are present.
+static void p_status(gmx::ArrayRef<const std::string> restype,
+ gmx::ArrayRef<const std::string> typenames)
{
- int i, j;
- int * counter;
-
- snew(counter, ntypes);
- for (i = 0; i < ntypes; i++)
- {
- counter[i] = 0;
- }
- for (i = 0; i < nres; i++)
- {
- for (j = 0; j < ntypes; j++)
- {
- if (!gmx_strcasecmp(restype[i], typenames[j]))
- {
- counter[j]++;
- }
- }
- }
-
- for (i = 0; (i < ntypes); i++)
+ std::vector<int> counter(typenames.size(), 0);
+ std::transform(typenames.begin(), typenames.end(), counter.begin(),
+ [&restype](const std::string &typenm) {
+ return std::count_if(restype.begin(), restype.end(),
+ [&typenm](const std::string &res) {
+ return gmx_strcasecmp(res.c_str(), typenm.c_str()) == 0;
+ }
+ );
+ }
+ );
+
+ for (int i = 0; (i < typenames.size()); i++)
{
if (counter[i] > 0)
{
- printf("There are: %5d %10s residues\n", counter[i], typenames[i]);
+ printf("There are: %5d %10s residues\n", counter[i], typenames[i].c_str());
}
}
-
- sfree(counter);
}
-
-static int *
-mk_aid(const t_atoms *atoms, const char ** restype, const char * typestring, int *nra, gmx_bool bMatch)
-/* Make an array of ints for all atoms with residuetypes matching typestring, or the opposite if bMatch is false */
+/*! \brief
+ * Return a new group of atoms with \p restype that match \p typestring,
+ * or not matching if \p bMatch.
+ *
+ * \param[in] atoms Atoms data to use.
+ * \param[in] restype Residuetypes to match.
+ * \param[in] typestring Which type the residue should have.
+ * \param[in] bMatch whether to return matching atoms or those that don't.
+ * \returns Vector of atoms that match.
+ */
+static std::vector<int> mk_aid(const t_atoms *atoms,
+ gmx::ArrayRef<const std::string> restype,
+ const std::string &typestring,
+ bool bMatch)
{
- int *a;
- int i;
- bool res;
-
- snew(a, atoms->nr);
- *nra = 0;
- for (i = 0; (i < atoms->nr); i++)
+ std::vector<int> a;
+ for (int i = 0; (i < atoms->nr); i++)
{
- res = gmx_strcasecmp(restype[atoms->atom[i].resind], typestring) == 0;
+ bool res = gmx_strcasecmp(restype[atoms->atom[i].resind].c_str(), typestring.c_str()) == 0;
if (!bMatch)
{
res = !res;
}
if (res)
{
- a[(*nra)++] = i;
+ a.push_back(i);
}
}
char *gname;
} restp_t;
-static void analyse_other(const char ** restype, const t_atoms *atoms,
+static void analyse_other(gmx::ArrayRef<std::string> restype, const t_atoms *atoms,
t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
{
restp_t *restp = nullptr;
char **attp = nullptr;
char *rname, *aname;
- int *aid, *aaid;
- int i, j, k, l, resind, naid, naaid, natp, nrestp = 0;
+ int i, resind, natp, nrestp = 0;
for (i = 0; (i < atoms->nres); i++)
{
- if (gmx_strcasecmp(restype[i], "Protein") && gmx_strcasecmp(restype[i], "DNA") && gmx_strcasecmp(restype[i], "RNA") && gmx_strcasecmp(restype[i], "Water"))
+ if (gmx_strcasecmp(restype[i].c_str(), "Protein") && gmx_strcasecmp(restype[i].c_str(), "DNA") && gmx_strcasecmp(restype[i].c_str(), "RNA") && gmx_strcasecmp(restype[i].c_str(), "Water"))
{
break;
}
{
printf("Analysing residues not classified as Protein/DNA/RNA/Water and splitting into groups...\n");
}
- for (k = 0; (k < atoms->nr); k++)
+ for (int k = 0; (k < atoms->nr); k++)
{
resind = atoms->atom[k].resind;
rname = *atoms->resinfo[resind].name;
- if (gmx_strcasecmp(restype[resind], "Protein") && gmx_strcasecmp(restype[resind], "DNA") &&
- gmx_strcasecmp(restype[resind], "RNA") && gmx_strcasecmp(restype[resind], "Water"))
+ if (gmx_strcasecmp(restype[resind].c_str(), "Protein") && gmx_strcasecmp(restype[resind].c_str(), "DNA") &&
+ gmx_strcasecmp(restype[resind].c_str(), "RNA") && gmx_strcasecmp(restype[resind].c_str(), "Water"))
{
-
+ int l;
for (l = 0; (l < nrestp); l++)
{
assert(restp);
}
}
}
- for (i = 0; (i < nrestp); i++)
+ for (int i = 0; (i < nrestp); i++)
{
- snew(aid, atoms->nr);
- naid = 0;
- for (j = 0; (j < atoms->nr); j++)
+ std::vector<int> aid;
+ for (int j = 0; (j < atoms->nr); j++)
{
rname = *atoms->resinfo[atoms->atom[j].resind].name;
if ((strcmp(restp[i].rname, rname) == 0 && !restp[i].bNeg) ||
(strcmp(restp[i].rname, rname) != 0 && restp[i].bNeg))
{
- aid[naid++] = j;
+ aid.push_back(j);
}
}
- add_grp(gb, gn, naid, aid, restp[i].gname);
+ add_grp(gb, gn, aid, restp[i].gname);
if (bASK)
{
printf("split %s into atoms (y/n) ? ", restp[i].gname);
if (gmx_ask_yesno(bASK))
{
natp = 0;
- for (k = 0; (k < naid); k++)
+ for (size_t k = 0; (k < aid.size()); k++)
{
aname = *atoms->atomname[aid[k]];
+ int l;
for (l = 0; (l < natp); l++)
{
if (strcmp(aname, attp[l]) == 0)
}
if (natp > 1)
{
- for (l = 0; (l < natp); l++)
+ for (int l = 0; (l < natp); l++)
{
- snew(aaid, naid);
- naaid = 0;
- for (k = 0; (k < naid); k++)
+ std::vector<int> aaid;
+ for (size_t k = 0; (k < aid.size()); k++)
{
aname = *atoms->atomname[aid[k]];
if (strcmp(aname, attp[l]) == 0)
{
- aaid[naaid++] = aid[k];
+ aaid.push_back(aid[k]);
}
}
- add_grp(gb, gn, naaid, aaid, attp[l]);
- sfree(aaid);
+ add_grp(gb, gn, aaid, attp[l]);
}
}
sfree(attp);
attp = nullptr;
}
}
- sfree(aid);
sfree(restp[i].rname);
sfree(restp[i].gname);
}
int compareto;
} t_gmx_help_make_index_group;
-static void analyse_prot(const char ** restype, const t_atoms *atoms,
+static void analyse_prot(gmx::ArrayRef<const std::string> restype, const t_atoms *atoms,
t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
{
/* lists of atomnames to be used in constructing index groups: */
const int num_index_groups = asize(constructing_data);
int n, j;
- int *aid;
- int nra, npres;
+ int npres;
gmx_bool match;
char ndx_name[STRLEN], *atnm;
int i;
{
printf("Analysing Protein...\n");
}
- snew(aid, atoms->nr);
+ std::vector<int> aid;
/* calculate the number of protein residues */
npres = 0;
for (i = 0; (i < atoms->nres); i++)
{
- if (0 == gmx_strcasecmp(restype[i], "Protein"))
+ if (0 == gmx_strcasecmp(restype[i].c_str(), "Protein"))
{
npres++;
}
/* find matching or complement atoms */
for (i = 0; (i < num_index_groups); i++)
{
- nra = 0;
for (n = 0; (n < atoms->nr); n++)
{
- if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind], "Protein"))
+ if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind].c_str(), "Protein"))
{
match = FALSE;
for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
}
if (constructing_data[i].bTakeComplement != match)
{
- aid[nra++] = n;
+ aid.push_back(n);
}
}
}
/* if we want to add this group always or it differs from previous
group, add it: */
- if (-1 == constructing_data[i].compareto || !grp_cmp(gb, nra, aid, constructing_data[i].compareto-i) )
+ if (-1 == constructing_data[i].compareto || !grp_cmp(gb, aid, constructing_data[i].compareto-i) )
{
- add_grp(gb, gn, nra, aid, constructing_data[i].group_name);
+ add_grp(gb, gn, aid, constructing_data[i].group_name);
}
}
if (gmx_ask_yesno(bASK))
{
int resind;
- nra = 0;
+ aid.clear();
for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
{
resind = atoms->atom[n].resind;
}
if (constructing_data[i].bTakeComplement != match)
{
- aid[nra++] = n;
+ aid.push_back(n);
}
}
/* copy the residuename to the tail of the groupname */
- if (nra > 0)
+ if (!aid.empty())
{
t_resinfo *ri;
ri = &atoms->resinfo[resind];
sprintf(ndx_name, "%s_%s%d%c",
constructing_data[i].group_name, *ri->name, ri->nr, ri->ic == ' ' ? '\0' : ri->ic);
- add_grp(gb, gn, nra, aid, ndx_name);
- nra = 0;
+ add_grp(gb, gn, aid, ndx_name);
+ aid.clear();
}
}
}
if (gmx_ask_yesno(bASK))
{
/* Make swap sidechain C=O index */
- int resind, hold;
- nra = 0;
- for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
+ aid.clear();
+ for (int n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
{
- resind = atoms->atom[n].resind;
- hold = -1;
+ int resind = atoms->atom[n].resind;
+ int hold = -1;
for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
{
if (strcmp("CA", *atoms->atomname[n]) == 0)
{
- aid[nra++] = n;
- hold = nra;
- nra += 2;
+ aid.push_back(n);
+ hold = aid.size();
+ aid.resize(aid.size() + 3);
}
else if (strcmp("C", *atoms->atomname[n]) == 0)
{
}
else
{
- aid[nra++] = n;
+ aid.push_back(n);
}
}
}
/* copy the residuename to the tail of the groupname */
- if (nra > 0)
+ if (!aid.empty())
{
- add_grp(gb, gn, nra, aid, "SwapSC-CO");
+ add_grp(gb, gn, aid, "SwapSC-CO");
}
}
}
- sfree(aid);
}
void analyse(const t_atoms *atoms, t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
{
- gmx_residuetype_t*rt = nullptr;
char *resnm;
- int *aid;
- const char ** restype;
- int nra;
- int i, k;
- int ntypes;
- char ** p_typename;
+ int i;
int iwater, iion;
int nwater, nion;
- bool found;
if (bVerb)
{
printf("Analysing residue names:\n");
}
/* Create system group, every single atom */
- snew(aid, atoms->nr);
+ std::vector<int> aid(atoms->nr);
for (i = 0; i < atoms->nr; i++)
{
aid[i] = i;
}
- add_grp(gb, gn, atoms->nr, aid, "System");
- sfree(aid);
+ add_grp(gb, gn, aid, "System");
/* For every residue, get a pointer to the residue type name */
- gmx_residuetype_init(&rt);
- assert(rt);
+ ResidueType rt;
- snew(restype, atoms->nres);
- ntypes = 0;
- p_typename = nullptr;
+ std::vector<std::string> restype;
+ std::vector<std::string> previousTypename;
if (atoms->nres > 0)
{
int i = 0;
resnm = *atoms->resinfo[i].name;
- gmx_residuetype_get_type(rt, resnm, &(restype[i]));
- snew(p_typename, ntypes+1);
- p_typename[ntypes] = gmx_strdup(restype[i]);
- ntypes++;
+ restype.emplace_back(rt.typeNameForIndexedResidue(resnm));
+ previousTypename.push_back(restype[i]);
for (i = 1; i < atoms->nres; i++)
{
resnm = *atoms->resinfo[i].name;
- gmx_residuetype_get_type(rt, resnm, &(restype[i]));
+ restype.emplace_back(rt.typeNameForIndexedResidue(resnm));
/* Note that this does not lead to a N*N loop, but N*K, where
* K is the number of residue _types_, which is small and independent of N.
*/
- found = false;
- for (k = 0; k < ntypes && !found; k++)
+ bool found = false;
+ for (size_t k = 0; k < previousTypename.size() && !found; k++)
{
- found = strcmp(restype[i], p_typename[k]) == 0;
+ found = strcmp(restype[i].c_str(), previousTypename[k].c_str()) == 0;
}
if (!found)
{
- srenew(p_typename, ntypes+1);
- p_typename[ntypes] = gmx_strdup(restype[i]);
- ntypes++;
+ previousTypename.push_back(restype[i]);
}
}
}
if (bVerb)
{
- p_status(restype, atoms->nres, p_typename, ntypes);
+ p_status(restype, previousTypename);
}
- for (k = 0; k < ntypes; k++)
+ for (int k = 0; k < gmx::index(previousTypename.size()); k++)
{
- aid = mk_aid(atoms, restype, p_typename[k], &nra, TRUE);
+ aid = mk_aid(atoms, restype, previousTypename[k], TRUE);
/* Check for special types to do fancy stuff with */
- if (!gmx_strcasecmp(p_typename[k], "Protein") && nra > 0)
+ if (!gmx_strcasecmp(previousTypename[k].c_str(), "Protein") && !aid.empty())
{
- sfree(aid);
/* PROTEIN */
analyse_prot(restype, atoms, gb, gn, bASK, bVerb);
/* Create a Non-Protein group */
- aid = mk_aid(atoms, restype, "Protein", &nra, FALSE);
- if ((nra > 0) && (nra < atoms->nr))
+ aid = mk_aid(atoms, restype, "Protein", FALSE);
+ if ((!aid.empty()) && (static_cast<int>(aid.size()) < atoms->nr))
{
- add_grp(gb, gn, nra, aid, "non-Protein");
+ add_grp(gb, gn, aid, "non-Protein");
}
- sfree(aid);
}
- else if (!gmx_strcasecmp(p_typename[k], "Water") && nra > 0)
+ else if (!gmx_strcasecmp(previousTypename[k].c_str(), "Water") && !aid.empty())
{
- add_grp(gb, gn, nra, aid, p_typename[k]);
+ add_grp(gb, gn, aid, previousTypename[k]);
/* Add this group as 'SOL' too, for backward compatibility with older gromacs versions */
- add_grp(gb, gn, nra, aid, "SOL");
+ add_grp(gb, gn, aid, "SOL");
- sfree(aid);
/* Solvent, create a negated group too */
- aid = mk_aid(atoms, restype, "Water", &nra, FALSE);
- if ((nra > 0) && (nra < atoms->nr))
+ aid = mk_aid(atoms, restype, "Water", FALSE);
+ if ((!aid.empty()) && (static_cast<int>(aid.size()) < atoms->nr))
{
- add_grp(gb, gn, nra, aid, "non-Water");
+ add_grp(gb, gn, aid, "non-Water");
}
- sfree(aid);
}
- else if (nra > 0)
+ else if (!aid.empty())
{
/* Other groups */
- add_grp(gb, gn, nra, aid, p_typename[k]);
- sfree(aid);
+ add_grp(gb, gn, aid, previousTypename[k]);
analyse_other(restype, atoms, gb, gn, bASK, bVerb);
}
- sfree(p_typename[k]);
}
- sfree(p_typename);
- sfree(restype);
- gmx_residuetype_destroy(rt);
/* Create a merged water_and_ions group */
iwater = -1;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <stdio.h>
+#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/basedefinitions.h"
struct t_atoms;
void write_index(const char *outf, struct t_blocka *b, char **gnames, gmx_bool bDuplicate, int natoms);
/* Writes index blocks to outf (writes an indexfile) */
-void add_grp(struct t_blocka *b, char ***gnames, int nra, const int a[], const char *name);
+/*! \brief
+ * Add a new group with \p name to \p b.
+ *
+ * \param[in] b Block struct to add group to.
+ * \param[in] gnames Names of groups.
+ * \param[in] a Group to add to Block.
+ * \param[in] name Group name.
+ */
+void add_grp(struct t_blocka *b, char ***gnames, gmx::ArrayRef<const int> a, const std::string &name);
/* Ads group a with name name to block b and namelist gnames */
void analyse(const t_atoms *atoms, struct t_blocka *gb, char ***gn,
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2008,2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2008,2009,2010,
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
}
-typedef struct gmx_mtop_atomloop_all
+AtomIterator::AtomIterator(const gmx_mtop_t &mtop, int globalAtomNumber)
+ : mtop_(&mtop), mblock_(0),
+ atoms_(&mtop.moltype[mtop.molblock[0].type].atoms),
+ currentMolecule_(0), highestResidueNumber_(mtop.maxresnr),
+ localAtomNumber_(0), globalAtomNumber_(globalAtomNumber)
{
- const gmx_mtop_t *mtop;
- size_t mblock;
- const t_atoms *atoms;
- int mol;
- int maxresnr;
- int at_local;
- int at_global;
-} t_gmx_mtop_atomloop_all;
-
-gmx_mtop_atomloop_all_t
-gmx_mtop_atomloop_all_init(const gmx_mtop_t *mtop)
-{
- struct gmx_mtop_atomloop_all *aloop;
-
- snew(aloop, 1);
-
- aloop->mtop = mtop;
- aloop->mblock = 0;
- aloop->atoms =
- &mtop->moltype[mtop->molblock[aloop->mblock].type].atoms;
- aloop->mol = 0;
- aloop->maxresnr = mtop->maxresnr;
- aloop->at_local = -1;
- aloop->at_global = -1;
-
- return aloop;
+ GMX_ASSERT(globalAtomNumber == 0 || globalAtomNumber == mtop.natoms,
+ "Starting at other atoms not implemented yet");
}
-static void gmx_mtop_atomloop_all_destroy(gmx_mtop_atomloop_all_t aloop)
+AtomIterator &AtomIterator::operator++()
{
- sfree(aloop);
-}
+ localAtomNumber_++;
+ globalAtomNumber_++;
-gmx_bool gmx_mtop_atomloop_all_next(gmx_mtop_atomloop_all_t aloop,
- int *at_global, const t_atom **atom)
-{
- if (aloop == nullptr)
+ if (localAtomNumber_ >= atoms_->nr)
{
- gmx_incons("gmx_mtop_atomloop_all_next called without calling gmx_mtop_atomloop_all_init");
- }
-
- aloop->at_local++;
- aloop->at_global++;
-
- if (aloop->at_local >= aloop->atoms->nr)
- {
- if (aloop->atoms->nres <= aloop->mtop->maxres_renum)
+ if (atoms_->nres <= mtop_->maxresnr)
{
/* Single residue molecule, increase the count with one */
- aloop->maxresnr += aloop->atoms->nres;
+ highestResidueNumber_ += atoms_->nres;
}
- aloop->mol++;
- aloop->at_local = 0;
- if (aloop->mol >= aloop->mtop->molblock[aloop->mblock].nmol)
+ currentMolecule_++;
+ localAtomNumber_ = 0;
+ if (currentMolecule_ >= mtop_->molblock[mblock_].nmol)
{
- aloop->mblock++;
- if (aloop->mblock >= aloop->mtop->molblock.size())
+ mblock_++;
+ if (mblock_ >= mtop_->molblock.size())
{
- gmx_mtop_atomloop_all_destroy(aloop);
- return FALSE;
+ return *this;
}
- aloop->atoms = &aloop->mtop->moltype[aloop->mtop->molblock[aloop->mblock].type].atoms;
- aloop->mol = 0;
+ atoms_ = &mtop_->moltype[mtop_->molblock[mblock_].type].atoms;
+ currentMolecule_ = 0;
}
}
+ return *this;
+}
- *at_global = aloop->at_global;
- *atom = &aloop->atoms->atom[aloop->at_local];
+AtomIterator AtomIterator::operator++(int)
+{
+ AtomIterator temp = *this;
+ ++(*this);
+ return temp;
+}
- return TRUE;
+bool AtomIterator::operator==(const AtomIterator &o) const
+{
+ return mtop_ == o.mtop_ && globalAtomNumber_ == o.globalAtomNumber_;
+}
+
+bool AtomIterator::operator!=(const AtomIterator &o) const
+{
+ return !(*this == o);
+}
+
+const t_atom &AtomProxy::atom() const
+{
+ return it_->atoms_->atom[it_->localAtomNumber_];
+}
+
+int AtomProxy::globalAtomNumber() const
+{
+ return it_->globalAtomNumber_;
+}
+
+const char *AtomProxy::atomName() const
+{
+ return *(it_->atoms_->atomname[it_->localAtomNumber_]);
}
-void gmx_mtop_atomloop_all_names(gmx_mtop_atomloop_all_t aloop,
- char **atomname, int *resnr, char **resname)
+const char *AtomProxy::residueName() const
{
- int resind_mol;
+ int residueIndexInMolecule = it_->atoms_->atom[it_->localAtomNumber_].resind;
+ return *(it_->atoms_->resinfo[residueIndexInMolecule].name);
+}
- *atomname = *(aloop->atoms->atomname[aloop->at_local]);
- resind_mol = aloop->atoms->atom[aloop->at_local].resind;
- *resnr = aloop->atoms->resinfo[resind_mol].nr;
- if (aloop->atoms->nres <= aloop->mtop->maxres_renum)
+int AtomProxy::residueNumber() const
+{
+ int residueIndexInMolecule = it_->atoms_->atom[it_->localAtomNumber_].resind;
+ if (it_->atoms_->nres <= it_->mtop_->maxres_renum)
{
- *resnr = aloop->maxresnr + 1 + resind_mol;
+ return it_->highestResidueNumber_ + 1 + residueIndexInMolecule;
+ }
+ else
+ {
+ return it_->atoms_->resinfo[residueIndexInMolecule].nr;
}
- *resname = *(aloop->atoms->resinfo[resind_mol].name);
}
-void gmx_mtop_atomloop_all_moltype(gmx_mtop_atomloop_all_t aloop,
- const gmx_moltype_t **moltype,
- int *at_mol)
+const gmx_moltype_t &AtomProxy::moleculeType() const
{
- *moltype = &aloop->mtop->moltype[aloop->mtop->molblock[aloop->mblock].type];
- *at_mol = aloop->at_local;
+ return it_->mtop_->moltype[it_->mtop_->molblock[it_->mblock_].type];
+}
+
+int AtomProxy::atomNumberInMol() const
+{
+ return it_->localAtomNumber_;
}
typedef struct gmx_mtop_atomloop_block
if (freeEnergyInteractionsAtEnd && gmx_mtop_bondeds_free_energy(&mtop))
{
- std::vector<real> qA(mtop.natoms);
- std::vector<real> qB(mtop.natoms);
- gmx_mtop_atomloop_all_t aloop = gmx_mtop_atomloop_all_init(&mtop);
- const t_atom *atom;
- int ag = 0;
- while (gmx_mtop_atomloop_all_next(aloop, &ag, &atom))
+ std::vector<real> qA(mtop.natoms);
+ std::vector<real> qB(mtop.natoms);
+ for (const AtomProxy &atomP : AtomRange(mtop))
{
- qA[ag] = atom->q;
- qB[ag] = atom->qB;
+ const t_atom &local = atomP.atom();
+ int index = atomP.globalAtomNumber();
+ qA[index] = local.q;
+ qB[index] = local.qB;
}
gmx_sort_ilist_fe(idef, qA.data(), qB.data());
}
}
}
-gmx_localtop_t *
-gmx_mtop_generate_local_top(const gmx_mtop_t *mtop,
+void
+gmx_mtop_generate_local_top(const gmx_mtop_t &mtop,
+ gmx_localtop_t *top,
bool freeEnergyInteractionsAtEnd)
{
- gmx_localtop_t *top;
-
- snew(top, 1);
-
- gen_local_top(*mtop, freeEnergyInteractionsAtEnd, true, top);
-
- return top;
+ gen_local_top(mtop, freeEnergyInteractionsAtEnd, true, top);
}
/*! \brief Fills an array with molecule begin/end atom indices
std::vector<int> get_atom_index(const gmx_mtop_t *mtop)
{
- std::vector<int> atom_index;
- gmx_mtop_atomloop_all_t aloop = gmx_mtop_atomloop_all_init(mtop);
- const t_atom *atom;
- int at_global;
- while (gmx_mtop_atomloop_all_next(aloop, &at_global, &atom))
+ std::vector<int> atom_index;
+ for (const AtomProxy &atomP : AtomRange(*mtop))
{
- if (atom->ptype == eptAtom)
+ const t_atom &local = atomP.atom();
+ int index = atomP.globalAtomNumber();
+ if (local.ptype == eptAtom)
{
- atom_index.push_back(at_global);
+ atom_index.push_back(index);
}
}
return atom_index;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/topology/topology.h"
#include "gromacs/utility/basedefinitions.h"
-#include "gromacs/utility/gmxassert.h"
struct gmx_localtop_t;
struct t_atom;
/* Removes the charge groups, i.e. makes single atom charge groups, in mtop */
void gmx_mtop_remove_chargegroups(gmx_mtop_t *mtop);
-/* Abstract type for atom loop over all atoms */
-typedef struct gmx_mtop_atomloop_all *gmx_mtop_atomloop_all_t;
-
-/* Initialize an atom loop over all atoms in the system.
- * The order of the atoms will be as in the state struct.
- * Only use this when you really need to loop over all atoms,
- * i.e. when you use groups which might differ per molecule,
- * otherwise use gmx_mtop_atomloop_block.
+class AtomIterator;
+
+//! Proxy object returned from AtomIterator
+class AtomProxy
+{
+ public:
+ //! Default constructor.
+ AtomProxy(const AtomIterator* it) : it_(it) {}
+ //! Access current global atom number.
+ int globalAtomNumber() const;
+ //! Access current t_atom struct.
+ const t_atom &atom() const;
+ //! Access current name of the atom.
+ const char *atomName() const;
+ //! Access current name of the residue the atom is in.
+ const char *residueName() const;
+ //! Access current residue number.
+ int residueNumber() const;
+ //! Access current molecule type.
+ const gmx_moltype_t &moleculeType() const;
+ //! Access the position of the current atom in the molecule.
+ int atomNumberInMol() const;
+ private:
+ const AtomIterator* it_;
+};
+
+//! Wrapper around proxy object to implement operator->
+template <typename T>
+class ProxyPtr
+{
+ public:
+ //! Construct with proxy object.
+ ProxyPtr(T t) : t_(t) {}
+ //! Member of pointer operator.
+ T* operator->() { return &t_; }
+ private:
+ T t_;
+};
+
+/*! \brief
+ * Object that allows looping over all atoms in an mtop.
*/
-gmx_mtop_atomloop_all_t
-gmx_mtop_atomloop_all_init(const gmx_mtop_t *mtop);
-
-/* Loop to the next atom.
- * When not at the end:
- * returns TRUE and at_global,
- * writes the global atom number in *at_global
- * and sets the pointer atom to the t_atom struct of that atom.
- * When at the end, destroys aloop and returns FALSE.
- * Use as:
- * gmx_mtop_atomloop_all_t aloop;
- * aloop = gmx_mtop_atomloop_all_init(mtop)
- * while (gmx_mtop_atomloop_all_next(aloop,&at_global,&atom)) {
- * ...
- * }
- */
-gmx_bool
-gmx_mtop_atomloop_all_next(gmx_mtop_atomloop_all_t aloop,
- int *at_global, const t_atom **atom);
-
-/* Return the atomname, the residue number and residue name
- * of the current atom in the loop.
- */
-void
-gmx_mtop_atomloop_all_names(gmx_mtop_atomloop_all_t aloop,
- char **atomname, int *resnr, char **resname);
-
-/* Return the a pointer to the moltype struct of the current atom
- * in the loop and the atom number in the molecule.
- */
-void
-gmx_mtop_atomloop_all_moltype(gmx_mtop_atomloop_all_t aloop,
- const gmx_moltype_t **moltype, int *at_mol);
-
+class AtomIterator
+{
+ public:
+ //! Construct from topology and optionalally a global atom number.
+ explicit AtomIterator(const gmx_mtop_t &mtop, int globalAtomNumber = 0);
+
+ //! Prefix increment.
+ AtomIterator &operator++();
+ //! Postfix increment.
+ AtomIterator operator++(int);
+
+ //! Equality comparison.
+ bool operator==(const AtomIterator &o) const;
+ //! Non-equal comparison.
+ bool operator!=(const AtomIterator &o) const;
+
+ //! Dereference operator. Returns proxy.
+ AtomProxy operator*() const { return {this}; }
+ //! Member of pointer operator.
+ ProxyPtr<AtomProxy> operator->() const { return {this}; };
+
+ private:
+ //! Global topology.
+ const gmx_mtop_t *mtop_;
+ //! Current molecule block.
+ size_t mblock_;
+ //! The atoms of the current molecule.
+ const t_atoms *atoms_;
+ //! The current molecule.
+ int currentMolecule_;
+ //! Current highest number for residues.
+ int highestResidueNumber_;
+ //! Current local atom number.
+ int localAtomNumber_;
+ //! Global current atom number.
+ int globalAtomNumber_;
+
+ friend class AtomProxy;
+};
+
+//! Range over all atoms of topology.
+class AtomRange
+{
+ public:
+ //! Default constructor.
+ explicit AtomRange(const gmx_mtop_t &mtop) :
+ begin_(mtop), end_(mtop, mtop.natoms) {}
+ //! Iterator to begin of range.
+ AtomIterator &begin() { return begin_; }
+ //! Iterator to end of range.
+ AtomIterator &end() { return end_; }
+ private:
+ AtomIterator begin_, end_;
+};
/* Abstract type for atom loop over atoms in all molecule blocks */
typedef struct gmx_mtop_atomloop_block *gmx_mtop_atomloop_block_t;
gmx_mtop_global_atoms(const gmx_mtop_t *mtop);
-/* Generate a 'local' topology for the whole system.
+/*! \brief
+ * Populate a 'local' topology for the whole system.
+ *
* When freeEnergyInteractionsAtEnd == true, the free energy interactions will
* be sorted to the end.
+ *
+ * \param[in] mtop The global topology used to populate the local one.
+ * \param[in,out] top New local topology populated from global \p mtop.
+ * \param[in] freeEnergyInteractionsAtEnd If free energy interactions will be sorted.
*/
-gmx_localtop_t *
-gmx_mtop_generate_local_top(const gmx_mtop_t *mtop, bool freeEnergyInteractionsAtEnd);
+void
+gmx_mtop_generate_local_top(const gmx_mtop_t &mtop,
+ gmx_localtop_t *top,
+ bool freeEnergyInteractionsAtEnd);
/*!\brief Creates and returns a struct with begin/end atom indices of all molecules
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cassert>
#include <cstdio>
+#include <algorithm>
+#include <iterator>
+#include <string>
+
+#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/futil.h"
#include "gromacs/utility/smalloc.h"
#include "gromacs/utility/strdb.h"
-const char gmx_residuetype_undefined[] = "Other";
+//! Definition for residue type that is not known.
+const std::string c_undefinedResidueType = "Other";
+
+//! Single ResidueType entry object
+struct ResidueTypeEntry
+{
+ //! Default constructor creates complete object.
+ ResidueTypeEntry(const std::string &rName, const std::string &rType)
+ : residueName(rName), residueType(rType)
+ {}
+ //! Name of the residue in the entry.
+ std::string residueName;
+ //! Type of the residue in the entry.
+ std::string residueType;
+};
-struct gmx_residuetype_t
+//! Implementation detail for ResidueTypes
+class ResidueType::Impl
{
- int n;
- char ** resname;
- char ** restype;
+ public:
+ //! Storage object for entries.
+ std::vector<ResidueTypeEntry> entry;
};
-int
-gmx_residuetype_init(gmx_residuetype_t **prt)
+ResidueType::ResidueType()
+ : impl_(new Impl)
{
char line[STRLEN];
char resname[STRLEN], restype[STRLEN], dum[STRLEN];
- gmx_residuetype_t *rt;
-
- snew(rt, 1);
- *prt = rt;
-
- rt->n = 0;
- rt->resname = nullptr;
- rt->restype = nullptr;
- gmx::FilePtr db = gmx::openLibraryFile("residuetypes.dat");
+ gmx::FilePtr db = gmx::openLibraryFile("residuetypes.dat");
while (get_a_line(db.get(), line, STRLEN))
{
{
if (sscanf(line, "%1000s %1000s %1000s", resname, restype, dum) != 2)
{
- gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat");
+ gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat ");
}
- gmx_residuetype_add(rt, resname, restype);
+ addResidue(resname, restype);
}
}
-
- return 0;
}
-int
-gmx_residuetype_destroy(gmx_residuetype_t *rt)
+ResidueType::~ResidueType()
{
- int i;
-
- for (i = 0; i < rt->n; i++)
- {
- sfree(rt->resname[i]);
- sfree(rt->restype[i]);
- }
- sfree(rt->resname);
- sfree(rt->restype);
- sfree(rt);
-
- return 0;
}
-/* Return 0 if the name was found, otherwise -1.
- * p_restype is set to a pointer to the type name, or 'Other' if we did not find it.
+/*! \brief
+ * Find a residue entry by the residue name.
+ *
+ * \param[in] entries Currently registered residue entries in the database.
+ * \param[in] residueName Name of a residue to compare to database.
+ * \returns A pointer to the entry that was found, or nullptr.
*/
-int
-gmx_residuetype_get_type(gmx_residuetype_t *rt, const char * resname, const char ** p_restype)
+static gmx::ArrayRef<const ResidueTypeEntry>::iterator
+residueEntryByResidueName(gmx::ArrayRef<const ResidueTypeEntry> entries, const std::string &residueName)
{
- int i, rc;
-
- rc = -1;
- for (i = 0; i < rt->n && rc; i++)
- {
- rc = gmx_strcasecmp(rt->resname[i], resname);
- }
-
- *p_restype = (rc == 0) ? rt->restype[i-1] : gmx_residuetype_undefined;
-
- return rc;
+ return std::find_if(entries.begin(), entries.end(),
+ [&residueName](const ResidueTypeEntry &old)
+ { return gmx::equalCaseInsensitive(residueName, old.residueName); });
}
-int
-gmx_residuetype_add(gmx_residuetype_t *rt, const char *newresname, const char *newrestype)
+bool ResidueType::nameIndexedInResidueTypes(const std::string &residueName)
{
- bool found;
- const char * p_oldtype;
-
- found = (gmx_residuetype_get_type(rt, newresname, &p_oldtype) == 0);
-
- if (found && gmx_strcasecmp(p_oldtype, newrestype))
- {
- fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
- newresname, p_oldtype, newrestype);
- }
-
- if (!found)
- {
- srenew(rt->resname, rt->n+1);
- srenew(rt->restype, rt->n+1);
- rt->resname[rt->n] = gmx_strdup(newresname);
- rt->restype[rt->n] = gmx_strdup(newrestype);
- rt->n++;
- }
-
- return 0;
+ return residueEntryByResidueName(impl_->entry, residueName) != nullptr;
}
-int
-gmx_residuetype_get_alltypes(gmx_residuetype_t *rt,
- const char *** p_typenames,
- int * ntypes)
+void ResidueType::addResidue(const std::string &residueName, const std::string &residueType)
{
- int n = 0;
- const char **my_typename = nullptr;
+ gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+ auto found = residueEntryByResidueName(temp, residueName);
- if (rt->n > 0)
+ if (found != temp.end())
{
- int i = 0;
- const char *p = rt->restype[i];
- snew(my_typename, n+1);
- my_typename[n] = p;
- n = 1;
-
- for (i = 1; i < rt->n; i++)
+ if (!gmx::equalCaseInsensitive(found->residueType, residueType))
{
- p = rt->restype[i];
- bool bFound = false;
- for (int j = 0; j < n && !bFound; j++)
- {
- bFound = (gmx_strcasecmp(p, my_typename[j]) == 0);
- }
- if (!bFound)
- {
- srenew(my_typename, n+1);
- my_typename[n] = p;
- n++;
- }
+ fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.\n",
+ residueName.c_str(), found->residueType.c_str(), residueType.c_str());
}
}
- *ntypes = n;
- *p_typenames = my_typename;
-
- return 0;
-}
-
-gmx_bool
-gmx_residuetype_is_protein(gmx_residuetype_t *rt, const char *resnm)
-{
- gmx_bool rc;
- const char *p_type;
-
- rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
- gmx_strcasecmp(p_type, "Protein") == 0;
- return rc;
+ else
+ {
+ impl_->entry.emplace_back(residueName, residueType);
+ }
}
-gmx_bool
-gmx_residuetype_is_dna(gmx_residuetype_t *rt, const char *resnm)
+bool ResidueType::namedResidueHasType(const std::string &residueName, const std::string &residueType)
{
- gmx_bool rc;
- const char *p_type;
-
- rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
- gmx_strcasecmp(p_type, "DNA") == 0;
- return rc;
+ gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+ auto found = residueEntryByResidueName(temp, residueName);
+ return ((found != temp.end()) &&
+ gmx::equalCaseInsensitive(residueType, found->residueType));
}
-gmx_bool
-gmx_residuetype_is_rna(gmx_residuetype_t *rt, const char *resnm)
+int ResidueType::numberOfEntries() const
{
- gmx_bool rc;
- const char *p_type;
-
- rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
- gmx_strcasecmp(p_type, "RNA") == 0;
- return rc;
+ return impl_->entry.size();
}
-/* Return the size of the arrays */
-int
-gmx_residuetype_get_size(gmx_residuetype_t *rt)
+int ResidueType::indexFromResidueName(const std::string &residueName) const
{
- return rt->n;
+ gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+ auto found = residueEntryByResidueName(temp, residueName);
+ return (found != temp.end()) ? std::distance(temp.begin(), found) : -1;
}
-/* Search for a residuetype with name resnm within the
- * gmx_residuetype database. Return the index if found,
- * otherwise -1.
- */
-int
-gmx_residuetype_get_index(gmx_residuetype_t *rt, const char *resnm)
+const std::string ResidueType::nameFromResidueIndex(int index) const
{
- int i, rc;
-
- rc = -1;
- for (i = 0; i < rt->n && rc; i++)
+ if (index >= 0 && index < static_cast<int>(impl_->entry.size()))
{
- rc = gmx_strcasecmp(rt->resname[i], resnm);
+ return impl_->entry[index].residueName;
+ }
+ else
+ {
+ return "";
}
-
- return (0 == rc) ? i-1 : -1;
}
-/* Return the name of the residuetype with the given index, or
- * NULL if not found. */
-const char *
-gmx_residuetype_get_name(gmx_residuetype_t *rt, int index)
+const std::string ResidueType::typeNameForIndexedResidue(const std::string &residueName)
{
- if (index >= 0 && index < rt->n)
+ gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+ auto found = residueEntryByResidueName(temp, residueName);
+ if (found != temp.end())
{
- return rt->resname[index];
+ return found->residueType;
}
else
{
- return nullptr;
+ return c_undefinedResidueType;
}
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2010,2014,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#ifndef GMX_TOPOLOGY_RESIDUETYPES_H
#define GMX_TOPOLOGY_RESIDUETYPES_H
-#include "gromacs/utility/basedefinitions.h"
-
-typedef struct gmx_residuetype_t gmx_residuetype_t;
-
-int
-gmx_residuetype_init(gmx_residuetype_t **rt);
-
-int
-gmx_residuetype_destroy(gmx_residuetype_t *rt);
+#include <string>
-int
-gmx_residuetype_get_type(gmx_residuetype_t *rt, const char *resname, const char **p_restype);
-
-int
-gmx_residuetype_add(gmx_residuetype_t *rt, const char *newresname, const char *newrestype);
-
-int
-gmx_residuetype_get_alltypes(gmx_residuetype_t *rt,
- const char ***p_typenames,
- int *ntypes);
+#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
-gmx_bool
-gmx_residuetype_is_protein(gmx_residuetype_t *rt, const char *resnm);
+struct ResidueTypeEntry;
-gmx_bool
-gmx_residuetype_is_dna(gmx_residuetype_t *rt, const char *resnm);
+class ResidueType
+{
+ public:
+ //! Default constructor.
+ ResidueType();
+ //! Default destructor.
+ ~ResidueType();
-gmx_bool
-gmx_residuetype_is_rna(gmx_residuetype_t *rt, const char *resnm);
+ //! Get handle to underlying residue type data.
+ ResidueTypeEntry *ResidueTypes();
-int
-gmx_residuetype_get_size(gmx_residuetype_t *rt);
+ //! Get number of entries in ResidueTypes.
+ int numberOfEntries() const;
+ /*! \brief
+ * Return true if residue \p residueName is found or false otherwise.
+ *
+ * \param[in] residueName Residue name to search database for.
+ * \returns true if successful.
+ */
+ bool nameIndexedInResidueTypes(const std::string &residueName);
+ /*! \brief
+ * Add entry to ResidueTypes if unique.
+ *
+ * \param[in] residueName Name of new residue.
+ * \param[in] residueType Type of new residue.
+ */
+ void addResidue(const std::string &residueName, const std::string &residueType);
+ /*! \brief
+ * Checks if the indicated \p residueName if of \p residueType.
+ *
+ * \param[in] residueName Residue that should be checked.
+ * \param[in] residueType Which ResidueType the residue should have.
+ * \returns If the check was successful.
+ */
+ bool namedResidueHasType(const std::string &residueName, const std::string &residueType);
+ /*! \brief
+ * Get index to entry in ResidueTypes with name \p residueName.
+ *
+ * \param[in] residueName Name of the residue being searched.
+ * \returns The index or -1 if not found.
+ */
+ int indexFromResidueName(const std::string &residueName) const;
+ /*! \brief
+ * Get the name of the entry in ResidueTypes with \p index.
+ *
+ * \param[in] index Which entry should be returned.
+ * \returns The name of the entry at \p index, or nullptr.
+ */
+ const std::string nameFromResidueIndex(int index) const;
+ /*! \brief
+ * Get name of residue type for already defined residue.
+ *
+ *
+ * \param[in] residueName Name of the residue to search for.
+ * \returns Type name or UndefineResidueName if not found.
+ */
+ const std::string typeNameForIndexedResidue(const std::string &residueName);
-int
-gmx_residuetype_get_index(gmx_residuetype_t *rt, const char *resnm);
+ private:
+ //! Implementation pointer.
+ class Impl;
-const char *
-gmx_residuetype_get_name(gmx_residuetype_t *rt, int index);
+ gmx::PrivateImplPointer<Impl> impl_;
+};
#endif
--- /dev/null
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2019, by the GROMACS development team, led by
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+# and including many others, as listed in the AUTHORS file in the
+# top-level source directory and at http://www.gromacs.org.
+#
+# GROMACS is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# GROMACS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with GROMACS; if not, see
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# If you want to redistribute modifications to GROMACS, please
+# consider that scientific software is very special. Version
+# control is crucial - bugs must be traceable. We will be happy to
+# consider code for inclusion in the official distribution, but
+# derived work must not be called official GROMACS. Details are found
+# in the README & COPYING files - if they are missing, get the
+# official version at http://www.gromacs.org.
+#
+# To help us fund GROMACS development, we humbly ask that you cite
+# the research papers on the package. Check out http://www.gromacs.org.
+
+gmx_add_unit_test(TopologyTest topology-test
+ mtop.cpp)
+
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief
+ * Implements test of mtop routines
+ *
+ * \author Roland Schulz <roland.schulz@intel.com>
+ * \ingroup module_topology
+ */
+#include "gmxpre.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/topology/mtop_util.h"
+
+namespace gmx
+{
+namespace
+{
+
+/*! \brief Initializes a basic topology with 9 atoms with settle*/
+void createBasicTop(gmx_mtop_t* mtop)
+{
+ gmx_moltype_t moltype;
+ moltype.atoms.nr = NRAL(F_SETTLE);
+ std::vector<int> &iatoms = moltype.ilist[F_SETTLE].iatoms;
+ const int settleType = 0;
+ iatoms.push_back(settleType);
+ iatoms.push_back(0);
+ iatoms.push_back(1);
+ iatoms.push_back(2);
+ mtop->moltype.push_back(moltype);
+
+ mtop->molblock.resize(1);
+ mtop->molblock[0].type = 0;
+ mtop->molblock[0].nmol = 3;
+ mtop->natoms = moltype.atoms.nr * mtop->molblock[0].nmol;
+ gmx_mtop_finalize(mtop);
+}
+
+TEST(MtopTest, RangeBasedLoop)
+{
+ gmx_mtop_t mtop;
+ createBasicTop(&mtop);
+ int count = 0;
+ for (const AtomProxy &atomP : AtomRange(mtop))
+ {
+ EXPECT_EQ(atomP.globalAtomNumber(), count);
+ ++count;
+ }
+ EXPECT_EQ(count, 9);
+}
+
+TEST(MtopTest, Operators)
+{
+ gmx_mtop_t mtop;
+ createBasicTop(&mtop);
+ AtomIterator it(mtop);
+ AtomIterator otherIt(mtop);
+ EXPECT_EQ((*it).globalAtomNumber(), 0);
+ EXPECT_EQ(it->globalAtomNumber(), 0);
+ EXPECT_TRUE (it == otherIt);
+ EXPECT_FALSE(it != otherIt);
+ ++it;
+ EXPECT_EQ(it->globalAtomNumber(), 1);
+ it++;
+ EXPECT_EQ(it->globalAtomNumber(), 2);
+ EXPECT_TRUE (it != otherIt);
+ EXPECT_FALSE(it == otherIt);
+}
+
+} // namespace
+
+} // namespace gmx
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/topology/idef.h"
#include "gromacs/topology/ifunc.h"
#include "gromacs/topology/symtab.h"
+#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/compare.h"
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/smalloc.h"
}
}
-void init_localtop(gmx_localtop_t *top)
+gmx_localtop_t::gmx_localtop_t()
{
- init_block(&top->cgs);
- init_blocka(&top->excls);
- init_idef(&top->idef);
- init_atomtypes(&top->atomtypes);
+ init_block_null(&cgs);
+ init_blocka_null(&excls);
+ init_idef(&idef);
+ init_atomtypes(&atomtypes);
}
-void done_localtop(gmx_localtop_t *top)
+gmx_localtop_t::~gmx_localtop_t()
{
- if (top == nullptr)
+ if (!useInDomainDecomp_)
{
- return;
+ done_idef(&idef);
+ done_block(&cgs);
+ done_blocka(&excls);
+ done_atomtypes(&atomtypes);
}
- done_idef(&top->idef);
- done_block(&top->cgs);
- done_blocka(&top->excls);
- done_atomtypes(&top->atomtypes);
-}
-
-void done_and_sfree_localtop(gmx_localtop_t *top)
-{
- done_localtop(top);
- sfree(top);
}
bool gmx_mtop_has_masses(const gmx_mtop_t *mtop)
}
}
-static void cmp_ilist(FILE *fp, int ftype, const t_ilist *il1, const t_ilist *il2)
-{
- int i;
- char buf[256];
-
- fprintf(fp, "comparing ilist %s\n", interaction_function[ftype].name);
- sprintf(buf, "%s->nr", interaction_function[ftype].name);
- cmp_int(fp, buf, -1, il1->nr, il2->nr);
- sprintf(buf, "%s->iatoms", interaction_function[ftype].name);
- if (((il1->nr > 0) && (!il1->iatoms)) ||
- ((il2->nr > 0) && (!il2->iatoms)) ||
- ((il1->nr != il2->nr)))
- {
- fprintf(fp, "Comparing radically different topologies - %s is different\n",
- buf);
- }
- else
- {
- for (i = 0; (i < il1->nr); i++)
- {
- cmp_int(fp, buf, i, il1->iatoms[i], il2->iatoms[i]);
- }
- }
-}
-
static void cmp_iparm(FILE *fp, const char *s, t_functype ft,
- const t_iparams &ip1, const t_iparams &ip2, real ftol, real abstol)
+ const t_iparams &ip1, const t_iparams &ip2, real relativeTolerance, real absoluteTolerance)
{
int i;
gmx_bool bDiff;
bDiff = FALSE;
for (i = 0; i < MAXFORCEPARAM && !bDiff; i++)
{
- bDiff = !equal_real(ip1.generic.buf[i], ip2.generic.buf[i], ftol, abstol);
+ bDiff = !equal_real(ip1.generic.buf[i], ip2.generic.buf[i], relativeTolerance, absoluteTolerance);
}
if (bDiff)
{
}
static void cmp_iparm_AB(FILE *fp, const char *s, t_functype ft,
- const t_iparams &ip1, real ftol, real abstol)
+ const t_iparams &ip1, real relativeTolerance, real absoluteTolerance)
{
int nrfpA, nrfpB, p0, i;
gmx_bool bDiff;
bDiff = FALSE;
for (i = 0; i < nrfpB && !bDiff; i++)
{
- bDiff = !equal_real(ip1.generic.buf[p0+i], ip1.generic.buf[nrfpA+i], ftol, abstol);
+ bDiff = !equal_real(ip1.generic.buf[p0+i], ip1.generic.buf[nrfpA+i], relativeTolerance, absoluteTolerance);
}
if (bDiff)
{
}
}
-static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2, real ftol, real abstol)
+static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2, real relativeTolerance, real absoluteTolerance)
{
int cmap1_ngrid = (cmap1 ? cmap1->cmapdata.size() : 0);
int cmap2_ngrid = (cmap2 ? cmap2->cmapdata.size() : 0);
for (i = 0; i < 4*cmap1->grid_spacing*cmap1->grid_spacing; i++)
{
- cmp_real(fp, "", i, cmap1->cmapdata[g].cmap[i], cmap2->cmapdata[g].cmap[i], ftol, abstol);
+ cmp_real(fp, "", i, cmap1->cmapdata[g].cmap[i], cmap2->cmapdata[g].cmap[i], relativeTolerance, absoluteTolerance);
}
}
}
}
-static void cmp_idef(FILE *fp, const t_idef *id1, const t_idef *id2, real ftol, real abstol)
-{
- int i;
- char buf1[64], buf2[64];
-
- fprintf(fp, "comparing idef\n");
- if (id2)
- {
- cmp_int(fp, "idef->ntypes", -1, id1->ntypes, id2->ntypes);
- cmp_int(fp, "idef->atnr", -1, id1->atnr, id2->atnr);
- for (i = 0; (i < std::min(id1->ntypes, id2->ntypes)); i++)
- {
- sprintf(buf1, "idef->functype[%d]", i);
- sprintf(buf2, "idef->iparam[%d]", i);
- cmp_int(fp, buf1, i, static_cast<int>(id1->functype[i]), static_cast<int>(id2->functype[i]));
- cmp_iparm(fp, buf2, id1->functype[i],
- id1->iparams[i], id2->iparams[i], ftol, abstol);
- }
- cmp_real(fp, "fudgeQQ", -1, id1->fudgeQQ, id2->fudgeQQ, ftol, abstol);
- cmp_cmap(fp, id1->cmap_grid, id2->cmap_grid, ftol, abstol);
- for (i = 0; (i < F_NRE); i++)
- {
- cmp_ilist(fp, i, &(id1->il[i]), &(id2->il[i]));
- }
- }
- else
- {
- for (i = 0; (i < id1->ntypes); i++)
- {
- cmp_iparm_AB(fp, "idef->iparam", id1->functype[i], id1->iparams[i], ftol, abstol);
- }
- }
-}
-
static void cmp_block(FILE *fp, const t_block *b1, const t_block *b2, const char *s)
{
char buf[32];
cmp_int(fp, buf, -1, b1->nra, b2->nra);
}
-void cmp_top(FILE *fp, const t_topology *t1, const t_topology *t2, real ftol, real abstol)
+static void compareFfparams(FILE *fp, const gmx_ffparams_t &ff1, const gmx_ffparams_t &ff2, real relativeTolerance, real absoluteTolerance)
{
- fprintf(fp, "comparing top\n");
- if (t2)
+ fprintf(fp, "comparing force field parameters\n");
+ cmp_int(fp, "numTypes", -1, ff1.numTypes(), ff2.numTypes());
+ cmp_int(fp, "atnr", -1, ff1.atnr, ff1.atnr);
+ cmp_double(fp, "reppow", -1, ff1.reppow, ff2.reppow, relativeTolerance, absoluteTolerance);
+ cmp_real(fp, "fudgeQQ", -1, ff1.fudgeQQ, ff2.fudgeQQ, relativeTolerance, absoluteTolerance);
+ cmp_cmap(fp, &ff1.cmap_grid, &ff2.cmap_grid, relativeTolerance, absoluteTolerance);
+ for (int i = 0; i < std::min(ff1.numTypes(), ff2.numTypes()); i++)
{
- cmp_idef(fp, &(t1->idef), &(t2->idef), ftol, abstol);
- cmp_atoms(fp, &(t1->atoms), &(t2->atoms), ftol, abstol);
- cmp_block(fp, &t1->cgs, &t2->cgs, "cgs");
- cmp_block(fp, &t1->mols, &t2->mols, "mols");
- cmp_bool(fp, "bIntermolecularInteractions", -1, t1->bIntermolecularInteractions, t2->bIntermolecularInteractions);
- cmp_blocka(fp, &t1->excls, &t2->excls, "excls");
+ std::string buf = gmx::formatString("ffparams->functype[%d]", i);
+ cmp_int(fp, buf.c_str(), i, ff1.functype[i], ff2.functype[i]);
+ buf = gmx::formatString("ffparams->iparams[%d]", i);
+ cmp_iparm(fp, buf.c_str(), ff1.functype[i], ff1.iparams[i], ff2.iparams[i], relativeTolerance, absoluteTolerance);
}
- else
+
+}
+
+static void compareFfparamAB(FILE *fp, const gmx_ffparams_t &ff1, real relativeTolerance, real absoluteTolerance)
+{
+ fprintf(fp, "comparing free energy parameters\n");
+ for (int i = 0; i < ff1.numTypes(); i++)
{
- cmp_idef(fp, &(t1->idef), nullptr, ftol, abstol);
- cmp_atoms(fp, &(t1->atoms), nullptr, ftol, abstol);
+ std::string buf = gmx::formatString("ffparams->iparams[%d]", i);
+ cmp_iparm_AB(fp, buf.c_str(), ff1.functype[i], ff1.iparams[i], relativeTolerance, absoluteTolerance);
+ }
+}
+static void compareInteractionLists(FILE *fp, const InteractionLists *il1, const InteractionLists *il2)
+{
+ fprintf(fp, "comparing InteractionLists\n");
+ if ((il1 || il2) && (!il1 || !il2))
+ {
+ fprintf(fp, "InteractionLists are present in topology %d but not in the other\n", il1 ? 1 : 2);
+ }
+ if (il1 && il2)
+ {
+ for (int i = 0; i < F_NRE; i++)
+ {
+ cmp_int(fp, "InteractionList size", i, il1->at(i).size(), il2->at(i).size());
+ int nr = std::min(il1->at(i).size(), il2->at(i).size());
+ for (int j = 0; j < nr; j++)
+ {
+ cmp_int(fp, "InteractionList entry", j, il1->at(i).iatoms.at(j), il2->at(i).iatoms.at(j));
+ }
+ }
}
}
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
- int natoms0, int natoms1)
+static void compareMoltypes(FILE *fp, gmx::ArrayRef<const gmx_moltype_t> mt1, gmx::ArrayRef<const gmx_moltype_t> mt2, real relativeTolerance, real absoluteTolerance)
{
- char buf[32];
+ fprintf(fp, "comparing molecule types\n");
+ cmp_int(fp, "moltype size", -1, mt1.size(), mt2.size());
+ for (int i = 0; i < std::min(mt1.size(), mt2.size()); i++)
+ {
+ cmp_str(fp, "Name", i, *mt1[i].name, *mt2[i].name);
+ compareAtoms(fp, &mt1[i].atoms, &mt2[i].atoms, relativeTolerance, absoluteTolerance);
+ compareInteractionLists(fp, &mt1[i].ilist, &mt2[i].ilist);
+ std::string buf = gmx::formatString("cgs[%d]", i);
+ cmp_block(fp, &mt1[i].cgs, &mt2[i].cgs, buf.c_str());
+ buf = gmx::formatString("excls[%d]", i);
+ cmp_blocka(fp, &mt1[i].excls, &mt2[i].excls, buf.c_str());
+ }
+}
+
+static void compareMoletypeAB(FILE *fp, gmx::ArrayRef<const gmx_moltype_t> mt1, real relativeTolerance, real absoluteTolerance)
+{
+ fprintf(fp, "comparing free energy molecule types\n");
+ for (int i = 0; i < mt1.size(); i++)
+ {
+ compareAtoms(fp, &mt1[i].atoms, nullptr, relativeTolerance, absoluteTolerance);
+ }
+}
+static void compareMolblocks(FILE *fp, gmx::ArrayRef<const gmx_molblock_t> mb1, gmx::ArrayRef<const gmx_molblock_t> mb2)
+{
+ fprintf(fp, "comparing molecule blocks\n");
+ cmp_int(fp, "molblock size", -1, mb1.size(), mb2.size());
+ int nr = std::min(mb1.size(), mb2.size());
+ for (int i = 0; i < nr; i++)
+ {
+ cmp_int(fp, "type", i, mb1[i].type, mb2[i].type);
+ cmp_int(fp, "nmol", i, mb1[i].nmol, mb2[i].nmol);
+ // Only checking size of restraint vectors for now
+ cmp_int(fp, "posres_xA size", i, mb1[i].posres_xA.size(), mb2[i].posres_xA.size());
+ cmp_int(fp, "posres_xB size", i, mb1[i].posres_xB.size(), mb2[i].posres_xB.size());
+ }
+
+}
+static void compareAtomtypes(FILE *fp, const t_atomtypes &at1, const t_atomtypes &at2)
+{
+ fprintf(fp, "comparing atomtypes\n");
+ cmp_int(fp, "nr", -1, at1.nr, at2.nr);
+ int nr = std::min(at1.nr, at2.nr);
+ for (int i = 0; i < nr; i++)
+ {
+ cmp_int(fp, "atomtype", i, at1.atomnumber[i], at2.atomnumber[i]);
+ }
+}
+
+static void compareIntermolecularExclusions(FILE *fp, gmx::ArrayRef<const int> ime1, gmx::ArrayRef<const int> ime2)
+{
+ fprintf(fp, "comparing intermolecular exclusions\n");
+ cmp_int(fp, "exclusion number", -1, ime1.size(), ime2.size());
+ int nr = std::min(ime1.size(), ime2.size());
+ for (int i = 0; i < nr; i++)
+ {
+ cmp_int(fp, "exclusion", i, ime1[i], ime2[i]);
+ }
+}
+
+static void compareBlockIndices(FILE *fp, gmx::ArrayRef<const MoleculeBlockIndices> mbi1, gmx::ArrayRef<const MoleculeBlockIndices> mbi2)
+{
+ fprintf(fp, "comparing moleculeBlockIndices\n");
+ cmp_int(fp, "size", -1, mbi1.size(), mbi2.size());
+ int nr = std::min(mbi1.size(), mbi2.size());
+ for (int i = 0; i < nr; i++)
+ {
+ cmp_int(fp, "numAtomsPerMolecule", i, mbi1[i].numAtomsPerMolecule, mbi2[i].numAtomsPerMolecule);
+ cmp_int(fp, "globalAtomStart", i, mbi1[i].globalAtomStart, mbi2[i].globalAtomStart);
+ cmp_int(fp, "globalAtomEnd", i, mbi1[i].globalAtomEnd, mbi2[i].globalAtomEnd);
+ cmp_int(fp, "globalResidueStart", i, mbi1[i].globalResidueStart, mbi2[i].globalResidueStart);
+ cmp_int(fp, "moleculeIndexStart", i, mbi1[i].moleculeIndexStart, mbi2[i].moleculeIndexStart);
+ }
+}
+
+void compareMtop(FILE *fp, const gmx_mtop_t &mtop1, const gmx_mtop_t &mtop2, real relativeTolerance, real absoluteTolerance)
+{
+ fprintf(fp, "comparing mtop topology\n");
+ cmp_str(fp, "Name", -1, *mtop1.name, *mtop2.name);
+ cmp_int(fp, "natoms", -1, mtop1.natoms, mtop2.natoms);
+ cmp_int(fp, "maxres_renum", -1, mtop1.maxres_renum, mtop2.maxres_renum);
+ cmp_int(fp, "maxresnr", -1, mtop1.maxresnr, mtop2.maxresnr);
+ cmp_bool(fp, "bIntermolecularInteractions", -1, mtop1.bIntermolecularInteractions, mtop2.bIntermolecularInteractions);
+ cmp_bool(fp, "haveMoleculeIndices", -1, mtop1.haveMoleculeIndices, mtop2.haveMoleculeIndices);
+
+ compareFfparams(fp, mtop1.ffparams, mtop2.ffparams, relativeTolerance, absoluteTolerance);
+ compareMoltypes(fp, mtop1.moltype, mtop2.moltype, relativeTolerance, absoluteTolerance);
+ compareMolblocks(fp, mtop1.molblock, mtop2.molblock);
+ compareInteractionLists(fp, mtop1.intermolecular_ilist.get(), mtop2.intermolecular_ilist.get());
+ compareAtomtypes(fp, mtop1.atomtypes, mtop2.atomtypes);
+ compareAtomGroups(fp, mtop1.groups, mtop2.groups, mtop1.natoms, mtop2.natoms);
+ compareIntermolecularExclusions(fp, mtop1.intermolecularExclusionGroup, mtop2.intermolecularExclusionGroup);
+ compareBlockIndices(fp, mtop1.moleculeBlockIndices, mtop2.moleculeBlockIndices);
+}
+
+void compareMtopAB(FILE *fp, const gmx_mtop_t &mtop1, real relativeTolerance, real absoluteTolerance)
+{
+ fprintf(fp, "comparing topAB\n");
+ compareFfparamAB(fp, mtop1.ffparams, relativeTolerance, absoluteTolerance);
+ compareMoletypeAB(fp, mtop1.moltype, relativeTolerance, absoluteTolerance);
+}
+
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+ int natoms0, int natoms1)
+{
fprintf(fp, "comparing groups\n");
for (int i = 0; i < egcNR; i++)
{
- sprintf(buf, "grps[%d].nr", i);
- cmp_int(fp, buf, -1, g0->grps[i].nr, g1->grps[i].nr);
- if (g0->grps[i].nr == g1->grps[i].nr)
+ std::string buf = gmx::formatString("grps[%d].nr", i);
+ cmp_int(fp, buf.c_str(), -1, g0.grps[i].nr, g1.grps[i].nr);
+ if (g0.grps[i].nr == g1.grps[i].nr)
{
- for (int j = 0; j < g0->grps[i].nr; j++)
+ for (int j = 0; j < g0.grps[i].nr; j++)
{
- sprintf(buf, "grps[%d].name[%d]", i, j);
- cmp_str(fp, buf, -1,
- *g0->grpname[g0->grps[i].nm_ind[j]],
- *g1->grpname[g1->grps[i].nm_ind[j]]);
+ buf = gmx::formatString("grps[%d].name[%d]", i, j);
+ cmp_str(fp, buf.c_str(), -1,
+ *g0.grpname[g0.grps[i].nm_ind[j]],
+ *g1.grpname[g1.grps[i].nm_ind[j]]);
}
}
- cmp_int(fp, "ngrpnr", i, g0->ngrpnr[i], g1->ngrpnr[i]);
- if (g0->ngrpnr[i] == g1->ngrpnr[i] && natoms0 == natoms1 &&
- (g0->grpnr[i] != nullptr || g1->grpnr[i] != nullptr))
+ cmp_int(fp, "ngrpnr", i, g0.ngrpnr[i], g1.ngrpnr[i]);
+ if (g0.ngrpnr[i] == g1.ngrpnr[i] && natoms0 == natoms1 &&
+ (g0.grpnr[i] != nullptr || g1.grpnr[i] != nullptr))
{
for (int j = 0; j < natoms0; j++)
{
*/
}
-int getGroupType(const gmx_groups_t *group, int type, int atom)
+int getGroupType(const gmx_groups_t &group, int type, int atom)
{
- return (group->grpnr[type] ? group->grpnr[type][atom] : 0);
+ return (group.grpnr[type] ? group.grpnr[type][atom] : 0);
}
void copy_moltype(const gmx_moltype_t *src, gmx_moltype_t *dst)
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* \param[in] type Type of group to check.
* \param[in] atom Atom to check if it has an entry.
*/
-int getGroupType (const gmx_groups_t *group, int type, int atom);
+int getGroupType (const gmx_groups_t &group, int type, int atom);
/* The global, complete system topology struct, based on molecule types.
* This structure should contain no data that is O(natoms) in memory.
std::vector<MoleculeBlockIndices> moleculeBlockIndices;
};
-/* The mdrun node-local topology struct, completely written out */
-typedef struct gmx_localtop_t
+/* \brief
+ * The fully written out topology for a domain over its lifetime
+ *
+ * Also used in some analysis code.
+ */
+struct gmx_localtop_t
{
- t_idef idef; /* The interaction function definition */
- t_atomtypes atomtypes; /* Atomtype properties */
- t_block cgs; /* The charge groups */
- t_blocka excls; /* The exclusions */
-} gmx_localtop_t;
+ //! Constructor used for normal operation, manages own resources.
+ gmx_localtop_t();
+
+ ~gmx_localtop_t();
+
+ //! The interaction function definition
+ t_idef idef;
+ //! Atomtype properties
+ t_atomtypes atomtypes;
+ //! The charge groups
+ t_block cgs;
+ //! The exclusions
+ t_blocka excls;
+ //! Flag for domain decomposition so we don't free already freed memory.
+ bool useInDomainDecomp_ = false;
+};
/* The old topology struct, completely written out, used in analysis tools */
typedef struct t_topology
// Frees both t_topology and gmx_mtop_t when the former has been created from
// the latter.
void done_top_mtop(t_topology *top, gmx_mtop_t *mtop);
-/*! \brief
- * Properly initialize local topology.
- *
- * \param[in] top Pointer to topology to initialize.
- */
-void init_localtop(gmx_localtop_t *top);
-/*! \brief
- * Properly clear up local topology,
- *
- * \param[in] top Pointer to topology to clear up.
- */
-void done_localtop(gmx_localtop_t *top);
-void done_and_sfree_localtop(gmx_localtop_t *top);
bool gmx_mtop_has_masses(const gmx_mtop_t *mtop);
bool gmx_mtop_has_charges(const gmx_mtop_t *mtop);
void pr_top(FILE *fp, int indent, const char *title, const t_topology *top,
gmx_bool bShowNumbers, gmx_bool bShowParameters);
-void cmp_top(FILE *fp, const t_topology *t1, const t_topology *t2, real ftol, real abstol);
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
- int natoms0, int natoms1);
+/*! \brief Compare two mtop topologies.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] mtop1 First topology to compare.
+ * \param[in] mtop2 Second topology to compare.
+ * \param[in] relativeTolerance Relative tolerance for comparison.
+ * \param[in] absoluteTolerance Absolute tolerance for comparison.
+ */
+void compareMtop(FILE *fp, const gmx_mtop_t &mtop1, const gmx_mtop_t &mtop2, real relativeTolerance, real absoluteTolerance);
+
+/*! \brief Check perturbation parameters in topology.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] mtop1 Topology to check perturbation parameters in.
+ * \param[in] relativeTolerance Relative tolerance for comparison.
+ * \param[in] absoluteTolerance Absolute tolerance for comparison.
+ */
+void compareMtopAB(FILE *fp, const gmx_mtop_t &mtop1, real relativeTolerance, real absoluteTolerance);
+
+/*! \brief Compare groups.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] g0 First group for comparison.
+ * \param[in] g1 Second group for comparison.
+ * \param[in] natoms0 Number of atoms for first group.
+ * \param[in] natoms1 Number of atoms for second group.
+ */
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+ int natoms0, int natoms1);
-//! Deleter for gmx_localtop_t, needed until it has a proper destructor.
-using ExpandedTopologyPtr = gmx::unique_cptr<gmx_localtop_t, done_and_sfree_localtop>;
+//! Typedef for gmx_localtop in analysis tools.
+using ExpandedTopologyPtr = std::unique_ptr<gmx_localtop_t>;
void copy_moltype(const gmx_moltype_t *src, gmx_moltype_t *dst);
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
}
if (cmp_bool(fp, "bAtoms", -1, fr1->bAtoms, fr2->bAtoms))
{
- cmp_atoms(fp, fr1->atoms, fr2->atoms, ftol, abstol);
+ compareAtoms(fp, fr1->atoms, fr2->atoms, ftol, abstol);
}
if (cmp_bool(fp, "bPrec", -1, fr1->bPrec, fr2->bPrec))
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
// Initiate variable
cutoff_ = 0;
int nnovdw = 0;
- gmx_atomprop_t aps = gmx_atomprop_init();
+ AtomProperties aps;
auto atoms = top.copyAtoms();
// Compute total mass
// Lookup the Van der Waals radius of this atom
int resnr = atoms->atom[i].resind;
- if (gmx_atomprop_query(aps, epropVDW,
- *(atoms->resinfo[resnr].name),
- *(atoms->atomname[i]),
- &value))
+ if (aps.setAtomProperty(epropVDW,
+ *(atoms->resinfo[resnr].name),
+ *(atoms->atomname[i]),
+ &value))
{
vdw_radius_.push_back(value);
if (value > cutoff_)
vdw_radius_.push_back(0.0);
}
}
- gmx_atomprop_destroy(aps);
// Increase cutoff by proberadius to make sure we do not miss
// anything
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2006, The GROMACS development team.
- * Copyright (c) 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
// TODO: Not exception-safe, but nice solution would be to have a C++
// atom properties class...
- gmx_atomprop_t aps = gmx_atomprop_init();
+ AtomProperties aps;
ArrayRef<const int> atomIndices = surfaceSel_.atomIndices();
int ndefault = 0;
const int ii = atomIndices[i];
const int resind = atoms_->atom[ii].resind;
real radius;
- if (!gmx_atomprop_query(aps, epropVDW,
- *(atoms_->resinfo[resind].name),
- *(atoms_->atomname[ii]), &radius))
+ if (!aps.setAtomProperty(epropVDW,
+ *(atoms_->resinfo[resind].name),
+ *(atoms_->atomname[ii]), &radius))
{
ndefault++;
}
if (bDGsol)
{
real dgsFactor;
- if (!gmx_atomprop_query(aps, epropDGsol,
- *(atoms_->resinfo[resind].name),
- *(atoms_->atomtype[ii]), &dgsFactor))
+ if (!aps.setAtomProperty(epropDGsol,
+ *(atoms_->resinfo[resind].name),
+ *(atoms_->atomtype[ii]), &dgsFactor))
{
dgsFactor = dgsDefault_;
}
{
fprintf(stderr, "WARNING: could not find a Van der Waals radius for %d atoms\n", ndefault);
}
- gmx_atomprop_destroy(aps);
// Pre-compute mapping from the output groups to the calculation group,
// and store it in the selection ID map for easy lookup.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
// Do lazy initialization
if (expandedTopology_ == nullptr && hasTopology())
{
- expandedTopology_.reset(gmx_mtop_generate_local_top(mtop_.get(), false));
+ expandedTopology_ = gmx::compat::make_unique<gmx_localtop_t>();
+ gmx_mtop_generate_local_top(*mtop_, expandedTopology_.get(), false);
}
return expandedTopology_.get();
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
/*! \internal \file
* \brief
- * Implements functionality from variant.h.
+ * Implements functionality from any.h.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
* \ingroup module_utility
*/
#include "gmxpre.h"
-#include "variant.h"
+#include "any.h"
#include <string>
{
//! \cond libapi
-std::string simpleValueToString(const Variant &value)
+std::string simpleValueToString(const Any &value)
{
if (value.isType<bool>())
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
*/
/*! \libinternal \file
* \brief
- * Declares gmx::Variant.
+ * Declares gmx::Any.
*
* \author Teemu Murtola <teemu.murtola@gmail.com>
* \inlibraryapi
* \ingroup module_utility
*/
-#ifndef GMX_UTILITY_VARIANT_H
-#define GMX_UTILITY_VARIANT_H
+#ifndef GMX_UTILITY_ANY_H
+#define GMX_UTILITY_ANY_H
#include <memory>
#include <string>
/*! \libinternal \brief
* Represents a dynamically typed value of an arbitrary type.
*
- * To create a variant, either initialize it as empty, or with the create()
+ * To create a any, either initialize it as empty, or with the create()
* method (or the equivalent constructor, if the type parameter can be deduced
* and is clear to the reader from the context).
*
- * To query the type of the contents in the variant, use isEmpty(), type(), and
+ * To query the type of the contents in the any, use isEmpty(), type(), and
* isType().
*
* To access the value, you need to know the type as a compile-time constant
*
* \ingroup module_utility
*/
-class Variant
+class Any
{
public:
/*! \brief
- * Creates a variant that holds the given value.
+ * Creates a any that holds the given value.
*
* \throws std::bad_alloc if out of memory.
*
* contrary to the templated constructor.
*/
template <typename T>
- static Variant create(const T &value) { return Variant(value); }
+ static Any create(const T &value) { return Any(value); }
/*! \brief
- * Creates a variant that holds the given value.
+ * Creates a any that holds the given value.
*
* \throws std::bad_alloc if out of memory.
*
* method avoids copying when move-construction is possible.
*/
template <typename T>
- static Variant create(T &&value) { return Variant(std::forward<T>(value)); }
+ static Any create(T &&value) { return Any(std::forward<T>(value)); }
- //! Creates an empty variant value.
- Variant() {}
+ //! Creates an empty any value.
+ Any() {}
/*! \brief
- * Creates a variant that holds the given value.
+ * Creates a any that holds the given value.
*
* \throws std::bad_alloc if out of memory.
*/
- template <typename T, typename = typename std::enable_if<!std::is_same<T, Variant>::value>::type>
- explicit Variant(T &&value)
+ template <typename T, typename = typename std::enable_if<!std::is_same<T, Any>::value>::type>
+ explicit Any(T &&value)
: content_(new Content<typename std::decay<T>::type>(std::forward<T>(value)))
{
}
/*! \brief
- * Creates a deep copy of a variant.
+ * Creates a deep copy of a any.
*
* \throws std::bad_alloc if out of memory.
*/
- Variant(const Variant &other) : content_(other.cloneContent()) {}
- //! Move-constructs a variant.
- Variant(Variant &&other) noexcept : content_(std::move(other.content_)) {}
+ Any(const Any &other) : content_(other.cloneContent()) {}
+ //! Move-constructs a any.
+ Any(Any &&other) noexcept : content_(std::move(other.content_)) {}
/*! \brief
- * Assigns the variant.
+ * Assigns the any.
*
* \throws std::bad_alloc if out of memory.
*/
- Variant &operator=(const Variant &other)
+ Any &operator=(const Any &other)
{
content_ = other.cloneContent();
return *this;
}
- //! Move-assigns the variant.
- Variant &operator=(Variant &&other) noexcept
+ //! Move-assigns the any.
+ Any &operator=(Any &&other) noexcept
{
content_ = std::move(other.content_);
return *this;
/*! \brief
* Gets the value when the type is known.
*
- * \tparam T Type to get (which must match what the variant stores).
+ * \tparam T Type to get (which must match what the any stores).
*
- * Asserts if the variant is empty or does not contain the requested type.
+ * Asserts if the any is empty or does not contain the requested type.
*/
template <typename T>
const T &cast() const
/*! \brief
* Gets the value when the type is known as a modifiable reference.
*
- * \tparam T Type to get (which must match what the variant stores).
+ * \tparam T Type to get (which must match what the any stores).
*
- * Asserts if the variant is empty or does not contain the requested type.
+ * Asserts if the any is empty or does not contain the requested type.
*/
template <typename T>
T &castRef()
//! \cond libapi
/*! \brief
- * Converts a Variant value to a string.
+ * Converts a Any value to a string.
*
* As the name suggests, only some types of "simple" values (such as int) are
* supported. Asserts for unsupported types.
*
* \ingroup module_utility
*/
-std::string simpleValueToString(const Variant &value);
+std::string simpleValueToString(const Any &value);
//! \endcond
} // namespace gmx
{ "Why would the backup server database get corrupted anyway?", "Stefan Fleischmann -- system administrator, physicist, optimist." },
{ "Teaching quantum computing is like teaching computer science at Hogwarts.", "Thomas Sterling, ISC2018 keynote" },
{ "It is unfortunate that the authors did not make better use of all the electric power energy that went into these massive computations.", "An anonymous referee" },
+ { "Doctor, doctor, it hurts when I hit myself in the head with the hammer! - So don't do it!", "Bjarne Stroustrup at CppCon2015" },
{ "This is extremely unlikely.", "Berk Hess" },
{ "Nothing is more anarchic than power.", "Pier Paolo Pasolini" },
};
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \libinternal \file
+ * \brief Declares an allocator that can use default initialization instead
+ * of values initialization. This is useful for improving performance of
+ * resize() in standard vectors for buffers in performance critical code.
+ *
+ * \author Berk Hess <hess@kth.se>
+ * \inlibraryapi
+ * \ingroup module_utility
+ */
+#ifndef GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
+#define GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
+
+#include <memory>
+
+namespace gmx
+{
+
+/*! \libinternal \brief Allocator adaptor that interposes construct() calls to
+ * convert value initialization into default initialization.
+ *
+ * This can be used to avoid initialization e.g. on resize() in std::vector.
+ */
+template <typename T, typename A = std::allocator<T> >
+class DefaultInitializationAllocator : public A
+{
+ typedef std::allocator_traits<A> a_t;
+ public:
+ template <typename U> struct rebind {
+ using other =
+ DefaultInitializationAllocator < U, typename a_t::template rebind_alloc < U>>;
+ };
+
+ using A::A;
+
+ /*! \brief Constructs an object and default initializes */
+ template <typename U>
+ void construct(U* ptr)
+ noexcept(std::is_nothrow_default_constructible<U>::value) {
+ ::new(static_cast<void*>(ptr))U;
+ }
+
+ /*! \brief Constructs an object and value initializes */
+ template <typename U, typename ... Args>
+ void construct(U* ptr, Args && ... args)
+ {
+ a_t::construct(static_cast<A &>(*this),
+ ptr, std::forward<Args>(args) ...);
+ }
+};
+
+} // namespace gmx
+
+#endif // GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \libinternal
+ * \file
+ * \brief Defines helper types for class enumerations.
+ *
+ * These helper types facilitate iterating over class enums, and
+ * maintaining a type-safe and value-safe matching list of names. The
+ * code is closely based on the public-domain code by Guilherme
+ * R. Lampert, found in commit c94c18a of
+ * https://github.com/glampert/enum_helpers/blob/master/enum_helpers.hpp
+ * Thanks Guilherme!
+ *
+ * NOTE This functionality only works for enumerations of monotonically
+ * increasing values, starting with the value zero.
+ *
+ * Usage example:
+ *
+ * enum class Foo
+ * {
+ * Bar, Baz, Fooz,
+ * Count
+ * };
+ *
+ * EnumerationWrapper<Foo> iter;
+ *
+ * for (Foo c : iter)
+ * {
+ * 'c' is a constant from Foo
+ * }
+ *
+ * const EnumerationArray<Foo, std::string> FooStrings = { { "Bar", "Baz", "Fooz" } };
+ *
+ * print(FooStrings[Foo::Bar]);
+ * print(FooStrings[Foo::Baz]);
+ * ...
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \inlibraryapi
+ * \ingroup module_utility
+ */
+#ifndef GMX_UTILITY_ENUMHELPERS_H
+#define GMX_UTILITY_ENUMHELPERS_H
+
+#include <cstddef>
+
+#include <iterator>
+#include <type_traits>
+
+#include "gromacs/utility/gmxassert.h"
+
+namespace gmx
+{
+
+/*! \libinternal
+ * \brief Allows iterating sequential enumerators.
+ *
+ * You can also provide an increment step > 1 if each constant is
+ * spaced by a larger value. Terminating constant is assumed to be a
+ * 'Count' member, which is never iterated. A different name for the
+ * terminating constant can also be specified on declaration.
+ *
+ * NOTE This functionality only works for enumerations of monotonically
+ * increasing values, starting with the value zero.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam EnumType The enum (class) type.
+ * \tparam Last Last constant or number thereof (assumes a default 'Count' member).
+ * \tparam Step Step increment.
+ */
+template
+<
+ typename EnumType,
+ EnumType Last = EnumType::Count,
+ unsigned int Step = 1
+>
+class EnumerationIterator final
+ : public std::iterator<std::forward_iterator_tag, EnumType>
+{
+ public:
+ //! Convenience alias
+ using IntegerType = typename std::underlying_type<EnumType>::type;
+
+ constexpr EnumerationIterator() noexcept :
+ m_current { 0 } // Assumes 0 is the first constant
+ { }
+ //! Copy constructor
+ constexpr EnumerationIterator(const EnumType index) noexcept
+ : m_current(static_cast<IntegerType>(index))
+ { }
+ //! Pre-increment operator
+ EnumerationIterator operator++()
+ {
+ m_current += Step;
+ return *this;
+ }
+ //! Post-increment operator
+ EnumerationIterator operator++(int)
+ {
+ EnumerationIterator old_val { *this };
+ m_current += Step;
+ return old_val;
+ }
+ //! Dereference operator
+ EnumType operator*() const
+ {
+ GMX_ASSERT(m_current < static_cast<IntegerType>(Last), "dereferencing out of range");
+ return static_cast<EnumType>(m_current);
+ }
+
+ /*!@{*/
+ //! Comparision operators
+ bool operator== (const EnumerationIterator other) const noexcept { return m_current == other.m_current; }
+ bool operator!= (const EnumerationIterator other) const noexcept { return m_current != other.m_current; }
+ bool operator< (const EnumerationIterator other) const noexcept { return m_current < other.m_current; }
+ bool operator> (const EnumerationIterator other) const noexcept { return m_current > other.m_current; }
+ bool operator<= (const EnumerationIterator other) const noexcept { return m_current <= other.m_current; }
+ bool operator>= (const EnumerationIterator other) const noexcept { return m_current >= other.m_current; }
+ /*!@}*/
+
+ private:
+ IntegerType m_current;
+};
+
+/*! \libinternal
+ * \brief Allows constructing iterators for looping over sequential enumerators.
+ *
+ * These are particularly useful for range-based for statements.
+ *
+ * You can also provide an increment step > 1 if each constant is
+ * spaced by a larger value. Terminating constant is assumed to be a
+ * 'Count' member, which is never iterated. A different name for the
+ * terminating constant can also be specified on declaration.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam EnumType The enum (class) type.
+ * \tparam Last Last constant or number thereof (assumes a default 'Count' member).
+ * \tparam Step Step increment.
+ */
+template
+<
+ typename EnumType,
+ EnumType Last = EnumType::Count,
+ unsigned int Step = 1
+>
+class EnumerationWrapper final
+{
+ public:
+ //! Convenience alias.
+ using IteratorType = EnumerationIterator<EnumType, Last, Step>;
+
+ //! Functions required for range-based for statements to work.
+ /*!@{*/
+ IteratorType begin() const { return IteratorType {}; }
+ IteratorType end() const { return IteratorType { Last }; }
+ /*!@}*/
+};
+
+/*! \libinternal
+ * \brief Wrapper for a C-style array with size and indexing defined
+ * by an enum. Useful for declaring arrays of enum names for debug
+ * or other printing.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam EnumType The enum (class) type.
+ * \tparam DataType Type of the data stored in the array.
+ * \tparam ArraySize Size in entries of the array.
+ */
+template
+<
+ typename EnumType, // The enum (class) type.
+ typename DataType, // Type of the data stored in the array.
+ EnumType ArraySize = EnumType::Count // Size in entries of the array.
+>
+struct EnumerationArray final
+{
+ //! Convenience alias
+ using EnumerationWrapperType = EnumerationWrapper<EnumType, ArraySize>;
+
+ /*! \brief Data for names.
+ *
+ * Data is kept public so we can use direct aggregate
+ * initialization just like in a plain C-style array. */
+ DataType m_elements[std::size_t(ArraySize)];
+
+ //! Returns an object that provides iterators over the keys.
+ static constexpr EnumerationWrapperType keys() { return EnumerationWrapperType {}; }
+ //! Returns the size of the enumeration.
+ static constexpr std::size_t size() { return std::size_t(ArraySize); }
+
+ /*!@{*/
+ //! Array access with asserts:
+ DataType &operator[](const std::size_t index)
+ {
+ GMX_ASSERT(index < size(), "index out of range");
+ return m_elements[index];
+ }
+ const DataType &operator[](const std::size_t index) const
+ {
+ GMX_ASSERT(index < size(), "index out of range");
+ return m_elements[index];
+ }
+
+ DataType &operator[](const EnumType index)
+ {
+ GMX_ASSERT(std::size_t(index) < size(), "index out of range");
+ return m_elements[std::size_t(index)];
+ }
+ const DataType &operator[](const EnumType index) const
+ {
+ GMX_ASSERT(std::size_t(index) < size(), "index out of range");
+ return m_elements[std::size_t(index)];
+ }
+ /*!@}*/
+
+ /*!@{*/
+ //! Range iterators (unchecked)
+ using iterator = DataType *;
+ using const_iterator = const DataType *;
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+ /*!@}*/
+
+ /*!@{*/
+ //! Getters for forward iterators for ranges
+ iterator begin() { return &m_elements[0]; }
+ iterator end() { return &m_elements[size()]; }
+ const_iterator begin() const { return &m_elements[0]; }
+ const_iterator end() const { return &m_elements[size()]; }
+ /*!@}*/
+
+ /*!@{*/
+ //! Getters for reverse iterators for ranges
+ reverse_iterator rbegin() { return reverse_iterator { end() }; }
+ reverse_iterator rend() { return reverse_iterator { begin() }; }
+ const_reverse_iterator rbegin() const { return const_reverse_iterator { end() }; }
+ const_reverse_iterator rend() const { return const_reverse_iterator { begin() }; }
+ /*!@}*/
+};
+
+} // namespace gmx
+
+#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <utility>
#include <vector>
+#include "gromacs/utility/any.h"
#include "gromacs/utility/real.h"
-#include "gromacs/utility/variant.h"
namespace gmx
{
template <typename T>
const T &cast() const { return value_.cast<T>(); }
- //! Returns the raw Variant value (always possible).
- const Variant &asVariant() const { return value_; }
+ //! Returns the raw Any value (always possible).
+ const Any &asAny() const { return value_; }
private:
- explicit KeyValueTreeValue(Variant &&value) : value_(std::move(value)) {}
+ explicit KeyValueTreeValue(Any &&value) : value_(std::move(value)) {}
- Variant value_;
+ Any value_;
friend class KeyValueTreeBuilder;
friend class KeyValueTreeObjectBuilder;
static inline std::string
simpleValueToString(const KeyValueTreeValue &value)
{
- return simpleValueToString(value.asVariant());
+ return simpleValueToString(value.asAny());
}
//! \endcond
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <utility>
#include <vector>
+#include "gromacs/utility/any.h"
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/keyvaluetree.h"
-#include "gromacs/utility/variant.h"
namespace gmx
{
template <typename T>
static KeyValueTreeValue createValue(const T &value)
{
- return KeyValueTreeValue(Variant::create<T>(value));
+ return KeyValueTreeValue(Any::create<T>(value));
}
/*! \brief
* Helper function for other builders to create default-constructed
template <typename T>
static KeyValueTreeValue createValue()
{
- return KeyValueTreeValue(Variant::create<T>(T()));
+ return KeyValueTreeValue(Any::create<T>(T()));
}
KeyValueTreeObject root_;
template <typename T>
void setValue(const T &value)
{
- value_ = Variant::create<T>(value);
+ value_ = Any::create<T>(value);
}
- //! Assigns a Variant value to the built value.
- void setVariantValue(Variant &&value)
+ //! Assigns a Any value to the built value.
+ void setAnyValue(Any &&value)
{
value_ = std::move(value);
}
KeyValueTreeValue build() { return KeyValueTreeValue(std::move(value_)); }
private:
- Variant value_;
+ Any value_;
};
class KeyValueTreeArrayBuilderBase
{
}
- //! Appends a raw Variant value to the array.
- KeyValueTreeValue &addRawValue(Variant &&value)
+ //! Appends a raw Any value to the array.
+ KeyValueTreeValue &addRawValue(Any &&value)
{
KeyValueTreeValueBuilder builder;
- builder.setVariantValue(std::move(value));
+ builder.setAnyValue(std::move(value));
array_->values_.push_back(builder.build());
return array_->values_.back();
}
{
addProperty(key, std::move(value));
}
- //! Adds a property with given key from a Variant value.
- void addRawValue(const std::string &key, Variant &&value)
+ //! Adds a property with given key from a Any value.
+ void addRawValue(const std::string &key, Any &&value)
{
addProperty(key, KeyValueTreeValue(std::move(value)));
}
inline KeyValueTreeObjectBuilder KeyValueTreeValueBuilder::createObject()
{
- value_ = Variant::create<KeyValueTreeObject>(KeyValueTreeObject());
+ value_ = Any::create<KeyValueTreeObject>(KeyValueTreeObject());
return KeyValueTreeObjectBuilder(&value_.castRef<KeyValueTreeObject>());
}
inline KeyValueTreeArrayBuilder KeyValueTreeValueBuilder::createArray()
{
- value_ = Variant::create<KeyValueTreeArray>(KeyValueTreeArray());
+ value_ = Any::create<KeyValueTreeArray>(KeyValueTreeArray());
return KeyValueTreeArrayBuilder(&value_.castRef<KeyValueTreeArray>());
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
data_->keyMatchRule_ = true;
}
-void KeyValueTreeTransformRuleBuilder::addTransformToVariant(
- const std::function<Variant(const Variant &)> &transform)
+void KeyValueTreeTransformRuleBuilder::addTransformToAny(
+ const std::function<Any(const Any &)> &transform)
{
data_->transform_ =
[transform] (KeyValueTreeValueBuilder *builder, const KeyValueTreeValue &value)
{
- builder->setVariantValue(transform(value.asVariant()));
+ builder->setAnyValue(transform(value.asAny()));
};
}
void KeyValueTreeTransformRuleBuilder::addTransformToObject(
- const std::function<void(KeyValueTreeObjectBuilder *, const Variant &)> &transform)
+ const std::function<void(KeyValueTreeObjectBuilder *, const Any &)> &transform)
{
data_->transform_ =
[transform] (KeyValueTreeValueBuilder *builder, const KeyValueTreeValue &value)
{
KeyValueTreeObjectBuilder obj = builder->createObject();
- transform(&obj, value.asVariant());
+ transform(&obj, value.asAny());
};
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <typeindex>
#include <vector>
+#include "gromacs/utility/any.h"
#include "gromacs/utility/classhelpers.h"
#include "gromacs/utility/keyvaluetree.h"
-#include "gromacs/utility/variant.h"
namespace gmx
{
*/
void transformWith(std::function<ToType(const FromType &)> transform)
{
- builder_->addTransformToVariant(
- [transform] (const Variant &value)
+ builder_->addTransformToAny(
+ [transform] (const Any &value)
{
- return Variant::create<ToType>(transform(value.cast<FromType>()));
+ return Any::create<ToType>(transform(value.cast<FromType>()));
});
}
};
void transformWith(std::function<void(KeyValueTreeObjectBuilder *, const FromType &)> transform)
{
builder_->addTransformToObject(
- [transform] (KeyValueTreeObjectBuilder *builder, const Variant &value)
+ [transform] (KeyValueTreeObjectBuilder *builder, const Any &value)
{
transform(builder, value.cast<FromType>());
});
void setExpectedType(const std::type_index &type);
void setToPath(const KeyValueTreePath &path);
void setKeyMatchType(StringCompareType keyMatchType);
- void addTransformToVariant(const std::function<Variant(const Variant &)> &transform);
- void addTransformToObject(const std::function<void(KeyValueTreeObjectBuilder *, const Variant &)> &transform);
+ void addTransformToAny(const std::function<Any(const Any &)> &transform);
+ void addTransformToObject(const std::function<void(KeyValueTreeObjectBuilder *, const Any &)> &transform);
class Data;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/baseversion.h"
#include "gromacs/utility/cstringutil.h"
#include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
typedef struct {
const char *key;
"Flexible constraints: an adiabatic treatment of quantum degrees of freedom, with application to the flexible and polarizable MCDHO model for water",
"J. Chem. Phys.",
116, 2002, "9602-9610" },
- { "Hetenyi2002b",
- "Csaba Hetenyi and David van der Spoel",
- "Efficient docking of peptides to proteins without prior knowledge of the binding site.",
- "Prot. Sci.",
- 11, 2002, "1729-1737" },
{ "Hess2003",
"B. Hess and R.M. Scheek",
"Orientation restraints in molecular dynamics simulations using time and ensemble averaging",
/* Not a release build, return without printing anything */
return;
}
-
- const char *doiString = wrap_lines(gmxDOI(), LINE_WIDTH, 0, FALSE);
+ gmx::TextLineWrapper wrapper;
+ wrapper.settings().setLineLength(LINE_WIDTH);
+ wrapper.settings().setFirstLineIndent(0);
+ const std::string doiString = wrapper.wrapToString(gmxDOI());
if (fp == nullptr)
{
return;
}
fprintf(fp, "\n++++ PLEASE CITE THE DOI FOR THIS VERSION OF GROMACS ++++\n");
- fprintf(fp, "%s%s\n", "https://doi.org/", doiString);
+ fprintf(fp, "%s%s\n", "https://doi.org/", doiString.c_str());
fprintf(fp, "-------- -------- --- Thank You --- -------- --------\n\n");
fflush(fp);
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
return replaceInternal(input, from.c_str(), to.c_str(), true);
}
+bool equalCaseInsensitive(const std::string &source, const std::string &target)
+{
+ return source.length() == target.length() &&
+ std::equal(source.begin(), source.end(), target.begin(),
+ [](const char &s, const char &t)
+ { return std::tolower(s) == std::tolower(t); });
+}
/********************************************************************
* TextLineWrapperSettings
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
std::string replaceAllWords(const std::string &input,
const std::string &from, const std::string &to);
+/*! \brief Return whether two strings are equal, ignoring case.
+ *
+ * Checks if two strings have the same length and if all characters
+ * in them match when compared case insensitive.
+ * Characters are converted by using std::tolower.
+ *
+ * \param[in] source Search string to compare against \p target.
+ * \param[in] target String to be matched to \p source.
+ * \returns True if the strings match.
+ */
+bool equalCaseInsensitive(const std::string &source,
+ const std::string &target);
+
class TextLineWrapper;
/*! \brief
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
alignedallocator.cpp
arrayref.cpp
bitmask32.cpp bitmask64.cpp bitmask128.cpp
+ defaultinitializationallocator.cpp
+ enumerationhelpers.cpp
keyvaluetreeserializer.cpp
keyvaluetreetransform.cpp
gmxregex.cpp
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Tests for gmx::DefaultInitializationAllocator used in std::vector
+ *
+ * \author Berk Hess <hess@kth.se>
+ * \ingroup module_utility
+ */
+
+#include "gmxpre.h"
+
+#include "gromacs/utility/defaultinitializationallocator.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/utility/gmxassert.h"
+
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+TEST(DefaultInitializationAllocator, PerformsValueInitialization)
+{
+ std::vector < int, DefaultInitializationAllocator < int>> v;
+
+ v.resize(1, 2);
+ EXPECT_EQ(v[0], 2);
+}
+
+TEST(DefaultInitializationAllocator, PerformsNoInitialization)
+{
+ std::vector < int, DefaultInitializationAllocator < int>> v {
+ 1, 2, 3
+ };
+
+ const int *oldData = v.data();
+ v.resize(0);
+ v.resize(3);
+ GMX_RELEASE_ASSERT(v.data() == oldData,
+ "According to the C++ standard std::vector will not reallocate when the capacity is sufficient");
+ // The allocation is the same, so the default initialization should
+ // not have changed the contents
+ EXPECT_EQ(v[0], 1);
+ EXPECT_EQ(v[1], 2);
+ EXPECT_EQ(v[2], 3);
+}
+
+} // namespace
+} // namespace test
+} // namespace gmx
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Tests for enumeration helpers
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \ingroup module_utility
+ */
+#include "gmxpre.h"
+
+#include "gromacs/utility/enumerationhelpers.h"
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+namespace
+{
+
+//! Type to use in testing
+enum class Foo
+{
+ Bar, Baz, Fooz,
+ Count
+};
+
+TEST(EnumerationHelpersTest, EnumerationWrapperWorks)
+{
+ EnumerationWrapper<Foo> iter;
+
+ // Range-based for works
+ int i = 0;
+ for (Foo c : iter)
+ {
+ EXPECT_EQ(static_cast<int>(c), i++);
+ }
+
+ // Normal iterators work
+ i = 0;
+ for (auto c = iter.begin(); c != iter.end(); ++c)
+ {
+ EXPECT_EQ(static_cast<int>(*c), i++);
+ }
+
+ auto a = std::begin(iter);
+ auto b = std::begin(iter);
+
+ ASSERT_EQ(a, b);
+ ASSERT_EQ(*(a++), Foo::Bar);
+ ASSERT_EQ(*(++b), Foo::Baz);
+}
+
+TEST(EnumerationHelpersTest, EnumerationArrayWorks)
+{
+ using FooArray = EnumerationArray<Foo, std::string>;
+ const FooArray FooStrings { {
+ "Bar", "Baz", "Fooz"
+ } };
+
+ // Keys give you the constants associated with each array index.
+ int i = 0;
+ for (auto k : FooArray::keys())
+ {
+ EXPECT_EQ(static_cast<int>(k), i++);
+ }
+
+ // Using iterators and operator[] gives the array values.
+ i = 0;
+ for (const auto &s : FooStrings)
+ {
+ EXPECT_EQ(s, FooStrings[i++]);
+ }
+
+ // Using reverse iterators gives the array values.
+ i = 2;
+ for (auto s = FooStrings.rbegin(); s != FooStrings.rend(); ++s)
+ {
+ EXPECT_EQ((*s), FooStrings[i--]);
+ }
+
+ // Incrementing iterators works
+ auto x = std::begin(FooStrings);
+ EXPECT_EQ(*x, "Bar");
+ ++x;
+ EXPECT_EQ(*x, "Baz");
+ ++x;
+ EXPECT_EQ(*x, "Fooz");
+
+ // Operator[] can be used with enumeration values.
+ EXPECT_EQ(FooStrings[Foo::Bar], "Bar");
+ EXPECT_EQ(FooStrings[Foo::Baz], "Baz");
+ EXPECT_EQ(FooStrings[Foo::Fooz], "Fooz");
+}
+
+} // namespace
+} // namespace gmx
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+# Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
${GMX_STDLIB_LIBRARIES})
set(BINARY_NAME "mdrun${GMX_BINARY_SUFFIX}")
set_target_properties(mdrun PROPERTIES
- OUTPUT_NAME "${BINARY_NAME}"
- COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+ OUTPUT_NAME "${BINARY_NAME}")
install(TARGETS mdrun DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT mdrun)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gmx-completion-${BINARY_NAME}.bash
"complete -o nospace -F _gmx_mdrun_compl ${BINARY_NAME}")
endif()
set(BINARY_NAME "gmx${GMX_BINARY_SUFFIX}")
set_target_properties(gmx PROPERTIES
- OUTPUT_NAME "${BINARY_NAME}"
- COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+ OUTPUT_NAME "${BINARY_NAME}")
install(TARGETS gmx
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/commandline/cmdlinemodulemanager.h"
#include "gromacs/commandline/cmdlineoptionsmodule.h"
#include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/gmxpreprocess/editconf.h"
#include "gromacs/gmxpreprocess/genconf.h"
+#include "gromacs/gmxpreprocess/genion.h"
+#include "gromacs/gmxpreprocess/genrestr.h"
#include "gromacs/gmxpreprocess/grompp.h"
#include "gromacs/gmxpreprocess/insert-molecules.h"
#include "gromacs/gmxpreprocess/pdb2gmx.h"
"Multiply a conformation in 'random' orientations");
registerModule(manager, &gmx_genion, "genion",
"Generate monoatomic ions on energetically favorable positions");
- registerModule(manager, &gmx_genpr, "genrestr",
+ registerModule(manager, &gmx_genrestr, "genrestr",
"Generate position restraints or distance restraints for index groups");
registerModule(manager, &gmx_make_edi, "make_edi",
"Generate input files for essential dynamics sampling");
registerModule(manager, &gmx_xpm2ps, "xpm2ps",
"Convert XPM (XPixelMap) matrices to postscript or XPM");
- registerModule(manager, &gmx_anadock, "anadock",
- "Cluster structures from Autodock runs");
registerModule(manager, &gmx_anaeig, "anaeig",
"Analyze eigenvectors/normal modes");
registerModule(manager, &gmx_analyze, "analyze",
"Analyze density of states and properties based on that");
registerModule(manager, &gmx_dyecoupl, "dyecoupl",
"Extract dye dynamics from trajectories");
- registerModule(manager, &gmx_dyndom, "dyndom",
- "Interpolate and extrapolate structure rotations");
registerModule(manager, &gmx_enemat, "enemat",
"Extract an energy matrix from an energy file");
registerModule(manager, &gmx_energy, "energy",
"Calculate residue contact maps");
registerModule(manager, &gmx_mindist, "mindist",
"Calculate the minimum distance between two groups");
- registerModule(manager, &gmx_morph, "morph",
- "Interpolate linearly between conformations");
registerModule(manager, &gmx_msd, "msd",
"Calculates mean square displacements");
registerModule(manager, &gmx_nmeig, "nmeig",
manager->addModuleGroup("Tools");
group.addModule("analyze");
group.addModule("awh");
- group.addModule("dyndom");
group.addModule("filter");
group.addModule("lie");
- group.addModule("morph");
group.addModule("pme_error");
group.addModule("sham");
group.addModule("spatial");
{
gmx::CommandLineModuleGroup group =
manager->addModuleGroup("Structural properties");
- group.addModule("anadock");
group.addModule("bundle");
group.addModule("clustsize");
group.addModule("disre");
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
energyreader.cpp
energycomparison.cpp
moduletest.cpp
- simulationdatabase.cpp
terminationhelper.cpp
trajectorycomparison.cpp
trajectoryreader.cpp
${exename}
# files with code for tests
minimize.cpp
+ normalmodes.cpp
rerun.cpp
- # pseudo-library for code for testing mdrun
- $<TARGET_OBJECTS:mdrun_test_objlib>
- # pseudo-library for code for mdrun
- $<TARGET_OBJECTS:mdrun_objlib>
- )
-gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST)
-
-# To permit other end-to-end tests to run with multiple OpenMP
-# threads, test cases that still use the group scheme are separated.
-set(testname "LegacyGroupSchemeMdrunTests")
-set(exename "legacy-mdrun-test")
-
-gmx_add_gtest_executable(
- ${exename}
- # When TPI supports the Verlet scheme, move this into
- # MdrunNonIntegratorTest
+ simple_mdrun.cpp
tpitest.cpp
# pseudo-library for code for testing mdrun
$<TARGET_OBJECTS:mdrun_test_objlib>
# pseudo-library for code for mdrun
$<TARGET_OBJECTS:mdrun_objlib>
)
-gmx_register_gtest_test(${testname} ${exename} INTEGRATION_TEST)
+gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST)
# Tests that only make sense to run with multiple ranks and/or real
# MPI are implemented here.
#include "testutils/cmdlinetest.h"
#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
#include "energycomparison.h"
#include "energyreader.h"
#include "moduletest.h"
-#include "simulationdatabase.h"
namespace gmx
{
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "testutils/mpitest.h"
#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
#include "testutils/testasserts.h"
#include "energycomparison.h"
#include "energyreader.h"
#include "moduletest.h"
-#include "simulationdatabase.h"
namespace gmx
{
relativeToleranceAsPrecisionDependentUlp(-1, 10, 200)
},
{
- "spc5",
+ "tip3p5",
relativeToleranceAsPrecisionDependentUlp(-50, 150, 3800)
},
{
std::vector<std::string> unconstrainedSystemsToTest_g = { "argon12", "glycine_no_constraints_vacuo" };
std::vector<std::string> minimizersToTest_g = { "steep", "cg", "l-bfgs" };
-std::vector<std::string> constrainedSystemsToTest_g = { "spc5", "glycine_vacuo", "alanine_vsite_vacuo" };
+std::vector<std::string> constrainedSystemsToTest_g = { "tip3p5", "glycine_vacuo", "alanine_vsite_vacuo" };
std::vector<std::string> minimizersToTestWithConstraints_g = { "steep", "cg" };
//! \}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <cstdio>
+#include "gromacs/gmxana/gmx_ana.h"
#include "gromacs/gmxpreprocess/grompp.h"
#include "gromacs/hardware/detecthardware.h"
#include "gromacs/options/basicoptions.h"
} // namespace
SimulationRunner::SimulationRunner(TestFileManager *fileManager) :
+ fullPrecisionTrajectoryFileName_(fileManager->getTemporaryFilePath(".trr")),
mdpOutputFileName_(fileManager->getTemporaryFilePath("output.mdp")),
tprFileName_(fileManager->getTemporaryFilePath(".tpr")),
logFileName_(fileManager->getTemporaryFilePath(".log")),
edrFileName_(fileManager->getTemporaryFilePath(".edr")),
+ mtxFileName_(fileManager->getTemporaryFilePath(".mtx")),
+
nsteps_(-2),
fileManager_(*fileManager)
{
gmx::TextWriter::writeFileFromString(ndxFileName_, ndxString);
}
+void
+SimulationRunner::useTopG96AndNdxFromDatabase(const std::string &name)
+{
+ topFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".top");
+ groFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".g96");
+ ndxFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".ndx");
+}
+
void
SimulationRunner::useTopGroAndNdxFromDatabase(const std::string &name)
{
return callGrompp(CommandLine());
}
+int
+SimulationRunner::callNmeig()
+{
+ /* Conforming to style guide by not passing a non-const reference
+ to this function. Passing a non-const reference might make it
+ easier to write code that incorrectly re-uses callerRef after
+ the call to this function. */
+
+ CommandLine caller;
+ caller.append("nmeig");
+ caller.addOption("-s", tprFileName_);
+ caller.addOption("-f", mtxFileName_);
+ // Ignore the overall translation and rotation in the
+ // first six eigenvectors.
+ caller.addOption("-first", "7");
+ // No need to check more than a number of output values.
+ caller.addOption("-last", "50");
+ caller.addOption("-xvg", "none");
+
+ return gmx_nmeig(caller.argc(), caller.argv());
+}
+
int
SimulationRunner::callMdrun(const CommandLine &callerRef)
{
caller.addOption("-g", logFileName_);
caller.addOption("-e", edrFileName_);
+ caller.addOption("-mtx", mtxFileName_);
caller.addOption("-o", fullPrecisionTrajectoryFileName_);
caller.addOption("-x", reducedPrecisionTrajectoryFileName_);
void useStringAsMdpFile(const std::string &mdpString);
//! Use a string as -n input to grompp
void useStringAsNdxFile(const char *ndxString);
+ //! Use a standard .top and .g96 file as input to grompp
+ void useTopG96AndNdxFromDatabase(const std::string &name);
//! Use a standard .top and .gro file as input to grompp
void useTopGroAndNdxFromDatabase(const std::string &name);
//! Use a standard .gro file as input to grompp
int callGromppOnThisRank(const CommandLine &callerRef);
//! Convenience wrapper for a default call to \c callGromppOnThisRank
int callGromppOnThisRank();
+ //! Calls nmeig for testing
+ int callNmeig();
//! Calls mdrun for testing with a customized command line
int callMdrun(const CommandLine &callerRef);
/*! \brief Convenience wrapper for calling mdrun for testing
std::string tprFileName_;
std::string logFileName_;
std::string edrFileName_;
+ std::string mtxFileName_;
std::string cptFileName_;
std::string swapFileName_;
int nsteps_;
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+
+/*! \internal \file
+ * \brief
+ * Tests for the normal modes functionality.
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/compat/make_unique.h"
+#include "gromacs/options/filenameoption.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/trajectory/energyframe.h"
+#include "gromacs/trajectory/trajectoryframe.h"
+#include "gromacs/utility/basenetwork.h"
+#include "gromacs/utility/filestream.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/mpitest.h"
+#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
+#include "testutils/testasserts.h"
+#include "testutils/xvgtest.h"
+
+#include "energycomparison.h"
+#include "energyreader.h"
+#include "moduletest.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+//! Helper type
+using MdpField = MdpFieldValues::value_type;
+
+/*! \brief Test fixture base for normal mode analysis
+ *
+ * This test ensures mdrun can run a normal mode analys, reaching
+ * a reproducible eigenvalues following diagonalization.
+ *
+ * The choices for tolerance are arbitrary but sufficient. */
+class NormalModesTest : public MdrunTestFixture,
+ public ::testing::WithParamInterface <
+ std::tuple < std::string, std::string>>
+{
+};
+
+TEST_P(NormalModesTest, WithinTolerances)
+{
+ auto params = GetParam();
+ auto simulationName = std::get<0>(params);
+ auto integrator = std::get<1>(params);
+ SCOPED_TRACE(formatString("Comparing normal modes for '%s'",
+ simulationName.c_str()));
+
+ // TODO At some point we should also test PME-only ranks.
+ int numRanksAvailable = getNumberOfTestMpiRanks();
+ if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable))
+ {
+ fprintf(stdout, "Test system '%s' cannot run with %d ranks.\n"
+ "The supported numbers are: %s\n",
+ simulationName.c_str(), numRanksAvailable,
+ reportNumbersOfPpRanksSupported(simulationName).c_str());
+ return;
+ }
+ auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(),
+ integrator.c_str(),
+ "no", "no");
+ mdpFieldValues["nsteps"] = "1";
+ mdpFieldValues["rcoulomb"] = "5.6";
+ mdpFieldValues["rlist"] = "5.6";
+ mdpFieldValues["rvdw"] = "5.6";
+ mdpFieldValues["constraints"] = "none";
+ mdpFieldValues.insert(MdpField("coulombtype", "Cut-off"));
+ mdpFieldValues.insert(MdpField("vdwtype", "Cut-off"));
+
+ // prepare the .tpr file
+ {
+ CommandLine caller;
+ runner_.useTopG96AndNdxFromDatabase(simulationName);
+ runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues));
+ EXPECT_EQ(0, runner_.callGrompp(caller));
+ }
+ // Do mdrun, preparing to check the normal modes later
+ {
+ CommandLine mdrunCaller;
+ ASSERT_EQ(0, runner_.callMdrun(mdrunCaller));
+ }
+ // Now run gmx nmeig and check the output
+ {
+ ASSERT_EQ(0, runner_.callNmeig());
+ TestReferenceData refData;
+ auto checker = refData.rootChecker()
+ .checkCompound("System", simulationName)
+ .checkCompound("Integrator", integrator);
+ auto settings = XvgMatchSettings();
+ TextInputFile input("eigenval.xvg");
+ checkXvgFile(&input, &checker, settings);
+ }
+}
+
+//! Containers of systems and integrators to test.
+//! \{
+std::vector<std::string> systemsToTest_g = { "scaled-water", "villin", "spc-dimer", "one-tip5p", "sw-dimer" };
+std::vector<std::string> integratorsToTest_g = { "nm" };
+
+//! \}
+
+// The time for OpenCL kernel compilation means these tests might time
+// out. If that proves to be a problem, these can be disabled for
+// OpenCL builds. However, once that compilation is cached for the
+// lifetime of the whole test binary process, these tests should run in
+// such configurations.
+#if GMX_DOUBLE
+INSTANTIATE_TEST_CASE_P(NormalModesWorks, NormalModesTest,
+ ::testing::Combine(::testing::ValuesIn(systemsToTest_g),
+ ::testing::ValuesIn(integratorsToTest_g)));
+#endif
+} // namespace
+} // namespace test
+} // namespace gmx
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Simulation Name="angles1">
+ <Mdrun Name="md">
+ <Energy Name="Kinetic En.">
+ <Real Name="Time 0.000000 Step 0 in frame 0">8.8827049229659867</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">8.6853411978925212</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">9.0476379091109891</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">9.8917199248001868</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">10.970729795432797</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">11.969598016517697</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">12.620267943889669</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">12.784778605942707</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">12.481797526143797</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">11.859180066366713</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">11.133173167819335</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">10.519456636414786</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">10.175948192781643</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">10.141536444106846</Real>
+ </Energy>
+ <Energy Name="Pressure">
+ <Real Name="Time 0.000000 Step 0 in frame 0">0.050796915464453078</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">0.049668265065138079</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">0.051740106421168025</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">0.056567100356897236</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">0.062737560105270318</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">0.06844971929851254</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">0.072170660789039956</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">0.073111436629933163</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">0.071378799507418461</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">0.067818279739479667</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">0.063666513878523082</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">0.060156895239239817</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">0.058192497060544725</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">0.057995708953366192</Real>
+ </Energy>
+ <Energy Name="Potential">
+ <Real Name="Time 0.000000 Step 0 in frame 0">4.1472047198540372</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">4.3456029525254678</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">3.9826669068573985</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">3.1365732905082528</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">2.0549883062523469</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">1.053909305545295</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">0.40206460374619313</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">0.23763430982967265</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">0.54173749646261815</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">1.1660367172497461</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">1.8937346262503456</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">2.5086918336925299</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">2.852711964582892</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">2.8985177691300135</Real>
+ </Energy>
+ <Vector Name="Time 0.000000 Step 0 F[0]">
+ <Real Name="X">10.938095074317319</Real>
+ <Real Name="Y">-9.6849636829809604</Real>
+ <Real Name="Z">14.9477673456121</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[1]">
+ <Real Name="X">-358.95983701890032</Real>
+ <Real Name="Y">-72.184737465987098</Real>
+ <Real Name="Z">5.2427273882850791</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[2]">
+ <Real Name="X">504.44011431612421</Real>
+ <Real Name="Y">-30.492879467234754</Real>
+ <Real Name="Z">132.02668359243958</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[3]">
+ <Real Name="X">-156.41837237154124</Real>
+ <Real Name="Y">112.36258061620281</Real>
+ <Real Name="Z">-152.21717832633675</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[0]">
+ <Real Name="X">20.435838614386633</Real>
+ <Real Name="Y">-17.686356823439912</Real>
+ <Real Name="Z">28.095606243064644</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[1]">
+ <Real Name="X">-393.58451331352791</Real>
+ <Real Name="Y">-74.845578585694341</Real>
+ <Real Name="Z">-13.392242553088089</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[2]">
+ <Real Name="X">529.98619683151344</Real>
+ <Real Name="Y">-19.588183147046106</Real>
+ <Real Name="Z">140.73458818251191</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[3]">
+ <Real Name="X">-156.83752213237216</Real>
+ <Real Name="Y">112.12011855618036</Real>
+ <Real Name="Z">-155.43795187248847</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[0]">
+ <Real Name="X">23.175091525779919</Real>
+ <Real Name="Y">-19.684699303050994</Real>
+ <Real Name="Z">32.068217603600317</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[1]">
+ <Real Name="X">-384.67295235829749</Real>
+ <Real Name="Y">-74.107890253924694</Real>
+ <Real Name="Z">-21.330768782037424</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[2]">
+ <Real Name="X">508.23023246865938</Real>
+ <Real Name="Y">-11.323306055502048</Real>
+ <Real Name="Z">138.18426885013943</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[3]">
+ <Real Name="X">-146.73237163614181</Real>
+ <Real Name="Y">105.11589561247773</Real>
+ <Real Name="Z">-148.92171767170231</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[0]">
+ <Real Name="X">19.606862325228409</Real>
+ <Real Name="Y">-16.414806546801842</Real>
+ <Real Name="Z">27.313596732132655</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[1]">
+ <Real Name="X">-335.63542363030876</Real>
+ <Real Name="Y">-68.955808848547065</Real>
+ <Real Name="Z">-18.44424868720855</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[2]">
+ <Real Name="X">443.40685745535319</Real>
+ <Real Name="Y">-6.6985698054608456</Real>
+ <Real Name="Z">124.1640033656024</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[3]">
+ <Real Name="X">-127.37829615027287</Real>
+ <Real Name="Y">92.069185200809756</Real>
+ <Real Name="Z">-133.03335141052651</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[0]">
+ <Real Name="X">10.936701481888193</Real>
+ <Real Name="Y">-9.0594222620341984</Real>
+ <Real Name="Z">15.337114133364635</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[1]">
+ <Real Name="X">-254.29369565940516</Real>
+ <Real Name="Y">-58.536578272057184</Real>
+ <Real Name="Z">-6.7734573229946236</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[2]">
+ <Real Name="X">344.4276213065869</Real>
+ <Real Name="Y">-6.5739101403710727</Real>
+ <Real Name="Z">100.47506026189879</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[3]">
+ <Real Name="X">-101.0706271290699</Real>
+ <Real Name="Y">74.169910674462457</Real>
+ <Real Name="Z">-109.0387170722688</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[0]">
+ <Real Name="X">-1.1487885143590644</Real>
+ <Real Name="Y">0.94425702845751291</Real>
+ <Real Name="Z">-1.6210190752303417</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[1]">
+ <Real Name="X">-151.33525622409871</Real>
+ <Real Name="Y">-42.597492262017155</Real>
+ <Real Name="Z">10.276839538853924</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[2]">
+ <Real Name="X">223.13701175223176</Real>
+ <Real Name="Y">-11.261469518677318</Real>
+ <Real Name="Z">70.282144298824107</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[3]">
+ <Real Name="X">-70.652967013773974</Real>
+ <Real Name="Y">52.914704752236958</Real>
+ <Real Name="Z">-78.937964762447692</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[0]">
+ <Real Name="X">-14.792631934835677</Real>
+ <Real Name="Y">12.084501645102721</Real>
+ <Real Name="Z">-20.985856455180208</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[1]">
+ <Real Name="X">-38.508823233299573</Real>
+ <Real Name="Y">-21.773206178588957</Real>
+ <Real Name="Z">28.978581607086344</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[2]">
+ <Real Name="X">92.311360568250592</Real>
+ <Real Name="Y">-20.243825211273709</Real>
+ <Real Name="Z">37.199039838943072</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[3]">
+ <Real Name="X">-39.009905400115343</Real>
+ <Real Name="Y">29.932529744759947</Real>
+ <Real Name="Z">-45.191764990849208</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[0]">
+ <Real Name="X">-28.233093664967807</Real>
+ <Real Name="Y">22.92859444472731</Real>
+ <Real Name="Z">-40.223321948721754</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[1]">
+ <Real Name="X">73.021460992109311</Real>
+ <Real Name="Y">2.4029740292514781</Real>
+ <Real Name="Z">46.15342995506451</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[2]">
+ <Real Name="X">-36.130408162563846</Real>
+ <Real Name="Y">-32.154073025311916</Real>
+ <Real Name="Z">4.4691445584323635</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[3]">
+ <Real Name="X">-8.6579591645776546</Real>
+ <Real Name="Y">6.8225045513331253</Real>
+ <Real Name="Z">-10.399252564775118</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[0]">
+ <Real Name="X">-39.97789984097686</Real>
+ <Real Name="Y">32.241671576985929</Real>
+ <Real Name="Z">-57.119576941001135</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[1]">
+ <Real Name="X">173.85168027656647</Real>
+ <Real Name="Y">27.749078001711162</Real>
+ <Real Name="Z">59.637350464835151</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[2]">
+ <Real Name="X">-152.36496859639158</Real>
+ <Real Name="Y">-45.012821768681185</Real>
+ <Real Name="Z">-25.518087185941891</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[3]">
+ <Real Name="X">18.49118816080194</Real>
+ <Real Name="Y">-14.977927810015906</Real>
+ <Real Name="Z">23.000313662107878</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[0]">
+ <Real Name="X">-48.881612139197181</Real>
+ <Real Name="Y">39.065295762634229</Real>
+ <Real Name="Z">-69.938279010926436</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[1]">
+ <Real Name="X">256.91883657637214</Real>
+ <Real Name="Y">51.827136837357685</Real>
+ <Real Name="Z">68.316578380756738</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[2]">
+ <Real Name="X">-249.22935104064919</Real>
+ <Real Name="Y">-56.609707958967739</Real>
+ <Real Name="Z">-51.324820635516417</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[3]">
+ <Real Name="X">41.192126603474236</Real>
+ <Real Name="Y">-34.282724641024174</Real>
+ <Real Name="Z">52.946521265686115</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[0]">
+ <Real Name="X">-54.149503868648566</Real>
+ <Real Name="Y">42.755819150349467</Real>
+ <Real Name="Z">-77.469738353419245</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[1]">
+ <Real Name="X">317.55427307025371</Real>
+ <Real Name="Y">72.337791383415436</Real>
+ <Real Name="Z">71.871971514297229</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[2]">
+ <Real Name="X">-322.20372287496099</Real>
+ <Real Name="Y">-64.891170578042846</Real>
+ <Real Name="Z">-72.27849537849221</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[3]">
+ <Real Name="X">58.798953673355882</Real>
+ <Real Name="Y">-50.202439955722056</Real>
+ <Real Name="Z">77.876262217614226</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[0]">
+ <Real Name="X">-55.30214765388515</Real>
+ <Real Name="Y">42.989286333517626</Real>
+ <Real Name="Z">-79.007731097948096</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[1]">
+ <Real Name="X">353.20119046090213</Real>
+ <Real Name="Y">87.420405578975277</Real>
+ <Real Name="Z">70.415575063717398</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[2]">
+ <Real Name="X">-369.03341302494488</Real>
+ <Real Name="Y">-68.257569667105031</Real>
+ <Real Name="Z">-88.161363599526965</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[3]">
+ <Real Name="X">71.134370217927881</Real>
+ <Real Name="Y">-62.152122245387858</Real>
+ <Real Name="Z">96.753519633757662</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[0]">
+ <Real Name="X">-52.13141853615042</Real>
+ <Real Name="Y">39.743487788303739</Real>
+ <Real Name="Z">-74.292830164081394</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[1]">
+ <Real Name="X">363.0139691466951</Real>
+ <Real Name="Y">95.826941958577009</Real>
+ <Real Name="Z">64.166722501371126</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[2]">
+ <Real Name="X">-389.2319923561339</Real>
+ <Real Name="Y">-65.735297034854213</Real>
+ <Real Name="Z">-98.914481786706801</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[3]">
+ <Real Name="X">78.349441745589218</Real>
+ <Real Name="Y">-69.835132712026535</Real>
+ <Real Name="Z">109.04058944941707</Real>
+ </Vector>
+ </Mdrun>
+ </Simulation>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <Simulation Name="angles1">
+ <Mdrun Name="md-vv">
+ <Energy Name="Kinetic En.">
+ <Real Name="Time 0.000000 Step 0 in frame 0">8.9391563133906793</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">8.672068382555647</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">8.975918149383503</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">9.7927683894995514</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">10.883100553613275</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">11.924969433487275</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">12.633456867318333</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">12.851048714886538</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">12.58102385678621</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">11.964056077156558</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">11.218083083060089</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">10.567428789368687</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">10.182372549748186</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">10.118035846218756</Real>
+ </Energy>
+ <Energy Name="Pressure">
+ <Real Name="Time 0.000000 Step 0 in frame 0">0.051119740159421841</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">0.049592362726324835</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">0.051329967549776645</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">0.056001232998098956</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">0.062236440769716052</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">0.06819450488137796</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">0.072246083380951245</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">0.073490410957126703</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">0.071946238319492595</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">0.068418026989956096</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">0.064152082387663359</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">0.060431230300392935</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">0.058229235590145312</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">0.057861317695901665</Real>
+ </Energy>
+ <Energy Name="Potential">
+ <Real Name="Time 0.000000 Step 0 in frame 0">4.1472047198540372</Real>
+ <Real Name="Time 0.004000 Step 4 in frame 1">4.4149217832200334</Real>
+ <Real Name="Time 0.008000 Step 8 in frame 2">4.1108352256843359</Real>
+ <Real Name="Time 0.012000 Step 12 in frame 3">3.2930164829357831</Real>
+ <Real Name="Time 0.016000 Step 16 in frame 4">2.2013970593427996</Real>
+ <Real Name="Time 0.020000 Step 20 in frame 5">1.1584108045547079</Real>
+ <Real Name="Time 0.024000 Step 24 in frame 6">0.44933660978657469</Real>
+ <Real Name="Time 0.028000 Step 28 in frame 7">0.23181125259333402</Real>
+ <Real Name="Time 0.032000 Step 32 in frame 8">0.5024481720916194</Real>
+ <Real Name="Time 0.036000 Step 36 in frame 9">1.1203230657139849</Real>
+ <Real Name="Time 0.040000 Step 40 in frame 10">1.8672122477644266</Real>
+ <Real Name="Time 0.044000 Step 44 in frame 11">2.5185540376704454</Real>
+ <Real Name="Time 0.048000 Step 48 in frame 12">2.9039247534827046</Real>
+ <Real Name="Time 0.050000 Step 50 in frame 13">2.9682628134981011</Real>
+ </Energy>
+ <Vector Name="Time 0.000000 Step 0 F[0]">
+ <Real Name="X">10.938095074317319</Real>
+ <Real Name="Y">-9.6849636829809604</Real>
+ <Real Name="Z">14.9477673456121</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[1]">
+ <Real Name="X">-358.95983701890032</Real>
+ <Real Name="Y">-72.184737465987098</Real>
+ <Real Name="Z">5.2427273882850791</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[2]">
+ <Real Name="X">504.44011431612421</Real>
+ <Real Name="Y">-30.492879467234754</Real>
+ <Real Name="Z">132.02668359243958</Real>
+ </Vector>
+ <Vector Name="Time 0.000000 Step 0 F[3]">
+ <Real Name="X">-156.41837237154124</Real>
+ <Real Name="Y">112.36258061620281</Real>
+ <Real Name="Z">-152.21717832633675</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[0]">
+ <Real Name="X">21.155933650930336</Real>
+ <Real Name="Y">-18.30217112282849</Real>
+ <Real Name="Z">29.0872615288202</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[1]">
+ <Real Name="X">-398.44571972757416</Real>
+ <Real Name="Y">-75.278904772517194</Real>
+ <Real Name="Z">-14.56996388508238</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[2]">
+ <Real Name="X">535.37129474483072</Real>
+ <Real Name="Y">-19.334396863248223</Real>
+ <Real Name="Z">142.04876684081597</Real>
+ </Vector>
+ <Vector Name="Time 0.004000 Step 4 F[3]">
+ <Real Name="X">-158.08150866818687</Real>
+ <Real Name="Y">112.91547275859391</Real>
+ <Real Name="Z">-156.56606448455378</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[0]">
+ <Real Name="X">24.510088216175738</Real>
+ <Real Name="Y">-20.802794779922351</Real>
+ <Real Name="Z">33.921241153170826</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[1]">
+ <Real Name="X">-393.74461098406653</Real>
+ <Real Name="Y">-75.022625052227227</Real>
+ <Real Name="Z">-23.585410607289134</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[2]">
+ <Real Name="X">518.27939480574969</Real>
+ <Real Name="Y">-10.771865418744383</Real>
+ <Real Name="Z">140.74566748023204</Real>
+ </Vector>
+ <Vector Name="Time 0.008000 Step 8 F[3]">
+ <Real Name="X">-149.04487203785891</Real>
+ <Real Name="Y">106.59728525089396</Real>
+ <Real Name="Z">-151.08149802611374</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[0]">
+ <Real Name="X">21.373956477946891</Real>
+ <Real Name="Y">-17.876293502758351</Real>
+ <Real Name="Z">29.785527758153542</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[1]">
+ <Real Name="X">-347.79714180428039</Real>
+ <Real Name="Y">-70.389381013981478</Real>
+ <Real Name="Z">-21.433137459147801</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[2]">
+ <Real Name="X">456.890557439281</Real>
+ <Real Name="Y">-5.8127238448001677</Real>
+ <Real Name="Z">127.68017675056926</Real>
+ </Vector>
+ <Vector Name="Time 0.012000 Step 12 F[3]">
+ <Real Name="X">-130.46737211294752</Real>
+ <Real Name="Y">94.078398361539996</Real>
+ <Real Name="Z">-136.03256704957499</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[0]">
+ <Real Name="X">12.910266776578091</Real>
+ <Real Name="Y">-10.68271258479351</Real>
+ <Real Name="Z">18.11527408507898</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[1]">
+ <Real Name="X">-268.15085850941546</Real>
+ <Real Name="Y">-60.469286219319308</Real>
+ <Real Name="Z">-10.015696681484254</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[2]">
+ <Real Name="X">359.82537543352231</Real>
+ <Real Name="Y">-5.3687566061117895</Real>
+ <Real Name="Z">104.51228741840357</Real>
+ </Vector>
+ <Vector Name="Time 0.016000 Step 16 F[3]">
+ <Real Name="X">-104.58478370068499</Real>
+ <Real Name="Y">76.520755410224609</Real>
+ <Real Name="Z">-112.6118648219983</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[0]">
+ <Real Name="X">0.80043849865756767</Real>
+ <Real Name="Y">-0.65729315673919175</Real>
+ <Real Name="Z">1.1304577556443514</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[1]">
+ <Real Name="X">-165.43787640016933</Real>
+ <Real Name="Y">-44.92051537226294</Real>
+ <Real Name="Z">7.2694825113200752</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[2]">
+ <Real Name="X">238.88010227908927</Real>
+ <Real Name="Y">-9.8358893758006953</Real>
+ <Real Name="Z">74.379767907759998</Real>
+ </Vector>
+ <Vector Name="Time 0.020000 Step 20 F[3]">
+ <Real Name="X">-74.242664377577512</Real>
+ <Real Name="Y">55.413697904802831</Real>
+ <Real Name="Z">-82.779708174724419</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[0]">
+ <Real Name="X">-13.073130849008304</Real>
+ <Real Name="Y">10.672643181667585</Real>
+ <Real Name="Z">-18.568736736583428</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[1]">
+ <Real Name="X">-51.544852442012825</Real>
+ <Real Name="Y">-24.287756917116472</Real>
+ <Real Name="Z">26.593970257182065</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[2]">
+ <Real Name="X">106.99514991091363</Real>
+ <Real Name="Y">-18.781853356148474</Real>
+ <Real Name="Z">40.969682247310217</Real>
+ </Vector>
+ <Vector Name="Time 0.024000 Step 24 F[3]">
+ <Real Name="X">-42.377166619892492</Real>
+ <Real Name="Y">32.396967091597361</Real>
+ <Real Name="Z">-48.99491576790885</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[0]">
+ <Real Name="X">-26.905038476440723</Real>
+ <Real Name="Y">21.845277606154198</Real>
+ <Real Name="Z">-38.390846834012301</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[1]">
+ <Real Name="X">62.094432049682808</Real>
+ <Real Name="Y">-0.044286053734932551</Real>
+ <Real Name="Z">44.625457490257261</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[2]">
+ <Real Name="X">-23.604852725028373</Real>
+ <Real Name="Y">-30.895338557029298</Real>
+ <Real Name="Z">7.6545036386917591</Real>
+ </Vector>
+ <Vector Name="Time 0.028000 Step 28 F[3]">
+ <Real Name="X">-11.58454084821372</Real>
+ <Real Name="Y">9.0943470046100323</Real>
+ <Real Name="Z">-13.889114294936725</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[0]">
+ <Real Name="X">-39.153576176776852</Real>
+ <Real Name="Y">31.587908763363291</Real>
+ <Real Name="Z">-56.048764515112126</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[1]">
+ <Real Name="X">165.75016431507885</Real>
+ <Real Name="Y">25.641188819994188</Real>
+ <Real Name="Z">59.048848583403377</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[2]">
+ <Real Name="X">-142.73430156268535</Real>
+ <Real Name="Y">-44.205851656460204</Real>
+ <Real Name="Z">-23.041879721999415</Real>
+ </Vector>
+ <Vector Name="Time 0.032000 Step 32 F[3]">
+ <Real Name="X">16.13771342438336</Real>
+ <Real Name="Y">-13.023245926897276</Real>
+ <Real Name="Z">20.04179565370816</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[0]">
+ <Real Name="X">-48.627076294478371</Real>
+ <Real Name="Y">38.900467024609185</Real>
+ <Real Name="Z">-69.731012708786722</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[1]">
+ <Real Name="X">252.04290680189882</Real>
+ <Real Name="Y">50.297911484235428</Real>
+ <Real Name="Z">68.639903632959374</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[2]">
+ <Real Name="X">-242.88428065303333</Real>
+ <Real Name="Y">-56.465779566734703</Real>
+ <Real Name="Z">-49.578175305145407</Real>
+ </Vector>
+ <Vector Name="Time 0.036000 Step 36 F[3]">
+ <Real Name="X">39.468450145612891</Real>
+ <Real Name="Y">-32.73259894210991</Real>
+ <Real Name="Z">50.669284380972755</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[0]">
+ <Real Name="X">-54.492010685444257</Real>
+ <Real Name="Y">43.098098771003073</Real>
+ <Real Name="Z">-78.159865677919839</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[1]">
+ <Real Name="X">316.03744056063238</Real>
+ <Real Name="Y">71.560639740861617</Real>
+ <Real Name="Z">73.021940746216785</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[2]">
+ <Real Name="X">-319.24940869807375</Real>
+ <Real Name="Y">-65.551158527427845</Real>
+ <Real Name="Z">-71.223753583128143</Real>
+ </Vector>
+ <Vector Name="Time 0.040000 Step 40 F[3]">
+ <Real Name="X">57.703978822885588</Real>
+ <Real Name="Y">-49.107579984436853</Real>
+ <Real Name="Z">76.361678514831198</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[0]">
+ <Real Name="X">-56.237726655826592</Real>
+ <Real Name="Y">43.818958810715507</Real>
+ <Real Name="Z">-80.57179817058514</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[1]">
+ <Real Name="X">354.97220769636726</Real>
+ <Real Name="Y">87.486479467141166</Real>
+ <Real Name="Z">72.29474684442927</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[2]">
+ <Real Name="X">-369.36237946334654</Real>
+ <Real Name="Y">-69.775803839351028</Real>
+ <Real Name="Z">-87.743936626605645</Real>
+ </Vector>
+ <Vector Name="Time 0.044000 Step 44 F[3]">
+ <Real Name="X">70.627898422805856</Real>
+ <Real Name="Y">-61.529634438505653</Real>
+ <Real Name="Z">96.020987952761516</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[0]">
+ <Real Name="X">-53.630108119971887</Real>
+ <Real Name="Y">41.007814115633622</Real>
+ <Real Name="Z">-76.660498889407634</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[1]">
+ <Real Name="X">367.84884771898669</Real>
+ <Real Name="Y">96.742918562017806</Real>
+ <Real Name="Z">66.692696725481014</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[2]">
+ <Real Name="X">-392.5859940785673</Real>
+ <Real Name="Y">-68.078169935686844</Real>
+ <Real Name="Z">-99.089175489421223</Real>
+ </Vector>
+ <Vector Name="Time 0.048000 Step 48 F[3]">
+ <Real Name="X">78.367254479552514</Real>
+ <Real Name="Y">-69.672562741964583</Real>
+ <Real Name="Z">109.05697765334784</Real>
+ </Vector>
+ </Mdrun>
+ </Simulation>
+</ReferenceData>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Simulation Name="spc5">
+ <Simulation Name="tip3p5">
<Minimizer Name="steep">
<Energy Name="Potential">
<Real Name="Time 0.000000 Step 0 in frame 0">-9.6231425679441998</Real>
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
<ReferenceData>
- <Simulation Name="spc5">
+ <Simulation Name="tip3p5">
<Minimizer Name="cg">
<Energy Name="Potential">
<Real Name="Time 0.000000 Step 0 in frame 0">-9.6231425679441998</Real>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <System Name="scaled-water">
+ <Integrator Name="nm">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>7</Real>
+ <Real>0.068698</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>8</Real>
+ <Real>0.311942</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>9</Real>
+ <Real>0.318822</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>10</Real>
+ <Real>0.916834</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>11</Real>
+ <Real>3.24034</Real>
+ </Sequence>
+ <Sequence Name="Row5">
+ <Int Name="Length">2</Int>
+ <Real>12</Real>
+ <Real>13.6069</Real>
+ </Sequence>
+ <Sequence Name="Row6">
+ <Int Name="Length">2</Int>
+ <Real>13</Real>
+ <Real>14.2014</Real>
+ </Sequence>
+ <Sequence Name="Row7">
+ <Int Name="Length">2</Int>
+ <Real>14</Real>
+ <Real>39.3613</Real>
+ </Sequence>
+ <Sequence Name="Row8">
+ <Int Name="Length">2</Int>
+ <Real>15</Real>
+ <Real>5257.53</Real>
+ </Sequence>
+ <Sequence Name="Row9">
+ <Int Name="Length">2</Int>
+ <Real>16</Real>
+ <Real>5280.78</Real>
+ </Sequence>
+ <Sequence Name="Row10">
+ <Int Name="Length">2</Int>
+ <Real>17</Real>
+ <Real>5315.76</Real>
+ </Sequence>
+ <Sequence Name="Row11">
+ <Int Name="Length">2</Int>
+ <Real>18</Real>
+ <Real>5340.06</Real>
+ </Sequence>
+ </XvgData>
+ </Integrator>
+ </System>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <System Name="villin">
+ <Integrator Name="nm">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>7</Real>
+ <Real>0.753154</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>8</Real>
+ <Real>1.13727</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>9</Real>
+ <Real>1.64238</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>10</Real>
+ <Real>5.21099</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>11</Real>
+ <Real>7.63161</Real>
+ </Sequence>
+ <Sequence Name="Row5">
+ <Int Name="Length">2</Int>
+ <Real>12</Real>
+ <Real>10.1597</Real>
+ </Sequence>
+ <Sequence Name="Row6">
+ <Int Name="Length">2</Int>
+ <Real>13</Real>
+ <Real>12.7895</Real>
+ </Sequence>
+ <Sequence Name="Row7">
+ <Int Name="Length">2</Int>
+ <Real>14</Real>
+ <Real>13.432</Real>
+ </Sequence>
+ <Sequence Name="Row8">
+ <Int Name="Length">2</Int>
+ <Real>15</Real>
+ <Real>16.4345</Real>
+ </Sequence>
+ <Sequence Name="Row9">
+ <Int Name="Length">2</Int>
+ <Real>16</Real>
+ <Real>19.3931</Real>
+ </Sequence>
+ <Sequence Name="Row10">
+ <Int Name="Length">2</Int>
+ <Real>17</Real>
+ <Real>23.6003</Real>
+ </Sequence>
+ <Sequence Name="Row11">
+ <Int Name="Length">2</Int>
+ <Real>18</Real>
+ <Real>27.9563</Real>
+ </Sequence>
+ <Sequence Name="Row12">
+ <Int Name="Length">2</Int>
+ <Real>19</Real>
+ <Real>29.88</Real>
+ </Sequence>
+ <Sequence Name="Row13">
+ <Int Name="Length">2</Int>
+ <Real>20</Real>
+ <Real>31.9625</Real>
+ </Sequence>
+ <Sequence Name="Row14">
+ <Int Name="Length">2</Int>
+ <Real>21</Real>
+ <Real>35.1576</Real>
+ </Sequence>
+ <Sequence Name="Row15">
+ <Int Name="Length">2</Int>
+ <Real>22</Real>
+ <Real>41.2246</Real>
+ </Sequence>
+ <Sequence Name="Row16">
+ <Int Name="Length">2</Int>
+ <Real>23</Real>
+ <Real>42.7061</Real>
+ </Sequence>
+ <Sequence Name="Row17">
+ <Int Name="Length">2</Int>
+ <Real>24</Real>
+ <Real>46.6857</Real>
+ </Sequence>
+ <Sequence Name="Row18">
+ <Int Name="Length">2</Int>
+ <Real>25</Real>
+ <Real>50.9545</Real>
+ </Sequence>
+ <Sequence Name="Row19">
+ <Int Name="Length">2</Int>
+ <Real>26</Real>
+ <Real>54.8514</Real>
+ </Sequence>
+ <Sequence Name="Row20">
+ <Int Name="Length">2</Int>
+ <Real>27</Real>
+ <Real>56.3073</Real>
+ </Sequence>
+ <Sequence Name="Row21">
+ <Int Name="Length">2</Int>
+ <Real>28</Real>
+ <Real>63.2007</Real>
+ </Sequence>
+ <Sequence Name="Row22">
+ <Int Name="Length">2</Int>
+ <Real>29</Real>
+ <Real>64.6087</Real>
+ </Sequence>
+ <Sequence Name="Row23">
+ <Int Name="Length">2</Int>
+ <Real>30</Real>
+ <Real>72.6079</Real>
+ </Sequence>
+ <Sequence Name="Row24">
+ <Int Name="Length">2</Int>
+ <Real>31</Real>
+ <Real>73.9597</Real>
+ </Sequence>
+ <Sequence Name="Row25">
+ <Int Name="Length">2</Int>
+ <Real>32</Real>
+ <Real>79.2567</Real>
+ </Sequence>
+ <Sequence Name="Row26">
+ <Int Name="Length">2</Int>
+ <Real>33</Real>
+ <Real>83.2</Real>
+ </Sequence>
+ <Sequence Name="Row27">
+ <Int Name="Length">2</Int>
+ <Real>34</Real>
+ <Real>94.9563</Real>
+ </Sequence>
+ <Sequence Name="Row28">
+ <Int Name="Length">2</Int>
+ <Real>35</Real>
+ <Real>97.5064</Real>
+ </Sequence>
+ <Sequence Name="Row29">
+ <Int Name="Length">2</Int>
+ <Real>36</Real>
+ <Real>103.01</Real>
+ </Sequence>
+ <Sequence Name="Row30">
+ <Int Name="Length">2</Int>
+ <Real>37</Real>
+ <Real>111.783</Real>
+ </Sequence>
+ <Sequence Name="Row31">
+ <Int Name="Length">2</Int>
+ <Real>38</Real>
+ <Real>126.957</Real>
+ </Sequence>
+ <Sequence Name="Row32">
+ <Int Name="Length">2</Int>
+ <Real>39</Real>
+ <Real>139.565</Real>
+ </Sequence>
+ <Sequence Name="Row33">
+ <Int Name="Length">2</Int>
+ <Real>40</Real>
+ <Real>141.97</Real>
+ </Sequence>
+ <Sequence Name="Row34">
+ <Int Name="Length">2</Int>
+ <Real>41</Real>
+ <Real>151.782</Real>
+ </Sequence>
+ <Sequence Name="Row35">
+ <Int Name="Length">2</Int>
+ <Real>42</Real>
+ <Real>174.771</Real>
+ </Sequence>
+ <Sequence Name="Row36">
+ <Int Name="Length">2</Int>
+ <Real>43</Real>
+ <Real>176.954</Real>
+ </Sequence>
+ <Sequence Name="Row37">
+ <Int Name="Length">2</Int>
+ <Real>44</Real>
+ <Real>186.777</Real>
+ </Sequence>
+ <Sequence Name="Row38">
+ <Int Name="Length">2</Int>
+ <Real>45</Real>
+ <Real>189.704</Real>
+ </Sequence>
+ <Sequence Name="Row39">
+ <Int Name="Length">2</Int>
+ <Real>46</Real>
+ <Real>198.895</Real>
+ </Sequence>
+ <Sequence Name="Row40">
+ <Int Name="Length">2</Int>
+ <Real>47</Real>
+ <Real>211.611</Real>
+ </Sequence>
+ <Sequence Name="Row41">
+ <Int Name="Length">2</Int>
+ <Real>48</Real>
+ <Real>216.338</Real>
+ </Sequence>
+ <Sequence Name="Row42">
+ <Int Name="Length">2</Int>
+ <Real>49</Real>
+ <Real>232.757</Real>
+ </Sequence>
+ <Sequence Name="Row43">
+ <Int Name="Length">2</Int>
+ <Real>50</Real>
+ <Real>240.872</Real>
+ </Sequence>
+ </XvgData>
+ </Integrator>
+ </System>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <System Name="spc-dimer">
+ <Integrator Name="nm">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>7</Real>
+ <Real>94.3948</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>8</Real>
+ <Real>919.878</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>9</Real>
+ <Real>1327.45</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>10</Real>
+ <Real>2022.46</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>11</Real>
+ <Real>6385.63</Real>
+ </Sequence>
+ <Sequence Name="Row5">
+ <Int Name="Length">2</Int>
+ <Real>12</Real>
+ <Real>16960.8</Real>
+ </Sequence>
+ <Sequence Name="Row6">
+ <Int Name="Length">2</Int>
+ <Real>13</Real>
+ <Real>82239.7</Real>
+ </Sequence>
+ <Sequence Name="Row7">
+ <Int Name="Length">2</Int>
+ <Real>14</Real>
+ <Real>87417.2</Real>
+ </Sequence>
+ <Sequence Name="Row8">
+ <Int Name="Length">2</Int>
+ <Real>15</Real>
+ <Real>347356</Real>
+ </Sequence>
+ <Sequence Name="Row9">
+ <Int Name="Length">2</Int>
+ <Real>16</Real>
+ <Real>359346</Real>
+ </Sequence>
+ <Sequence Name="Row10">
+ <Int Name="Length">2</Int>
+ <Real>17</Real>
+ <Real>367766</Real>
+ </Sequence>
+ <Sequence Name="Row11">
+ <Int Name="Length">2</Int>
+ <Real>18</Real>
+ <Real>371723</Real>
+ </Sequence>
+ </XvgData>
+ </Integrator>
+ </System>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <System Name="one-tip5p">
+ <Integrator Name="nm">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>7</Real>
+ <Real>146045</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>8</Real>
+ <Real>522628</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>9</Real>
+ <Real>537704</Real>
+ </Sequence>
+ </XvgData>
+ </Integrator>
+ </System>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <System Name="sw-dimer">
+ <Integrator Name="nm">
+ <XvgLegend Name="Legend">
+ <String Name="XvgLegend"><![CDATA[
+]]></String>
+ </XvgLegend>
+ <XvgData Name="Data">
+ <Sequence Name="Row0">
+ <Int Name="Length">2</Int>
+ <Real>7</Real>
+ <Real>284.327</Real>
+ </Sequence>
+ <Sequence Name="Row1">
+ <Int Name="Length">2</Int>
+ <Real>8</Real>
+ <Real>526.814</Real>
+ </Sequence>
+ <Sequence Name="Row2">
+ <Int Name="Length">2</Int>
+ <Real>9</Real>
+ <Real>2029.22</Real>
+ </Sequence>
+ <Sequence Name="Row3">
+ <Int Name="Length">2</Int>
+ <Real>10</Real>
+ <Real>5524.43</Real>
+ </Sequence>
+ <Sequence Name="Row4">
+ <Int Name="Length">2</Int>
+ <Real>11</Real>
+ <Real>8944.04</Real>
+ </Sequence>
+ <Sequence Name="Row5">
+ <Int Name="Length">2</Int>
+ <Real>12</Real>
+ <Real>9695.26</Real>
+ </Sequence>
+ <Sequence Name="Row6">
+ <Int Name="Length">2</Int>
+ <Real>13</Real>
+ <Real>13450.1</Real>
+ </Sequence>
+ <Sequence Name="Row7">
+ <Int Name="Length">2</Int>
+ <Real>14</Real>
+ <Real>40808.3</Real>
+ </Sequence>
+ <Sequence Name="Row8">
+ <Int Name="Length">2</Int>
+ <Real>15</Real>
+ <Real>100111</Real>
+ </Sequence>
+ <Sequence Name="Row9">
+ <Int Name="Length">2</Int>
+ <Real>16</Real>
+ <Real>384375</Real>
+ </Sequence>
+ <Sequence Name="Row10">
+ <Int Name="Length">2</Int>
+ <Real>17</Real>
+ <Real>480009</Real>
+ </Sequence>
+ <Sequence Name="Row11">
+ <Int Name="Length">2</Int>
+ <Real>18</Real>
+ <Real>496826</Real>
+ </Sequence>
+ </XvgData>
+ </Integrator>
+ </System>
+</ReferenceData>
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/utility/stringutil.h"
#include "testutils/mpitest.h"
+#include "testutils/simulationdatabase.h"
#include "testutils/testasserts.h"
#include "energycomparison.h"
#include "energyreader.h"
#include "mdruncomparison.h"
#include "moduletest.h"
-#include "simulationdatabase.h"
#include "trajectorycomparison.h"
#include "trajectoryreader.h"
// tests can run in such configurations.
#if GMX_GPU != GMX_GPU_OPENCL
INSTANTIATE_TEST_CASE_P(NormalMdrunIsReproduced, MdrunRerunTest,
- ::testing::Combine(::testing::Values("argon12", "spc5", "alanine_vsite_vacuo"),
+ ::testing::Combine(::testing::Values("argon12", "tip3p5", "alanine_vsite_vacuo"),
::testing::Values("md", "md-vv", "bd", "sd")));
#else
INSTANTIATE_TEST_CASE_P(DISABLED_NormalMdrunIsReproduced, MdrunRerunTest,
- ::testing::Combine(::testing::Values("argon12", "spc5", "alanine_vsite_vacuo"),
+ ::testing::Combine(::testing::Values("argon12", "tip3p5", "alanine_vsite_vacuo"),
::testing::Values("md", "md-vv", "bd", "sd")));
#endif
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+
+/*! \internal \file
+ * \brief
+ * Simple tests for the mdrun functionality.
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/compat/make_unique.h"
+#include "gromacs/options/filenameoption.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/trajectory/trajectoryframe.h"
+#include "gromacs/utility/basenetwork.h"
+#include "gromacs/utility/filestream.h"
+#include "gromacs/utility/strconvert.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/mpitest.h"
+#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
+#include "testutils/testasserts.h"
+#include "testutils/xvgtest.h"
+
+#include "energycomparison.h"
+#include "moduletest.h"
+#include "trajectoryreader.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+/*! \brief Database of enerngy tolerances for MD integrator on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> energyToleranceForSystem_g =
+{{
+ {
+ "angles1",
+ relativeToleranceAsFloatingPoint(1, 1e-4)
+ }
+ }};
+
+/*! \brief Database of pressure
+ tolerances for MD integrator on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> pressureToleranceForSystem_g =
+{{
+ {
+ "angles1",
+ relativeToleranceAsFloatingPoint(1, 1e-4)
+ }
+ }};
+
+//! Helper type
+using MdpField = MdpFieldValues::value_type;
+
+/*! \brief Test fixture base for simple mdrun systems
+ *
+ * This test ensures mdrun can run a simulation, reaching
+ * reproducible energies.
+ *
+ * The choices for tolerance are arbitrary but sufficient. */
+class SimpleMdrunTest : public MdrunTestFixture,
+ public ::testing::WithParamInterface <
+ std::tuple < std::string, std::string>>
+{
+};
+
+TEST_P(SimpleMdrunTest, WithinTolerances)
+{
+ auto params = GetParam();
+ auto simulationName = std::get<0>(params);
+ auto integrator = std::get<1>(params);
+ SCOPED_TRACE(formatString("Comparing simple mdrun for '%s'",
+ simulationName.c_str()));
+
+ // TODO At some point we should also test PME-only ranks.
+ int numRanksAvailable = getNumberOfTestMpiRanks();
+ if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable))
+ {
+ fprintf(stdout, "Test system '%s' cannot run with %d ranks.\n"
+ "The supported numbers are: %s\n",
+ simulationName.c_str(), numRanksAvailable,
+ reportNumbersOfPpRanksSupported(simulationName).c_str());
+ return;
+ }
+ auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(),
+ integrator.c_str(),
+ "no", "no");
+ mdpFieldValues["nsteps"] = "50";
+ mdpFieldValues["nstfout"] = "4";
+ mdpFieldValues["constraints"] = "none";
+ mdpFieldValues["nstcalcenergy"] = "4";
+ mdpFieldValues.insert(MdpField("coulombtype", "Cut-off"));
+ mdpFieldValues.insert(MdpField("vdwtype", "Cut-off"));
+
+ // Prepare the .tpr file
+ {
+ CommandLine caller;
+ runner_.useTopGroAndNdxFromDatabase(simulationName);
+ runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues));
+ EXPECT_EQ(0, runner_.callGrompp(caller));
+ }
+ // Do mdrun
+ {
+ CommandLine mdrunCaller;
+ ASSERT_EQ(0, runner_.callMdrun(mdrunCaller));
+ EnergyTolerances energiesToMatch
+ {{
+ {
+ interaction_function[F_EPOT].longname, energyToleranceForSystem_g.at(simulationName)
+ },
+ {
+ interaction_function[F_EKIN].longname, energyToleranceForSystem_g.at(simulationName)
+ },
+ {
+ interaction_function[F_PRES].longname, pressureToleranceForSystem_g.at(simulationName)
+ },
+ }};
+ TestReferenceData refData;
+ auto checker = refData.rootChecker()
+ .checkCompound("Simulation", simulationName)
+ .checkCompound("Mdrun", integrator);
+ checkEnergiesAgainstReferenceData(runner_.edrFileName_,
+ energiesToMatch,
+ &checker);
+ // Now check the forces
+ TrajectoryFrameReader reader(runner_.fullPrecisionTrajectoryFileName_);
+ checker.setDefaultTolerance(relativeToleranceAsFloatingPoint(1, 1e-4));
+ do
+ {
+ auto frame = reader.frame();
+ auto force = frame.f();
+ int atom = 0;
+ for (auto &f : force)
+ {
+ std::string forceName = frame.frameName() + " F[" + toString(atom) + "]";
+
+ checker.checkVector(f, forceName.c_str());
+ atom++;
+ }
+ }
+ while (reader.readNextFrame());
+ }
+}
+
+//! Containers of systems to test.
+//! \{
+std::vector<std::string> systemsToTest_g = { "angles1" };
+std::vector<std::string> md_g = { "md", "md-vv" };
+//! \}
+
+// The time for OpenCL kernel compilation means these tests might time
+// out. If that proves to be a problem, these can be disabled for
+// OpenCL builds. However, once that compilation is cached for the
+// lifetime of the whole test binary process, these tests should run in
+// such configurations.
+#if GMX_DOUBLE
+INSTANTIATE_TEST_CASE_P(Angles1, SimpleMdrunTest, ::testing::Combine(::testing::ValuesIn(systemsToTest_g), ::testing::ValuesIn(md_g)));
+#endif
+} // namespace
+} // namespace test
+} // namespace gmx
+++ /dev/null
-
- 6
- 1MeOH Me1 1 1.970 1.460 1.209 -0.8587 -0.1344 -0.0643
- 1MeOH O2 2 1.978 1.415 1.082 0.0623 -0.1787 0.0036
- 1MeOH H3 3 1.905 1.460 1.030 -0.5020 -0.9564 0.0997
- 2SOL OW 4 1.555 1.511 0.703 0.869 1.245 1.665
- 2SOL HW1 5 1.498 1.495 0.784 0.169 0.275 1.565
- 2SOL HW2 6 1.496 1.521 0.623 0.269 2.275 1.465
- 3.01000 3.01000 3.01000
+++ /dev/null
-[ System ]
- 1 2 3 4 5 6
-[ Methanol ]
- 1 2 3
-[ SOL ]
- 4 5 6
+++ /dev/null
-#include "gromos43a1.ff/forcefield.itp"
-#include "gromos43a1.ff/methanol.itp"
-#include "gromos43a1.ff/spc.itp"
-
-[ system ]
-; Name
-spc-and-methanol
-
-[ molecules ]
-; Compound #mols
-Methanol 1
-SOL 1
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
const std::string mdpContents = R"(
dt = 0.005
nsteps = 2
- define = -DPOSRES
tcoupl = Berendsen
tc-grps = System
tau-t = 0.5
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
rtpi = 0.05
nstlog = 0
nstenergy = 0
- cutoff-scheme = group
+ cutoff-scheme = Verlet
nstlist = 10
ns_type = grid
rlist = 0.9
runTest();
}
-INSTANTIATE_TEST_CASE_P(Simple, TpiTest, ::testing::Values(1993, 2994));
+// Should be re-enabled when TPI supports the Verlet scheme
+INSTANTIATE_TEST_CASE_P(DISABLED_Simple, TpiTest, ::testing::Values(1993, 2994));
} // namespace
} // namespace test
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#define XTextHeight(font) ((font)->max_bounds.ascent+(font)->max_bounds.descent)
#define XDrawCircle(disp, win, gc, x, y, rad) \
- XDrawArc(disp, win, gc, x-rad, y-rad, 2*rad, 2*rad, 0, 64*360)
+ XDrawArc(disp, win, gc, (x)-(rad), (y)-(rad), 2*(rad), 2*(rad), 0, 64*360)
#define XFillCircle(disp, win, gc, x, y, rad) \
- XFillArc(disp, win, gc, x-rad, y-rad, 2*rad, 2*rad, 0, 64*360)
+ XFillArc(disp, win, gc, (x)-(rad), (y)-(rad), 2*(rad), 2*(rad), 0, 64*360)
#ifdef NEED_XSTUFF
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
man->obj[man->nobj-1].z = 0.0;
}
-static void add_bonds(t_manager *man, t_functype func[],
+static void add_bonds(t_manager *man, const t_functype func[],
t_ilist *b, bool bB[])
{
bool *bH = man->bHydro;
{
if (man->bVis[i])
{
- return (int) i;
+ return i;
}
}
}
void set_file(t_x11 *x11, t_manager *man, const char *trajectory,
const char *status)
{
- gmx_atomprop_t aps;
t_tpxheader sh;
t_atoms *at;
bool *bB;
man->title.text = gmx_strdup(gmx::formatString("%s: %s", *man->top.name, gmx::getCoolQuote().c_str()).c_str());
man->view = init_view(man->box);
at = &(man->top.atoms);
- aps = gmx_atomprop_init();
+ AtomProperties aps;
for (i = 0; (i < man->natom); i++)
{
char *aname = *(at->atomname[i]);
{
man->vdw[i] = 0;
}
- else if (!gmx_atomprop_query(aps, epropVDW, *ri->name, aname, &(man->vdw[i])))
+ else if (!aps.setAtomProperty(epropVDW, *ri->name, aname, &(man->vdw[i])))
{
man->vdw[i] = 0;
}
}
- gmx_atomprop_destroy(aps);
add_bpl(man, &(man->top.idef), bB);
for (i = 0; (i < man->natom); i++)
{
if (!bB[i])
{
- add_object(man, eOSingle, (int) i, 0);
+ add_object(man, eOSingle, i, 0);
}
}
sfree(bB);
return bEof;
}
-static void HandleClient(t_x11 *x11, t_manager *man, long data[])
+static void HandleClient(t_x11 *x11, t_manager *man, const long data[])
{
int ID, button, x, y;
bool bPos;
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
extern void map_man(t_x11 *x11, t_manager *man);
-extern void move_man(t_x11 *x11, t_manager *man, int width, int height);
+
extern bool toggle_animate (t_x11 *x11, t_manager *man);
mpitest.cpp
refdata.cpp
refdata-xml.cpp
+ simulationdatabase.cpp
stdiohelper.cpp
stringtest.cpp
testasserts.cpp
#include "gromacs/commandline/cmdlineoptionsmodule.h"
#include "gromacs/commandline/cmdlineprogramcontext.h"
#include "gromacs/utility/arrayref.h"
+#include "gromacs/utility/futil.h"
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/strconvert.h"
#include "gromacs/utility/stringstream.h"
setInputFile(option, filename.c_str());
}
+void CommandLineTestBase::setModifiableInputFile(
+ const char *option, const std::string &filename)
+{
+ setModifiableInputFile(option, filename.c_str());
+}
+
+void CommandLineTestBase::setModifiableInputFile(
+ const char *option, const char *filename)
+{
+ std::string originalFileName = gmx::test::TestFileManager::getInputFilePath(filename);
+ std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+ gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+ impl_->cmdline_.addOption(option, modifiableFileName);
+}
+
void CommandLineTestBase::setInputFileContents(
const char *option, const char *extension, const std::string &contents)
{
impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
}
+void CommandLineTestBase::setInputAndOutputFile(
+ const char *option, const char *filename,
+ const ITextBlockMatcherSettings &matcher)
+{
+ std::string originalFileName = gmx::test::TestFileManager::getInputFilePath(filename);
+ std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+ gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+ impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
+}
+
+void CommandLineTestBase::setInputAndOutputFile(
+ const char *option, const char *filename,
+ const IFileMatcherSettings &matcher)
+{
+ std::string originalFileName = gmx::test::TestFileManager::getInputFilePath(filename);
+ std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+ gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+ impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
+}
+
CommandLine &CommandLineTestBase::commandLine()
{
return impl_->cmdline_;
void setInputFile(const char *option, const char *filename);
//! \copydoc setInputFile(const char *, const char *);
void setInputFile(const char *option, const std::string &filename);
+ /*! \brief
+ * Sets an input file that may be modified. The file is copied to a
+ * temporary file, which is used as the test input
+ *
+ * \param[in] option Option to set.
+ * \param[in] filename Name of the input file.
+ *
+ */
+ void setModifiableInputFile(const char *option, const char *filename);
+ //! \copydoc setModifiableInputFile(const char *, const char *);
+ void setModifiableInputFile(const char *option, const std::string &filename);
/*! \brief
* Generates and sets an input file.
*
*/
void setOutputFile(const char *option, const char *filename,
const IFileMatcherSettings &matcher);
+ /*! \brief
+ * Sets a file parameter that is used for input and modified as output. The input file
+ * is copied to a temporary file that is used as input and can be modified.
+ */
+ void setInputAndOutputFile(const char *option, const char *filename,
+ const ITextBlockMatcherSettings &matcher);
+ //! \copydoc setInputAndOutputFile(const char *, const char *, const ITextBlockMatcherSettings&);
+ void setInputAndOutputFile(const char *option, const char *filename,
+ const IFileMatcherSettings &matcher);
/*! \brief
* Returns the internal CommandLine object used to construct the
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include "gromacs/options/basicoptions.h"
#include "gromacs/options/ioptionscontainer.h"
+#include "gromacs/utility/any.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/gmxassert.h"
#include "gromacs/utility/keyvaluetree.h"
#include "gromacs/utility/path.h"
#include "gromacs/utility/real.h"
#include "gromacs/utility/stringutil.h"
-#include "gromacs/utility/variant.h"
#include "testutils/refdata-checkers.h"
#include "testutils/refdata-impl.h"
}
-void TestReferenceChecker::checkVariant(const Variant &variant, const char *id)
+void TestReferenceChecker::checkAny(const Any &any, const char *id)
{
- if (variant.isType<bool>())
+ if (any.isType<bool>())
{
- checkBoolean(variant.cast<bool>(), id);
+ checkBoolean(any.cast<bool>(), id);
}
- else if (variant.isType<int>())
+ else if (any.isType<int>())
{
- checkInteger(variant.cast<int>(), id);
+ checkInteger(any.cast<int>(), id);
}
- else if (variant.isType<int64_t>())
+ else if (any.isType<int64_t>())
{
- checkInt64(variant.cast<int64_t>(), id);
+ checkInt64(any.cast<int64_t>(), id);
}
- else if (variant.isType<float>())
+ else if (any.isType<float>())
{
- checkFloat(variant.cast<float>(), id);
+ checkFloat(any.cast<float>(), id);
}
- else if (variant.isType<double>())
+ else if (any.isType<double>())
{
- checkDouble(variant.cast<double>(), id);
+ checkDouble(any.cast<double>(), id);
}
- else if (variant.isType<std::string>())
+ else if (any.isType<std::string>())
{
- checkString(variant.cast<std::string>(), id);
+ checkString(any.cast<std::string>(), id);
}
else
{
- GMX_THROW(TestException("Unsupported variant type"));
+ GMX_THROW(TestException("Unsupported any type"));
}
}
}
else
{
- checkVariant(value.asVariant(), id);
+ checkAny(value.asAny(), id);
}
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
class IOptionsContainer;
class KeyValueTreeObject;
class KeyValueTreeValue;
-class Variant;
+class Any;
namespace test
{
void checkVector(const double value[3], const char *id);
//! Check a single floating-point value from a string.
void checkRealFromString(const std::string &value, const char *id);
- //! Checks a variant value that contains a supported simple type.
- void checkVariant(const Variant &value, const char *id);
+ //! Checks a any value that contains a supported simple type.
+ void checkAny(const Any &value, const char *id);
//! Checks a key-value tree rooted at a object.
void checkKeyValueTreeObject(const KeyValueTreeObject &tree, const char *id);
//! Checks a generic key-value tree value.
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* Implements declarations from in simulationdatabase.h
*
* \author Mark Abraham <mark.j.abraham@gmail.com>
- * \ingroup module_mdrun_integration_tests
+ * \ingroup module_testutils
*/
#include "gmxpre.h"
},
// Simple system with 5 water molecules, fairly widely separated
{
- "spc5", { { {
- "compressibility", "5e-10"
- },
+ "tip3p5", { { {
+ "compressibility", "5e-10"
+ },
+ {
+ "tau-p", "1000"
+ } },
{
- "tau-p", "1000"
- } },
- {
- 1, 2, 3, 4, 5, 6, 8, 9
- } }
+ 1, 2, 3, 4, 5, 6, 8, 9
+ } }
},
// Simple system with 5832 argon atoms, suitable for normal pressure coupling
{
1, 2, 3, 4, 5, 6, 7, 8, 9
} }
},
+ // Simple mdrun tests of energy
+ {
+ "angles1", { { },
+ {
+ 1, 2
+ } }
+ },
+ // Scaled water for NMA
+ {
+ "scaled-water", { { },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
+ // Villin for NMA
+ {
+ "villin", { { },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
+ // SPC-Dimer for NMA
+ {
+ "spc-dimer", { { },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
+ // SW-Dimer for NMA
+ {
+ "sw-dimer", { { {
+ "nstcalcenergy", "1"
+ } },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
+ // TIP5P for NMA
+ {
+ "one-tip5p", { { },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
+ // ICE-Binding protein for NMA
+ {
+ "ice-binding", { { },
+ {
+ 1, 2, 3, 4, 5, 6
+ } }
+ },
// Nonanol molecule in vacuo, topology suitable for testing FEP
// on KE, angles, dihedral restraints, coulomb and vdw
{
mdpFieldValues.insert(MdpField("compressibility", "5e-5"));
mdpFieldValues.insert(MdpField("constraints", "none"));
mdpFieldValues.insert(MdpField("other", ""));
+ mdpFieldValues.insert(MdpField("rcoulomb", "0.7"));
+ mdpFieldValues.insert(MdpField("rvdw", "0.7"));
+ mdpFieldValues.insert(MdpField("nstcalcenergy", "100"));
return mdpFieldValues;
}
* energies were not computed with those from rerun on the same
* coordinates.
*/
- return formatString(R"(rcoulomb = 0.7
- rvdw = 0.7
+ return formatString(R"(rcoulomb = %s
+ rvdw = %s
rlist = -1
bd-fric = 1000
verlet-buffer-tolerance = 0.000001
constraint-algorithm = lincs
lincs-order = 2
lincs-iter = 5
+ nstcalcenergy = %s
%s)",
+ mdpFieldValues.at("rcoulomb").c_str(),
+ mdpFieldValues.at("rvdw").c_str(),
mdpFieldValues.at("nsteps").c_str(),
mdpFieldValues.at("integrator").c_str(),
mdpFieldValues.at("tcoupl").c_str(),
mdpFieldValues.at("tau-p").c_str(),
mdpFieldValues.at("compressibility").c_str(),
mdpFieldValues.at("constraints").c_str(),
+ mdpFieldValues.at("nstcalcenergy").c_str(),
mdpFieldValues.at("other").c_str());
}
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
* To help us fund GROMACS development, we humbly ask that you cite
* the research papers on the package. Check out http://www.gromacs.org.
*/
-/*! \libinternal
+/*! \libinternal \file
*
* \brief Functionality for testing whether calls to mdrun produce the
* same energy and force quantities when they should do so.
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \inlibraryapi
+ * \ingroup module_testutils
*/
-#ifndef GMX_MDRUN_TESTS_SIMULATIONDATABASE_H
-#define GMX_MDRUN_TESTS_SIMULATIONDATABASE_H
+#ifndef GMX_TESTUTILS__SIMULATIONDATABASE_H
+#define GMX_TESTUTILS__SIMULATIONDATABASE_H
#include <map>
#include <string>
* comparisons is available, whose \c simulationName keys are
* - argon12
* - argon5832
- * - spc5
+ * - tip3p5
* - spc216
* - alanine_vsite_vacuo
* - alanine_vsite_solvated
--- /dev/null
+This_incredible_box_of_butane
+ 4
+ 1BUT C1 1 1.459 1.683 1.495 0.2896 0.6955 -0.1160
+ 1BUT C2 2 1.268 1.546 1.546 0.2706 -0.0710 -0.1176
+ 1BUT C3 3 1.304 1.427 1.684 -0.1283 -0.1121 0.2082
+ 1BUT C4 4 1.113 1.302 1.788 -0.4224 -0.5246 0.0316
+ 12.46298 12.46298 12.46298
--- /dev/null
+;
+; User beckers (20078)
+; Tue Jan 4 11:14:03 1994
+; System
+;
+#define ANGLES
+[ defaults ]
+; nbfunc comb-rule gen-pairs fudgeLJ fudgeQQ
+ 1 1 no 1.0 1.0
+
+[ atomtypes ]
+;name mass charge ptype c6 c12
+#ifdef LJ
+ CH2 14.02700 0.000 A 0.90975E-02 0.35333E-04
+ CH3 15.03500 0.000 A 0.88765E-02 0.26150E-04
+#else
+ CH2 14.02700 0.000 A 0.0 0.0
+ CH3 15.03500 0.000 A 0.0 0.0
+#endif
+
+[ moleculetype ]
+; name nrexcl
+ butane 3
+
+[ atoms ]
+; nr type resnr residu atom cgnr charge mass
+ 1 CH3 1 BUT C1 1
+ 2 CH2 1 BUT C2 2
+ 3 CH2 1 BUT C3 3
+ 4 CH3 1 BUT C4 4
+
+[ bonds ]
+; ai aj funct c0 c1
+#ifdef BONDS
+ 1 2 1 1.530000e-01 3.347000e+05
+ 2 3 1 1.530000e-01 3.347000e+05
+ 3 4 1 1.530000e-01 3.347000e+05
+#endif
+#ifdef G96BONDS
+ 1 2 2 1.530000e-01 14297920.0
+ 2 3 2 1.530000e-01 14297920.0
+ 3 4 2 1.530000e-01 14297920.0
+#endif
+
+[ angles ]
+; ai aj ak funct c0 c1
+#ifdef ANGLES
+ 1 2 3 1 1.110000e+02 4.602000e+02
+ 4 3 2 1 1.110000e+02 4.602000e+02
+#endif
+#ifdef G96ANGLES
+ 1 2 3 2 1.110000e+02 528
+ 4 3 2 2 1.110000e+02 528
+#endif
+
+[ dihedrals ]
+; ai aj ak al funct c0 c1 c2
+#ifdef DIHS
+ 1 2 3 4 1 0.0 5.857600e+00 3.000000e+00
+#endif
+#ifdef RYCKAERTS
+ 1 2 3 4 3 9.2789 12.156 -13.120 -3.0597 26.240 -31.495
+#endif
+
+[ system ]
+; The name of the system to be simulated
+This_incredible_box_of_butane
+
+[ molecules ]
+; Molname Number
+Butane 1
+
--- /dev/null
+[ System ]
+ 1 2 3 4
--- /dev/null
+[ atom1 ]
+1
+[ atom2 ]
+2
+[ atom3 ]
+3
+[ atoms12 ]
+1 2
+[ atoms23 ]
+2 3
+[ atoms123 ]
+1 2 3
--- /dev/null
+mindist_beads
+ 3
+ 1A A 1 1.000 3.000 3.000
+ 2A A 2 4.000 3.000 3.000
+ 2B B 3 4.500 3.000 3.000
+ 5.00000 5.00000 5.00000
\ No newline at end of file
--- /dev/null
+TITLE
+1 TIP5P
+END
+POSITION
+ 1 SOL OW 1 0.320905924 1.613866529 0.603274297
+ 1 SOL HW1 2 0.377193341 1.643166954 0.674936910
+ 1 SOL HW2 3 0.257900736 1.554966518 0.644788793
+ 1 SOL LP1 4 0.288185980 1.668227613 0.573706149
+ 1 SOL LP2 5 0.358259894 1.579923712 0.554771064
+END
+BOX
+ 12.500070000 12.500070000 12.500070000
+END
--- /dev/null
+[ System ]
+ 1 2 3 4 5
--- /dev/null
+#include "oplsaa.ff/forcefield.itp"
+
+; original reference: [M. W. Mahoney and W. L. Jorgensen, J. Chem. Phys. 112 , 2000]
+;
+; Note that there are various issues with tip5p and the different forcefields.
+; Discussion is here: http://redmine.gromacs.org/issues/1348
+
+[ moleculetype ]
+; molname nrexcl
+SOL 2
+
+[ atoms ]
+; id at type res nr residu name at name cg nr charge
+1 opls_118 1 SOL OW 1 0
+2 opls_119 1 SOL HW1 1 0.241
+3 opls_119 1 SOL HW2 1 0.241
+4 opls_120 1 SOL LP1 1 -0.241
+5 opls_120 1 SOL LP2 1 -0.241
+
+[ bonds ]
+; i j funct length force.c.
+1 2 1 0.09572 502416.0 0.09572 502416.0
+1 3 1 0.09572 502416.0 0.09572 502416.0
+
+[ angles ]
+; i j k funct angle force.c.
+2 1 3 1 104.52 628.02 104.52 628.02
+
+[ virtual_sites3 ]
+; The position of the virtual site is computed as follows:
+;
+; The distance from OW to L is 0.07 nm, the geometry is tetrahedral
+; (109.47 deg)
+; Therefore, a = b = 0.07 * cos (109.47/2) / | xOH1 + xOH2 |
+; c = 0.07 * sin (109.47/2) / | xOH1 X xOH2 |
+;
+; Using | xOH1 X xOH2 | = | xOH1 | | xOH2 | sin (H1-O-H2)
+; | xOH1 + xOH2 | = 2 | xOH1 | cos (H1-O-H2)
+; Vsite pos x4 = x1 + a*x21 + b*x31 + c*(x21 X x31)
+
+; Vsite from funct a b c
+4 1 2 3 4 -0.344908 -0.344908 -6.4437903493
+5 1 2 3 4 -0.344908 -0.344908 6.4437903493
+
+[ exclusions ]
+1 2 3 4 5
+2 1 3 4 5
+3 1 2 4 5
+4 1 2 3 5
+5 1 2 3 4
+
+[ system ]
+1 TIP5P
+
+[ molecules ]
+SOL 1
--- /dev/null
+TITLE
+2 scaled waters
+END
+POSITION
+ 1 SOL OW 1 0.914818904 17.114674936 24.974532564
+ 1 SOL HW1 2 1.207239659 16.434171182 24.367718701
+ 1 SOL HW2 3 1.794362088 17.256320895 0.323592571
+ 2 SOL OW 4 2.688663748 14.887261002 23.182636745
+ 2 SOL HW1 5 2.999853477 14.939893657 22.278872288
+ 2 SOL HW2 6 2.760097525 13.938314213 23.286543655
+END
+BOX
+ 25.001000000 25.001000000 25.001000000
+END
--- /dev/null
+[ System ]
+ 1 2 3 4 5 6
+[ Water ]
+ 1 2 3 4 5 6
+[ SOL ]
+ 1 2 3 4 5 6
--- /dev/null
+[ defaults ]
+; nbfunc comb-rule gen-pairs fudgeLJ fudgeQQ
+1 3 yes 0.5 0.5
+
+[ atomtypes ]
+; full atom descriptions are available in ffoplsaa.atp
+; name bond_type mass charge ptype sigma epsilon
+ OW O 8 15.99940 0.000 A 3 50
+ HW H 1 1.00800 0.000 A 0.00000e+00 0.00000e+00
+
+[ moleculetype ]
+; molname nrexcl
+SOL 2
+
+[ atoms ]
+; id at type res nr residu name at name cg nr charge
+1 OW 1 SOL OW 1 -0.6
+2 HW 1 SOL HW1 1 0.3
+3 HW 1 SOL HW2 1 0.3
+
+[ bonds ]
+; i j funct length force.c.
+1 2 1 0.9572 5024.0
+1 3 1 0.9572 5024.0
+
+[ angles ]
+; i j k funct angle force.c.
+2 1 3 1 100.0 6.0
+
+[ system ]
+2 scaled waters
+
+[ molecules ]
+SOL 2
2SOL OW 4 1.555 1.511 0.703 0.869 1.245 1.665
2SOL HW1 5 1.498 1.495 0.784 0.169 0.275 1.565
2SOL HW2 6 1.496 1.521 0.623 0.269 2.275 1.465
- 30.0000 30.0000 30.0000
+ 3.0100 3.0100 3.0100
--- /dev/null
+TITLE
+flex spc dimer
+END
+POSITION
+ 1 SOL OW 1 0.107010772 1.683192707 2.473043682
+ 1 SOL HW1 2 0.160090735 1.615077199 2.417969596
+ 1 SOL HW2 3 0.171349747 1.729056724 2.533939606
+ 2 SOL OW 4 0.257783861 1.504703191 2.331507471
+ 2 SOL HW1 5 0.283683457 1.519119514 2.235567800
+ 2 SOL HW2 6 0.256584968 1.405914249 2.349461497
+END
+BOX
+ 12.500100000 12.500100000 12.500100000
+END
--- /dev/null
+[ System ]
+ 1 2 3 4 5 6
--- /dev/null
+;
+; Topology file for SPC
+;
+#define FLEXIBLE
+#include "oplsaa.ff/forcefield.itp"
+#include "oplsaa.ff/spc.itp"
+
+[ system ]
+flex spc dimer
+
+[ molecules ]
+SOL 2
+
--- /dev/null
+[ water ]
+1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+
--- /dev/null
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.00000 step= 0
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 1
+ATOM 1 OW SOL 1 15.330 9.890 2.320 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.660 9.590 1.570 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.140 10.370 1.940 1.00 0.00 H
+ATOM 4 OW SOL 2 2.280 7.430 11.030 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.510 8.060 11.060 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.870 7.560 11.840 1.00 0.00 H
+ATOM 7 OW SOL 3 12.700 6.440 2.270 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.510 7.190 1.580 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.090 5.670 1.730 1.00 0.00 H
+ATOM 10 OW SOL 4 4.350 18.020 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.350 18.060 10.600 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.370 18.160 9.350 1.00 0.00 H
+ATOM 13 OW SOL 5 3.080 11.360 9.950 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.890 12.320 10.040 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.360 11.090 10.880 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.00400 step= 20
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 2
+ATOM 1 OW SOL 1 15.360 9.890 2.320 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.740 9.620 1.560 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.160 10.400 1.920 1.00 0.00 H
+ATOM 4 OW SOL 2 2.280 7.430 11.000 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.530 8.190 11.010 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.860 7.650 11.850 1.00 0.00 H
+ATOM 7 OW SOL 3 12.670 6.450 2.280 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.500 7.180 1.640 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.140 5.720 1.750 1.00 0.00 H
+ATOM 10 OW SOL 4 4.330 18.040 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.280 18.100 10.610 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.360 18.140 9.330 1.00 0.00 H
+ATOM 13 OW SOL 5 3.080 11.340 9.940 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.820 12.330 10.000 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.280 11.140 10.900 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.00800 step= 40
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 3
+ATOM 1 OW SOL 1 15.400 9.890 2.330 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.800 9.670 1.540 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.130 10.390 1.880 1.00 0.00 H
+ATOM 4 OW SOL 2 2.280 7.430 10.970 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.670 8.180 10.950 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.800 7.680 11.790 1.00 0.00 H
+ATOM 7 OW SOL 3 12.650 6.450 2.290 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.520 7.210 1.650 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.190 5.770 1.750 1.00 0.00 H
+ATOM 10 OW SOL 4 4.310 18.050 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.220 18.120 10.590 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.330 18.130 9.280 1.00 0.00 H
+ATOM 13 OW SOL 5 3.080 11.330 9.930 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.770 12.310 9.910 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.210 11.140 10.970 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.01200 step= 60
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 4
+ATOM 1 OW SOL 1 15.430 9.890 2.350 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.800 9.690 1.530 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.160 10.410 1.830 1.00 0.00 H
+ATOM 4 OW SOL 2 2.290 7.440 10.950 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.660 8.260 10.840 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.810 7.660 11.810 1.00 0.00 H
+ATOM 7 OW SOL 3 12.620 6.450 2.290 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.530 7.250 1.650 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.230 5.840 1.750 1.00 0.00 H
+ATOM 10 OW SOL 4 4.290 18.070 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.170 18.160 10.600 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.350 18.150 9.230 1.00 0.00 H
+ATOM 13 OW SOL 5 3.070 11.320 9.930 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.760 12.250 9.790 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.120 11.170 10.900 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.01600 step= 80
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 5
+ATOM 1 OW SOL 1 15.460 9.890 2.350 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.790 9.690 1.640 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.180 10.400 1.840 1.00 0.00 H
+ATOM 4 OW SOL 2 2.290 7.450 10.930 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.670 8.260 10.730 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.820 7.600 11.810 1.00 0.00 H
+ATOM 7 OW SOL 3 12.600 6.450 2.290 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.540 7.240 1.730 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.260 5.880 1.760 1.00 0.00 H
+ATOM 10 OW SOL 4 4.260 18.090 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.110 18.190 10.590 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.340 18.200 9.170 1.00 0.00 H
+ATOM 13 OW SOL 5 3.060 11.310 9.920 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.740 12.260 9.670 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.060 11.200 10.950 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.02000 step= 100
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 6
+ATOM 1 OW SOL 1 15.500 9.880 2.360 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.720 9.690 1.710 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.210 10.380 1.840 1.00 0.00 H
+ATOM 4 OW SOL 2 2.290 7.460 10.910 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.740 8.210 10.680 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.760 7.580 11.780 1.00 0.00 H
+ATOM 7 OW SOL 3 12.590 6.450 2.290 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.510 7.330 1.770 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.260 5.880 1.780 1.00 0.00 H
+ATOM 10 OW SOL 4 4.230 18.100 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 4.040 18.240 10.580 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.340 18.280 9.130 1.00 0.00 H
+ATOM 13 OW SOL 5 3.050 11.290 9.900 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.750 12.200 9.610 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.020 11.270 10.950 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.02400 step= 120
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 7
+ATOM 1 OW SOL 1 15.520 9.880 2.380 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.710 9.720 1.780 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.250 10.350 1.790 1.00 0.00 H
+ATOM 4 OW SOL 2 2.300 7.460 10.880 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.710 8.320 10.660 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.720 7.630 11.830 1.00 0.00 H
+ATOM 7 OW SOL 3 12.580 6.450 2.280 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.480 7.350 1.850 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.260 5.880 1.800 1.00 0.00 H
+ATOM 10 OW SOL 4 4.200 18.110 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.960 18.290 10.570 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.350 18.380 9.120 1.00 0.00 H
+ATOM 13 OW SOL 5 3.040 11.280 9.890 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.760 12.170 9.550 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.000 11.340 10.870 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.02800 step= 140
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 8
+ATOM 1 OW SOL 1 15.550 9.870 2.390 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.740 9.770 1.820 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.220 10.270 1.740 1.00 0.00 H
+ATOM 4 OW SOL 2 2.310 7.460 10.860 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.770 8.270 10.690 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.650 7.670 11.810 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.450 2.280 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.460 7.360 1.900 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.250 5.900 1.760 1.00 0.00 H
+ATOM 10 OW SOL 4 4.170 18.130 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.900 18.320 10.550 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.360 18.490 9.080 1.00 0.00 H
+ATOM 13 OW SOL 5 3.030 11.260 9.870 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.750 12.170 9.480 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.000 11.380 10.930 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.03200 step= 160
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 9
+ATOM 1 OW SOL 1 15.580 9.870 2.410 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.710 9.800 1.840 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.240 10.190 1.690 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.470 10.850 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.750 8.270 10.670 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.620 7.650 11.790 1.00 0.00 H
+ATOM 7 OW SOL 3 12.560 6.440 2.280 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.430 7.410 1.890 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.220 5.970 1.670 1.00 0.00 H
+ATOM 10 OW SOL 4 4.140 18.140 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.860 18.340 10.560 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.410 18.590 9.050 1.00 0.00 H
+ATOM 13 OW SOL 5 3.020 11.250 9.850 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.760 12.100 9.430 1.00 0.00 H
+ATOM 15 HW2 SOL 5 3.000 11.340 10.850 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.03600 step= 180
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 10
+ATOM 1 OW SOL 1 15.600 9.860 2.420 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.720 9.830 1.920 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.300 10.110 1.700 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.470 10.830 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.690 8.290 10.610 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.670 7.590 11.830 1.00 0.00 H
+ATOM 7 OW SOL 3 12.550 6.440 2.270 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.380 7.350 1.930 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.170 6.050 1.550 1.00 0.00 H
+ATOM 10 OW SOL 4 4.100 18.160 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.840 18.330 10.570 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.450 18.680 9.020 1.00 0.00 H
+ATOM 13 OW SOL 5 3.010 11.230 9.830 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.740 12.100 9.370 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.970 11.290 10.840 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.04000 step= 200
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 11
+ATOM 1 OW SOL 1 15.610 9.850 2.430 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.700 9.840 1.980 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.340 10.050 1.750 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.470 10.820 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.730 8.200 10.620 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.690 7.530 11.770 1.00 0.00 H
+ATOM 7 OW SOL 3 12.560 6.430 2.260 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.260 7.380 1.970 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.090 6.110 1.470 1.00 0.00 H
+ATOM 10 OW SOL 4 4.070 18.180 9.600 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.790 18.310 10.570 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.460 18.760 9.010 1.00 0.00 H
+ATOM 13 OW SOL 5 3.000 11.220 9.800 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.700 12.090 9.380 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.910 11.260 10.870 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.04400 step= 220
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 12
+ATOM 1 OW SOL 1 15.630 9.850 2.450 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.710 9.860 1.970 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.390 10.020 1.750 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.470 10.810 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.680 8.270 10.670 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.710 7.520 11.750 1.00 0.00 H
+ATOM 7 OW SOL 3 12.560 6.430 2.250 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.130 7.350 2.040 1.00 0.00 H
+ATOM 9 HW2 SOL 3 13.020 6.140 1.390 1.00 0.00 H
+ATOM 10 OW SOL 4 4.040 18.200 9.600 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.720 18.300 10.570 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.460 18.820 9.060 1.00 0.00 H
+ATOM 13 OW SOL 5 2.990 11.210 9.780 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.660 12.080 9.430 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.830 11.220 10.750 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.04800 step= 240
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 13
+ATOM 1 OW SOL 1 15.630 9.840 2.470 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.790 9.880 1.930 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.360 10.010 1.770 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.460 10.790 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.700 8.270 10.770 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.720 7.540 11.770 1.00 0.00 H
+ATOM 7 OW SOL 3 12.560 6.440 2.240 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.040 7.270 2.140 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.960 6.170 1.340 1.00 0.00 H
+ATOM 10 OW SOL 4 4.010 18.220 9.600 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.660 18.270 10.550 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.410 18.880 9.100 1.00 0.00 H
+ATOM 13 OW SOL 5 2.980 11.210 9.760 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.600 12.110 9.460 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.740 11.150 10.780 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.05200 step= 260
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 14
+ATOM 1 OW SOL 1 15.640 9.830 2.490 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.820 9.880 1.850 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.360 10.030 1.800 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.460 10.780 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.730 8.230 10.850 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.720 7.520 11.690 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.430 2.220 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.940 7.270 2.180 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.890 6.240 1.290 1.00 0.00 H
+ATOM 10 OW SOL 4 3.980 18.240 9.600 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.620 18.200 10.560 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.360 18.890 9.130 1.00 0.00 H
+ATOM 13 OW SOL 5 2.960 11.210 9.740 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.570 12.090 9.480 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.710 11.050 10.740 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.05600 step= 280
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 15
+ATOM 1 OW SOL 1 15.630 9.830 2.500 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.850 9.850 1.850 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.420 10.070 1.850 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.460 10.770 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.660 8.280 10.860 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.790 7.440 11.700 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.430 2.210 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.950 7.210 2.190 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.840 6.320 1.220 1.00 0.00 H
+ATOM 10 OW SOL 4 3.960 18.270 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.630 18.110 10.550 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.290 18.870 9.130 1.00 0.00 H
+ATOM 13 OW SOL 5 2.940 11.220 9.730 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.540 12.100 9.490 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.720 10.970 10.660 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.06000 step= 300
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 16
+ATOM 1 OW SOL 1 15.620 9.840 2.510 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.850 9.800 1.850 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.440 10.110 1.970 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.460 10.770 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.680 8.210 10.830 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.840 7.380 11.660 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.420 2.200 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.960 7.220 2.210 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.800 6.370 1.230 1.00 0.00 H
+ATOM 10 OW SOL 4 3.940 18.290 9.590 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.640 18.030 10.520 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.180 18.830 9.130 1.00 0.00 H
+ATOM 13 OW SOL 5 2.920 11.220 9.710 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.500 12.140 9.530 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.700 10.920 10.710 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.06400 step= 320
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 17
+ATOM 1 OW SOL 1 15.610 9.840 2.520 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.850 9.760 1.820 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.460 10.180 2.030 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.460 10.760 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.640 8.220 10.830 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.820 7.400 11.610 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.410 2.190 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.950 7.250 2.270 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.800 6.370 1.210 1.00 0.00 H
+ATOM 10 OW SOL 4 3.920 18.310 9.580 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.620 17.970 10.500 1.00 0.00 H
+ATOM 12 HW2 SOL 4 3.090 18.740 9.170 1.00 0.00 H
+ATOM 13 OW SOL 5 2.890 11.230 9.700 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.490 12.130 9.620 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.720 10.970 10.650 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.06800 step= 340
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 18
+ATOM 1 OW SOL 1 15.590 9.840 2.530 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.920 9.730 1.790 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.410 10.250 2.030 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.460 10.750 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.620 8.250 10.860 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.830 7.490 11.680 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.420 2.180 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.010 7.220 2.330 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.810 6.320 1.200 1.00 0.00 H
+ATOM 10 OW SOL 4 3.900 18.320 9.570 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.600 17.950 10.460 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.990 18.660 9.190 1.00 0.00 H
+ATOM 13 OW SOL 5 2.860 11.240 9.680 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.480 12.170 9.680 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.750 11.010 10.670 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.07200 step= 360
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 19
+ATOM 1 OW SOL 1 15.580 9.840 2.530 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.940 9.700 1.730 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.330 10.310 2.020 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.470 10.750 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.670 8.200 10.850 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.780 7.600 11.650 1.00 0.00 H
+ATOM 7 OW SOL 3 12.570 6.410 2.170 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.000 7.260 2.360 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.780 6.300 1.220 1.00 0.00 H
+ATOM 10 OW SOL 4 3.870 18.330 9.550 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.610 17.960 10.460 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.960 18.630 9.170 1.00 0.00 H
+ATOM 13 OW SOL 5 2.830 11.250 9.680 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.500 12.210 9.690 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.800 11.000 10.710 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.07600 step= 380
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 20
+ATOM 1 OW SOL 1 15.560 9.840 2.520 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.920 9.650 1.750 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.300 10.390 2.020 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.480 10.750 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.600 8.250 10.780 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.770 7.680 11.630 1.00 0.00 H
+ATOM 7 OW SOL 3 12.580 6.410 2.180 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.010 7.250 2.320 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.720 6.300 1.170 1.00 0.00 H
+ATOM 10 OW SOL 4 3.850 18.330 9.540 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.640 18.000 10.470 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.970 18.640 9.130 1.00 0.00 H
+ATOM 13 OW SOL 5 2.800 11.260 9.680 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.560 12.230 9.660 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.860 10.990 10.630 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.08000 step= 400
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 21
+ATOM 1 OW SOL 1 15.540 9.840 2.500 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.870 9.580 1.790 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.260 10.420 2.070 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.510 10.750 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.600 8.230 10.680 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.840 7.720 11.670 1.00 0.00 H
+ATOM 7 OW SOL 3 12.590 6.410 2.190 1.00 0.00 O
+ATOM 8 HW1 SOL 3 12.010 7.210 2.270 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.650 6.300 1.200 1.00 0.00 H
+ATOM 10 OW SOL 4 3.820 18.330 9.520 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.650 18.080 10.480 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.940 18.700 9.090 1.00 0.00 H
+ATOM 13 OW SOL 5 2.760 11.270 9.680 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.620 12.290 9.640 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.890 10.970 10.680 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.08400 step= 420
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 22
+ATOM 1 OW SOL 1 15.530 9.830 2.480 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.810 9.520 1.790 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.240 10.420 2.050 1.00 0.00 H
+ATOM 4 OW SOL 2 2.320 7.540 10.760 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.610 8.210 10.610 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.820 7.730 11.600 1.00 0.00 H
+ATOM 7 OW SOL 3 12.600 6.400 2.200 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.960 7.220 2.280 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.620 6.250 1.210 1.00 0.00 H
+ATOM 10 OW SOL 4 3.800 18.330 9.500 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.610 18.180 10.500 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.960 18.740 9.120 1.00 0.00 H
+ATOM 13 OW SOL 5 2.740 11.280 9.680 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.700 12.290 9.660 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.850 11.020 10.670 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.08800 step= 440
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 23
+ATOM 1 OW SOL 1 15.500 9.820 2.460 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.830 9.510 1.780 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.220 10.370 1.940 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.570 10.750 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.580 8.300 10.620 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.810 7.800 11.640 1.00 0.00 H
+ATOM 7 OW SOL 3 12.600 6.410 2.210 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.960 7.170 2.320 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.650 6.160 1.200 1.00 0.00 H
+ATOM 10 OW SOL 4 3.790 18.310 9.490 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.580 18.290 10.480 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.930 18.780 9.140 1.00 0.00 H
+ATOM 13 OW SOL 5 2.710 11.290 9.690 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.780 12.290 9.680 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.750 11.070 10.660 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.09200 step= 460
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 24
+ATOM 1 OW SOL 1 15.480 9.810 2.440 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.810 9.510 1.730 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.170 10.250 1.830 1.00 0.00 H
+ATOM 4 OW SOL 2 2.330 7.600 10.740 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.640 8.300 10.710 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.780 7.830 11.670 1.00 0.00 H
+ATOM 7 OW SOL 3 12.610 6.410 2.220 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.930 7.160 2.350 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.680 6.100 1.280 1.00 0.00 H
+ATOM 10 OW SOL 4 3.770 18.300 9.480 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.590 18.350 10.480 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.930 18.780 9.110 1.00 0.00 H
+ATOM 13 OW SOL 5 2.690 11.290 9.690 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.860 12.310 9.660 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.630 11.070 10.730 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.09600 step= 480
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 25
+ATOM 1 OW SOL 1 15.460 9.800 2.420 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.750 9.510 1.730 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.180 10.150 1.750 1.00 0.00 H
+ATOM 4 OW SOL 2 2.340 7.630 10.740 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.610 8.340 10.790 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.740 7.760 11.620 1.00 0.00 H
+ATOM 7 OW SOL 3 12.610 6.400 2.240 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.920 7.170 2.290 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.710 6.090 1.270 1.00 0.00 H
+ATOM 10 OW SOL 4 3.750 18.300 9.470 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.630 18.360 10.490 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.950 18.730 9.050 1.00 0.00 H
+ATOM 13 OW SOL 5 2.670 11.300 9.700 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.920 12.270 9.610 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.510 11.070 10.660 1.00 0.00 H
+TER
+ENDMDL
+REMARK GENERATED BY TRJCONV
+TITLE water t= 0.10000 step= 500
+REMARK THIS IS A SIMULATION BOX
+CRYST1 18.621 18.621 18.621 90.00 90.00 90.00 P 1 1
+MODEL 26
+ATOM 1 OW SOL 1 15.450 9.780 2.380 1.00 0.00 O
+ATOM 2 HW1 SOL 1 14.660 9.520 1.790 1.00 0.00 H
+ATOM 3 HW2 SOL 1 16.200 10.060 1.740 1.00 0.00 H
+ATOM 4 OW SOL 2 2.350 7.660 10.720 1.00 0.00 O
+ATOM 5 HW1 SOL 2 1.560 8.330 10.840 1.00 0.00 H
+ATOM 6 HW2 SOL 2 2.820 7.620 11.700 1.00 0.00 H
+ATOM 7 OW SOL 3 12.610 6.400 2.270 1.00 0.00 O
+ATOM 8 HW1 SOL 3 11.960 7.160 2.170 1.00 0.00 H
+ATOM 9 HW2 SOL 3 12.740 6.140 1.290 1.00 0.00 H
+ATOM 10 OW SOL 4 3.740 18.290 9.470 1.00 0.00 O
+ATOM 11 HW1 SOL 4 3.670 18.340 10.480 1.00 0.00 H
+ATOM 12 HW2 SOL 4 2.900 18.700 8.990 1.00 0.00 H
+ATOM 13 OW SOL 5 2.650 11.310 9.710 1.00 0.00 O
+ATOM 14 HW1 SOL 5 2.960 12.260 9.600 1.00 0.00 H
+ATOM 15 HW2 SOL 5 2.400 11.090 10.670 1.00 0.00 H
+TER
+ENDMDL
--- /dev/null
+#include "oplsaa.ff/forcefield.itp"
+#include "oplsaa.ff/spc.itp"
+
+[ system ]
+water
+
+[ molecules ]
+sol 5
+
--- /dev/null
+[ mol ]
+1 2 3 4 5 6 10 11 12
+
--- /dev/null
+TITLE
+sw dimer
+END
+POSITION
+ 1 SM2 OW1 1 0.105589126 1.683747627 2.473256543
+ 1 SM2 HW2 2 0.169054476 1.625271429 2.430233329
+ 1 SM2 HW3 3 0.158294176 1.733694494 2.535445150
+ 1 SM2 DW 4 0.119211950 1.682747427 2.475503990
+ 1 SM2 SW 5 0.117933880 1.683816442 2.476262471
+ 2 SM2 OW1 6 0.281166272 1.495951726 2.328371342
+ 2 SM2 HW2 7 0.273838350 1.511998272 2.233969836
+ 2 SM2 HW3 8 0.248561139 1.406400039 2.340213452
+ 2 SM2 DW 9 0.276483487 1.487332081 2.318689942
+ 2 SM2 SW 10 0.275562577 1.489119972 2.320247878
+END
+BOX
+ 14.500100000 14.500100000 14.500100000
+END
--- /dev/null
+[ System ]
+ 1 2 3 4 5 6 7 8 9 10
--- /dev/null
+;
+; Topology file for SW
+;
+; Paul van Maaren and David van der Spoel
+; Molecular Dynamics Simulations of Water with Novel Shell Model Potentials
+; J. Phys. Chem. B. 105 (2618-2626), 2001
+;
+; Force constants for the shell are given by:
+;
+; k = qs^2/(4 pi eps0 alpha)
+; However, in the current version of the itp file and software (3.2+)
+; force constants are computed in mdrun, and the input is the
+; polarizability in nm^3.
+;
+; Some data: mu (water) = 1.8546 D ( 0.0386116 e nm)
+; 1/(4 pi eps0 alpha) = 94513.94
+;
+; Alpha-X = 1.415 kx = 608069
+; Alpha-Y = 1.528 ky = 563101
+; Alpha-Z = 1.468 kz = 586116
+;
+; Alpha = 1.470 k = 585318
+;
+; Bonding parameters from (but without cubic term):
+; D. M. Ferguson:
+; Parametrization and Evaluation of a Flexible Water Model
+; J. Comp. Chem. 16(4), 501-511 (1995)
+;
+; Possible defines that you can put in your topol.top:
+; -DANISOTROPIC Select anisotropic polarizibility (isotropic is default).
+; -DRIGID Rigid model (flexible is default)
+; -DPOSRES Position restrain oxygen atoms
+;
+
+[ defaults ]
+LJ Geometric
+
+[ atomtypes ]
+;name mass charge ptype c6 c12
+ WO 15.99940 0.0 A 0.0 0.0
+ WH 1.00800 0.0 A 0.0 0.0
+ WS 0.0 0.0 S 0.0 0.0
+ WD 0.0 0.0 V 0.0 0.0
+
+[ nonbond_params ]
+#ifdef RIGID
+#ifdef ANISOTROPIC
+WH WH 1 4.0e-5 4.0e-8
+WS WO 1 1.0e-6 1.0e-12
+WS WH 1 4.0e-5 2.766e-08
+WO WO 1 2.0e-3 1.174e-06
+#else
+WH WH 1 4.0e-5 4.0e-8
+WS WO 1 1.0e-6 1.0e-12
+WS WH 1 4.0e-5 2.769e-08
+WO WO 1 2.0e-3 1.176e-06
+#endif
+#else
+#ifdef ANISOTROPIC
+WH WH 1 4.0e-5 4.0e-8
+WS WO 1 1.0e-6 1.0e-12
+WS WH 1 4.0e-5 2.910e-08
+WO WO 1 2.0e-3 1.189e-06
+#else
+WH WH 1 4.0e-5 4.0e-8
+WS WO 1 1.0e-6 1.0e-12
+WS WH 1 4.0e-5 2.937e-08
+WO WO 1 2.0e-3 1.187e-06
+#endif
+#endif
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This is a the 'classical YAW' model, in which we do have the dummy.
+;; The shell is attached to the dummy, in this case the gas-phase
+;; quadrupole is correct. Water_pol routine can be used for this
+;; model. This has four interaction sites.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+[ moleculetype ]
+; molname nrexcl
+SW 2
+
+[ atoms ]
+; id at type res nr residu name at name cg nr charge
+1 WO 1 SM2 OW1 1 1.24588
+2 WH 1 SM2 HW2 1 0.62134
+3 WH 1 SM2 HW3 1 0.62134
+4 WD 1 SM2 DW 1 0.0
+5 WS 1 SM2 SW 1 -2.48856
+
+#ifdef ANISOTROPIC
+[ water_polarization ]
+; See notes above. Alphas in nm^3 (See ref. above)
+; O H H D S funct al_x al_y al_z rOH rHH rOD
+ 1 2 3 4 5 1 0.001415 0.001528 0.001468 0.09572 0.15139 0.0137408
+
+#else
+
+[ polarization ]
+; See notes above. alpha (nm^3)
+4 5 1 0.00147
+#endif
+
+#ifdef RIGID
+[ settles ]
+; i funct dOH dHH
+1 1 0.09572 0.15139
+
+#else
+
+[ bonds ]
+1 2 1 0.09572 458148.
+1 3 1 0.09572 458148.
+
+[ angles ]
+; i j k
+2 1 3 1 104.52 417.6
+#endif
+
+[ dummies3 ]
+; The position of the dummies is computed as follows:
+;
+; O
+;
+; D
+;
+; H H
+;
+; 2 * b = distance (OD) / [ cos (angle(DOH)) * distance (OH) ]
+; 0.0137408 nm / [ cos (104.52 / 2 deg) * 0.09572 nm ]
+; 0.01557 nm
+; Dummy pos x4 = x1 + a*(x2-x1) + b*(x3-X1)
+;
+; Dummy from funct a b
+4 1 2 3 1 0.117265878 0.117265878
+
+[ exclusions ]
+; iatom excluded from interaction with i
+1 2 3 4 5
+2 1 3 4 5
+3 1 2 4 5
+4 1 2 3 5
+5 1 2 3 4
+
+#ifdef POSRES
+; Restrain the oxygen...
+[ position_restraints ]
+; iatom type fx fy fz
+1 1 100 100 100
+#endif
+
+[ system ]
+sw dimer
+
+[ molecules ]
+SW 2
+
#include "oplsaa.ff/forcefield.itp"
-
; Include water topology
#include "oplsaa.ff/tip3p.itp"
--- /dev/null
+TITLE
+AMYLOID BETA A4 PROTEIN
+END
+POSITION
+ 1 ASP N 1 -0.095738231 0.572774319 -1.057562981
+ 1 ASP H1 2 -0.038734704 0.612581759 -1.133626338
+ 1 ASP H2 3 -0.065228911 0.472622499 -1.038021303
+ 1 ASP H3 4 -0.193927807 0.553503822 -1.089130213
+ 1 ASP CA 5 -0.092733895 0.649483647 -0.931159729
+ 1 ASP HA 6 0.009289907 0.645130106 -0.894797586
+ 1 ASP CB 7 -0.132302761 0.796102401 -0.961795051
+ 1 ASP HB1 8 -0.071222743 0.837940769 -1.044563088
+ 1 ASP HB2 9 -0.239644960 0.807616509 -0.986318894
+ 1 ASP CG 10 -0.100151896 0.875758042 -0.837883250
+ 1 ASP OD1 11 0.018576586 0.910706759 -0.819015285
+ 1 ASP OD2 12 -0.190455399 0.891929899 -0.752573424
+ 1 ASP C 13 -0.179122751 0.582613712 -0.824302376
+ 1 ASP O 14 -0.127854170 0.510843746 -0.739216732
+ 2 ALA N 15 -0.312707650 0.603028428 -0.827177828
+ 2 ALA HN 16 -0.353267958 0.662063591 -0.895982874
+ 2 ALA CA 17 -0.406270503 0.555106865 -0.727409760
+ 2 ALA HA 18 -0.377140695 0.597598894 -0.632389432
+ 2 ALA CB 19 -0.547588852 0.604802381 -0.763602152
+ 2 ALA HB1 20 -0.620860543 0.574927334 -0.685558877
+ 2 ALA HB2 21 -0.548046648 0.715663179 -0.771014666
+ 2 ALA HB3 22 -0.580327033 0.562732245 -0.861111429
+ 2 ALA C 23 -0.408208180 0.403957202 -0.708159996
+ 2 ALA O 24 -0.419548270 0.355100489 -0.596071361
+ 3 GLU N 25 -0.394102539 0.326512982 -0.817111585
+ 3 GLU HN 26 -0.380006497 0.366875495 -0.908211950
+ 3 GLU CA 27 -0.382217046 0.182017694 -0.813863708
+ 3 GLU HA 28 -0.468089297 0.144194034 -0.760284666
+ 3 GLU CB 29 -0.389109207 0.126228620 -0.959128231
+ 3 GLU HB1 30 -0.403188424 0.015892499 -0.954064390
+ 3 GLU HB2 31 -0.480633776 0.168697422 -1.006245798
+ 3 GLU CG 32 -0.269523482 0.154493856 -1.054910974
+ 3 GLU HG1 33 -0.184491588 0.088616103 -1.026518827
+ 3 GLU HG2 34 -0.298638599 0.129179950 -1.158925967
+ 3 GLU CD 35 -0.218822581 0.297339961 -1.053790211
+ 3 GLU OE1 36 -0.099456303 0.317673629 -1.018756015
+ 3 GLU OE2 37 -0.295818569 0.393897437 -1.080046933
+ 3 GLU C 38 -0.259959103 0.132565074 -0.736197301
+ 3 GLU O 39 -0.272549916 0.048973297 -0.646963409
+ 4 PHE N 40 -0.140591735 0.191239724 -0.760043037
+ 4 PHE HN 41 -0.129671915 0.251705649 -0.839613367
+ 4 PHE CA 42 -0.020441914 0.167023198 -0.682431710
+ 4 PHE HA 43 -0.008479130 0.059674466 -0.678112812
+ 4 PHE CB 44 0.104141072 0.228003018 -0.752663941
+ 4 PHE HB1 45 0.108289148 0.191469880 -0.857548209
+ 4 PHE HB2 46 0.097274213 0.338762224 -0.753926916
+ 4 PHE CG 47 0.232475096 0.185371312 -0.685077390
+ 4 PHE CD1 48 0.262163368 0.049082431 -0.667001406
+ 4 PHE HD1 49 0.195683907 -0.027763200 -0.704164737
+ 4 PHE CE1 50 0.376292282 0.009475295 -0.596384732
+ 4 PHE HE1 51 0.394835660 -0.096128426 -0.580959614
+ 4 PHE CZ 52 0.463464115 0.105934765 -0.544607219
+ 4 PHE HZ 53 0.551080815 0.074795657 -0.489611460
+ 4 PHE CD2 54 0.321016568 0.281344741 -0.633001866
+ 4 PHE HD2 55 0.298719391 0.386211355 -0.644741540
+ 4 PHE CE2 56 0.436071386 0.242058365 -0.563188898
+ 4 PHE HE2 57 0.502944347 0.316329006 -0.522333518
+ 4 PHE C 58 -0.032096898 0.214710487 -0.537688600
+ 4 PHE O 59 0.021384151 0.153469629 -0.446077176
+ 5 ARG N 60 -0.104812943 0.324852974 -0.510156677
+ 5 ARG HN 61 -0.143427848 0.378123853 -0.585443429
+ 5 ARG CA 62 -0.132621213 0.366710226 -0.373281701
+ 5 ARG HA 63 -0.037499525 0.375855198 -0.322532204
+ 5 ARG CB 64 -0.204112659 0.503982940 -0.366306351
+ 5 ARG HB1 65 -0.299168939 0.497836177 -0.423649827
+ 5 ARG HB2 66 -0.229791994 0.526233506 -0.260207185
+ 5 ARG CG 67 -0.117210917 0.618787885 -0.420815969
+ 5 ARG HG1 68 -0.022745441 0.623155928 -0.362458013
+ 5 ARG HG2 69 -0.088917595 0.594553701 -0.525386310
+ 5 ARG CD 70 -0.186407524 0.755597878 -0.419216899
+ 5 ARG HD1 71 -0.287529397 0.746979891 -0.465209085
+ 5 ARG HD2 72 -0.197701408 0.795997413 -0.316235319
+ 5 ARG NE 73 -0.106046146 0.848910608 -0.504370465
+ 5 ARG HE 74 -0.138257062 0.868595610 -0.600035221
+ 5 ARG CZ 75 0.013988163 0.900066116 -0.474789584
+ 5 ARG NH1 76 0.067937792 0.887613027 -0.353896867
+ 5 ARG HH11 77 0.016651485 0.835971796 -0.286943145
+ 5 ARG HH12 78 0.157648951 0.925343623 -0.336820949
+ 5 ARG NH2 79 0.081990319 0.963700184 -0.569636967
+ 5 ARG HH21 80 0.047796598 0.952091642 -0.665985404
+ 5 ARG HH22 81 0.175646061 0.990433013 -0.556118833
+ 5 ARG C 82 -0.211689441 0.263784727 -0.293094946
+ 5 ARG O 83 -0.183834600 0.242750833 -0.175482275
+ 6 HIS N 84 -0.310108428 0.195111948 -0.354637165
+ 6 HIS HN 85 -0.336285534 0.217971282 -0.448386570
+ 6 HIS CA 86 -0.375597220 0.080377213 -0.292711542
+ 6 HIS HA 87 -0.410209177 0.110315386 -0.194639473
+ 6 HIS CB 88 -0.497303476 0.032494408 -0.374955423
+ 6 HIS HB1 89 -0.464882194 0.002716760 -0.476840358
+ 6 HIS HB2 90 -0.543867583 -0.055547418 -0.325708936
+ 6 HIS ND1 91 -0.667001817 0.183465672 -0.274071396
+ 6 HIS CG 92 -0.604075935 0.136495007 -0.387727095
+ 6 HIS CE1 93 -0.755666581 0.270458990 -0.317176109
+ 6 HIS HE1 94 -0.823283484 0.326707716 -0.252603108
+ 6 HIS NE2 95 -0.753685967 0.281944428 -0.452176967
+ 6 HIS HE2 96 -0.811629925 0.340848619 -0.508098084
+ 6 HIS CD2 97 -0.656363366 0.195806759 -0.498156059
+ 6 HIS HD2 98 -0.630913956 0.181878997 -0.602152251
+ 6 HIS C 99 -0.283216968 -0.039316896 -0.271590910
+ 6 HIS O 100 -0.283392379 -0.100047338 -0.164852800
+ 7 ASP N 101 -0.200574135 -0.073485014 -0.372724819
+ 7 ASP HN 102 -0.204678100 -0.024621155 -0.459783979
+ 7 ASP CA 103 -0.103973665 -0.182437945 -0.370405262
+ 7 ASP HA 104 -0.155904115 -0.275222498 -0.349936719
+ 7 ASP CB 105 -0.043442926 -0.184385056 -0.513184581
+ 7 ASP HB1 106 -0.125617407 -0.185984189 -0.587785343
+ 7 ASP HB2 107 0.018543208 -0.094361758 -0.530500631
+ 7 ASP CG 108 0.042147355 -0.306357958 -0.540943707
+ 7 ASP OD1 109 0.161294047 -0.286053234 -0.575495741
+ 7 ASP OD2 110 -0.012462374 -0.418945694 -0.531818690
+ 7 ASP C 111 0.004089364 -0.164299107 -0.262618251
+ 7 ASP O 112 0.024351454 -0.247461335 -0.174413788
+ 8 SER N 113 0.067458829 -0.045345296 -0.259463539
+ 8 SER HN 114 0.049849361 0.018756054 -0.334842711
+ 8 SER CA 115 0.161779822 -0.001771952 -0.157007031
+ 8 SER HA 116 0.238508734 -0.077497841 -0.148891495
+ 8 SER CB 117 0.226695673 0.133533356 -0.197501237
+ 8 SER HB1 118 0.272934148 0.121519391 -0.298200321
+ 8 SER HB2 119 0.147248088 0.210938198 -0.206607385
+ 8 SER OG 120 0.325862745 0.179015190 -0.105098606
+ 8 SER HG1 121 0.391013420 0.108425579 -0.096294340
+ 8 SER C 122 0.095733136 0.009307216 -0.020492277
+ 8 SER O 123 0.154193004 -0.020784641 0.083501813
+ 9 GLY N 124 -0.033371891 0.048005952 -0.018856544
+ 9 GLY HN 125 -0.077294880 0.074169752 -0.104883771
+ 9 GLY CA 126 -0.117823005 0.053262708 0.099379448
+ 9 GLY HA1 127 -0.070668913 0.118702574 0.171023759
+ 9 GLY HA2 128 -0.214764792 0.088417422 0.067475000
+ 9 GLY C 129 -0.139800107 -0.079349011 0.167330129
+ 9 GLY O 130 -0.170468830 -0.083363685 0.286042789
+ 10 TYR N 131 -0.122794301 -0.192673403 0.096373691
+ 10 TYR HN 132 -0.101316945 -0.188138600 -0.001461977
+ 10 TYR CA 133 -0.126432672 -0.325429326 0.155272743
+ 10 TYR HA 134 -0.219514180 -0.332262619 0.209200799
+ 10 TYR CB 135 -0.122619710 -0.432233216 0.042287009
+ 10 TYR HB1 136 -0.194892570 -0.402851329 -0.036937820
+ 10 TYR HB2 137 -0.021509578 -0.434063535 -0.004153911
+ 10 TYR CG 138 -0.160063938 -0.572537627 0.084316358
+ 10 TYR CD1 139 -0.096540903 -0.681042627 0.021372100
+ 10 TYR HD1 140 -0.020852114 -0.661920796 -0.053519681
+ 10 TYR CE1 141 -0.131192916 -0.813074208 0.053398039
+ 10 TYR HE1 142 -0.081576686 -0.895608797 0.004473049
+ 10 TYR CZ 143 -0.230318463 -0.837962404 0.148732956
+ 10 TYR OH 144 -0.263675649 -0.970470537 0.182514697
+ 10 TYR HH 145 -0.334849485 -0.966697179 0.246526105
+ 10 TYR CD2 146 -0.260798424 -0.599314397 0.179098596
+ 10 TYR HD2 147 -0.313474332 -0.518795253 0.227736117
+ 10 TYR CE2 148 -0.295423566 -0.731310569 0.211502012
+ 10 TYR HE2 149 -0.371949808 -0.749430147 0.285390063
+ 10 TYR C 150 -0.014923095 -0.346115534 0.258001926
+ 10 TYR O 151 -0.039387969 -0.393341714 0.368749466
+ 11 GLU N 152 0.108525474 -0.301319181 0.227172946
+ 11 GLU HN 153 0.127220340 -0.263938463 0.136640999
+ 11 GLU CA 154 0.218907567 -0.295132719 0.322080415
+ 11 GLU HA 155 0.229277573 -0.392569367 0.367359203
+ 11 GLU CB 156 0.352004058 -0.260602396 0.251081143
+ 11 GLU HB1 157 0.331493536 -0.187666447 0.169847307
+ 11 GLU HB2 158 0.423504271 -0.212719751 0.321884141
+ 11 GLU CG 159 0.421290198 -0.386158339 0.192456142
+ 11 GLU HG1 160 0.346848921 -0.454921336 0.147834427
+ 11 GLU HG2 161 0.493518518 -0.356109547 0.113682480
+ 11 GLU CD 162 0.500257208 -0.463073299 0.298213717
+ 11 GLU OE1 163 0.445179194 -0.490997466 0.408031863
+ 11 GLU OE2 164 0.619685336 -0.491883803 0.272080169
+ 11 GLU C 165 0.193544263 -0.200277670 0.438037710
+ 11 GLU O 166 0.222268815 -0.231308829 0.553241523
+ 12 VAL N 167 0.131519573 -0.083270029 0.412700792
+ 12 VAL HN 168 0.113111129 -0.057944089 0.317972380
+ 12 VAL CA 169 0.088260850 0.008928412 0.517615172
+ 12 VAL HA 170 0.175262217 0.032086012 0.577686472
+ 12 VAL CB 171 0.033383770 0.139482372 0.460108750
+ 12 VAL HB 172 -0.058418337 0.118386857 0.400697310
+ 12 VAL CG1 173 -0.001701682 0.238833670 0.572879134
+ 12 VAL HG11 174 -0.032174765 0.336386732 0.529552209
+ 12 VAL HG12 175 -0.085404127 0.201255161 0.635335892
+ 12 VAL HG13 176 0.086667740 0.255372949 0.638204439
+ 12 VAL CG2 177 0.139505766 0.202210081 0.367437441
+ 12 VAL HG21 178 0.104108216 0.300267311 0.329356875
+ 12 VAL HG22 179 0.234368438 0.218270733 0.422998225
+ 12 VAL HG23 180 0.161027447 0.137594547 0.279855178
+ 12 VAL C 181 -0.013353270 -0.055173300 0.612547549
+ 12 VAL O 182 -0.010069676 -0.035259606 0.734213698
+ 13 HIS N 183 -0.105698930 -0.138881468 0.560675239
+ 13 HIS HN 184 -0.114853102 -0.146640312 0.461045649
+ 13 HIS CA 185 -0.188887082 -0.225410169 0.643185512
+ 13 HIS HA 186 -0.237942741 -0.163019676 0.716661491
+ 13 HIS CB 187 -0.299213632 -0.297498079 0.562332385
+ 13 HIS HB1 188 -0.254143045 -0.355687533 0.479467737
+ 13 HIS HB2 189 -0.354885997 -0.367618189 0.628026515
+ 13 HIS ND1 190 -0.476972345 -0.126680496 0.591617607
+ 13 HIS CG 191 -0.400577926 -0.203287350 0.505507760
+ 13 HIS CE1 192 -0.554938629 -0.054919315 0.513486598
+ 13 HIS HE1 193 -0.627727115 0.018157402 0.549009064
+ 13 HIS NE2 194 -0.533661006 -0.081611957 0.382385280
+ 13 HIS HE2 195 -0.577146630 -0.037778437 0.303852317
+ 13 HIS CD2 196 -0.434761397 -0.177361434 0.376656269
+ 13 HIS HD2 197 -0.395716929 -0.218881458 0.284949251
+ 13 HIS C 198 -0.109741477 -0.329771329 0.721702470
+ 13 HIS O 199 -0.131478075 -0.344971710 0.841922093
+ 14 HIS N 200 -0.012228577 -0.400276585 0.660435569
+ 14 HIS HN 201 0.002741453 -0.391995377 0.561408671
+ 14 HIS CA 202 0.069978456 -0.498416989 0.731112514
+ 14 HIS HA 203 0.003579518 -0.569913899 0.777840355
+ 14 HIS CB 204 0.164770063 -0.575092686 0.635285704
+ 14 HIS HB1 205 0.237628202 -0.505616390 0.588137587
+ 14 HIS HB2 206 0.221808462 -0.651907043 0.691523749
+ 14 HIS ND1 207 -0.015286004 -0.725593019 0.549415213
+ 14 HIS CG 208 0.096114702 -0.647272757 0.524221071
+ 14 HIS CE1 209 -0.046750690 -0.777466414 0.432500937
+ 14 HIS HE1 210 -0.130935266 -0.844308664 0.414342507
+ 14 HIS NE2 211 0.038029258 -0.737825186 0.334709887
+ 14 HIS HE2 212 0.030954986 -0.758454879 0.237091675
+ 14 HIS CD2 213 0.130575322 -0.654579733 0.393159202
+ 14 HIS HD2 214 0.213545409 -0.608781463 0.341076263
+ 14 HIS C 215 0.158939030 -0.441110533 0.841064028
+ 14 HIS O 216 0.150574961 -0.481103183 0.956918075
+ 15 GLN N 217 0.241869809 -0.339871744 0.810028550
+ 15 GLN HN 218 0.243353251 -0.301762929 0.716528302
+ 15 GLN CA 219 0.344931506 -0.290105926 0.899588239
+ 15 GLN HA 220 0.335027133 -0.337073820 0.996556312
+ 15 GLN CB 221 0.486931130 -0.324269575 0.847548932
+ 15 GLN HB1 222 0.563105779 -0.279091819 0.915029442
+ 15 GLN HB2 223 0.498975050 -0.434908375 0.853401883
+ 15 GLN CG 224 0.515765400 -0.281731490 0.701635549
+ 15 GLN HG1 225 0.443764464 -0.329504903 0.631887704
+ 15 GLN HG2 226 0.507054040 -0.171657819 0.690949866
+ 15 GLN CD 227 0.657908355 -0.321609302 0.661381452
+ 15 GLN OE1 228 0.756161050 -0.275358179 0.719982194
+ 15 GLN NE2 229 0.670624496 -0.409601901 0.559815220
+ 15 GLN HE21 230 0.589972288 -0.440646236 0.506585459
+ 15 GLN HE22 231 0.761080307 -0.431277456 0.525310782
+ 15 GLN C 232 0.327912004 -0.141014876 0.923210680
+ 15 GLN O 233 0.297978600 -0.063922660 0.832459636
+ 16 LYS N 234 0.335351596 -0.098615647 1.050607474
+ 16 LYS HN 235 0.359717859 -0.155695561 1.129646885
+ 16 LYS CA 236 0.328396798 0.038956637 1.094040110
+ 16 LYS HA 237 0.404501253 0.095243193 1.041832138
+ 16 LYS CB 238 0.188602114 0.104657736 1.076463107
+ 16 LYS HB1 239 0.200604378 0.214139949 1.093129026
+ 16 LYS HB2 240 0.156710467 0.091323559 0.971054280
+ 16 LYS CG 241 0.080667092 0.053761842 1.174230296
+ 16 LYS HG1 242 0.112660139 -0.042018897 1.221074405
+ 16 LYS HG2 243 0.075735519 0.127867140 1.257518972
+ 16 LYS CD 244 -0.058230301 0.037399968 1.110567162
+ 16 LYS HD1 245 -0.134947405 0.064968367 1.186524481
+ 16 LYS HD2 246 -0.068604489 0.108454503 1.025573279
+ 16 LYS CE 247 -0.087986108 -0.105872934 1.065107328
+ 16 LYS HE1 248 -0.090864931 -0.174036247 1.153041964
+ 16 LYS HE2 249 -0.185305842 -0.111315867 1.011590386
+ 16 LYS NZ 250 0.017492927 -0.153355934 0.974747531
+ 16 LYS HZ1 251 0.000340658 -0.253023756 0.948018656
+ 16 LYS HZ2 252 0.017164210 -0.096950814 0.885809439
+ 16 LYS HZ3 253 0.111142994 -0.142123190 1.018805179
+ 16 LYS C 254 0.365040544 0.038211234 1.244283965
+ 16 LYS OT1 255 0.381584418 0.148358923 1.302706521
+ 16 LYS OT2 256 0.373620063 -0.074276792 1.301521379
+END
+BOX
+ 12.100000000 12.100000000 12.100000000
+END
--- /dev/null
+[ System ]
+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
+ 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
+ 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
+ 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
+ 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
+ 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
+ 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
+ 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
+ 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
+ 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
+ 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
+ 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
+ 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
+ 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
+ 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
+ 256
--- /dev/null
+;
+; File 'topol.top' was generated
+; By user: spoel (501)
+; On host: bright.lan
+; At date: Wed Dec 30 20:58:54 2015
+
+;
+; This is a standalone topology file
+;
+; Created by:
+; :-) GROMACS - gmx pdb2gmx, 2016-dev-20151226-ae98b19 (double precision) (-:
+;
+; Executable: /Users/spoel/software-master/bin/gmx
+; Data prefix: /Users/spoel/software-master
+; Command line:
+; gmx pdb2gmx -f 2BP4.pdb -ignh
+; Force field was read from the standard GROMACS share directory.
+;
+
+; Include forcefield parameters
+#include "charmm27.ff/forcefield.itp"
+
+[ moleculetype ]
+; Name nrexcl
+Protein_chain_A 3
+
+[ atoms ]
+; nr type resnr residue atom cgnr charge mass typeB chargeB massB
+; residue 1 ASP rtp ASP q 0.0
+ 1 NH3 1 ASP N 1 -0.3 14.007 ; qtot -0.3
+ 2 HC 1 ASP H1 2 0.33 1.008 ; qtot 0.03
+ 3 HC 1 ASP H2 3 0.33 1.008 ; qtot 0.36
+ 4 HC 1 ASP H3 4 0.33 1.008 ; qtot 0.69
+ 5 CT1 1 ASP CA 5 0.21 12.011 ; qtot 0.9
+ 6 HB 1 ASP HA 6 0.1 1.008 ; qtot 1
+ 7 CT2 1 ASP CB 7 -0.28 12.011 ; qtot 0.72
+ 8 HA 1 ASP HB1 8 0.09 1.008 ; qtot 0.81
+ 9 HA 1 ASP HB2 9 0.09 1.008 ; qtot 0.9
+ 10 CC 1 ASP CG 10 0.62 12.011 ; qtot 1.52
+ 11 OC 1 ASP OD1 11 -0.76 15.999 ; qtot 0.76
+ 12 OC 1 ASP OD2 12 -0.76 15.999 ; qtot 0
+ 13 C 1 ASP C 13 0.51 12.011 ; qtot 0.51
+ 14 O 1 ASP O 14 -0.51 15.999 ; qtot 0
+; residue 2 ALA rtp ALA q 0.0
+ 15 NH1 2 ALA N 15 -0.47 14.007 ; qtot -0.47
+ 16 H 2 ALA HN 16 0.31 1.008 ; qtot -0.16
+ 17 CT1 2 ALA CA 17 0.07 12.011 ; qtot -0.09
+ 18 HB 2 ALA HA 18 0.09 1.008 ; qtot 0
+ 19 CT3 2 ALA CB 19 -0.27 12.011 ; qtot -0.27
+ 20 HA 2 ALA HB1 20 0.09 1.008 ; qtot -0.18
+ 21 HA 2 ALA HB2 21 0.09 1.008 ; qtot -0.09
+ 22 HA 2 ALA HB3 22 0.09 1.008 ; qtot 0
+ 23 C 2 ALA C 23 0.51 12.011 ; qtot 0.51
+ 24 O 2 ALA O 24 -0.51 15.999 ; qtot 0
+; residue 3 GLU rtp GLU q -1.0
+ 25 NH1 3 GLU N 25 -0.47 14.007 ; qtot -0.47
+ 26 H 3 GLU HN 26 0.31 1.008 ; qtot -0.16
+ 27 CT1 3 GLU CA 27 0.07 12.011 ; qtot -0.09
+ 28 HB 3 GLU HA 28 0.09 1.008 ; qtot 0
+ 29 CT2 3 GLU CB 29 -0.18 12.011 ; qtot -0.18
+ 30 HA 3 GLU HB1 30 0.09 1.008 ; qtot -0.09
+ 31 HA 3 GLU HB2 31 0.09 1.008 ; qtot 0
+ 32 CT2 3 GLU CG 32 -0.28 12.011 ; qtot -0.28
+ 33 HA 3 GLU HG1 33 0.09 1.008 ; qtot -0.19
+ 34 HA 3 GLU HG2 34 0.09 1.008 ; qtot -0.1
+ 35 CC 3 GLU CD 35 0.62 12.011 ; qtot 0.52
+ 36 OC 3 GLU OE1 36 -0.76 15.999 ; qtot -0.24
+ 37 OC 3 GLU OE2 37 -0.76 15.999 ; qtot -1
+ 38 C 3 GLU C 38 0.51 12.011 ; qtot -0.49
+ 39 O 3 GLU O 39 -0.51 15.999 ; qtot -1
+; residue 4 PHE rtp PHE q 0.0
+ 40 NH1 4 PHE N 40 -0.47 14.007 ; qtot -1.47
+ 41 H 4 PHE HN 41 0.31 1.008 ; qtot -1.16
+ 42 CT1 4 PHE CA 42 0.07 12.011 ; qtot -1.09
+ 43 HB 4 PHE HA 43 0.09 1.008 ; qtot -1
+ 44 CT2 4 PHE CB 44 -0.18 12.011 ; qtot -1.18
+ 45 HA 4 PHE HB1 45 0.09 1.008 ; qtot -1.09
+ 46 HA 4 PHE HB2 46 0.09 1.008 ; qtot -1
+ 47 CA 4 PHE CG 47 0 12.011 ; qtot -1
+ 48 CA 4 PHE CD1 48 -0.115 12.011 ; qtot -1.115
+ 49 HP 4 PHE HD1 49 0.115 1.008 ; qtot -1
+ 50 CA 4 PHE CE1 50 -0.115 12.011 ; qtot -1.115
+ 51 HP 4 PHE HE1 51 0.115 1.008 ; qtot -1
+ 52 CA 4 PHE CZ 52 -0.115 12.011 ; qtot -1.115
+ 53 HP 4 PHE HZ 53 0.115 1.008 ; qtot -1
+ 54 CA 4 PHE CD2 54 -0.115 12.011 ; qtot -1.115
+ 55 HP 4 PHE HD2 55 0.115 1.008 ; qtot -1
+ 56 CA 4 PHE CE2 56 -0.115 12.011 ; qtot -1.115
+ 57 HP 4 PHE HE2 57 0.115 1.008 ; qtot -1
+ 58 C 4 PHE C 58 0.51 12.011 ; qtot -0.49
+ 59 O 4 PHE O 59 -0.51 15.999 ; qtot -1
+; residue 5 ARG rtp ARG q +1.0
+ 60 NH1 5 ARG N 60 -0.47 14.007 ; qtot -1.47
+ 61 H 5 ARG HN 61 0.31 1.008 ; qtot -1.16
+ 62 CT1 5 ARG CA 62 0.07 12.011 ; qtot -1.09
+ 63 HB 5 ARG HA 63 0.09 1.008 ; qtot -1
+ 64 CT2 5 ARG CB 64 -0.18 12.011 ; qtot -1.18
+ 65 HA 5 ARG HB1 65 0.09 1.008 ; qtot -1.09
+ 66 HA 5 ARG HB2 66 0.09 1.008 ; qtot -1
+ 67 CT2 5 ARG CG 67 -0.18 12.011 ; qtot -1.18
+ 68 HA 5 ARG HG1 68 0.09 1.008 ; qtot -1.09
+ 69 HA 5 ARG HG2 69 0.09 1.008 ; qtot -1
+ 70 CT2 5 ARG CD 70 0.2 12.011 ; qtot -0.8
+ 71 HA 5 ARG HD1 71 0.09 1.008 ; qtot -0.71
+ 72 HA 5 ARG HD2 72 0.09 1.008 ; qtot -0.62
+ 73 NC2 5 ARG NE 73 -0.7 14.007 ; qtot -1.32
+ 74 HC 5 ARG HE 74 0.44 1.008 ; qtot -0.88
+ 75 C 5 ARG CZ 75 0.64 12.011 ; qtot -0.24
+ 76 NC2 5 ARG NH1 76 -0.8 14.007 ; qtot -1.04
+ 77 HC 5 ARG HH11 77 0.46 1.008 ; qtot -0.58
+ 78 HC 5 ARG HH12 78 0.46 1.008 ; qtot -0.12
+ 79 NC2 5 ARG NH2 79 -0.8 14.007 ; qtot -0.92
+ 80 HC 5 ARG HH21 80 0.46 1.008 ; qtot -0.46
+ 81 HC 5 ARG HH22 81 0.46 1.008 ; qtot 0
+ 82 C 5 ARG C 82 0.51 12.011 ; qtot 0.51
+ 83 O 5 ARG O 83 -0.51 15.999 ; qtot 0
+; residue 6 HIS rtp HSE q 0.0
+ 84 NH1 6 HIS N 84 -0.47 14.007 ; qtot -0.47
+ 85 H 6 HIS HN 85 0.31 1.008 ; qtot -0.16
+ 86 CT1 6 HIS CA 86 0.07 12.011 ; qtot -0.09
+ 87 HB 6 HIS HA 87 0.09 1.008 ; qtot 0
+ 88 CT2 6 HIS CB 88 -0.08 12.011 ; qtot -0.08
+ 89 HA 6 HIS HB1 89 0.09 1.008 ; qtot 0.01
+ 90 HA 6 HIS HB2 90 0.09 1.008 ; qtot 0.1
+ 91 NR2 6 HIS ND1 91 -0.7 14.007 ; qtot -0.6
+ 92 CPH1 6 HIS CG 92 0.22 12.011 ; qtot -0.38
+ 93 CPH2 6 HIS CE1 93 0.25 12.011 ; qtot -0.13
+ 94 HR1 6 HIS HE1 94 0.13 1.008 ; qtot 0
+ 95 NR1 6 HIS NE2 95 -0.36 14.007 ; qtot -0.36
+ 96 H 6 HIS HE2 96 0.32 1.008 ; qtot -0.04
+ 97 CPH1 6 HIS CD2 97 -0.05 12.011 ; qtot -0.09
+ 98 HR3 6 HIS HD2 98 0.09 1.008 ; qtot 0
+ 99 C 6 HIS C 99 0.51 12.011 ; qtot 0.51
+ 100 O 6 HIS O 100 -0.51 15.999 ; qtot 0
+; residue 7 ASP rtp ASP q -1.0
+ 101 NH1 7 ASP N 101 -0.47 14.007 ; qtot -0.47
+ 102 H 7 ASP HN 102 0.31 1.008 ; qtot -0.16
+ 103 CT1 7 ASP CA 103 0.07 12.011 ; qtot -0.09
+ 104 HB 7 ASP HA 104 0.09 1.008 ; qtot 0
+ 105 CT2 7 ASP CB 105 -0.28 12.011 ; qtot -0.28
+ 106 HA 7 ASP HB1 106 0.09 1.008 ; qtot -0.19
+ 107 HA 7 ASP HB2 107 0.09 1.008 ; qtot -0.1
+ 108 CC 7 ASP CG 108 0.62 12.011 ; qtot 0.52
+ 109 OC 7 ASP OD1 109 -0.76 15.999 ; qtot -0.24
+ 110 OC 7 ASP OD2 110 -0.76 15.999 ; qtot -1
+ 111 C 7 ASP C 111 0.51 12.011 ; qtot -0.49
+ 112 O 7 ASP O 112 -0.51 15.999 ; qtot -1
+; residue 8 SER rtp SER q 0.0
+ 113 NH1 8 SER N 113 -0.47 14.007 ; qtot -1.47
+ 114 H 8 SER HN 114 0.31 1.008 ; qtot -1.16
+ 115 CT1 8 SER CA 115 0.07 12.011 ; qtot -1.09
+ 116 HB 8 SER HA 116 0.09 1.008 ; qtot -1
+ 117 CT2 8 SER CB 117 0.05 12.011 ; qtot -0.95
+ 118 HA 8 SER HB1 118 0.09 1.008 ; qtot -0.86
+ 119 HA 8 SER HB2 119 0.09 1.008 ; qtot -0.77
+ 120 OH1 8 SER OG 120 -0.66 15.999 ; qtot -1.43
+ 121 H 8 SER HG1 121 0.43 1.008 ; qtot -1
+ 122 C 8 SER C 122 0.51 12.011 ; qtot -0.49
+ 123 O 8 SER O 123 -0.51 15.999 ; qtot -1
+; residue 9 GLY rtp GLY q 0.0
+ 124 NH1 9 GLY N 124 -0.47 14.007 ; qtot -1.47
+ 125 H 9 GLY HN 125 0.31 1.008 ; qtot -1.16
+ 126 CT2 9 GLY CA 126 -0.02 12.011 ; qtot -1.18
+ 127 HB 9 GLY HA1 127 0.09 1.008 ; qtot -1.09
+ 128 HB 9 GLY HA2 128 0.09 1.008 ; qtot -1
+ 129 C 9 GLY C 129 0.51 12.011 ; qtot -0.49
+ 130 O 9 GLY O 130 -0.51 15.999 ; qtot -1
+; residue 10 TYR rtp TYR q 0.0
+ 131 NH1 10 TYR N 131 -0.47 14.007 ; qtot -1.47
+ 132 H 10 TYR HN 132 0.31 1.008 ; qtot -1.16
+ 133 CT1 10 TYR CA 133 0.07 12.011 ; qtot -1.09
+ 134 HB 10 TYR HA 134 0.09 1.008 ; qtot -1
+ 135 CT2 10 TYR CB 135 -0.18 12.011 ; qtot -1.18
+ 136 HA 10 TYR HB1 136 0.09 1.008 ; qtot -1.09
+ 137 HA 10 TYR HB2 137 0.09 1.008 ; qtot -1
+ 138 CA 10 TYR CG 138 0 12.011 ; qtot -1
+ 139 CA 10 TYR CD1 139 -0.115 12.011 ; qtot -1.115
+ 140 HP 10 TYR HD1 140 0.115 1.008 ; qtot -1
+ 141 CA 10 TYR CE1 141 -0.115 12.011 ; qtot -1.115
+ 142 HP 10 TYR HE1 142 0.115 1.008 ; qtot -1
+ 143 CA 10 TYR CZ 143 0.11 12.011 ; qtot -0.89
+ 144 OH1 10 TYR OH 144 -0.54 15.999 ; qtot -1.43
+ 145 H 10 TYR HH 145 0.43 1.008 ; qtot -1
+ 146 CA 10 TYR CD2 146 -0.115 12.011 ; qtot -1.115
+ 147 HP 10 TYR HD2 147 0.115 1.008 ; qtot -1
+ 148 CA 10 TYR CE2 148 -0.115 12.011 ; qtot -1.115
+ 149 HP 10 TYR HE2 149 0.115 1.008 ; qtot -1
+ 150 C 10 TYR C 150 0.51 12.011 ; qtot -0.49
+ 151 O 10 TYR O 151 -0.51 15.999 ; qtot -1
+; residue 11 GLU rtp GLU q -1.0
+ 152 NH1 11 GLU N 152 -0.47 14.007 ; qtot -1.47
+ 153 H 11 GLU HN 153 0.31 1.008 ; qtot -1.16
+ 154 CT1 11 GLU CA 154 0.07 12.011 ; qtot -1.09
+ 155 HB 11 GLU HA 155 0.09 1.008 ; qtot -1
+ 156 CT2 11 GLU CB 156 -0.18 12.011 ; qtot -1.18
+ 157 HA 11 GLU HB1 157 0.09 1.008 ; qtot -1.09
+ 158 HA 11 GLU HB2 158 0.09 1.008 ; qtot -1
+ 159 CT2 11 GLU CG 159 -0.28 12.011 ; qtot -1.28
+ 160 HA 11 GLU HG1 160 0.09 1.008 ; qtot -1.19
+ 161 HA 11 GLU HG2 161 0.09 1.008 ; qtot -1.1
+ 162 CC 11 GLU CD 162 0.62 12.011 ; qtot -0.48
+ 163 OC 11 GLU OE1 163 -0.76 15.999 ; qtot -1.24
+ 164 OC 11 GLU OE2 164 -0.76 15.999 ; qtot -2
+ 165 C 11 GLU C 165 0.51 12.011 ; qtot -1.49
+ 166 O 11 GLU O 166 -0.51 15.999 ; qtot -2
+; residue 12 VAL rtp VAL q 0.0
+ 167 NH1 12 VAL N 167 -0.47 14.007 ; qtot -2.47
+ 168 H 12 VAL HN 168 0.31 1.008 ; qtot -2.16
+ 169 CT1 12 VAL CA 169 0.07 12.011 ; qtot -2.09
+ 170 HB 12 VAL HA 170 0.09 1.008 ; qtot -2
+ 171 CT1 12 VAL CB 171 -0.09 12.011 ; qtot -2.09
+ 172 HA 12 VAL HB 172 0.09 1.008 ; qtot -2
+ 173 CT3 12 VAL CG1 173 -0.27 12.011 ; qtot -2.27
+ 174 HA 12 VAL HG11 174 0.09 1.008 ; qtot -2.18
+ 175 HA 12 VAL HG12 175 0.09 1.008 ; qtot -2.09
+ 176 HA 12 VAL HG13 176 0.09 1.008 ; qtot -2
+ 177 CT3 12 VAL CG2 177 -0.27 12.011 ; qtot -2.27
+ 178 HA 12 VAL HG21 178 0.09 1.008 ; qtot -2.18
+ 179 HA 12 VAL HG22 179 0.09 1.008 ; qtot -2.09
+ 180 HA 12 VAL HG23 180 0.09 1.008 ; qtot -2
+ 181 C 12 VAL C 181 0.51 12.011 ; qtot -1.49
+ 182 O 12 VAL O 182 -0.51 15.999 ; qtot -2
+; residue 13 HIS rtp HSE q 0.0
+ 183 NH1 13 HIS N 183 -0.47 14.007 ; qtot -2.47
+ 184 H 13 HIS HN 184 0.31 1.008 ; qtot -2.16
+ 185 CT1 13 HIS CA 185 0.07 12.011 ; qtot -2.09
+ 186 HB 13 HIS HA 186 0.09 1.008 ; qtot -2
+ 187 CT2 13 HIS CB 187 -0.08 12.011 ; qtot -2.08
+ 188 HA 13 HIS HB1 188 0.09 1.008 ; qtot -1.99
+ 189 HA 13 HIS HB2 189 0.09 1.008 ; qtot -1.9
+ 190 NR2 13 HIS ND1 190 -0.7 14.007 ; qtot -2.6
+ 191 CPH1 13 HIS CG 191 0.22 12.011 ; qtot -2.38
+ 192 CPH2 13 HIS CE1 192 0.25 12.011 ; qtot -2.13
+ 193 HR1 13 HIS HE1 193 0.13 1.008 ; qtot -2
+ 194 NR1 13 HIS NE2 194 -0.36 14.007 ; qtot -2.36
+ 195 H 13 HIS HE2 195 0.32 1.008 ; qtot -2.04
+ 196 CPH1 13 HIS CD2 196 -0.05 12.011 ; qtot -2.09
+ 197 HR3 13 HIS HD2 197 0.09 1.008 ; qtot -2
+ 198 C 13 HIS C 198 0.51 12.011 ; qtot -1.49
+ 199 O 13 HIS O 199 -0.51 15.999 ; qtot -2
+; residue 14 HIS rtp HSE q 0.0
+ 200 NH1 14 HIS N 200 -0.47 14.007 ; qtot -2.47
+ 201 H 14 HIS HN 201 0.31 1.008 ; qtot -2.16
+ 202 CT1 14 HIS CA 202 0.07 12.011 ; qtot -2.09
+ 203 HB 14 HIS HA 203 0.09 1.008 ; qtot -2
+ 204 CT2 14 HIS CB 204 -0.08 12.011 ; qtot -2.08
+ 205 HA 14 HIS HB1 205 0.09 1.008 ; qtot -1.99
+ 206 HA 14 HIS HB2 206 0.09 1.008 ; qtot -1.9
+ 207 NR2 14 HIS ND1 207 -0.7 14.007 ; qtot -2.6
+ 208 CPH1 14 HIS CG 208 0.22 12.011 ; qtot -2.38
+ 209 CPH2 14 HIS CE1 209 0.25 12.011 ; qtot -2.13
+ 210 HR1 14 HIS HE1 210 0.13 1.008 ; qtot -2
+ 211 NR1 14 HIS NE2 211 -0.36 14.007 ; qtot -2.36
+ 212 H 14 HIS HE2 212 0.32 1.008 ; qtot -2.04
+ 213 CPH1 14 HIS CD2 213 -0.05 12.011 ; qtot -2.09
+ 214 HR3 14 HIS HD2 214 0.09 1.008 ; qtot -2
+ 215 C 14 HIS C 215 0.51 12.011 ; qtot -1.49
+ 216 O 14 HIS O 216 -0.51 15.999 ; qtot -2
+; residue 15 GLN rtp GLN q 0.0
+ 217 NH1 15 GLN N 217 -0.47 14.007 ; qtot -2.47
+ 218 H 15 GLN HN 218 0.31 1.008 ; qtot -2.16
+ 219 CT1 15 GLN CA 219 0.07 12.011 ; qtot -2.09
+ 220 HB 15 GLN HA 220 0.09 1.008 ; qtot -2
+ 221 CT2 15 GLN CB 221 -0.18 12.011 ; qtot -2.18
+ 222 HA 15 GLN HB1 222 0.09 1.008 ; qtot -2.09
+ 223 HA 15 GLN HB2 223 0.09 1.008 ; qtot -2
+ 224 CT2 15 GLN CG 224 -0.18 12.011 ; qtot -2.18
+ 225 HA 15 GLN HG1 225 0.09 1.008 ; qtot -2.09
+ 226 HA 15 GLN HG2 226 0.09 1.008 ; qtot -2
+ 227 CC 15 GLN CD 227 0.55 12.011 ; qtot -1.45
+ 228 O 15 GLN OE1 228 -0.55 15.999 ; qtot -2
+ 229 NH2 15 GLN NE2 229 -0.62 14.007 ; qtot -2.62
+ 230 H 15 GLN HE21 230 0.32 1.008 ; qtot -2.3
+ 231 H 15 GLN HE22 231 0.3 1.008 ; qtot -2
+ 232 C 15 GLN C 232 0.51 12.011 ; qtot -1.49
+ 233 O 15 GLN O 233 -0.51 15.999 ; qtot -2
+; residue 16 LYS rtp LYS q 0.0
+ 234 NH1 16 LYS N 234 -0.47 14.007 ; qtot -2.47
+ 235 H 16 LYS HN 235 0.31 1.008 ; qtot -2.16
+ 236 CT1 16 LYS CA 236 0.07 12.011 ; qtot -2.09
+ 237 HB 16 LYS HA 237 0.09 1.008 ; qtot -2
+ 238 CT2 16 LYS CB 238 -0.18 12.011 ; qtot -2.18
+ 239 HA 16 LYS HB1 239 0.09 1.008 ; qtot -2.09
+ 240 HA 16 LYS HB2 240 0.09 1.008 ; qtot -2
+ 241 CT2 16 LYS CG 241 -0.18 12.011 ; qtot -2.18
+ 242 HA 16 LYS HG1 242 0.09 1.008 ; qtot -2.09
+ 243 HA 16 LYS HG2 243 0.09 1.008 ; qtot -2
+ 244 CT2 16 LYS CD 244 -0.18 12.011 ; qtot -2.18
+ 245 HA 16 LYS HD1 245 0.09 1.008 ; qtot -2.09
+ 246 HA 16 LYS HD2 246 0.09 1.008 ; qtot -2
+ 247 CT2 16 LYS CE 247 0.21 12.011 ; qtot -1.79
+ 248 HA 16 LYS HE1 248 0.05 1.008 ; qtot -1.74
+ 249 HA 16 LYS HE2 249 0.05 1.008 ; qtot -1.69
+ 250 NH3 16 LYS NZ 250 -0.3 14.007 ; qtot -1.99
+ 251 HC 16 LYS HZ1 251 0.33 1.008 ; qtot -1.66
+ 252 HC 16 LYS HZ2 252 0.33 1.008 ; qtot -1.33
+ 253 HC 16 LYS HZ3 253 0.33 1.008 ; qtot -1
+ 254 CC 16 LYS C 254 0.34 12.011 ; qtot -0.66
+ 255 OC 16 LYS OT1 255 -0.67 15.9994 ; qtot -1.33
+ 256 OC 16 LYS OT2 256 -0.67 15.9994 ; qtot -2
+
+[ bonds ]
+; ai aj funct c0 c1 c2 c3
+ 1 2 1
+ 1 3 1
+ 1 4 1
+ 1 5 1
+ 5 6 1
+ 5 7 1
+ 5 13 1
+ 7 8 1
+ 7 9 1
+ 7 10 1
+ 10 11 1
+ 10 12 1
+ 13 14 1
+ 13 15 1
+ 15 16 1
+ 15 17 1
+ 17 18 1
+ 17 19 1
+ 17 23 1
+ 19 20 1
+ 19 21 1
+ 19 22 1
+ 23 24 1
+ 23 25 1
+ 25 26 1
+ 25 27 1
+ 27 28 1
+ 27 29 1
+ 27 38 1
+ 29 30 1
+ 29 31 1
+ 29 32 1
+ 32 33 1
+ 32 34 1
+ 32 35 1
+ 35 36 1
+ 35 37 1
+ 38 39 1
+ 38 40 1
+ 40 41 1
+ 40 42 1
+ 42 43 1
+ 42 44 1
+ 42 58 1
+ 44 45 1
+ 44 46 1
+ 44 47 1
+ 47 48 1
+ 47 54 1
+ 48 49 1
+ 48 50 1
+ 50 51 1
+ 50 52 1
+ 52 53 1
+ 52 56 1
+ 54 55 1
+ 54 56 1
+ 56 57 1
+ 58 59 1
+ 58 60 1
+ 60 61 1
+ 60 62 1
+ 62 63 1
+ 62 64 1
+ 62 82 1
+ 64 65 1
+ 64 66 1
+ 64 67 1
+ 67 68 1
+ 67 69 1
+ 67 70 1
+ 70 71 1
+ 70 72 1
+ 70 73 1
+ 73 74 1
+ 73 75 1
+ 75 76 1
+ 75 79 1
+ 76 77 1
+ 76 78 1
+ 79 80 1
+ 79 81 1
+ 82 83 1
+ 82 84 1
+ 84 85 1
+ 84 86 1
+ 86 87 1
+ 86 88 1
+ 86 99 1
+ 88 89 1
+ 88 90 1
+ 88 92 1
+ 91 92 1
+ 91 93 1
+ 92 97 1
+ 93 94 1
+ 93 95 1
+ 95 96 1
+ 95 97 1
+ 97 98 1
+ 99 100 1
+ 99 101 1
+ 101 102 1
+ 101 103 1
+ 103 104 1
+ 103 105 1
+ 103 111 1
+ 105 106 1
+ 105 107 1
+ 105 108 1
+ 108 109 1
+ 108 110 1
+ 111 112 1
+ 111 113 1
+ 113 114 1
+ 113 115 1
+ 115 116 1
+ 115 117 1
+ 115 122 1
+ 117 118 1
+ 117 119 1
+ 117 120 1
+ 120 121 1
+ 122 123 1
+ 122 124 1
+ 124 125 1
+ 124 126 1
+ 126 127 1
+ 126 128 1
+ 126 129 1
+ 129 130 1
+ 129 131 1
+ 131 132 1
+ 131 133 1
+ 133 134 1
+ 133 135 1
+ 133 150 1
+ 135 136 1
+ 135 137 1
+ 135 138 1
+ 138 139 1
+ 138 146 1
+ 139 140 1
+ 139 141 1
+ 141 142 1
+ 141 143 1
+ 143 144 1
+ 143 148 1
+ 144 145 1
+ 146 147 1
+ 146 148 1
+ 148 149 1
+ 150 151 1
+ 150 152 1
+ 152 153 1
+ 152 154 1
+ 154 155 1
+ 154 156 1
+ 154 165 1
+ 156 157 1
+ 156 158 1
+ 156 159 1
+ 159 160 1
+ 159 161 1
+ 159 162 1
+ 162 163 1
+ 162 164 1
+ 165 166 1
+ 165 167 1
+ 167 168 1
+ 167 169 1
+ 169 170 1
+ 169 171 1
+ 169 181 1
+ 171 172 1
+ 171 173 1
+ 171 177 1
+ 173 174 1
+ 173 175 1
+ 173 176 1
+ 177 178 1
+ 177 179 1
+ 177 180 1
+ 181 182 1
+ 181 183 1
+ 183 184 1
+ 183 185 1
+ 185 186 1
+ 185 187 1
+ 185 198 1
+ 187 188 1
+ 187 189 1
+ 187 191 1
+ 190 191 1
+ 190 192 1
+ 191 196 1
+ 192 193 1
+ 192 194 1
+ 194 195 1
+ 194 196 1
+ 196 197 1
+ 198 199 1
+ 198 200 1
+ 200 201 1
+ 200 202 1
+ 202 203 1
+ 202 204 1
+ 202 215 1
+ 204 205 1
+ 204 206 1
+ 204 208 1
+ 207 208 1
+ 207 209 1
+ 208 213 1
+ 209 210 1
+ 209 211 1
+ 211 212 1
+ 211 213 1
+ 213 214 1
+ 215 216 1
+ 215 217 1
+ 217 218 1
+ 217 219 1
+ 219 220 1
+ 219 221 1
+ 219 232 1
+ 221 222 1
+ 221 223 1
+ 221 224 1
+ 224 225 1
+ 224 226 1
+ 224 227 1
+ 227 228 1
+ 227 229 1
+ 229 230 1
+ 229 231 1
+ 232 233 1
+ 232 234 1
+ 234 235 1
+ 234 236 1
+ 236 237 1
+ 236 238 1
+ 236 254 1
+ 238 239 1
+ 238 240 1
+ 238 241 1
+ 241 242 1
+ 241 243 1
+ 241 244 1
+ 244 245 1
+ 244 246 1
+ 244 247 1
+ 247 248 1
+ 247 249 1
+ 247 250 1
+ 250 251 1
+ 250 252 1
+ 250 253 1
+ 254 255 1
+ 254 256 1
+
+[ pairs ]
+; ai aj funct c0 c1 c2 c3
+ 1 8 1
+ 1 9 1
+ 1 10 1
+ 1 14 1
+ 1 15 1
+ 2 6 1
+ 2 7 1
+ 2 13 1
+ 3 6 1
+ 3 7 1
+ 3 13 1
+ 4 6 1
+ 4 7 1
+ 4 13 1
+ 5 11 1
+ 5 12 1
+ 5 16 1
+ 5 17 1
+ 6 8 1
+ 6 9 1
+ 6 10 1
+ 6 14 1
+ 6 15 1
+ 7 14 1
+ 7 15 1
+ 8 11 1
+ 8 12 1
+ 8 13 1
+ 9 11 1
+ 9 12 1
+ 9 13 1
+ 10 13 1
+ 13 18 1
+ 13 19 1
+ 13 23 1
+ 14 16 1
+ 14 17 1
+ 15 20 1
+ 15 21 1
+ 15 22 1
+ 15 24 1
+ 15 25 1
+ 16 18 1
+ 16 19 1
+ 16 23 1
+ 17 26 1
+ 17 27 1
+ 18 20 1
+ 18 21 1
+ 18 22 1
+ 18 24 1
+ 18 25 1
+ 19 24 1
+ 19 25 1
+ 20 23 1
+ 21 23 1
+ 22 23 1
+ 23 28 1
+ 23 29 1
+ 23 38 1
+ 24 26 1
+ 24 27 1
+ 25 30 1
+ 25 31 1
+ 25 32 1
+ 25 39 1
+ 25 40 1
+ 26 28 1
+ 26 29 1
+ 26 38 1
+ 27 33 1
+ 27 34 1
+ 27 35 1
+ 27 41 1
+ 27 42 1
+ 28 30 1
+ 28 31 1
+ 28 32 1
+ 28 39 1
+ 28 40 1
+ 29 36 1
+ 29 37 1
+ 29 39 1
+ 29 40 1
+ 30 33 1
+ 30 34 1
+ 30 35 1
+ 30 38 1
+ 31 33 1
+ 31 34 1
+ 31 35 1
+ 31 38 1
+ 32 38 1
+ 33 36 1
+ 33 37 1
+ 34 36 1
+ 34 37 1
+ 38 43 1
+ 38 44 1
+ 38 58 1
+ 39 41 1
+ 39 42 1
+ 40 45 1
+ 40 46 1
+ 40 47 1
+ 40 59 1
+ 40 60 1
+ 41 43 1
+ 41 44 1
+ 41 58 1
+ 42 48 1
+ 42 54 1
+ 42 61 1
+ 42 62 1
+ 43 45 1
+ 43 46 1
+ 43 47 1
+ 43 59 1
+ 43 60 1
+ 44 49 1
+ 44 50 1
+ 44 55 1
+ 44 56 1
+ 44 59 1
+ 44 60 1
+ 45 48 1
+ 45 54 1
+ 45 58 1
+ 46 48 1
+ 46 54 1
+ 46 58 1
+ 47 51 1
+ 47 52 1
+ 47 57 1
+ 47 58 1
+ 48 53 1
+ 48 55 1
+ 48 56 1
+ 49 51 1
+ 49 52 1
+ 49 54 1
+ 50 54 1
+ 50 57 1
+ 51 53 1
+ 51 56 1
+ 52 55 1
+ 53 54 1
+ 53 57 1
+ 55 57 1
+ 58 63 1
+ 58 64 1
+ 58 82 1
+ 59 61 1
+ 59 62 1
+ 60 65 1
+ 60 66 1
+ 60 67 1
+ 60 83 1
+ 60 84 1
+ 61 63 1
+ 61 64 1
+ 61 82 1
+ 62 68 1
+ 62 69 1
+ 62 70 1
+ 62 85 1
+ 62 86 1
+ 63 65 1
+ 63 66 1
+ 63 67 1
+ 63 83 1
+ 63 84 1
+ 64 71 1
+ 64 72 1
+ 64 73 1
+ 64 83 1
+ 64 84 1
+ 65 68 1
+ 65 69 1
+ 65 70 1
+ 65 82 1
+ 66 68 1
+ 66 69 1
+ 66 70 1
+ 66 82 1
+ 67 74 1
+ 67 75 1
+ 67 82 1
+ 68 71 1
+ 68 72 1
+ 68 73 1
+ 69 71 1
+ 69 72 1
+ 69 73 1
+ 70 76 1
+ 70 79 1
+ 71 74 1
+ 71 75 1
+ 72 74 1
+ 72 75 1
+ 73 77 1
+ 73 78 1
+ 73 80 1
+ 73 81 1
+ 74 76 1
+ 74 79 1
+ 76 80 1
+ 76 81 1
+ 77 79 1
+ 78 79 1
+ 82 87 1
+ 82 88 1
+ 82 99 1
+ 83 85 1
+ 83 86 1
+ 84 89 1
+ 84 90 1
+ 84 92 1
+ 84 100 1
+ 84 101 1
+ 85 87 1
+ 85 88 1
+ 85 99 1
+ 86 91 1
+ 86 97 1
+ 86 102 1
+ 86 103 1
+ 87 89 1
+ 87 90 1
+ 87 92 1
+ 87 100 1
+ 87 101 1
+ 88 93 1
+ 88 95 1
+ 88 98 1
+ 88 100 1
+ 88 101 1
+ 89 91 1
+ 89 97 1
+ 89 99 1
+ 90 91 1
+ 90 97 1
+ 90 99 1
+ 91 96 1
+ 91 98 1
+ 92 94 1
+ 92 96 1
+ 92 99 1
+ 93 98 1
+ 94 96 1
+ 94 97 1
+ 96 98 1
+ 99 104 1
+ 99 105 1
+ 99 111 1
+ 100 102 1
+ 100 103 1
+ 101 106 1
+ 101 107 1
+ 101 108 1
+ 101 112 1
+ 101 113 1
+ 102 104 1
+ 102 105 1
+ 102 111 1
+ 103 109 1
+ 103 110 1
+ 103 114 1
+ 103 115 1
+ 104 106 1
+ 104 107 1
+ 104 108 1
+ 104 112 1
+ 104 113 1
+ 105 112 1
+ 105 113 1
+ 106 109 1
+ 106 110 1
+ 106 111 1
+ 107 109 1
+ 107 110 1
+ 107 111 1
+ 108 111 1
+ 111 116 1
+ 111 117 1
+ 111 122 1
+ 112 114 1
+ 112 115 1
+ 113 118 1
+ 113 119 1
+ 113 120 1
+ 113 123 1
+ 113 124 1
+ 114 116 1
+ 114 117 1
+ 114 122 1
+ 115 121 1
+ 115 125 1
+ 115 126 1
+ 116 118 1
+ 116 119 1
+ 116 120 1
+ 116 123 1
+ 116 124 1
+ 117 123 1
+ 117 124 1
+ 118 121 1
+ 118 122 1
+ 119 121 1
+ 119 122 1
+ 120 122 1
+ 122 127 1
+ 122 128 1
+ 122 129 1
+ 123 125 1
+ 123 126 1
+ 124 130 1
+ 124 131 1
+ 125 127 1
+ 125 128 1
+ 125 129 1
+ 126 132 1
+ 126 133 1
+ 127 130 1
+ 127 131 1
+ 128 130 1
+ 128 131 1
+ 129 134 1
+ 129 135 1
+ 129 150 1
+ 130 132 1
+ 130 133 1
+ 131 136 1
+ 131 137 1
+ 131 138 1
+ 131 151 1
+ 131 152 1
+ 132 134 1
+ 132 135 1
+ 132 150 1
+ 133 139 1
+ 133 146 1
+ 133 153 1
+ 133 154 1
+ 134 136 1
+ 134 137 1
+ 134 138 1
+ 134 151 1
+ 134 152 1
+ 135 140 1
+ 135 141 1
+ 135 147 1
+ 135 148 1
+ 135 151 1
+ 135 152 1
+ 136 139 1
+ 136 146 1
+ 136 150 1
+ 137 139 1
+ 137 146 1
+ 137 150 1
+ 138 142 1
+ 138 143 1
+ 138 149 1
+ 138 150 1
+ 139 144 1
+ 139 147 1
+ 139 148 1
+ 140 142 1
+ 140 143 1
+ 140 146 1
+ 141 145 1
+ 141 146 1
+ 141 149 1
+ 142 144 1
+ 142 148 1
+ 143 147 1
+ 144 146 1
+ 144 149 1
+ 145 148 1
+ 147 149 1
+ 150 155 1
+ 150 156 1
+ 150 165 1
+ 151 153 1
+ 151 154 1
+ 152 157 1
+ 152 158 1
+ 152 159 1
+ 152 166 1
+ 152 167 1
+ 153 155 1
+ 153 156 1
+ 153 165 1
+ 154 160 1
+ 154 161 1
+ 154 162 1
+ 154 168 1
+ 154 169 1
+ 155 157 1
+ 155 158 1
+ 155 159 1
+ 155 166 1
+ 155 167 1
+ 156 163 1
+ 156 164 1
+ 156 166 1
+ 156 167 1
+ 157 160 1
+ 157 161 1
+ 157 162 1
+ 157 165 1
+ 158 160 1
+ 158 161 1
+ 158 162 1
+ 158 165 1
+ 159 165 1
+ 160 163 1
+ 160 164 1
+ 161 163 1
+ 161 164 1
+ 165 170 1
+ 165 171 1
+ 165 181 1
+ 166 168 1
+ 166 169 1
+ 167 172 1
+ 167 173 1
+ 167 177 1
+ 167 182 1
+ 167 183 1
+ 168 170 1
+ 168 171 1
+ 168 181 1
+ 169 174 1
+ 169 175 1
+ 169 176 1
+ 169 178 1
+ 169 179 1
+ 169 180 1
+ 169 184 1
+ 169 185 1
+ 170 172 1
+ 170 173 1
+ 170 177 1
+ 170 182 1
+ 170 183 1
+ 171 182 1
+ 171 183 1
+ 172 174 1
+ 172 175 1
+ 172 176 1
+ 172 178 1
+ 172 179 1
+ 172 180 1
+ 172 181 1
+ 173 178 1
+ 173 179 1
+ 173 180 1
+ 173 181 1
+ 174 177 1
+ 175 177 1
+ 176 177 1
+ 177 181 1
+ 181 186 1
+ 181 187 1
+ 181 198 1
+ 182 184 1
+ 182 185 1
+ 183 188 1
+ 183 189 1
+ 183 191 1
+ 183 199 1
+ 183 200 1
+ 184 186 1
+ 184 187 1
+ 184 198 1
+ 185 190 1
+ 185 196 1
+ 185 201 1
+ 185 202 1
+ 186 188 1
+ 186 189 1
+ 186 191 1
+ 186 199 1
+ 186 200 1
+ 187 192 1
+ 187 194 1
+ 187 197 1
+ 187 199 1
+ 187 200 1
+ 188 190 1
+ 188 196 1
+ 188 198 1
+ 189 190 1
+ 189 196 1
+ 189 198 1
+ 190 195 1
+ 190 197 1
+ 191 193 1
+ 191 195 1
+ 191 198 1
+ 192 197 1
+ 193 195 1
+ 193 196 1
+ 195 197 1
+ 198 203 1
+ 198 204 1
+ 198 215 1
+ 199 201 1
+ 199 202 1
+ 200 205 1
+ 200 206 1
+ 200 208 1
+ 200 216 1
+ 200 217 1
+ 201 203 1
+ 201 204 1
+ 201 215 1
+ 202 207 1
+ 202 213 1
+ 202 218 1
+ 202 219 1
+ 203 205 1
+ 203 206 1
+ 203 208 1
+ 203 216 1
+ 203 217 1
+ 204 209 1
+ 204 211 1
+ 204 214 1
+ 204 216 1
+ 204 217 1
+ 205 207 1
+ 205 213 1
+ 205 215 1
+ 206 207 1
+ 206 213 1
+ 206 215 1
+ 207 212 1
+ 207 214 1
+ 208 210 1
+ 208 212 1
+ 208 215 1
+ 209 214 1
+ 210 212 1
+ 210 213 1
+ 212 214 1
+ 215 220 1
+ 215 221 1
+ 215 232 1
+ 216 218 1
+ 216 219 1
+ 217 222 1
+ 217 223 1
+ 217 224 1
+ 217 233 1
+ 217 234 1
+ 218 220 1
+ 218 221 1
+ 218 232 1
+ 219 225 1
+ 219 226 1
+ 219 227 1
+ 219 235 1
+ 219 236 1
+ 220 222 1
+ 220 223 1
+ 220 224 1
+ 220 233 1
+ 220 234 1
+ 221 228 1
+ 221 229 1
+ 221 233 1
+ 221 234 1
+ 222 225 1
+ 222 226 1
+ 222 227 1
+ 222 232 1
+ 223 225 1
+ 223 226 1
+ 223 227 1
+ 223 232 1
+ 224 230 1
+ 224 231 1
+ 224 232 1
+ 225 228 1
+ 225 229 1
+ 226 228 1
+ 226 229 1
+ 228 230 1
+ 228 231 1
+ 232 237 1
+ 232 238 1
+ 232 254 1
+ 233 235 1
+ 233 236 1
+ 234 239 1
+ 234 240 1
+ 234 241 1
+ 234 255 1
+ 234 256 1
+ 235 237 1
+ 235 238 1
+ 235 254 1
+ 236 242 1
+ 236 243 1
+ 236 244 1
+ 237 239 1
+ 237 240 1
+ 237 241 1
+ 237 255 1
+ 237 256 1
+ 238 245 1
+ 238 246 1
+ 238 247 1
+ 238 255 1
+ 238 256 1
+ 239 242 1
+ 239 243 1
+ 239 244 1
+ 239 254 1
+ 240 242 1
+ 240 243 1
+ 240 244 1
+ 240 254 1
+ 241 248 1
+ 241 249 1
+ 241 250 1
+ 241 254 1
+ 242 245 1
+ 242 246 1
+ 242 247 1
+ 243 245 1
+ 243 246 1
+ 243 247 1
+ 244 251 1
+ 244 252 1
+ 244 253 1
+ 245 248 1
+ 245 249 1
+ 245 250 1
+ 246 248 1
+ 246 249 1
+ 246 250 1
+ 248 251 1
+ 248 252 1
+ 248 253 1
+ 249 251 1
+ 249 252 1
+ 249 253 1
+
+[ angles ]
+; ai aj ak funct c0 c1 c2 c3
+ 2 1 3 5
+ 2 1 4 5
+ 2 1 5 5
+ 3 1 4 5
+ 3 1 5 5
+ 4 1 5 5
+ 1 5 6 5
+ 1 5 7 5
+ 1 5 13 5
+ 6 5 7 5
+ 6 5 13 5
+ 7 5 13 5
+ 5 7 8 5
+ 5 7 9 5
+ 5 7 10 5
+ 8 7 9 5
+ 8 7 10 5
+ 9 7 10 5
+ 7 10 11 5
+ 7 10 12 5
+ 11 10 12 5
+ 5 13 14 5
+ 5 13 15 5
+ 14 13 15 5
+ 13 15 16 5
+ 13 15 17 5
+ 16 15 17 5
+ 15 17 18 5
+ 15 17 19 5
+ 15 17 23 5
+ 18 17 19 5
+ 18 17 23 5
+ 19 17 23 5
+ 17 19 20 5
+ 17 19 21 5
+ 17 19 22 5
+ 20 19 21 5
+ 20 19 22 5
+ 21 19 22 5
+ 17 23 24 5
+ 17 23 25 5
+ 24 23 25 5
+ 23 25 26 5
+ 23 25 27 5
+ 26 25 27 5
+ 25 27 28 5
+ 25 27 29 5
+ 25 27 38 5
+ 28 27 29 5
+ 28 27 38 5
+ 29 27 38 5
+ 27 29 30 5
+ 27 29 31 5
+ 27 29 32 5
+ 30 29 31 5
+ 30 29 32 5
+ 31 29 32 5
+ 29 32 33 5
+ 29 32 34 5
+ 29 32 35 5
+ 33 32 34 5
+ 33 32 35 5
+ 34 32 35 5
+ 32 35 36 5
+ 32 35 37 5
+ 36 35 37 5
+ 27 38 39 5
+ 27 38 40 5
+ 39 38 40 5
+ 38 40 41 5
+ 38 40 42 5
+ 41 40 42 5
+ 40 42 43 5
+ 40 42 44 5
+ 40 42 58 5
+ 43 42 44 5
+ 43 42 58 5
+ 44 42 58 5
+ 42 44 45 5
+ 42 44 46 5
+ 42 44 47 5
+ 45 44 46 5
+ 45 44 47 5
+ 46 44 47 5
+ 44 47 48 5
+ 44 47 54 5
+ 48 47 54 5
+ 47 48 49 5
+ 47 48 50 5
+ 49 48 50 5
+ 48 50 51 5
+ 48 50 52 5
+ 51 50 52 5
+ 50 52 53 5
+ 50 52 56 5
+ 53 52 56 5
+ 47 54 55 5
+ 47 54 56 5
+ 55 54 56 5
+ 52 56 54 5
+ 52 56 57 5
+ 54 56 57 5
+ 42 58 59 5
+ 42 58 60 5
+ 59 58 60 5
+ 58 60 61 5
+ 58 60 62 5
+ 61 60 62 5
+ 60 62 63 5
+ 60 62 64 5
+ 60 62 82 5
+ 63 62 64 5
+ 63 62 82 5
+ 64 62 82 5
+ 62 64 65 5
+ 62 64 66 5
+ 62 64 67 5
+ 65 64 66 5
+ 65 64 67 5
+ 66 64 67 5
+ 64 67 68 5
+ 64 67 69 5
+ 64 67 70 5
+ 68 67 69 5
+ 68 67 70 5
+ 69 67 70 5
+ 67 70 71 5
+ 67 70 72 5
+ 67 70 73 5
+ 71 70 72 5
+ 71 70 73 5
+ 72 70 73 5
+ 70 73 74 5
+ 70 73 75 5
+ 74 73 75 5
+ 73 75 76 5
+ 73 75 79 5
+ 76 75 79 5
+ 75 76 77 5
+ 75 76 78 5
+ 77 76 78 5
+ 75 79 80 5
+ 75 79 81 5
+ 80 79 81 5
+ 62 82 83 5
+ 62 82 84 5
+ 83 82 84 5
+ 82 84 85 5
+ 82 84 86 5
+ 85 84 86 5
+ 84 86 87 5
+ 84 86 88 5
+ 84 86 99 5
+ 87 86 88 5
+ 87 86 99 5
+ 88 86 99 5
+ 86 88 89 5
+ 86 88 90 5
+ 86 88 92 5
+ 89 88 90 5
+ 89 88 92 5
+ 90 88 92 5
+ 92 91 93 5
+ 88 92 91 5
+ 88 92 97 5
+ 91 92 97 5
+ 91 93 94 5
+ 91 93 95 5
+ 94 93 95 5
+ 93 95 96 5
+ 93 95 97 5
+ 96 95 97 5
+ 92 97 95 5
+ 92 97 98 5
+ 95 97 98 5
+ 86 99 100 5
+ 86 99 101 5
+ 100 99 101 5
+ 99 101 102 5
+ 99 101 103 5
+ 102 101 103 5
+ 101 103 104 5
+ 101 103 105 5
+ 101 103 111 5
+ 104 103 105 5
+ 104 103 111 5
+ 105 103 111 5
+ 103 105 106 5
+ 103 105 107 5
+ 103 105 108 5
+ 106 105 107 5
+ 106 105 108 5
+ 107 105 108 5
+ 105 108 109 5
+ 105 108 110 5
+ 109 108 110 5
+ 103 111 112 5
+ 103 111 113 5
+ 112 111 113 5
+ 111 113 114 5
+ 111 113 115 5
+ 114 113 115 5
+ 113 115 116 5
+ 113 115 117 5
+ 113 115 122 5
+ 116 115 117 5
+ 116 115 122 5
+ 117 115 122 5
+ 115 117 118 5
+ 115 117 119 5
+ 115 117 120 5
+ 118 117 119 5
+ 118 117 120 5
+ 119 117 120 5
+ 117 120 121 5
+ 115 122 123 5
+ 115 122 124 5
+ 123 122 124 5
+ 122 124 125 5
+ 122 124 126 5
+ 125 124 126 5
+ 124 126 127 5
+ 124 126 128 5
+ 124 126 129 5
+ 127 126 128 5
+ 127 126 129 5
+ 128 126 129 5
+ 126 129 130 5
+ 126 129 131 5
+ 130 129 131 5
+ 129 131 132 5
+ 129 131 133 5
+ 132 131 133 5
+ 131 133 134 5
+ 131 133 135 5
+ 131 133 150 5
+ 134 133 135 5
+ 134 133 150 5
+ 135 133 150 5
+ 133 135 136 5
+ 133 135 137 5
+ 133 135 138 5
+ 136 135 137 5
+ 136 135 138 5
+ 137 135 138 5
+ 135 138 139 5
+ 135 138 146 5
+ 139 138 146 5
+ 138 139 140 5
+ 138 139 141 5
+ 140 139 141 5
+ 139 141 142 5
+ 139 141 143 5
+ 142 141 143 5
+ 141 143 144 5
+ 141 143 148 5
+ 144 143 148 5
+ 143 144 145 5
+ 138 146 147 5
+ 138 146 148 5
+ 147 146 148 5
+ 143 148 146 5
+ 143 148 149 5
+ 146 148 149 5
+ 133 150 151 5
+ 133 150 152 5
+ 151 150 152 5
+ 150 152 153 5
+ 150 152 154 5
+ 153 152 154 5
+ 152 154 155 5
+ 152 154 156 5
+ 152 154 165 5
+ 155 154 156 5
+ 155 154 165 5
+ 156 154 165 5
+ 154 156 157 5
+ 154 156 158 5
+ 154 156 159 5
+ 157 156 158 5
+ 157 156 159 5
+ 158 156 159 5
+ 156 159 160 5
+ 156 159 161 5
+ 156 159 162 5
+ 160 159 161 5
+ 160 159 162 5
+ 161 159 162 5
+ 159 162 163 5
+ 159 162 164 5
+ 163 162 164 5
+ 154 165 166 5
+ 154 165 167 5
+ 166 165 167 5
+ 165 167 168 5
+ 165 167 169 5
+ 168 167 169 5
+ 167 169 170 5
+ 167 169 171 5
+ 167 169 181 5
+ 170 169 171 5
+ 170 169 181 5
+ 171 169 181 5
+ 169 171 172 5
+ 169 171 173 5
+ 169 171 177 5
+ 172 171 173 5
+ 172 171 177 5
+ 173 171 177 5
+ 171 173 174 5
+ 171 173 175 5
+ 171 173 176 5
+ 174 173 175 5
+ 174 173 176 5
+ 175 173 176 5
+ 171 177 178 5
+ 171 177 179 5
+ 171 177 180 5
+ 178 177 179 5
+ 178 177 180 5
+ 179 177 180 5
+ 169 181 182 5
+ 169 181 183 5
+ 182 181 183 5
+ 181 183 184 5
+ 181 183 185 5
+ 184 183 185 5
+ 183 185 186 5
+ 183 185 187 5
+ 183 185 198 5
+ 186 185 187 5
+ 186 185 198 5
+ 187 185 198 5
+ 185 187 188 5
+ 185 187 189 5
+ 185 187 191 5
+ 188 187 189 5
+ 188 187 191 5
+ 189 187 191 5
+ 191 190 192 5
+ 187 191 190 5
+ 187 191 196 5
+ 190 191 196 5
+ 190 192 193 5
+ 190 192 194 5
+ 193 192 194 5
+ 192 194 195 5
+ 192 194 196 5
+ 195 194 196 5
+ 191 196 194 5
+ 191 196 197 5
+ 194 196 197 5
+ 185 198 199 5
+ 185 198 200 5
+ 199 198 200 5
+ 198 200 201 5
+ 198 200 202 5
+ 201 200 202 5
+ 200 202 203 5
+ 200 202 204 5
+ 200 202 215 5
+ 203 202 204 5
+ 203 202 215 5
+ 204 202 215 5
+ 202 204 205 5
+ 202 204 206 5
+ 202 204 208 5
+ 205 204 206 5
+ 205 204 208 5
+ 206 204 208 5
+ 208 207 209 5
+ 204 208 207 5
+ 204 208 213 5
+ 207 208 213 5
+ 207 209 210 5
+ 207 209 211 5
+ 210 209 211 5
+ 209 211 212 5
+ 209 211 213 5
+ 212 211 213 5
+ 208 213 211 5
+ 208 213 214 5
+ 211 213 214 5
+ 202 215 216 5
+ 202 215 217 5
+ 216 215 217 5
+ 215 217 218 5
+ 215 217 219 5
+ 218 217 219 5
+ 217 219 220 5
+ 217 219 221 5
+ 217 219 232 5
+ 220 219 221 5
+ 220 219 232 5
+ 221 219 232 5
+ 219 221 222 5
+ 219 221 223 5
+ 219 221 224 5
+ 222 221 223 5
+ 222 221 224 5
+ 223 221 224 5
+ 221 224 225 5
+ 221 224 226 5
+ 221 224 227 5
+ 225 224 226 5
+ 225 224 227 5
+ 226 224 227 5
+ 224 227 228 5
+ 224 227 229 5
+ 228 227 229 5
+ 227 229 230 5
+ 227 229 231 5
+ 230 229 231 5
+ 219 232 233 5
+ 219 232 234 5
+ 233 232 234 5
+ 232 234 235 5
+ 232 234 236 5
+ 235 234 236 5
+ 234 236 237 5
+ 234 236 238 5
+ 234 236 254 5
+ 237 236 238 5
+ 237 236 254 5
+ 238 236 254 5
+ 236 238 239 5
+ 236 238 240 5
+ 236 238 241 5
+ 239 238 240 5
+ 239 238 241 5
+ 240 238 241 5
+ 238 241 242 5
+ 238 241 243 5
+ 238 241 244 5
+ 242 241 243 5
+ 242 241 244 5
+ 243 241 244 5
+ 241 244 245 5
+ 241 244 246 5
+ 241 244 247 5
+ 245 244 246 5
+ 245 244 247 5
+ 246 244 247 5
+ 244 247 248 5
+ 244 247 249 5
+ 244 247 250 5
+ 248 247 249 5
+ 248 247 250 5
+ 249 247 250 5
+ 247 250 251 5
+ 247 250 252 5
+ 247 250 253 5
+ 251 250 252 5
+ 251 250 253 5
+ 252 250 253 5
+ 236 254 255 5
+ 236 254 256 5
+ 255 254 256 5
+
+[ dihedrals ]
+; ai aj ak al funct c0 c1 c2 c3 c4 c5
+ 2 1 5 6 9
+ 2 1 5 7 9
+ 2 1 5 13 9
+ 3 1 5 6 9
+ 3 1 5 7 9
+ 3 1 5 13 9
+ 4 1 5 6 9
+ 4 1 5 7 9
+ 4 1 5 13 9
+ 1 5 7 8 9
+ 1 5 7 9 9
+ 1 5 7 10 9
+ 6 5 7 8 9
+ 6 5 7 9 9
+ 6 5 7 10 9
+ 13 5 7 8 9
+ 13 5 7 9 9
+ 13 5 7 10 9
+ 1 5 13 14 9
+ 1 5 13 15 9
+ 6 5 13 14 9
+ 6 5 13 15 9
+ 7 5 13 14 9
+ 7 5 13 15 9
+ 5 7 10 11 9
+ 5 7 10 12 9
+ 8 7 10 11 9
+ 8 7 10 12 9
+ 9 7 10 11 9
+ 9 7 10 12 9
+ 5 13 15 16 9
+ 5 13 15 17 9
+ 14 13 15 16 9
+ 14 13 15 17 9
+ 13 15 17 18 9
+ 13 15 17 19 9
+ 13 15 17 23 9
+ 16 15 17 18 9
+ 16 15 17 19 9
+ 16 15 17 23 9
+ 15 17 19 20 9
+ 15 17 19 21 9
+ 15 17 19 22 9
+ 18 17 19 20 9
+ 18 17 19 21 9
+ 18 17 19 22 9
+ 23 17 19 20 9
+ 23 17 19 21 9
+ 23 17 19 22 9
+ 15 17 23 24 9
+ 15 17 23 25 9
+ 18 17 23 24 9
+ 18 17 23 25 9
+ 19 17 23 24 9
+ 19 17 23 25 9
+ 17 23 25 26 9
+ 17 23 25 27 9
+ 24 23 25 26 9
+ 24 23 25 27 9
+ 23 25 27 28 9
+ 23 25 27 29 9
+ 23 25 27 38 9
+ 26 25 27 28 9
+ 26 25 27 29 9
+ 26 25 27 38 9
+ 25 27 29 30 9
+ 25 27 29 31 9
+ 25 27 29 32 9
+ 28 27 29 30 9
+ 28 27 29 31 9
+ 28 27 29 32 9
+ 38 27 29 30 9
+ 38 27 29 31 9
+ 38 27 29 32 9
+ 25 27 38 39 9
+ 25 27 38 40 9
+ 28 27 38 39 9
+ 28 27 38 40 9
+ 29 27 38 39 9
+ 29 27 38 40 9
+ 27 29 32 33 9
+ 27 29 32 34 9
+ 27 29 32 35 9
+ 30 29 32 33 9
+ 30 29 32 34 9
+ 30 29 32 35 9
+ 31 29 32 33 9
+ 31 29 32 34 9
+ 31 29 32 35 9
+ 29 32 35 36 9
+ 29 32 35 37 9
+ 33 32 35 36 9
+ 33 32 35 37 9
+ 34 32 35 36 9
+ 34 32 35 37 9
+ 27 38 40 41 9
+ 27 38 40 42 9
+ 39 38 40 41 9
+ 39 38 40 42 9
+ 38 40 42 43 9
+ 38 40 42 44 9
+ 38 40 42 58 9
+ 41 40 42 43 9
+ 41 40 42 44 9
+ 41 40 42 58 9
+ 40 42 44 45 9
+ 40 42 44 46 9
+ 40 42 44 47 9
+ 43 42 44 45 9
+ 43 42 44 46 9
+ 43 42 44 47 9
+ 58 42 44 45 9
+ 58 42 44 46 9
+ 58 42 44 47 9
+ 40 42 58 59 9
+ 40 42 58 60 9
+ 43 42 58 59 9
+ 43 42 58 60 9
+ 44 42 58 59 9
+ 44 42 58 60 9
+ 42 44 47 48 9
+ 42 44 47 54 9
+ 45 44 47 48 9
+ 45 44 47 54 9
+ 46 44 47 48 9
+ 46 44 47 54 9
+ 44 47 48 49 9
+ 44 47 48 50 9
+ 54 47 48 49 9
+ 54 47 48 50 9
+ 44 47 54 55 9
+ 44 47 54 56 9
+ 48 47 54 55 9
+ 48 47 54 56 9
+ 47 48 50 51 9
+ 47 48 50 52 9
+ 49 48 50 51 9
+ 49 48 50 52 9
+ 48 50 52 53 9
+ 48 50 52 56 9
+ 51 50 52 53 9
+ 51 50 52 56 9
+ 50 52 56 54 9
+ 50 52 56 57 9
+ 53 52 56 54 9
+ 53 52 56 57 9
+ 47 54 56 52 9
+ 47 54 56 57 9
+ 55 54 56 52 9
+ 55 54 56 57 9
+ 42 58 60 61 9
+ 42 58 60 62 9
+ 59 58 60 61 9
+ 59 58 60 62 9
+ 58 60 62 63 9
+ 58 60 62 64 9
+ 58 60 62 82 9
+ 61 60 62 63 9
+ 61 60 62 64 9
+ 61 60 62 82 9
+ 60 62 64 65 9
+ 60 62 64 66 9
+ 60 62 64 67 9
+ 63 62 64 65 9
+ 63 62 64 66 9
+ 63 62 64 67 9
+ 82 62 64 65 9
+ 82 62 64 66 9
+ 82 62 64 67 9
+ 60 62 82 83 9
+ 60 62 82 84 9
+ 63 62 82 83 9
+ 63 62 82 84 9
+ 64 62 82 83 9
+ 64 62 82 84 9
+ 62 64 67 68 9
+ 62 64 67 69 9
+ 62 64 67 70 9
+ 65 64 67 68 9
+ 65 64 67 69 9
+ 65 64 67 70 9
+ 66 64 67 68 9
+ 66 64 67 69 9
+ 66 64 67 70 9
+ 64 67 70 71 9
+ 64 67 70 72 9
+ 64 67 70 73 9
+ 68 67 70 71 9
+ 68 67 70 72 9
+ 68 67 70 73 9
+ 69 67 70 71 9
+ 69 67 70 72 9
+ 69 67 70 73 9
+ 67 70 73 74 9
+ 67 70 73 75 9
+ 71 70 73 74 9
+ 71 70 73 75 9
+ 72 70 73 74 9
+ 72 70 73 75 9
+ 70 73 75 76 9
+ 70 73 75 79 9
+ 74 73 75 76 9
+ 74 73 75 79 9
+ 73 75 76 77 9
+ 73 75 76 78 9
+ 79 75 76 77 9
+ 79 75 76 78 9
+ 73 75 79 80 9
+ 73 75 79 81 9
+ 76 75 79 80 9
+ 76 75 79 81 9
+ 62 82 84 85 9
+ 62 82 84 86 9
+ 83 82 84 85 9
+ 83 82 84 86 9
+ 82 84 86 87 9
+ 82 84 86 88 9
+ 82 84 86 99 9
+ 85 84 86 87 9
+ 85 84 86 88 9
+ 85 84 86 99 9
+ 84 86 88 89 9
+ 84 86 88 90 9
+ 84 86 88 92 9
+ 87 86 88 89 9
+ 87 86 88 90 9
+ 87 86 88 92 9
+ 99 86 88 89 9
+ 99 86 88 90 9
+ 99 86 88 92 9
+ 84 86 99 100 9
+ 84 86 99 101 9
+ 87 86 99 100 9
+ 87 86 99 101 9
+ 88 86 99 100 9
+ 88 86 99 101 9
+ 86 88 92 91 9
+ 86 88 92 97 9
+ 89 88 92 91 9
+ 89 88 92 97 9
+ 90 88 92 91 9
+ 90 88 92 97 9
+ 93 91 92 88 9
+ 93 91 92 97 9
+ 92 91 93 94 9
+ 92 91 93 95 9
+ 88 92 97 95 9
+ 88 92 97 98 9
+ 91 92 97 95 9
+ 91 92 97 98 9
+ 91 93 95 96 9
+ 91 93 95 97 9
+ 94 93 95 96 9
+ 94 93 95 97 9
+ 93 95 97 92 9
+ 93 95 97 98 9
+ 96 95 97 92 9
+ 96 95 97 98 9
+ 86 99 101 102 9
+ 86 99 101 103 9
+ 100 99 101 102 9
+ 100 99 101 103 9
+ 99 101 103 104 9
+ 99 101 103 105 9
+ 99 101 103 111 9
+ 102 101 103 104 9
+ 102 101 103 105 9
+ 102 101 103 111 9
+ 101 103 105 106 9
+ 101 103 105 107 9
+ 101 103 105 108 9
+ 104 103 105 106 9
+ 104 103 105 107 9
+ 104 103 105 108 9
+ 111 103 105 106 9
+ 111 103 105 107 9
+ 111 103 105 108 9
+ 101 103 111 112 9
+ 101 103 111 113 9
+ 104 103 111 112 9
+ 104 103 111 113 9
+ 105 103 111 112 9
+ 105 103 111 113 9
+ 103 105 108 109 9
+ 103 105 108 110 9
+ 106 105 108 109 9
+ 106 105 108 110 9
+ 107 105 108 109 9
+ 107 105 108 110 9
+ 103 111 113 114 9
+ 103 111 113 115 9
+ 112 111 113 114 9
+ 112 111 113 115 9
+ 111 113 115 116 9
+ 111 113 115 117 9
+ 111 113 115 122 9
+ 114 113 115 116 9
+ 114 113 115 117 9
+ 114 113 115 122 9
+ 113 115 117 118 9
+ 113 115 117 119 9
+ 113 115 117 120 9
+ 116 115 117 118 9
+ 116 115 117 119 9
+ 116 115 117 120 9
+ 122 115 117 118 9
+ 122 115 117 119 9
+ 122 115 117 120 9
+ 113 115 122 123 9
+ 113 115 122 124 9
+ 116 115 122 123 9
+ 116 115 122 124 9
+ 117 115 122 123 9
+ 117 115 122 124 9
+ 115 117 120 121 9
+ 118 117 120 121 9
+ 119 117 120 121 9
+ 115 122 124 125 9
+ 115 122 124 126 9
+ 123 122 124 125 9
+ 123 122 124 126 9
+ 122 124 126 127 9
+ 122 124 126 128 9
+ 122 124 126 129 9
+ 125 124 126 127 9
+ 125 124 126 128 9
+ 125 124 126 129 9
+ 124 126 129 130 9
+ 124 126 129 131 9
+ 127 126 129 130 9
+ 127 126 129 131 9
+ 128 126 129 130 9
+ 128 126 129 131 9
+ 126 129 131 132 9
+ 126 129 131 133 9
+ 130 129 131 132 9
+ 130 129 131 133 9
+ 129 131 133 134 9
+ 129 131 133 135 9
+ 129 131 133 150 9
+ 132 131 133 134 9
+ 132 131 133 135 9
+ 132 131 133 150 9
+ 131 133 135 136 9
+ 131 133 135 137 9
+ 131 133 135 138 9
+ 134 133 135 136 9
+ 134 133 135 137 9
+ 134 133 135 138 9
+ 150 133 135 136 9
+ 150 133 135 137 9
+ 150 133 135 138 9
+ 131 133 150 151 9
+ 131 133 150 152 9
+ 134 133 150 151 9
+ 134 133 150 152 9
+ 135 133 150 151 9
+ 135 133 150 152 9
+ 133 135 138 139 9
+ 133 135 138 146 9
+ 136 135 138 139 9
+ 136 135 138 146 9
+ 137 135 138 139 9
+ 137 135 138 146 9
+ 135 138 139 140 9
+ 135 138 139 141 9
+ 146 138 139 140 9
+ 146 138 139 141 9
+ 135 138 146 147 9
+ 135 138 146 148 9
+ 139 138 146 147 9
+ 139 138 146 148 9
+ 138 139 141 142 9
+ 138 139 141 143 9
+ 140 139 141 142 9
+ 140 139 141 143 9
+ 139 141 143 144 9
+ 139 141 143 148 9
+ 142 141 143 144 9
+ 142 141 143 148 9
+ 141 143 144 145 9
+ 148 143 144 145 9
+ 141 143 148 146 9
+ 141 143 148 149 9
+ 144 143 148 146 9
+ 144 143 148 149 9
+ 138 146 148 143 9
+ 138 146 148 149 9
+ 147 146 148 143 9
+ 147 146 148 149 9
+ 133 150 152 153 9
+ 133 150 152 154 9
+ 151 150 152 153 9
+ 151 150 152 154 9
+ 150 152 154 155 9
+ 150 152 154 156 9
+ 150 152 154 165 9
+ 153 152 154 155 9
+ 153 152 154 156 9
+ 153 152 154 165 9
+ 152 154 156 157 9
+ 152 154 156 158 9
+ 152 154 156 159 9
+ 155 154 156 157 9
+ 155 154 156 158 9
+ 155 154 156 159 9
+ 165 154 156 157 9
+ 165 154 156 158 9
+ 165 154 156 159 9
+ 152 154 165 166 9
+ 152 154 165 167 9
+ 155 154 165 166 9
+ 155 154 165 167 9
+ 156 154 165 166 9
+ 156 154 165 167 9
+ 154 156 159 160 9
+ 154 156 159 161 9
+ 154 156 159 162 9
+ 157 156 159 160 9
+ 157 156 159 161 9
+ 157 156 159 162 9
+ 158 156 159 160 9
+ 158 156 159 161 9
+ 158 156 159 162 9
+ 156 159 162 163 9
+ 156 159 162 164 9
+ 160 159 162 163 9
+ 160 159 162 164 9
+ 161 159 162 163 9
+ 161 159 162 164 9
+ 154 165 167 168 9
+ 154 165 167 169 9
+ 166 165 167 168 9
+ 166 165 167 169 9
+ 165 167 169 170 9
+ 165 167 169 171 9
+ 165 167 169 181 9
+ 168 167 169 170 9
+ 168 167 169 171 9
+ 168 167 169 181 9
+ 167 169 171 172 9
+ 167 169 171 173 9
+ 167 169 171 177 9
+ 170 169 171 172 9
+ 170 169 171 173 9
+ 170 169 171 177 9
+ 181 169 171 172 9
+ 181 169 171 173 9
+ 181 169 171 177 9
+ 167 169 181 182 9
+ 167 169 181 183 9
+ 170 169 181 182 9
+ 170 169 181 183 9
+ 171 169 181 182 9
+ 171 169 181 183 9
+ 169 171 173 174 9
+ 169 171 173 175 9
+ 169 171 173 176 9
+ 172 171 173 174 9
+ 172 171 173 175 9
+ 172 171 173 176 9
+ 177 171 173 174 9
+ 177 171 173 175 9
+ 177 171 173 176 9
+ 169 171 177 178 9
+ 169 171 177 179 9
+ 169 171 177 180 9
+ 172 171 177 178 9
+ 172 171 177 179 9
+ 172 171 177 180 9
+ 173 171 177 178 9
+ 173 171 177 179 9
+ 173 171 177 180 9
+ 169 181 183 184 9
+ 169 181 183 185 9
+ 182 181 183 184 9
+ 182 181 183 185 9
+ 181 183 185 186 9
+ 181 183 185 187 9
+ 181 183 185 198 9
+ 184 183 185 186 9
+ 184 183 185 187 9
+ 184 183 185 198 9
+ 183 185 187 188 9
+ 183 185 187 189 9
+ 183 185 187 191 9
+ 186 185 187 188 9
+ 186 185 187 189 9
+ 186 185 187 191 9
+ 198 185 187 188 9
+ 198 185 187 189 9
+ 198 185 187 191 9
+ 183 185 198 199 9
+ 183 185 198 200 9
+ 186 185 198 199 9
+ 186 185 198 200 9
+ 187 185 198 199 9
+ 187 185 198 200 9
+ 185 187 191 190 9
+ 185 187 191 196 9
+ 188 187 191 190 9
+ 188 187 191 196 9
+ 189 187 191 190 9
+ 189 187 191 196 9
+ 192 190 191 187 9
+ 192 190 191 196 9
+ 191 190 192 193 9
+ 191 190 192 194 9
+ 187 191 196 194 9
+ 187 191 196 197 9
+ 190 191 196 194 9
+ 190 191 196 197 9
+ 190 192 194 195 9
+ 190 192 194 196 9
+ 193 192 194 195 9
+ 193 192 194 196 9
+ 192 194 196 191 9
+ 192 194 196 197 9
+ 195 194 196 191 9
+ 195 194 196 197 9
+ 185 198 200 201 9
+ 185 198 200 202 9
+ 199 198 200 201 9
+ 199 198 200 202 9
+ 198 200 202 203 9
+ 198 200 202 204 9
+ 198 200 202 215 9
+ 201 200 202 203 9
+ 201 200 202 204 9
+ 201 200 202 215 9
+ 200 202 204 205 9
+ 200 202 204 206 9
+ 200 202 204 208 9
+ 203 202 204 205 9
+ 203 202 204 206 9
+ 203 202 204 208 9
+ 215 202 204 205 9
+ 215 202 204 206 9
+ 215 202 204 208 9
+ 200 202 215 216 9
+ 200 202 215 217 9
+ 203 202 215 216 9
+ 203 202 215 217 9
+ 204 202 215 216 9
+ 204 202 215 217 9
+ 202 204 208 207 9
+ 202 204 208 213 9
+ 205 204 208 207 9
+ 205 204 208 213 9
+ 206 204 208 207 9
+ 206 204 208 213 9
+ 209 207 208 204 9
+ 209 207 208 213 9
+ 208 207 209 210 9
+ 208 207 209 211 9
+ 204 208 213 211 9
+ 204 208 213 214 9
+ 207 208 213 211 9
+ 207 208 213 214 9
+ 207 209 211 212 9
+ 207 209 211 213 9
+ 210 209 211 212 9
+ 210 209 211 213 9
+ 209 211 213 208 9
+ 209 211 213 214 9
+ 212 211 213 208 9
+ 212 211 213 214 9
+ 202 215 217 218 9
+ 202 215 217 219 9
+ 216 215 217 218 9
+ 216 215 217 219 9
+ 215 217 219 220 9
+ 215 217 219 221 9
+ 215 217 219 232 9
+ 218 217 219 220 9
+ 218 217 219 221 9
+ 218 217 219 232 9
+ 217 219 221 222 9
+ 217 219 221 223 9
+ 217 219 221 224 9
+ 220 219 221 222 9
+ 220 219 221 223 9
+ 220 219 221 224 9
+ 232 219 221 222 9
+ 232 219 221 223 9
+ 232 219 221 224 9
+ 217 219 232 233 9
+ 217 219 232 234 9
+ 220 219 232 233 9
+ 220 219 232 234 9
+ 221 219 232 233 9
+ 221 219 232 234 9
+ 219 221 224 225 9
+ 219 221 224 226 9
+ 219 221 224 227 9
+ 222 221 224 225 9
+ 222 221 224 226 9
+ 222 221 224 227 9
+ 223 221 224 225 9
+ 223 221 224 226 9
+ 223 221 224 227 9
+ 221 224 227 228 9
+ 221 224 227 229 9
+ 225 224 227 228 9
+ 225 224 227 229 9
+ 226 224 227 228 9
+ 226 224 227 229 9
+ 224 227 229 230 9
+ 224 227 229 231 9
+ 228 227 229 230 9
+ 228 227 229 231 9
+ 219 232 234 235 9
+ 219 232 234 236 9
+ 233 232 234 235 9
+ 233 232 234 236 9
+ 232 234 236 237 9
+ 232 234 236 238 9
+ 232 234 236 254 9
+ 235 234 236 237 9
+ 235 234 236 238 9
+ 235 234 236 254 9
+ 234 236 238 239 9
+ 234 236 238 240 9
+ 234 236 238 241 9
+ 237 236 238 239 9
+ 237 236 238 240 9
+ 237 236 238 241 9
+ 254 236 238 239 9
+ 254 236 238 240 9
+ 254 236 238 241 9
+ 234 236 254 255 9
+ 234 236 254 256 9
+ 237 236 254 255 9
+ 237 236 254 256 9
+ 238 236 254 255 9
+ 238 236 254 256 9
+ 236 238 241 242 9
+ 236 238 241 243 9
+ 236 238 241 244 9
+ 239 238 241 242 9
+ 239 238 241 243 9
+ 239 238 241 244 9
+ 240 238 241 242 9
+ 240 238 241 243 9
+ 240 238 241 244 9
+ 238 241 244 245 9
+ 238 241 244 246 9
+ 238 241 244 247 9
+ 242 241 244 245 9
+ 242 241 244 246 9
+ 242 241 244 247 9
+ 243 241 244 245 9
+ 243 241 244 246 9
+ 243 241 244 247 9
+ 241 244 247 248 9
+ 241 244 247 249 9
+ 241 244 247 250 9
+ 245 244 247 248 9
+ 245 244 247 249 9
+ 245 244 247 250 9
+ 246 244 247 248 9
+ 246 244 247 249 9
+ 246 244 247 250 9
+ 244 247 250 251 9
+ 244 247 250 252 9
+ 244 247 250 253 9
+ 248 247 250 251 9
+ 248 247 250 252 9
+ 248 247 250 253 9
+ 249 247 250 251 9
+ 249 247 250 252 9
+ 249 247 250 253 9
+
+[ dihedrals ]
+; ai aj ak al funct c0 c1 c2 c3
+ 10 7 12 11 2
+ 13 5 15 14 2
+ 15 13 17 16 2
+ 23 17 25 24 2
+ 25 23 27 26 2
+ 35 32 37 36 2
+ 38 27 40 39 2
+ 40 38 42 41 2
+ 58 42 60 59 2
+ 60 58 62 61 2
+ 73 79 76 75 2
+ 82 62 84 83 2
+ 84 82 86 85 2
+ 93 91 95 94 2
+ 93 95 91 94 2
+ 95 93 97 96 2
+ 95 97 93 96 2
+ 97 92 95 98 2
+ 97 95 92 98 2
+ 99 86 101 100 2
+ 101 99 103 102 2
+ 108 105 110 109 2
+ 111 103 113 112 2
+ 113 111 115 114 2
+ 122 115 124 123 2
+ 124 122 126 125 2
+ 129 126 131 130 2
+ 131 129 133 132 2
+ 150 133 152 151 2
+ 152 150 154 153 2
+ 162 159 164 163 2
+ 165 154 167 166 2
+ 167 165 169 168 2
+ 181 169 183 182 2
+ 183 181 185 184 2
+ 192 190 194 193 2
+ 192 194 190 193 2
+ 194 192 196 195 2
+ 194 196 192 195 2
+ 196 191 194 197 2
+ 196 194 191 197 2
+ 198 185 200 199 2
+ 200 198 202 201 2
+ 209 207 211 210 2
+ 209 211 207 210 2
+ 211 209 213 212 2
+ 211 213 209 212 2
+ 213 208 211 214 2
+ 213 211 208 214 2
+ 215 202 217 216 2
+ 217 215 219 218 2
+ 227 224 229 228 2
+ 227 229 224 228 2
+ 229 227 231 230 2
+ 229 227 230 231 2
+ 232 219 234 233 2
+ 234 232 236 235 2
+ 254 236 256 255 2
+
+[ cmap ]
+; ai aj ak al am funct
+ 13 15 17 23 25 1
+ 23 25 27 38 40 1
+ 38 40 42 58 60 1
+ 58 60 62 82 84 1
+ 82 84 86 99 101 1
+ 99 101 103 111 113 1
+ 111 113 115 122 124 1
+ 122 124 126 129 131 1
+ 129 131 133 150 152 1
+ 150 152 154 165 167 1
+ 165 167 169 181 183 1
+ 181 183 185 198 200 1
+ 198 200 202 215 217 1
+ 215 217 219 232 234 1
+
+; Include water topology
+#include "charmm27.ff/tip3p.itp"
+
+#ifdef POSRES_WATER
+; Position restraint for each water oxygen
+[ position_restraints ]
+; i funct fcx fcy fcz
+ 1 1 1000 1000 1000
+#endif
+
+; Include topology for ions
+#include "charmm27.ff/ions.itp"
+
+[ system ]
+; Name
+AMYLOID BETA A4 PROTEIN; 4 PROTEIN, CEREBRAL VASCULAR AMYLOID PEPTIDE, CVAP,; 5 PROTEASE NEXIN-II, PN-II, APPI, PREA4; 8 SECRETASES CLEAVAGE SITES OF ALZHEIMER'S DISEASE AMYLOID; 9 A4 PROTEIN, RESIDUES 672-687
+
+[ molecules ]
+; Compound #mols
+Protein_chain_A 1
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2019, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
#include <gtest/gtest.h>
#include <gtest/gtest-spi.h>
+#include "gromacs/utility/any.h"
#include "gromacs/utility/keyvaluetree.h"
#include "gromacs/utility/keyvaluetreebuilder.h"
-#include "gromacs/utility/variant.h"
#include "testutils/testasserts.h"
#include "testutils/testexceptions.h"
}
-TEST(ReferenceDataTest, HandlesVariants)
+TEST(ReferenceDataTest, HandlesAnys)
{
- using gmx::Variant;
+ using gmx::Any;
{
TestReferenceData data(gmx::test::erefdataUpdateAll);
TestReferenceChecker checker(data.rootChecker());
- checker.checkVariant(Variant::create<bool>(true), "bool");
- checker.checkVariant(Variant::create<int>(1), "int");
- checker.checkVariant(Variant::create<double>(3.5), "real");
- checker.checkVariant(Variant::create<std::string>("foo"), "str");
+ checker.checkAny(Any::create<bool>(true), "bool");
+ checker.checkAny(Any::create<int>(1), "int");
+ checker.checkAny(Any::create<double>(3.5), "real");
+ checker.checkAny(Any::create<std::string>("foo"), "str");
}
{
TestReferenceData data(gmx::test::erefdataCompare);
TestReferenceChecker checker(data.rootChecker());
- checker.checkVariant(Variant::create<bool>(true), "bool");
- checker.checkVariant(Variant::create<int>(1), "int");
- checker.checkVariant(Variant::create<double>(3.5), "real");
- checker.checkVariant(Variant::create<std::string>("foo"), "str");
+ checker.checkAny(Any::create<bool>(true), "bool");
+ checker.checkAny(Any::create<int>(1), "int");
+ checker.checkAny(Any::create<double>(3.5), "real");
+ checker.checkAny(Any::create<std::string>("foo"), "str");
}
}
}
-TEST(ReferenceDataTest, HandlesVariantsWithIncorrectValue)
+TEST(ReferenceDataTest, HandlesAnysWithIncorrectValue)
{
- using gmx::Variant;
+ using gmx::Any;
{
TestReferenceData data(gmx::test::erefdataUpdateAll);
TestReferenceChecker checker(data.rootChecker());
- checker.checkVariant(Variant::create<bool>(true), "bool");
- checker.checkVariant(Variant::create<int>(1), "int");
- checker.checkVariant(Variant::create<double>(3.5), "real");
- checker.checkVariant(Variant::create<std::string>("foo"), "str");
+ checker.checkAny(Any::create<bool>(true), "bool");
+ checker.checkAny(Any::create<int>(1), "int");
+ checker.checkAny(Any::create<double>(3.5), "real");
+ checker.checkAny(Any::create<std::string>("foo"), "str");
}
{
TestReferenceData data(gmx::test::erefdataCompare);
TestReferenceChecker checker(data.rootChecker());
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<bool>(false), "bool"), "");
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(2), "int"), "");
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<double>(2.5), "real"), "");
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<std::string>("bar"), "str"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<bool>(false), "bool"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(2), "int"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<double>(2.5), "real"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<std::string>("bar"), "str"), "");
}
}
-TEST(ReferenceDataTest, HandlesVariantsWithIncorrectType)
+TEST(ReferenceDataTest, HandlesAnysWithIncorrectType)
{
- using gmx::Variant;
+ using gmx::Any;
{
TestReferenceData data(gmx::test::erefdataUpdateAll);
TestReferenceChecker checker(data.rootChecker());
- checker.checkVariant(Variant::create<bool>(true), "bool");
- checker.checkVariant(Variant::create<int>(1), "int");
- checker.checkVariant(Variant::create<double>(3.5), "real");
+ checker.checkAny(Any::create<bool>(true), "bool");
+ checker.checkAny(Any::create<int>(1), "int");
+ checker.checkAny(Any::create<double>(3.5), "real");
}
{
TestReferenceData data(gmx::test::erefdataCompare);
TestReferenceChecker checker(data.rootChecker());
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(1), "bool"), "");
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<bool>(true), "int"), "");
- EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(2), "real"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(1), "bool"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<bool>(true), "int"), "");
+ EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(2), "real"), "");
}
}
#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
endif()
#currently not testing tools because they don't contain any useful tests
- foreach(subtest simple complex kernel freeenergy rotation essentialdynamics)
+ foreach(subtest complex freeenergy rotation essentialdynamics)
add_test(NAME regressiontests/${subtest}
#windows requires the command to be perl and not the script
COMMAND perl "${REGRESSIONTEST_PATH}/gmxtest.pl" ${subtest} ${ARGS})